DynDNS update: update URL, DynDNS2 protocol and responses
Your router, NAS or script reports its current IP address to IPv64.net via the update URL. The updater speaks the DynDNS2 protocol (/nic/update), understands the parameter names of many other providers and can detect your IP on its own. This page lists all parameters, responses and limits.
Update URL and endpoints
The IPv64.net DynDNS update URL is available at three addresses. All three behave the same:
| Address | Note |
|---|---|
https://ipv64.net/nic/update | DynDNS2 path, recommended for routers and clients such as ddclient or inadyn |
https://ipv64.net/update | Short form |
https://ipv64.net/update.php | Original address |
The updater accepts GET and POST. The response is JSON by default; you get the classic DynDNS2 words such as good or nochg with output=min (see Responses).
To force the automatically detected address to be IPv4 or IPv6, call the updater via one of the two host names that only have one address family:
https://ipv4.ipv64.net/nic/update– connection over IPv4 onlyhttps://ipv6.ipv64.net/nic/update– connection over IPv6 only
You find the right update URL for your domain on ipv64.net/dyndns in the domain settings. How to create domains and records is explained under DynDNS domains; ready-made device guides are under Routers & devices.
Authentication: update token and domain key
An update needs one of three keys. All are 32 characters long and are shown in your account; the narrower the key, the safer:
| Key | Valid for | Where to find it |
|---|---|---|
| Record token (security level 3, high) | exactly one record (its prefix) | in the individual record of the domain |
| Domain key / domain update token (level 2, recommended) | this one domain only | domain settings, “Domain Update URL” |
| Account Update Token (level 1, low) | all domains of your account | domain settings (“Account Update URL”) and as “Account Update Token” in the account box (see Account) |
With a domain key or record token you can leave out the domain parameter – the updater then uses the key’s domain. With the Account Update Token you always have to name the domain. You can regenerate every key in the web interface; the old one stops working. The updater does not accept an e-mail/password combination.
Passing the key
You can send the key in three ways. Many routers only have fields for user name and password – then put the key into one of them.
- As a parameter
One of the nameskey,token,user,username,pwd,passorpassword(GET or POST). - Via HTTP basic auth
User name and password are free; one of the two fields must be the key (24 or 32 characters). Fill the other one with any value, e.g.none. If the key is missing entirely, the updater answers401with the headerWWW-Authenticate: Basic realm="IPv64"so that clients send their credentials. - Via header
Authorization: Bearer YOUR_DOMAIN_KEY(alsoAuthorization: Token …).
With GET requests the key is part of the URL and ends up in logs, for example. Prefer the domain key or record token over the Account Update Token – then a leak only affects one domain.
All parameters
The updater understands the parameter names of many routers and DynDNS clients. If several names mean the same, the first one that is filled wins.
| Parameter | Meaning |
|---|---|
key, token, user, username, pwd, pass, password | Key (see Authentication) |
domain, domains, host, hostname, zone, host_id (GET only) | Domain, e.g. yourdomain.ipv64.net. Separate several domains with commas. Optional with a domain key or record token. |
ip, ip4, ipv4, myip, myip4, myipv4 | IPv4 address for the A record. auto = detect automatically. If the value contains a comma (e.g. “IPv6,IPv4” as sent by some Speedport routers), every valid address is used. |
ip6, ipv6, myip6, myipv6 | IPv6 address for the AAAA record. auto = detect automatically. |
praefix | Prefix (subdomain) of the record within the domain, e.g. nas for nas.yourdomain.ipv64.net. Empty = the domain itself. |
ipv6prefix, ip6lanprefix, ip6prefix, ipv6lanprefix, prefix | IPv6 prefix of your network, e.g. 2001:db8:1234:5600::/64, or auto (see IPv6 prefix, example URLs). |
onlyprefix | Update the IPv6 prefix only, no IP addresses. The parameter just has to be present. |
healthcheck, healthtoken | Token of a push check. After every processed address – also with nochg – the updater additionally calls this check's push URL. The answer is in the field healthcheck (OK for a push check). The push counts against the daily health check quota like any other. |
dkey | Domain key of a domain to select the domain; only together with a valid key in key. |
output (GET only) | full (default, JSON), min (a single word, plain text) or none (no output) |
howismyip (GET only) | Without a key: only shows the IP address you are connecting from |
praefix (German spelling with “ae”) selects the record within the domain, i.e. the subdomain. prefix, on the other hand, is an alias for the IPv6 prefix. Sending prefix=nas does not select the subdomain “nas” but sets an invalid IPv6 prefix.
For subdomains, pass the domain in domain and the front part in praefix.
If the A or AAAA record for the domain and prefix does not exist yet, the updater creates it with the first update.
Automatic IP detection
If you send neither an IPv4 nor an IPv6 address (or just auto), the updater uses the address your request comes from. That is always only one address – depending on whether your device uses IPv4 or IPv6 for the connection. For dual stack there are two ways:
- two calls, one via
ipv4.ipv64.netand one viaipv6.ipv64.net, or - send both addresses explicitly (
ip=…&ip6=…).
Which address IPv64.net sees from you is shown by https://ipv64.net/update.php?howismyip.
Only public addresses are accepted. The updater rejects private and reserved ranges (e.g. 192.168.0.0/16, 10.0.0.0/8, fe80::/10) and IPv4-mapped IPv6 addresses (::ffff:…). It strips square brackets and a zone suffix such as %eth0.
In the domain settings, “Ignore IPv4 / IPv6 on the updater (/nic/update)” lets you hide one address family – useful with DS-Lite or CG-NAT when the router reports an unusable IPv4. The response then shows "ignore" for that family.
Updating the IPv6 prefix
When your provider changes the IPv6 prefix, the addresses of all devices in your home network change. Instead of reporting every device, the router sends only the prefix. AAAA records whose content is only the interface ID (starts with ::, e.g. ::211:22ff:fe33:4455) are then combined with the new prefix by IPv64.net and written to DNS shortly afterwards. How to create such records and how the addresses are built is explained under IPv6 prefix and interface ID.
Values for ipv6prefix
Instead of ipv6prefix you can also use ip6lanprefix, ip6prefix, ipv6lanprefix and prefix – whatever your router offers.
| Value | Effect |
|---|---|
2001:db8:1234:5600::/64 | Fixed prefix with length. It must end with ::/ and the length (e.g. ::/56 or ::/64); without a length you get format error. The first 64 bits are used. |
auto | The /64 of the IPv6 address the request comes from. Only works if the request arrives via IPv6 – use ipv6.ipv64.net for that. If it arrives via IPv4, nothing happens (the response then contains no ipv6prefix). |
Router placeholder, e.g. <ip6lanprefix> | The router inserts the prefix of its home network itself, e.g. 2001:db8:1234:5600::/64. |
With or without onlyprefix: Without onlyprefix, a call updates the prefix and, as usual, the A and AAAA records of the domain (sent or automatically detected address) – this is how the FRITZ!Box works. With onlyprefix only the prefix is stored, the domain's addresses stay. The parameter needs no value, &onlyprefix is enough.
Example URLs for the IPv6 prefix
Detect the prefix automatically, change nothing else – e.g. via cron on a device in your home network:
https://ipv6.ipv64.net/nic/update?key=YOUR_DOMAIN_KEY&ipv6prefix=auto&onlyprefix
Set a fixed prefix:
https://ipv64.net/nic/update?key=YOUR_DOMAIN_KEY&ipv6prefix=2001:db8:1234:5600::/64&onlyprefix
Prefix and addresses in one call – A and AAAA record of the domain plus all device records:
https://ipv64.net/nic/update?key=YOUR_DOMAIN_KEY&ip=192.0.2.10&ip6=2001:db8:1234:5600::1&ipv6prefix=2001:db8:1234:5600::/64
With the Account Update Token – the domain must be included here:
https://ipv6.ipv64.net/nic/update?key=YOUR_UPDATE_TOKEN&domain=yourdomain.ipv64.net&ipv6prefix=auto&onlyprefix
Via POST with a bearer token:
curl -X POST "https://ipv6.ipv64.net/nic/update" \
-H "Authorization: Bearer YOUR_DOMAIN_KEY" \
-d "ipv6prefix=auto" -d "onlyprefix=1"
Router with placeholder (FRITZ!Box, setup under FRITZ!Box with IPv6 prefix):
https://ipv64.net/nic/update?key=YOUR_DOMAIN_KEY&ip=<ipaddr>&ip6=<ip6addr>&ip6lanprefix=<ip6lanprefix>
Responses
With onlyprefix, the JSON response only contains the result for the prefix:
// new prefix stored, 3 device records are being adjusted
{"info":"good","updated_ipv6prefix_ips":"3","ipv6prefix":"2001:db8:1234:5600::/64","status":"success"}
// prefix unchanged
{"info":"nochg","ipv6prefix":"2001:db8:1234:5600::/64","status":"success"}
// prefix not recognised, e.g. without /length
{"info":"","ipv6prefix":"format error"}
With output=min you get good, nochg or 911 on an error. Without onlyprefix, status and info follow the address update, and ip is added as with every update. updated_ipv6prefix_ips counts all AAAA records of the domain with an interface ID.
Responses and status codes
The default is JSON (output=full). The object contains status, info and – depending on the request – ip (with ipv4/ipv6), ipv6prefix and healthcheck:
{"info":"good","status":"success","ip":{"ipv4":"192.0.2.10"}}
With output=min you get a single word as plain text, as DynDNS2 clients expect. output=none returns no body, only the HTTP status code.
| HTTP | JSON status / info | output=min | Meaning |
|---|---|---|---|
| 200 | success / good | good | IP was changed (or record newly created) |
| 200 | success / nochg | nochg | IP was already current, nothing changed |
| 400 | 400 Bad Request / No correct IP transmitted | 911 | No valid public IP address |
| 401 | 401 Unauthorized / badauth | badauth | Key missing or wrong, account not active or domain deactivated |
| 404 | 404 Not Found / nohost | nohost | Domain not found or does not match the key |
| 409 | 409 Conflict / CNAME is set. | 911 | There is a CNAME on this prefix; A/AAAA are not set |
| 429 | 429 Too Many Requests / Update Cooldown - 10sec | abuse | Too many requests in a short time |
| 429 | 429 Too Many Requests / Updateintervall overcommited | abuse | Daily update limit reached |
Special values in the ip field: "ignore" means the address family is hidden in the domain settings; "cdn" means that for this address family the name only has the record of a CDN64 edge server; it stays unchanged (info is then nochg unless something else was changed). If the name in CDN64 has A/AAAA records of its own, the updater updates them as usual in the background while DNS keeps pointing to the edge servers (see CDN64 → DynDNS updates).
With several domains in one call, the response merges all results into one object; later domains overwrite the fields of earlier ones. For troubleshooting, call the domains one by one.
Limits and rate limit
- Cooldown: At most three updater requests within 10 seconds per account. Technically the updater counts the entries in the account log of the last 10 seconds; if there are more than two, it answers
429withUpdate Cooldown - 10sec. - Daily limit: The number of DynDNS updates per day depends on the account class (Free: 64, Home / Supporter: 1024, Business and Company: unlimited – see Account & limits). Every processed address per domain counts, including a
nochg. A call with IPv4 and IPv6 therefore counts twice. - Reset: The counter is reset to 0 once a day.
With a Free account, one call every 30 minutes for one address is fine (48 updates per day). Better: let the script check whether the IP has changed and only call the updater then. Routers usually do this on their own.
Examples with curl and wget
Domain key only, IP detected automatically
curl "https://ipv64.net/nic/update?key=YOUR_DOMAIN_KEY"
Domain and both addresses
curl "https://ipv64.net/nic/update?key=YOUR_DOMAIN_KEY&domain=yourdomain.ipv64.net&ip=192.0.2.10&ip6=2001:db8::10"
Record with prefix (nas.yourdomain.ipv64.net)
curl "https://ipv64.net/nic/update?key=YOUR_DOMAIN_KEY&domain=yourdomain.ipv64.net&praefix=nas&ip6=2001:db8::20"
Basic auth and DynDNS2 response
curl -u "none:YOUR_DOMAIN_KEY" "https://ipv64.net/nic/update?hostname=yourdomain.ipv64.net&myip=192.0.2.10&output=min"
Bearer token via POST
curl -X POST "https://ipv64.net/nic/update" \
-H "Authorization: Bearer YOUR_DOMAIN_KEY" \
-d "domain=yourdomain.ipv64.net" -d "ip=192.0.2.10"
Dual stack, detected automatically, with wget
wget -qO- "https://ipv4.ipv64.net/nic/update?key=YOUR_DOMAIN_KEY&output=min"
wget -qO- "https://ipv6.ipv64.net/nic/update?key=YOUR_DOMAIN_KEY&output=min"
Several domains with the Account Update Token
curl "https://ipv64.net/nic/update?key=YOUR_UPDATE_TOKEN&domain=yourdomain.ipv64.net,seconddomain.ipv64.net"
A single record with the record key
curl "https://ipv4.ipv64.net/nic/update?key=YOUR_RECORD_KEY"
curl "https://ipv6.ipv64.net/nic/update?key=YOUR_RECORD_KEY"
The first call sets the A record, the second the AAAA record of the record the key belongs to – each with the automatically detected address.
Update with a heartbeat to a health check
curl "https://ipv64.net/nic/update?key=YOUR_DOMAIN_KEY&healthcheck=YOUR_HEALTHCHECK_TOKEN"
If the update stops, the push check reports down after its period.
Without output (for cron)
curl -s "https://ipv64.net/nic/update?key=YOUR_DOMAIN_KEY&output=none"
IPv6 prefix only
curl "https://ipv6.ipv64.net/nic/update?key=YOUR_DOMAIN_KEY&ipv6prefix=auto&onlyprefix"
More variants under Example URLs for the IPv6 prefix.
Which address does IPv64.net see?
curl "https://ipv4.ipv64.net/update.php?howismyip"
curl "https://ipv6.ipv64.net/update.php?howismyip"
For regular updates via cron see Routers & devices.
Troubleshooting
badauth: Check that the key is complete (32 characters, case-sensitive) and that it was replaced after regenerating. With basic auth the key must be in the user name or the password. The account must be activated and the domain must not be deactivated.nohost: Check the spelling of the domain. A domain key only works for its own domain – with a different domain in the parameter you getnohost.No correct IP transmitted: The router reports a private address (e.g. behind a second router or with CG-NAT). Let the IP be detected automatically or useipv4.ipv64.net.- Wrong address family: Automatic detection returns IPv6 but you want IPv4 (or the other way round) – use the matching host name
ipv4.ipv64.netoripv6.ipv64.net. CNAME is set.: There is a CNAME on the prefix. Delete it or use a different prefix.abuse/ 429: Router or script call too often. Increase the interval or only update when the IP changes.- No effect in DNS: The updater stores the new IP immediately, the name server picks it up shortly afterwards. After that, the record’s TTL still applies in resolver caches.
Every successful update is listed in the account log at ipv64.net/logs (“Update A/AAAA Record - GOOD”). More help is in the FAQ and the v64.tech forum.
Found a mistake or missing something? Tell us in the v64.tech forum. · Updated: 2026-10-29