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_xxxxxxxxxxxxxxxxxxxxxx

Every 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.de

Domain 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/transfer

Create 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/records

Register 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/webhooks

Endpoints

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/:domainAvailability, premium status and price of a domain
POST/domains/checkBulk check for up to 50 domains per request
GET/domains/suggestAvailable domain suggestions for a search term across all TLDs
POST/domains/registerRegister a domain, optionally with term and nameservers
POST/domains/transferTransfer a domain to us with its auth code
GET/domainsList all domains in your account, filterable via ?tag=customer-a,project-x
GET/domains/tagsAll tags in use with their domain count
PUT/domains/:domain/tagsSet the tags of a domain (end customer, project, …)
POST/domains/:domain/tagsAdd tags to a domain
DELETE/domains/:domain/tags/:tagRemove a single tag
GET/domains/:domainDetails, status and expiry date of a domain
PATCH/domains/:domainChange nameservers and settings
PATCH/domains/:domain/contactsChange the owner, admin, tech and billing contact
GET/domains/:domain/authcodeAuth code for a transfer to another provider
GET/domains/:domain/dnssecGet the DNSSEC status
PUT/domains/:domain/dnssecSet DNSSEC keys
DELETE/domains/:domainDelete a domain or cancel it at the end of its term
POST/domains/:domain/restoreRestore a deleted domain from the redemption period
POST/domains/:domain/tradeOwner change of a .eu domain (trade)
POST/domains/:domain/holdPut 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/contactsList all contact handles
POST/contactsCreate a contact handle for a person or organisation
GET/contacts/:handleGet a contact handle
PATCH/contacts/:handleUpdate a contact handle
DELETE/contacts/:handleDelete 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/enableEnable Managed DNS for a domain
GET/dns/:domainGet all records of a zone
POST/dns/:domain/recordsCreate a record (A, AAAA, CNAME, MX, TXT, SRV, CAA …)
PATCH/dns/:domain/records/:recordIdUpdate a record
DELETE/dns/:domain/records/:recordIdDelete a record
GET/dns/:domain/exportExport a zone as a zone file
POST/dns/:domain/importImport a zone file
POST/dns/zonesCreate 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/eventsAll available events
POST/webhooksRegister a webhook URL for selected events
PATCH/webhooks/:idUpdate a webhook
POST/webhooks/:id/testSend a test event
GET/webhooks/:id/logsView the delivery log

Pricing

Public endpoints without an API key: ideal for keeping your own price list up to date automatically.

GET/pricingCurrent net prices for all TLDs or a single TLD (?tld=de)
GET/pricing/changesRecent price changes

Webhook events

  • domain.registered — Domain registered successfully
  • domain.transferred — Transfer completed
  • domain.transfer_failed — Transfer failed
  • domain.expiry_warning — 30, 7 and 1 day before expiry
  • domain.expired — Domain expired
  • domain.deleted — Domain deleted
  • domain.restored — Domain restored
  • domain.updated — Nameservers, DNSSEC or contacts changed
  • domain.traded — Owner change of a .eu domain completed
  • domain.held / domain.unheld — .de domain put on hold or released
  • wallet.low_balance — Wallet balance below the threshold
  • wallet.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.