API documentation - Domain API for resellers: REST instead of EPP
Check, register and transfer domains and manage DNS with JSON over HTTPS and an API key in the header. No EPP library, no persistent TLS session, no XML schemas.
Basics
All endpoints live under https://domain-reseller-api.de/api/v1. You authenticate with your API key as a bearer token; you create the key in the dashboard after signing up for free.
Authorization: Bearer drapi_xxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxEvery response is JSON with a success flag, the payload in data and, on errors, a message in error, along with matching HTTP status codes. The rate limit is 1000 requests per minute, and 500 per minute for domain checks.
Sandbox
With the header x-sandbox: true or the path prefix /api/v1/sandbox/…, every request runs in the sandbox: no real registrations, no charges, no DNS changes. That way you can test your integration end to end before it goes live.
If you want to rule out live actions at a technical level, for example when developing with AI tools, create a key with the Sandbox only option in the dashboard. It always runs in the sandbox, whatever header or path is sent, and can only reach domains, DNS, contacts and pricing, not live data such as wallet balance, transactions or webhooks. Like any sandbox request, it can trigger webhook events (e.g. domain.updated) to the webhooks you have set up, so you can test your receiver.
Permissions
Every API key has permissions: * for full access, *:read for read-only access, or scoped per area, e.g. domains:write and dns:read. If a permission is missing, the API responds with 403. Managing API keys is not covered by *:read and *:write, and sandbox-only keys never have access to it. A *:read key also cannot see auth codes, because they can be used to transfer a domain away.
Grouping domains
Assign domains to end customers or projects with tags, e.g. customer-miller or project:shop. A domain can carry up to 20 tags; filter the domain list with GET /domains?tag=customer-miller.
Examples
Domain check
A single GET returns availability, premium status and the net prices for registration, renewal and transfer.
curl -H "Authorization: Bearer $DRAPI_KEY" \
https://domain-reseller-api.de/api/v1/domains/check/example.deDomain transfer
Pass the domain and the auth code from your current provider. The domain.transferred webhook tells you when the transfer is complete.
curl -X POST -H "Authorization: Bearer $DRAPI_KEY" \
-H "Content-Type: application/json" \
-d '{"domain": "example.com", "authCode": "Xy7!pQ2#", "contacts": {"owner": "HANDLE-123"}}' \
https://domain-reseller-api.de/api/v1/domains/transferCreate a DNS record
You create records one at a time; @ stands for the zone apex.
curl -X POST -H "Authorization: Bearer $DRAPI_KEY" \
-H "Content-Type: application/json" \
-d '{"type": "A", "name": "@", "content": "203.0.113.10", "ttl": 3600}' \
https://domain-reseller-api.de/api/v1/dns/example.de/recordsRegister a webhook
One URL, as many events as you need.
curl -X POST -H "Authorization: Bearer $DRAPI_KEY" \
-H "Content-Type: application/json" \
-d '{"url": "https://example.com/hooks/domains", "events": ["domain.registered", "domain.expiry_warning"]}' \
https://domain-reseller-api.de/api/v1/webhooksEndpoints
This overview shows the most important endpoints, with paths relative to /api/v1. All fields, response schemas and error codes are listed in the OpenAPI reference.
Domains
Check availability, register, transfer, renew and delete: the complete lifecycle of a domain.
| GET | /domains/check/:domain | Availability, premium status and price of a domain |
| POST | /domains/check | Bulk check for up to 50 domains per request |
| GET | /domains/suggest | Available domain suggestions for a search term across all TLDs |
| POST | /domains/register | Register a domain, optionally with term and nameservers |
| POST | /domains/transfer | Transfer a domain to us with its auth code |
| GET | /domains | List all domains in your account, filterable via ?tag=customer-a,project-x |
| GET | /domains/tags | All tags in use with their domain count |
| PUT | /domains/:domain/tags | Set the tags of a domain (end customer, project, …) |
| POST | /domains/:domain/tags | Add tags to a domain |
| DELETE | /domains/:domain/tags/:tag | Remove a single tag |
| GET | /domains/:domain | Details, status and expiry date of a domain |
| PATCH | /domains/:domain | Change nameservers and settings |
| PATCH | /domains/:domain/contacts | Change the owner, admin, tech and billing contact |
| GET | /domains/:domain/authcode | Auth code for a transfer to another provider |
| GET | /domains/:domain/dnssec | Get the DNSSEC status |
| PUT | /domains/:domain/dnssec | Set DNSSEC keys |
| DELETE | /domains/:domain | Delete a domain or cancel it at the end of its term |
| POST | /domains/:domain/restore | Restore a deleted domain from the redemption period |
| POST | /domains/:domain/trade | Owner change of a .eu domain (trade) |
| POST | /domains/:domain/hold | Put a .de domain on hold or release it |
Contacts (handles)
Create owner and admin details once as a contact handle and reuse it for as many domains as you like. The organisation is only required for the types organization and role: you create private individuals (person) without one, and the house number is optional. Send an empty string via PATCH to remove either.
| GET | /contacts | List all contact handles |
| POST | /contacts | Create a contact handle for a person or organisation |
| GET | /contacts/:handle | Get a contact handle |
| PATCH | /contacts/:handle | Update a contact handle |
| DELETE | /contacts/:handle | Delete a contact handle that is no longer in use |
Managed DNS
DNS zones on our anycast nameservers: for your own domains or as a standalone zone for domains registered elsewhere.
| POST | /dns/:domain/enable | Enable Managed DNS for a domain |
| GET | /dns/:domain | Get all records of a zone |
| POST | /dns/:domain/records | Create a record (A, AAAA, CNAME, MX, TXT, SRV, CAA …) |
| PATCH | /dns/:domain/records/:recordId | Update a record |
| DELETE | /dns/:domain/records/:recordId | Delete a record |
| GET | /dns/:domain/export | Export a zone as a zone file |
| POST | /dns/:domain/import | Import a zone file |
| POST | /dns/zones | Create a standalone zone for an external domain |
Webhooks
Instead of polling for status, you receive an HTTP request as soon as something happens.
| GET | /webhooks/events | All available events |
| POST | /webhooks | Register a webhook URL for selected events |
| PATCH | /webhooks/:id | Update a webhook |
| POST | /webhooks/:id/test | Send a test event |
| GET | /webhooks/:id/logs | View the delivery log |
Pricing
Public endpoints without an API key: ideal for keeping your own price list up to date automatically.
| GET | /pricing | Current net prices for all TLDs or a single TLD (?tld=de) |
| GET | /pricing/changes | Recent price changes |
Webhook events
domain.registered— Domain registered successfullydomain.transferred— Transfer completeddomain.transfer_failed— Transfer faileddomain.expiry_warning— 30, 7 and 1 day before expirydomain.expired— Domain expireddomain.deleted— Domain deleteddomain.restored— Domain restoreddomain.updated— Nameservers, DNSSEC or contacts changeddomain.traded— Owner change of a .eu domain completeddomain.held / domain.unheld— .de domain put on hold or releasedwallet.low_balance— Wallet balance below the thresholdwallet.deposit— Wallet topped up
Pricing via the API
The domain check always includes the price. You'll find an overview of all extensions in the price list, for example for .de, .com, .eu, .net, .org, .at.
Your API key in under two minutes
Sign up for free, with no base fee and no minimum volume.