Transfer a domain
This guide walks you through transferring a domain to OpusDNS from another registrar, including preparation, monitoring, and handling edge cases. It also covers outbound transfers — approving or rejecting a transfer of a domain away from OpusDNS.
Flow overview
- Prepare the domain at the current registrar (unlock, get auth code).
- Create or select contacts.
- Start the transfer with
POST /v1/domains/transfer. - Monitor the transfer status.
- Handle completion or cancel if needed.
Before you begin
Transferring a domain involves coordination between the losing registrar (where the domain currently lives) and OpusDNS (the gaining registrar). A few things must be true before you can start:
- The domain must be unlocked at the current registrar (no
clientTransferProhibitedstatus). - You need the auth code (also called EPP code or transfer key) from the current registrar.
- The domain must have been registered for at least 60 days (ICANN policy for most gTLDs).
- The domain must not have been transferred within the last 60 days.
- The domain must not be in a redemption or pending delete state.
Transfer policies vary by TLD. Some ccTLDs (country-code domains) have different requirements. Check the TLD specifications for specifics.
1. Collect the auth code
Contact your current registrar to obtain the domain's authorization code. This code proves you have the right to transfer the domain.
- Most registrars provide this through their control panel or support team.
- Auth codes typically expire after a set period (often 5–14 days).
-
Some TLDs use alternative transfer mechanisms — see
.uk operations for
.ukreleases and .eu operations / .be operations for auth code requests.
2. Prepare contacts
Most transfers require contacts alongside renewal_mode. You can
reuse existing contacts or create new ones with POST /v1/contacts.
The contacts section is optional for TLDs that do not require any contacts to be supplied for an inbound transfer (i.e. every supported contact role has a minimum of 0 in the TLD specification, for example .ca and .ch). For those TLDs you can omit contacts entirely. TLDs that require one or more contact roles still reject transfers submitted without them.
curl "$OPUSDNS_API_BASE/v1/contacts" \
--request POST \
--header "X-Api-Key: $OPUSDNS_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"first_name": "Jane",
"last_name": "Smith",
"email": "jane@example.com",
"phone": "+49.1234567890",
"street": "Musterstraße 1",
"city": "Berlin",
"postal_code": "10115",
"country": "DE",
"org": "Example GmbH"
}'
Check which contact roles the TLD requires before submitting the transfer. See TLD specifications.
3. Start the transfer
Use POST /v1/domains/transfer to initiate the inbound transfer:
curl "$OPUSDNS_API_BASE/v1/domains/transfer" \
--request POST \
--header "X-Api-Key: $OPUSDNS_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"name": "example.com",
"auth_code": "xK9#mP2$vL5nQ8wR",
"contacts": {
"registrant": "contact_01h45ytscbebyvny4gc8cr8ma2",
"admin": "contact_01h45ytscbebyvny4gc8cr8ma2",
"tech": "contact_01h45ytscbebyvny4gc8cr8ma2",
"billing": "contact_01h45ytscbebyvny4gc8cr8ma2"
},
"renewal_mode": "renew",
"period": {
"unit": "y",
"value": 1
},
"nameservers": [
{ "hostname": "ns1.example.net" },
{ "hostname": "ns2.example.net" }
],
"create_zone": true
}'
Request fields
| Field | Required | Description |
|---|---|---|
name |
Yes | The fully qualified domain name to transfer (e.g., example.com). |
auth_code |
Yes | The authorization code from the current registrar. |
contacts |
Conditional | Contact IDs keyed by role. Required for most TLDs (a registrant is the minimum). Optional for TLDs where every supported contact role has a minimum of 0 (e.g. .ca, .ch). |
renewal_mode |
Yes | "renew" for automatic renewal or "expire" to let the domain expire. |
period |
No | Additional registration period added on transfer completion. If omitted, the registry default policy applies. |
nameservers |
No | Nameservers to set after transfer completes. If omitted, the existing nameservers from the previous registrar are imported. See Nameservers for the OpusDNS nameserver hostnames. Hostnames subordinate to a domain in your account must exist as host objects first. |
create_zone |
No | Set to true to provision a DNS zone on OpusDNS nameservers after transfer. |
expected_price |
No | Price confirmation for premium domains. |
attributes |
No | Registry-specific attributes required by certain TLDs. |
Registration period behavior
The period field in transfer requests works differently from registrations:
- Provided: The specified period is added to the domain's existing expiry date upon transfer completion. Most gTLDs add 1 year by default.
- Omitted: The registry's default transfer policy applies. For most gTLDs, this adds 1 year to the current expiry.
4. Monitor the transfer
The initial response is a DomainResponse with a pendingTransfer status.
Transfers do not complete instantly — they require registry processing and
potentially approval from the losing registrar.
Check the transfer status
Poll the domain to see the current state:
curl "$OPUSDNS_API_BASE/v1/domains/example.com" \
--header "X-Api-Key: $OPUSDNS_API_KEY"
Transfer timeline
| Phase | Duration | What happens |
|---|---|---|
| Initiated | Immediate | OpusDNS sends the transfer request to the registry. |
| Pending | 1–5 days | The losing registrar can approve or reject. If no action, auto-approval kicks in (for most gTLDs). |
| Completed | After approval | The domain moves to OpusDNS. Status changes to ok. |
| Failed | Varies | Auth code invalid, domain locked, or losing registrar rejected. |
Some TLDs complete the transfer instantly without a pending period. For example, .de domains are transferred immediately — once the transfer request is submitted with a valid auth code, the domain moves to your account right away with no approval wait time.
Monitor via events
You can also track transfer progress through the events system:
curl --get "$OPUSDNS_API_BASE/v1/events" \
--header "X-Api-Key: $OPUSDNS_API_KEY" \
--data-urlencode "object_type=DOMAIN" \
--data-urlencode "type=TRANSFER"
Events will notify you when the transfer succeeds or fails. See the Events overview for details.
5. Cancel if needed
If a transfer must be stopped while it is still pending, use
DELETE /v1/domains/{domain_reference}/transfer:
curl "$OPUSDNS_API_BASE/v1/domains/example.com/transfer" \
--request DELETE \
--header "X-Api-Key: $OPUSDNS_API_KEY"
This cancels the in-progress transfer and removes the domain object from your
account. Cancellation is only possible while the transfer is in pendingTransfer
status — once the registry completes the transfer, it cannot be reversed through
the API.
What happens after a successful transfer
Once the transfer completes:
- The domain no longer has status
pendingTransfer— it transitions to its normal state. - The expiry date is extended by the transfer period (typically 1 year).
- Contacts are set to those provided in the transfer request.
- Nameservers are updated if provided, otherwise the existing nameservers are imported from the previous registrar.
- A DNS zone is created if
create_zonewas set totrue. - Registry DNSSEC data is reconciled automatically: if the domain ends up on OpusDNS nameservers, stale DS records imported from the previous provider are removed or replaced so DNS resolution is not disrupted. Domains on external nameservers are left untouched. See Automatic DNSSEC reconciliation.
- A transfer event is created (check
/v1/events).
Outbound transfers
When another registrar initiates a transfer of a domain out of your
account, the domain enters pendingTransfer status. As the losing side you
can resolve the pending transfer explicitly with
POST /v1/domains/{domain_reference}/transfer/outbound:
curl "$OPUSDNS_API_BASE/v1/domains/example.com/transfer/outbound" \
--request POST \
--header "X-Api-Key: $OPUSDNS_API_KEY" \
--header "Content-Type: application/json" \
--data '{ "action": "approve" }'
| Field | Required | Description |
|---|---|---|
action |
Yes | "approve" to release the domain to the gaining registrar, or "reject" to deny the transfer and keep the domain. |
A few things to know:
- Approving acknowledges the transfer at the registry — it does not complete it. The domain remains in your account until the registry confirms the transfer has completed; only then is it removed and its subscription ended.
- Rejecting denies the request and the domain stays in your account unchanged.
- If you do nothing, most gTLD registries auto-approve the transfer after the pending period (typically 5 days).
-
The domain must currently have a pending outbound transfer; otherwise the
request fails with
400. -
Explicit resolution is only available for TLDs whose registry allows the
losing registrar to act on transfers. For other TLDs the request fails with
422.
Troubleshooting
Common transfer failures
| Issue | Cause | Resolution |
|---|---|---|
| Invalid auth code | The code is wrong or has expired. | Get a fresh auth code from the current registrar. |
| Domain is locked | clientTransferProhibited is set at the losing registrar. |
Ask the current registrar to unlock the domain. |
| Transfer rejected | The losing registrar or registrant rejected the transfer. | Confirm consent with the domain owner and retry. |
| Domain too new | The domain was registered less than 60 days ago. | Wait until the 60-day period has passed. |
| Recent transfer | The domain was transferred within the last 60 days. | Wait until 60 days have passed since the last transfer. |
TLD-specific transfer mechanisms
Not all TLDs follow the standard auth-code-based transfer process:
- .uk domains require a registrar tag change (release). See .uk operations.
- .eu / .be domains have specific auth code request endpoints. See .eu operations and .be operations.
Next steps
- Manage a domain — update settings after transfer
- Managing DNSSEC — configure DNSSEC on your transferred domain
- Events overview — track transfer events

