DynDNS API: manage domains and records via API
With the IPv64.net API you manage your account from scripts: create and delete domains and DNS records, query Cloud Routers. This page describes the existing API (v1, api.php) with all actions and curl examples; for new projects there is API v2.
API v1 at a glance
- Address:
https://ipv64.net/api.phporhttps://ipv64.net/api - Structure: The action is a parameter of the request, e.g.
?get_domains. Queries use GET, creating uses POST (form data), deleting uses DELETE with anapplication/x-www-form-urlencodedbody. - Response: always JSON.
- Authentication: with an API key (32 characters).
The API is not meant for plain IP updates from routers and simple devices – use the update URL for that.
Authentication with API key
The API accepts two kinds of keys:
- API keys from Account > API – with a name and an optional expiry date, as many as you like. Ideally one key per device or script.
- the account API key of your account (see Account & limits).
Send the key in one of these ways:
- Header (recommended)
Authorization: Bearer YOUR_API_KEY(alsoAuthorization: Token …) - HTTP basic auth
User name or password is the key (32 characters), the other field can be anything. - Parameter
apikey,keyortokenvia GET or POST.
If the key is missing or wrong, the API answers 401 with "info":"Unauthorized". If an API key has expired, info says API Key is expired. The account must be activated.
An API key gives full access to your account. Send it in the header rather than in the URL so it does not end up in logs, and give keys for scripts an expiry date.
Limits
- Short-term limit: at most 5 API calls within 5 seconds per account. Above that the API answers
429with"info":"Updateintervall overcommited". - Daily limit: Free 512 calls per day; Home / Supporter, Business and Company unlimited (see Account & limits). When it is reached you get
429with"info":"API Limit". Every authenticated call counts, including one that fails at the short-term limit. The counter is reset daily.
The number of calls per key is shown in Account > API in the “Used” column.
Responses and status codes
Every response is a JSON object with
info–successorerror(a text for authentication and limit errors),status– the HTTP code as text, e.g."201 Created",- a field named after the action or with an error description, e.g.
"add_domain":"domain limit reached", - and the actual data.
| HTTP | Meaning |
|---|---|
| 200 | Query successful |
| 201 | Created |
| 202 | Deletion accepted |
| 400 | Invalid input (e.g. record already exists) |
| 401 | Key missing, wrong or expired |
| 403 | No permission, name not available or account class limit reached |
| 429 | Short-term or daily limit reached |
If a request contains no known action, the response contains no data.
Account information and logs
get_account_info
Returns your account data: e-mail, status, validity of the account class, registration date, counters (DynDNS updates, API calls, health check pings, SMS, CDN and VPN traffic), number of domains and health checks, and under account_class the limits of your account class (dyndns_domain_limit, dyndns_update_limit, dyndns_ttl, api_limit …). The counters cdn_traffic_input and cdn_traffic_output do not include CDN64 traffic; the CDN64 API returns that.
curl "https://ipv64.net/api.php?get_account_info" -H "Authorization: Bearer YOUR_API_KEY"
The response also contains update_hash (Account Update Token) and api_key (account API key). Do not store them unprotected in logs.
get_logs
The last 100 entries of the account log, each with subdomain, time, header and content.
curl "https://ipv64.net/api.php?get_logs" -H "Authorization: Bearer YOUR_API_KEY"
Query, create and delete domains
get_domains
All domains with their records. Per domain: updates, wildcard, domain_update_hash (domain key), ipv6prefix, dualstack, deactivated and records. Each record has record_id, content, ttl, type, praefix, last_update, record_key, deactivated and failover_policy.
curl "https://ipv64.net/api.php?get_domains" -H "Authorization: Bearer YOUR_API_KEY"
Response (shortened):
{
"subdomains": {
"yourdomain.ipv64.net": {
"updates": "42", "wildcard": "1", "deactivated": "0",
"records": [
{"record_id": "1234", "type": "A", "praefix": "", "content": "192.0.2.10", "ttl": "60"}
]
}
},
"info": "success", "status": "200 OK"
}
add_domain (POST)
Creates a domain, e.g. add_domain=yourdomain.ipv64.net. If the name ends in one of the IPv64.net domain suffixes, a DynDNS domain is created; otherwise it is created as your own domain (DNS only) – which requires an own-domain quota in your account class.
curl -X POST "https://ipv64.net/api.php" -H "Authorization: Bearer YOUR_API_KEY" \
-d "add_domain=yourdomain.ipv64.net"
Errors (403, field add_domain): domainname not available (taken), domainname rules (name not allowed), domain limit reached.
del_domain (DELETE)
Deletes a domain immediately with all its records.
curl -X DELETE "https://ipv64.net/api.php" -H "Authorization: Bearer YOUR_API_KEY" \
-d "del_domain=yourdomain.ipv64.net"
Success: 202; no permission: 403.
Create and delete DNS records
add_record (POST)
| Field | Content |
|---|---|
add_record | Domain, e.g. yourdomain.ipv64.net |
praefix | Prefix (subdomain), empty for the domain itself |
type | A, AAAA, TXT, CNAME, MX, NS, SRV |
content | Content of the record |
curl -X POST "https://ipv64.net/api.php" -H "Authorization: Bearer YOUR_API_KEY" \
-d "add_record=yourdomain.ipv64.net" -d "praefix=nas" -d "type=A" -d "content=192.0.2.20"
If you add ?gettoken to the URL (https://ipv64.net/api.php?gettoken), the response also contains record_token – the record token for the update URL.
Errors: 400 with dns record already there, invalid record informations, domain not found or record rejected by nameserver.
Let's Encrypt DNS-01: ACME clients create _acme-challenge TXT records. If they guess the zone wrong (e.g. add_record=_acme-challenge.example.de for your own domain example.de), the API puts domain and prefix back together based on your existing domains. The longest matching domain of your account is always used.
del_record (DELETE)
Deletes a record either by its ID (from get_domains) or by domain, prefix, type and content:
curl -X DELETE "https://ipv64.net/api.php" -H "Authorization: Bearer YOUR_API_KEY" \
-d "del_record=1234"
curl -X DELETE "https://ipv64.net/api.php" -H "Authorization: Bearer YOUR_API_KEY" \
-d "del_record=yourdomain.ipv64.net" -d "praefix=_acme-challenge" -d "type=TXT" -d "content=TOKEN_FROM_ACME_CLIENT"
Success: 202; not found or no permission: 403.
Health checks and notifications
You manage the health checks together with notification channels, maintenance windows and nodes through API v2 under /api/v2/hc2/… – create, change, pause and delete checks, query measurements and incidents. All endpoints with curl examples are listed under Health checks API.
A cron job that only needs to report in does not need the API: a push check has its own push URL with its token (see Push checks).
In addition, API v1 returns your blocker nodes for the v64 blocklist with get_blockers (GET).
Cloud Router and VPN
| Action | Method | Parameters and effect |
|---|---|---|
get_cr_all | GET | All Cloud Routers with gateways and peers in one nested list (including the peers’ WireGuard keys). |
get_cloudrouters | GET | Cloud Routers with server and location. |
get_gateways | GET | All gateways with status, addresses, WireGuard port and traffic. |
get_peers | GET | All peers with addresses, keys, traffic and last handshake. |
get_cr_server | GET | Public Cloud Router servers with location and status. |
add_router | POST | vr=0 (or without vr) creates a new Cloud Router; vr=ROUTER_ID adds a gateway to that router. Limit reached: 403. |
add_gateway_peer | POST | Token of the gateway; creates a peer there. |
del_peer | DELETE | Delete a peer |
del_vpn_gw | DELETE | Token of the gateway; deletes the gateway with all peers. |
What Cloud Routers, gateways and peers are is explained on the Cloud Router page.
API v2
Besides API v1 there is API v2: a RESTful JSON API at https://ipv64.net/api/v2 for DynDNS, DNS records, health checks, DNS failover, status pages, offline pages, CDN64, Cloud Router and DNS64. The main differences:
- real resource paths and HTTP methods (GET, POST, PATCH, DELETE), JSON bodies,
- authentication with the same API keys, but only via header (
Authorization: Bearer …orX-API-Key: …), - uniform errors according to RFC 9457 with an error code, cursor-based paging,
- its own limits against overload, independent of your account class’s API limit, with the headers
RateLimit-LimitandRateLimit-Remaining, - a complete OpenAPI 3.1 description for import into Postman, Insomnia or code generators.
curl "https://ipv64.net/api/v2/me" -H "Authorization: Bearer YOUR_API_KEY"
The full documentation with all endpoints is at ipv64.net/api_v2_docs. API v1 and the update URL stay unchanged.
Found a mistake or missing something? Tell us in the v64.tech forum. · Updated: 2026-10-26