API Documentation - V2

Authentication: This API supports two authentication methods: Each endpoint says whether it takes an API key, and which permission the key needs. Session only endpoints refuse API keys; No login needed endpoints work without either.
Errors: every error has the same shape. The HTTP status gives the kind of error (for example 400 wrong input, 401 not logged in, 403 not allowed, 404 not found), code the exact reason. Each endpoint lists its codes under Possible Errors.
{
  "error": {
    "code": "AUTH_003",
    "message": "User not logged in"
  }
}
When parameters are wrong (INPUT_001), the error also lists them in invalid_params, and some endpoints add fields: each field with its error keys.
{
  "error": {
    "code": "INPUT_001",
    "message": "Invalid phone number",
    "fields": {
      "phone_number": ["phone.constraint.invalid"]
    }
  }
}

API Key Configuration

Enter your API key here to use it for all test requests. The key will be saved in your browser.

/contacts

GET/contacts

API key OK Needs contacts.view.

Description: List your contacts. phone_number is the national number without the country code, and ready_tlds lists the extensions for which the contact already has its registry-specific information. API keys need contacts.view.

Parameters & Try It Out:

ParameterTypeDescriptionValidationTest Value
pageIntegerPage number for paginationMin: 1
itemsPerPageIntegerNumber of items per pageMin: 1, Max: 100
paginationBooleanEnable or disable pagination-
sort_byStringField to sort by. Currently only supports "id". Default is "id"One of: id
sort_orderStringSort order - accepts "ASC" or "DESC" (case-insensitive). Default is "ASC"One of: ASC, DESC, asc, desc
searchStringSearch contacts by first name, last name, company name, or full name combinationsMin: 1, Max: 255

Possible Errors:

AUTH_002User session has expired
AUTH_003User is not logged in
AUTH_0042FA authentication not complete
AUTH_006API key lacks required permission: contacts.view
DB_001Database error occurred while fetching contacts

GET/contacts/{id}

API key OK Needs contacts.view.

Description: Get one contact, in the same format as GET contacts: phone_number is the national number without the country code, and ready_tlds lists the extensions for which the contact already has its registry-specific information. Admins can get any user's contact. API keys need contacts.view.

Parameters & Try It Out:

ParameterTypeDescriptionValidationTest Value
id *
(Path Parameter)
IntegerID of the contactRequired Integer

Possible Errors:

AUTH_002User session has expired
AUTH_003User is not logged in
AUTH_0042FA authentication not complete
AUTH_006API key lacks required permission: contacts.view
CONTACT_NOT_FOUNDContact not found
DB_001Database error occurred while fetching contact
INPUT_001Invalid contact ID

POST/contacts

API key OK Needs contacts.create.

Description: Create a new contact for the current user. API keys need contacts.create.

Parameters & Try It Out:

ParameterTypeDescriptionValidationTest Value
first_name *StringContact first nameMin: 1, Max: 100
last_name *StringContact last nameMin: 1, Max: 100
company_nameStringCompany name (optional)Max: 200
email *EmailContact email addressMax: 255
phone_number *StringPhone number as a string: national digits, or the country calling code followed by the national digits (for example 390212345678). Without + or 00.Custom: phoneCountryValidation
vat_numberStringVAT number (validated via VIES for EU countries)Max: 50
is_defaultBooleanSet as default contact-
address.address_line_first *StringPrimary address lineMin: 1, Max: 255
address.address_line_secondStringSecondary address line (optional)Max: 255
address.address_line_thirdStringThird address line (optional)Max: 255
address.city *StringCity nameMin: 1, Max: 100
address.postal_codeStringPostal/ZIP code (required only when country has postal codes; validated against country format when applicable)Max: 20
address.stateStringState or province (optional)Max: 100
address.country_id *IntegerCountry ID from countries tableMin: 1

Possible Errors:

AUTH_002User session has expired
AUTH_003User is not logged in
AUTH_0042FA authentication not complete
AUTH_006API key lacks required permission: contacts.create
DB_001Database error occurred while creating contact
FIELD_COUNTRY_001Country ID not found in database
FIELD_PHONE_001Phone number format invalid for the specified country
FIELD_POSTAL_001Postal code format invalid for the specified country
FIELD_VAT_001VAT number validation failed via VIES API (EU countries only)
INPUT_001Invalid input data - returns field-specific errors in response body
Field Validation Error Response Format:

When field validation fails (error code INPUT_001), the response includes field-specific error details:

{
    "error": {
        "code": "INPUT_001",
        "message": "Invalid phone number",
        "fields": {
            "phone_number": [
                "phone.constraint.invalid"
            ]
        }
    }
}

Validation Details:

PATCH/contacts/{id}

API key OK Needs contacts.modify.

Description: Change a contact's email, phone number, VAT number, address or default setting; the country can't be changed (create a new contact instead). A new VAT number or postal code recalculates the contact's VAT percentage and type. If the contact is registered at a domain registry, the change is sent there too; if the registry refuses it, nothing is saved. API keys need contacts.modify.

Parameters & Try It Out:

ParameterTypeDescriptionValidationTest Value
id *
(Path Parameter)
IntegerID of the contactRequired Integer
emailEmailUpdate email addressMax: 255
phone_numberStringPhone number as a string: national digits, or the country calling code followed by the national digits (for example 390212345678). Without + or 00.Max: 20
vat_numberStringUpdate VAT numberMax: 50
is_defaultBooleanSet as default contact-
address.address_line_firstStringUpdate primary address lineMin: 1, Max: 255
address.address_line_secondStringUpdate secondary address lineMax: 255
address.address_line_thirdStringUpdate third address lineMax: 255
address.cityStringUpdate cityMin: 1, Max: 100
address.postal_codeStringUpdate postal/ZIP code (required only for countries with postal codes)Max: 20
address.stateStringUpdate state or provinceMax: 100

Possible Errors:

AUTH_002User session has expired
AUTH_003User is not logged in
AUTH_0042FA authentication not complete
AUTH_006API key lacks required permission: contacts.modify
CONTACT_NOT_FOUNDContact not found
CONTACT_NOT_OWNEDYou do not have permission to update this contact
DB_001Database error occurred while updating contact
INPUT_001Invalid contact ID, phone number or postal code (field errors in the response), or a country change
REG_001Domain registry API error occurred
REG_002Failed to update contact at domain registry
REG_003Contact is not synchronized with registry
REG_004Contact data does not meet domain registry requirements
Automatic Behaviors:
Example Request:
{
    "vat_number": "DE123456789",
    "company_name": "New Company GmbH",
    "address": {
        "country_id": 81
    }
}

PATCH/contacts/{id}/required_info

API key OK Needs contacts.required_info.

Description: Add registry-specific required information to a contact. Use GET /tlds/required_info first to see which fields are needed; fields not listed there are filled in automatically. The information is checked at the registry: if that fails, nothing is saved and field errors are returned (INPUT_002). API keys need contacts.required_info.

Request Body & Try It Out:

ParameterTypeDescriptionValidationTest Value
id *
(Path Parameter)
IntegerID of the contactRequired Integer
registry *
(Request Body)
StringRegistry name (e.g., "Esnic", "Tci", "IisSe")Required String
tld *
(Request Body)
StringTop-level domain (e.g., ".es", ".tk", ".se")Required String
properties
(Request Body)
ObjectRegistry-specific fields as key-value pairs. The required fields vary by registry and TLD. Some fields may be auto-generated based on contact country and type. Use GET /tlds/required_info to check what fields are required for your specific case. Leave empty if all fields are auto-generated.
Example: {"RegistryName.fieldName":"value"}
Object
person
(Request Body)
StringOnly when GET /tlds/required_info returns contact_roles.person: "contact_person" (default) uses the holder's contact person without the organization; a contact ID uses that private-person contact of the same user. The person's fields go in properties with their PrivatePerson suffix.String

Possible Errors:

AUTH_002User session has expired
AUTH_003User is not logged in
AUTH_0042FA authentication not complete
AUTH_006API key lacks required permission: contacts.required_info
CONTACT_NOT_FOUNDContact not found
DB_001Database error occurred while updating required info
INPUT_001Invalid contact ID or JSON format
INPUT_002Missing required fields, field validation errors, or invalid registry/TLD combination. Returns structured field errors in response body
REG_001Failed to update contact at registry or registry validation failed
REG_003Contact is not synchronized with registry
REG_004Field validation failed - invalid format
REG_005Contact already has all required properties for this registry
REG_006Contact type (individual/organization) does not meet domain requirements

DELETE/contacts/{id}

API key OK Needs contacts.delete.

Description: Delete a specific contact by ID. API keys need contacts.delete.

Parameters & Try It Out:

ParameterTypeDescriptionValidationTest Value
id *
(Path Parameter)
IntegerID of the contactRequired Integer

Possible Errors:

AUTH_002User session has expired
AUTH_003User is not logged in
AUTH_0042FA authentication not complete
AUTH_006API key lacks required permission: contacts.delete
CONTACT_DEFAULTCannot delete default contact
CONTACT_HAS_DOMAINSCannot delete contact with active domain names
CONTACT_NOT_FOUNDContact not found
CONTACT_NOT_OWNEDYou do not have permission to delete this contact
DB_001Database error occurred while deleting contact
INPUT_001Invalid contact ID

/countries

GET/countries

No login needed

Description: Get all countries, sorted by country code by default. callingCode is the international calling code as a number, without + or 00 (31 for NL). vatPercentage is the VAT rate in percent and may have decimals.

Parameters & Try It Out:

ParameterTypeDescriptionValidationTest Value
pageIntegerPage number for paginationMin: 1
itemsPerPageIntegerNumber of items per pageMin: 1, Max: 100
paginationBooleanEnable or disable pagination-
sort_byStringField to sort by. Options: "id", "countryCode". Default is "countryCode"One of: id, countryCode
sort_orderStringSort order - accepts "ASC" or "DESC" (case-insensitive). Default is "ASC"One of: ASC, DESC, asc, desc
searchStringSearch for exact country code match (e.g., "NL", "SG", "US"). Must be exactly 2 characters. Case-insensitive.-

Possible Errors:

DB_001Database error occurred while fetching countries

GET/countries/{id}

No login needed

Description: Get a specific country by ID

Parameters & Try It Out:

ParameterTypeDescriptionValidationTest Value
id *
(Path Parameter)
IntegerID of the countryRequired Integer

Possible Errors:

COUNTRY_001Country not found
DB_001Database error occurred while fetching country

/dns_templates

GET/dns_templates

API key OK Needs dns_templates.view.

Description: Get DNS templates for the authenticated user. Returns templates with integer domain IDs and public DNS records only. API keys need dns_templates.view.

Try It Out:

Possible Errors:

AUTH_002User session has expired
AUTH_003User is not logged in
AUTH_0042FA authentication not complete
AUTH_006API key lacks required permission: dns_templates.view
DB_001Database error occurred while fetching DNS templates

GET/dns_templates/{id}

API key OK Needs dns_templates.view.

Description: Get a single DNS template by ID. Returns integer domain IDs and public DNS records only. API keys need dns_templates.view.

Parameters & Try It Out:

ParameterTypeDescriptionValidationTest Value
id *
(Path Parameter)
IntegerID of the dns templateRequired Integer

Possible Errors:

AUTH_002User session has expired
AUTH_003User is not logged in
AUTH_0042FA authentication not complete
AUTH_006API key lacks required permission: dns_templates.view
DNS_TEMPLATE_001DNS template not found

POST/dns_templates

API key OK Needs dns_templates.modify.

Description: Create a DNS template for the authenticated user. Applies application-host default DNS records. domain_names must be an array of integer domain IDs owned by the user. API keys need dns_templates.modify.

Parameters & Try It Out:

ParameterTypeDescriptionValidationTest Value
nameStringName field-
domain_namesStringParameter value-

Possible Errors:

AUTH_002User session has expired
AUTH_003User is not logged in
AUTH_0042FA authentication not complete
AUTH_006API key lacks required permission: dns_templates.modify
DNS_TEMPLATE_003A DNS template with this name already exists
DNS_TEMPLATE_004One or more domains are invalid or not owned by the user
DNS_TEMPLATE_005DNS template validation failed
INPUT_001Invalid payload shape or data types

PATCH/dns_templates/{id}

API key OK Needs dns_templates.modify.

Description: Update DNS template metadata (name and/or linked domains). domain_names must be an array of integer domain IDs owned by the user. Does not modify dns_records. API keys need dns_templates.modify.

Parameters & Try It Out:

ParameterTypeDescriptionValidationTest Value
id *
(Path Parameter)
IntegerID of the dns templateRequired Integer
nameStringName field-
domain_namesStringParameter value-

Possible Errors:

AUTH_002User session has expired
AUTH_003User is not logged in
AUTH_0042FA authentication not complete
AUTH_006API key lacks required permission: dns_templates.modify
DNS_TEMPLATE_001DNS template not found
DNS_TEMPLATE_003A DNS template with this name already exists
DNS_TEMPLATE_004One or more domains are invalid or not owned by the user
DNS_TEMPLATE_005DNS template validation failed
INPUT_001Invalid payload shape or data types

PATCH/dns_templates/{id}/update_dns_records

API key OK Needs dns_templates.modify.

Description: Replace DNS records of a DNS template. Uses the same DNS validation/normalization logic as PATCH /domain_names/{id}/dns_records and preserves %domain% placeholders. Returns public records only. API keys need dns_templates.modify.

Parameters & Try It Out:

ParameterTypeDescriptionValidationTest Value
id *
(Path Parameter)
IntegerID of the dns templateRequired Integer
dns_recordsStringParameter value-

Possible Errors:

AUTH_002User session has expired
AUTH_003User is not logged in
AUTH_0042FA authentication not complete
AUTH_006API key lacks required permission: dns_templates.modify
DNS_001DNS record validation failed. Check error.fields for indexed field details.
DNS_TEMPLATE_001DNS template not found
DNS_TEMPLATE_005DNS template validation failed
INPUT_001Invalid payload shape or data types

DELETE/dns_templates/{id}

API key OK Needs dns_templates.modify.

Description: Delete DNS template by ID. Domain links are cleared by database foreign-key constraints. API keys need dns_templates.modify.

Parameters & Try It Out:

ParameterTypeDescriptionValidationTest Value
id *
(Path Parameter)
IntegerID of the dns templateRequired Integer

Possible Errors:

AUTH_002User session has expired
AUTH_003User is not logged in
AUTH_0042FA authentication not complete
AUTH_006API key lacks required permission: dns_templates.modify
DNS_TEMPLATE_001DNS template not found

/domain_name_emails

GET/domain_name_emails

API key OK Needs domains.view.

Description: Get email addresses, forwarders, and catch-all addresses for owned regular and external domains. API keys need domains.view.

Parameters & Try It Out:

ParameterTypeDescriptionValidationTest Value
domain_name_idIntegerFilter by regular domain name IDMin: 1
domain_idIntegerAlias for domain_name_idMin: 1
external_domain_name_idIntegerFilter by external domain name IDMin: 1

Possible Errors:

AUTH_002User session has expired
AUTH_003User is not logged in
AUTH_0042FA authentication not complete
AUTH_006API key lacks required permission: domains.view
DB_001Database error occurred while fetching domain emails

GET/domain_name_emails/sync/process/{id}

API key OK Needs domains.email.sync.

Description: Get the status of a domain email sync process. API keys need domains.email.sync.

Parameters & Try It Out:

ParameterTypeDescriptionValidationTest Value
id *
(Path Parameter)
IntegerID of the processRequired Integer

Possible Errors:

AUTH_002User session has expired
AUTH_003User is not logged in
AUTH_0042FA authentication not complete
AUTH_006API key lacks required permission: domains.email.sync
DB_001Database error occurred while fetching sync process
GENERAL_001Sync process not found

GET/domain_name_emails/sync/processes

API key OK Needs domains.email.sync.

Description: List the sync processes of your mailboxes, newest first, in the same format as GET domain_name_emails/sync/process/{id}. API keys need domains.email.sync.

Parameters & Try It Out:

ParameterTypeDescriptionValidationTest Value
pageIntegerPage number (default 1)Min: 1
itemsPerPageIntegerProcesses per page (default 30)Min: 1, Max: 100
paginationBooleanfalse returns all processes on one page (default true)-

Possible Errors:

AUTH_002User session has expired
AUTH_003User is not logged in
AUTH_0042FA authentication not complete
AUTH_006API key lacks required permission: domains.email.sync
DB_001Database error occurred while fetching sync processes
INPUT_001Invalid page, itemsPerPage or pagination

POST/domain_name_emails

API key OK Needs domains.email.manage.

Description: Create a mailbox, forwarder, or catch-all address on a regular or external domain. Requires an active plan, active regular domain status, linked mail server, and available plan email quota. API keys need domains.email.manage.

Parameters & Try It Out:

ParameterTypeDescriptionValidationTest Value
domain_name_idIntegerRegular domain name ID. Provide exactly one of domain_name_id/domain_id or external_domain_name_id.Min: 1
domain_idIntegerAlias for domain_name_id.Min: 1
external_domain_name_idIntegerExternal domain name ID. Provide exactly one of domain_name_id/domain_id or external_domain_name_id.Min: 1
emailStringMailbox/forwarder source email. Required for mailbox and forwarder creation. For catch-all, omit this field; if provided, it is ignored and @domain.tld is derived from the selected domain.Max: 512
type *StringEmail entry type: email, forwarder, or catchall.One of: email, forwarder, catchall
passwordStringMailbox password. Required for type=email.-
targetStringForwarder/catch-all target. Must be an existing mailbox in the authenticated user account. Forwarders may use comma-separated targets.Max: 512

Possible Errors:

AUTH_002User session has expired
AUTH_003User is not logged in
AUTH_0042FA authentication not complete
AUTH_006API key lacks required permission: domains.email.manage
DB_001Database error occurred while creating domain email
INPUT_001Domain, plan, quota, or mail-server validation failed
INPUT_002Missing or invalid email fields

POST/domain_name_emails/{id}/sync

API key OK Needs domains.email.sync.

Description: Start an async mailbox import from the remote mailbox into the local mailbox. Returns HTTP 202 with sync_direction, local_mailbox, remote_mailbox, and process status details. API keys need domains.email.sync.

Parameters & Try It Out:

ParameterTypeDescriptionValidationTest Value
id *
(Path Parameter)
IntegerID of the domain name emailRequired Integer
local_password *StringPassword for the local destination mailbox.-
remote_mail_server *StringRemote IMAP mail server hostname.-
remote_email_address *StringRemote mailbox email address.-
remote_password *StringRemote mailbox password.-

Possible Errors:

AUTH_002User session has expired
AUTH_003User is not logged in
AUTH_0042FA authentication not complete
AUTH_006API key lacks required permission: domains.email.sync
DB_001Database error occurred while starting sync
GENERAL_001Domain email not found
INPUT_001Sync validation failed or another sync is already running
INPUT_002Missing or invalid sync fields

PATCH/domain_name_emails/{id}/change_target

API key OK Needs domains.email.manage.

Description: Change the target for a forwarder or catch-all address. API keys need domains.email.manage.

Parameters & Try It Out:

ParameterTypeDescriptionValidationTest Value
id *
(Path Parameter)
IntegerID of the domain name emailRequired Integer
target *StringNew forwarder or catch-all target email. Must be an existing mailbox in the authenticated user account. Forwarders may use comma-separated targets.Max: 512

Possible Errors:

AUTH_002User session has expired
AUTH_003User is not logged in
AUTH_0042FA authentication not complete
AUTH_006API key lacks required permission: domains.email.manage
DB_001Database error occurred while changing target
GENERAL_001Domain email or mail-server forwarding not found
INPUT_001Target change validation failed
INPUT_002Missing or invalid target

PATCH/domain_name_emails/{id}/change_password

API key OK Needs domains.email.manage.

Description: Change mailbox password. Forwarders and catch-all addresses are rejected. API keys need domains.email.manage.

Parameters & Try It Out:

ParameterTypeDescriptionValidationTest Value
id *
(Path Parameter)
IntegerID of the domain name emailRequired Integer
password *StringNew mailbox password. Must contain uppercase, lowercase, number, and at least 6 characters.-

Possible Errors:

AUTH_002User session has expired
AUTH_003User is not logged in
AUTH_0042FA authentication not complete
AUTH_006API key lacks required permission: domains.email.manage
DB_001Database error occurred while changing password
GENERAL_001Domain email or mail-server user not found
INPUT_001Password change validation failed
INPUT_002Missing or invalid password

DELETE/domain_name_emails/{id}

API key OK Needs domains.email.delete.

Description: Delete a mailbox, forwarder, or catch-all address. Mailbox deletion also creates a mail-server todo delete task. API keys need domains.email.delete.

Parameters & Try It Out:

ParameterTypeDescriptionValidationTest Value
id *
(Path Parameter)
IntegerID of the domain name emailRequired Integer

Possible Errors:

AUTH_002User session has expired
AUTH_003User is not logged in
AUTH_0042FA authentication not complete
AUTH_006API key lacks required permission: domains.email.delete
DB_001Database error occurred while deleting domain email
GENERAL_001Domain email not found

/domain_name_orders

GET/domain_name_orders

API key OK Needs domains.view.

Description: List the domain name orders that the sidebar currently shows as pending or with a problem, newest (highest ID) first. Each order has the same base fields as GET /domain_name_orders/{id}, without process attempts or live registry information. API keys need domains.view.

Parameters & Try It Out:

ParameterTypeDescriptionValidationTest Value
pageIntegerPage number for paginationMin: 1
itemsPerPageIntegerNumber of domain name orders per pageMin: 1, Max: 100
paginationBooleanEnable or disable pagination (default: true)-
Example Response:
[
    {
        "id": 123,
        "type": "domain_name_order",
        "status": "transfer_pending",
        "product": {
            "name": "Transfer"
        },
        "domain_name": "example.com"
    }
]

Possible Errors:

AUTH_002User session has expired
AUTH_003User is not logged in
AUTH_0042FA authentication not complete
AUTH_006API key lacks required permission: domains.view
DB_001Database error occurred while fetching domain name orders
INPUT_001Invalid input parameters

GET/domain_name_orders/{id}

API key OK Needs domains.view.

Description: Get one domain name order, if the sidebar shows it as pending or with a problem. process lists the registry attempts and, when available, the live state of the registry process with transfer details. API keys need domains.view.

Parameters & Try It Out:

ParameterTypeDescriptionValidationTest Value
id *
(Path Parameter)
IntegerID of the domain name orderRequired Integer
registry_process_idIntegerFetch live registry process information for this process ID. The process ID must belong to this domain name order. Defaults to the latest registry process ID for the order.Min: 1

Possible Errors:

AUTH_002User session has expired
AUTH_003User is not logged in
AUTH_0042FA authentication not complete
AUTH_006API key lacks required permission: domains.view
DB_001Database error occurred while fetching domain name order
GENERAL_001Domain name order not found
INPUT_001Invalid domain name order ID

PATCH/domain_name_orders/{id}/cancel

API key OK Needs domains.order.cancel.

Description: Cancel a pending domain name order (Registration or Transfer). Eligible statuses: awaiting_required_info and transfer_failed. Users can cancel their own orders, admins any order; a paid order is refunded to the owner's wallet with a credit invoice. API keys need domains.order.cancel.

Parameters & Try It Out:

ParameterTypeDescriptionValidationTest Value
id *
(Path Parameter)
IntegerID of the domain name orderRequired Integer
Example Response:
{
    "id": 829,
    "status": {
        "status": "cancelled"
    }
}

Possible Errors:

AUTH_002User session has expired
AUTH_003User is not logged in
AUTH_0042FA authentication not complete
AUTH_006API key lacks required permission: domains.order.cancel
DB_001Database error occurred while cancelling domain name order
GENERAL_001Domain name order not found
INPUT_001Invalid domain name order ID or the order is not cancellable

/domain_names

GET/domain_names/premium_quote

API key OK Needs domains.view.

Description: Get the price of a premium domain name for registration, transfer or renewal. Renewal requires authentication (API keys need domains.view) and ownership of the domain name. Returns the total price in cents excluding VAT, the currency, the period and a quote_id that stays valid until expires_at (7 days). For a regular domain name only domain_name and premium: false are returned (plus available).

Parameters & Try It Out:

ParameterTypeDescriptionValidationTest Value
domain_name *StringFull domain name, for example example.com. The extension must be offered by this website.-
actionStringregistration (default), transfer or renewal. Renewal requires ownership of the domain name.One of: registration, transfer, renewal
order_periodIntegerNumber of minimum registration periods of the extension (default 1). Premium domain names can be ordered for at most 3 years.Min: 1, Max: 5

Possible Errors:

AUTH_002User session has expired
AUTH_003Authentication required (renewal)
AUTH_004Two-factor authentication incomplete
AUTH_006Missing domains.view permission (renewal)
DOMAIN_NOT_AVAILABLEDomain name no longer available (registration) or not registered (transfer)
DOMAIN_NOT_FOUNDDomain not found or not owned by caller (renewal)
DOMAIN_PERIOD_NOT_ALLOWEDPeriod longer than 3 years or not offered for this domain name
INPUT_002Invalid domain name, action or period
REG_001Price temporarily unavailable; try again later

GET/domain_names/{id}/incoming_spam_filter

API key OK Needs domains.email.spam_filter.view.

Description: Get the incoming spam filter setting. Requires domains.email.spam_filter.view. Returns preset, enabled, status (applied, updating, failed, unknown or unavailable), can_change and a message that explains the status. While status is updating, read it again later.

Parameters & Try It Out:

ParameterTypeDescriptionValidationTest Value
id *
(Path Parameter)
IntegerID of the domain nameRequired Integer

Possible Errors:

AUTH_002User session has expired
AUTH_003Authentication required
AUTH_004Two-factor authentication incomplete
AUTH_006Missing domains.email.spam_filter.view permission
DOMAIN_NOT_FOUNDDomain not found or not owned by caller
INPUT_001Invalid domain ID

GET/domain_names

API key OK Needs domains.view.

Description: Get all domain names of the current user, with owner, extension, status, plan details (only your own plan) and is_premium (true for a premium domain name). Supports searching domain names and extensions (see search). API keys need domains.view.

Parameters & Try It Out:

ParameterTypeDescriptionValidationTest Value
pageIntegerPage number for paginationMin: 1
itemsPerPageIntegerNumber of items per pageMin: 1, Max: 100
paginationBooleanEnable or disable pagination-
statusStringFilter by domain statusMax: 32
searchStringSearch domain names and TLDs. Examples: "site" finds site.eu, "eu" finds all domains with "eu" in name or TLD, "ite.e" finds site.eu and site.es, ".nl" finds all .nl domains-
sort_byStringField to sort by. Valid options: id, registration_date, expiration_date, order_date, statusOne of: id, registration_date, expiration_date, order_date, status
sort_orderStringSort order. Valid options: asc (ascending) or desc (descending). Default: ascOne of: asc, desc, ASC, DESC

Possible Errors:

AUTH_002User session has expired
AUTH_003User is not logged in
AUTH_0042FA authentication not complete
AUTH_006API key lacks required permission: domains.view
DB_001Database error occurred while fetching domain names
INPUT_001Invalid input parameters

GET/domain_names/transferred_away

API key OK Needs domains.view.

Description: List your domain names that were transferred to another provider, last transfer first: domain_name, extension, expiry_date and transfer_date. API keys need domains.view.

Parameters & Try It Out:

ParameterTypeDescriptionValidationTest Value
pageIntegerPage number (default 1)Min: 1
itemsPerPageIntegerDomain names per page (default 30)Min: 1, Max: 100
paginationBooleanfalse returns all domain names on one page (default true)-

Possible Errors:

AUTH_002User session has expired
AUTH_003User is not logged in
AUTH_0042FA authentication not complete
AUTH_006API key lacks required permission: domains.view
DB_001Database error occurred while fetching transferred domain names
INPUT_001Invalid page, itemsPerPage or pagination

GET/domain_names/check_availability

No login needed

Description: Check whether a domain name can be registered. Returns available, a reason when it is not, and premium: true for a premium domain name (get its price with GET domain_names/premium_quote).

Parameters & Try It Out:

ParameterTypeDescriptionValidationTest Value
domain_name *StringFull domain name without subdomain, for example example.com. The extension must be offered by this website. Unicode names are accepted.-

Possible Errors:

DB_001Database error while checking the extension
INPUT_001Missing domain_name
INPUT_002Invalid domain name, a subdomain, or an extension this website does not offer
REG_001The registry could not be checked; try again later

GET/domain_names/{id}

API key OK Needs domains.view.

Description: Get one domain name with DNS records (when DNS control is on), tags, incoming_spam_filter, plan (only your own plan) and holder_validation (see POST domain_names/{id}/resend_validation). holder_change is the running holder change, or the last one if it failed or was cancelled and was not dismissed; the holder of another user is not named. move_request is an open move to another user, or null. API keys need domains.view.

Parameters & Try It Out:

ParameterTypeDescriptionValidationTest Value
id *
(Path Parameter)
IntegerID of the domain nameRequired Integer

Possible Errors:

AUTH_002User session has expired
AUTH_003User is not logged in
AUTH_0042FA authentication not complete
AUTH_006API key lacks required permission: domains.view
DB_001Database error occurred while fetching domain
DOMAIN_NOT_FOUNDDomain not found
INPUT_001Invalid domain ID

GET/domain_names/{id}/logs

API key OK Needs domains.view.

Description: Get the log book entries for a domain. Only the domain owner or an admin can view the logs. API keys need domains.view.

Parameters & Try It Out:

ParameterTypeDescriptionValidationTest Value
id *
(Path Parameter)
IntegerID of the domain nameRequired Integer
pageIntegerPage number for paginationMin: 1
itemsPerPageIntegerNumber of log entries per pageMin: 1, Max: 100
paginationBooleanEnable or disable pagination-
Example Response:
[
    {
        "id": 123,
        "created_at": "2026-06-18 10:30:00",
        "action_name": "ENABLE_DNS_CONTROL"
    }
]

Possible Errors:

AUTH_002User session has expired
AUTH_003User is not logged in
AUTH_0042FA authentication not complete
AUTH_006API key lacks required permission: domains.view
DB_001Database error occurred while fetching domain logs
DOMAIN_NOT_FOUNDDomain not found
INPUT_001Invalid domain ID

GET/domain_names/{id}/dnssec

API key OK Needs domains.dnssec.view.

Description: Get the DNSSEC keys of a domain name as the registry has them. With DNS control on you turn DNSSEC on or off (PATCH dnssec/status); with DNS control off you set the keys yourself (PATCH dnssec/keys); can_toggle and can_manage_keys say which is possible now. Send dnssec_hash back as expected_dnssec_hash when you change DNSSEC: if the keys changed since you read them, the change is refused. API keys need domains.dnssec.view.

Parameters & Try It Out:

ParameterTypeDescriptionValidationTest Value
id *
(Path Parameter)
IntegerID of the domain nameRequired Integer

Possible Errors:

AUTH_002User session has expired
AUTH_003User is not logged in
AUTH_0042FA authentication not complete
AUTH_006API key lacks required permission: domains.dnssec.view
DOMAIN_NOT_FOUNDDomain was not found or is not owned by the caller
EXT_001Failed to read DNSSEC state from the domain registry
INPUT_001Invalid domain ID

POST/domain_names/register

API key OK Needs domains.order.create (and contacts.required_info for required_info.

Description: Register a domain name: the shopping cart's checks and price, paid from your wallet and put on your monthly invoice (Via API). Nothing is charged when a check fails; dry_run only prices, and a retry with the same Idempotency-Key is never charged twice. ORDER_003 contact_required_info lists holder details needed before the order: send them as required_info. API keys need domains.order.create (and contacts.required_info for required_info).

Parameters & Try It Out:

ParameterTypeDescriptionValidationTest Value
domain_name *StringFull domain name, for example example.nl. The extension must be sold on your site.-
order_periodIntegerNumber of minimum registration periods of the extension (1 to 5, default 1). Premium domain names: at most 3 years.Min: 1, Max: 5
contact_idIntegerID of your contact that becomes the domain holder (default: your default contact).Min: 1
name_serversString2 to 8 name server host names (default: our name servers). Not inside the domain name itself.-
privacy_protectionBooleanHide the domain holder in WHOIS where the extension allows it (default false).-
language_codeStringIDN language code, only for internationalized domain names of extensions that ask for one.-
required_infoStringExtra holder details that ORDER_003 contact_required_info lists: properties (field: value) and person (for contact_roles.person). Checked at the registry and saved on the contact, also on dry_run.
Example: {"properties":{"CoreCAT.intendedUse":"Website of our bakery in Girona"}}
-
expected_priceIntegerThe price in cents excluding VAT you accept; the order is refused (ORDER_002) when the price differs. Required for premium domain names.Min: 0
dry_runBooleantrue: only check and price the order; nothing is ordered or charged (default false). The answer also says if your wallet covers it (wallet, with top_up when it does not).-
Example Request:
{
    "domain_name": "example.nl",
    "order_period": 1,
    "dry_run": false
}
Example Response:
{
    "order_id": 5925,
    "order_status": "paid",
    "dry_run": false,
    "currency": "EUR",
    "items": [
        {
            "id": 22455,
            "status": "unprocessed",
            "product": "Registration",
            "domain_name": "example.nl",
            "order_period": 1,
            "years": 1,
            "premium": false,
            "contact_id": 3665,
            "name_servers": null,
            "price_excluding_vat_in_cents": 469
        }
    ],
    "amount_excluding_vat_in_cents": 469,
    "transaction_cost_in_cents": 0,
    "vat_percentage": 21,
    "vat_amount_in_cents": 98,
    "total_including_vat_in_cents": 567,
    "payment": {
        "type": "monthly_invoice",
        "monthly_invoice_id": 1600,
        "wallet_transaction_id": 4300,
        "wallet_balance_in_cents": 9433
    }
}

Possible Errors:

AUTH_002User session has expired
AUTH_003Not logged in: send an API key in X-API-Key
AUTH_006No API key, or the API key lacks the permission
CONTACT_NOT_FOUNDContact not found
DB_001The order could not be placed; nothing was charged
DOMAIN_NOT_AVAILABLEHTTP 409: the domain name is taken (registration), not registered (transfer) or already with us
DOMAIN_PERIOD_NOT_ALLOWEDHTTP 422: this period is not possible for this premium domain name
INPUT_001Unexpected request parameter
INPUT_002Invalid parameter or Idempotency-Key, or the registry refused required_info; fields names it (as for PATCH /v2/contacts/{id}/required_info)
ORDER_001HTTP 402: the wallet balance does not cover the total including VAT; top_up has the amount to add and a link where you top up the wallet
ORDER_002HTTP 409: the price differs from expected_price; the answer has the current price
ORDER_003HTTP 422: the shopping cart would refuse this order; reason says why. contact_required_info: send the listed details as required_info (every mandatory one). holder_not_allowed: use another contact.
ORDER_004HTTP 422: paying from the wallet is not possible for this account; reason says why
ORDER_005HTTP 409: this Idempotency-Key was already used for another request
REG_001HTTP 502: the registry could not be asked; try again later. HTTP 400: the registry refused required_info

POST/domain_names/transfer

API key OK Needs domains.order.create (and contacts.required_info for required_info.

Description: Transfer a domain name to us: the shopping cart's checks and price, paid from your wallet and put on your monthly invoice (Via API). Nothing is charged when a check fails; dry_run only prices, and a retry with the same Idempotency-Key is never charged twice. ORDER_003 contact_required_info lists holder details needed before the order: send them as required_info. API keys need domains.order.create (and contacts.required_info for required_info).

Parameters & Try It Out:

ParameterTypeDescriptionValidationTest Value
domain_name *StringFull domain name, for example example.nl. The extension must be sold on your site.-
auth_keyStringTransfer code from the current provider. Required when the extension needs one.-
order_periodIntegerNumber of minimum registration periods of the extension (1 to 5, default 1). Premium domain names: at most 3 years.Min: 1, Max: 5
contact_idIntegerID of your contact that becomes the domain holder (default: your default contact).Min: 1
name_serversString2 to 8 name server host names (default: our name servers). Not inside the domain name itself.-
privacy_protectionBooleanHide the domain holder in WHOIS where the extension allows it (default false).-
language_codeStringIDN language code, only for internationalized domain names of extensions that ask for one.-
required_infoStringExtra holder details that ORDER_003 contact_required_info lists: properties (field: value) and person (for contact_roles.person). Checked at the registry and saved on the contact, also on dry_run.
Example: {"properties":{"CoreCAT.intendedUse":"Website of our bakery in Girona"}}
-
expected_priceIntegerThe price in cents excluding VAT you accept; the order is refused (ORDER_002) when the price differs. Required for premium domain names.Min: 0
dry_runBooleantrue: only check and price the order; nothing is ordered or charged (default false). The answer also says if your wallet covers it (wallet, with top_up when it does not).-
Example Request:
{
    "domain_name": "example.eu",
    "auth_key": "Xy7-pQ2-9tR",
    "order_period": 1
}
Example Response:
{
    "order_id": 5925,
    "order_status": "paid",
    "dry_run": false,
    "currency": "EUR",
    "items": [
        {
            "id": 22455,
            "status": "unprocessed",
            "product": "Transfer",
            "domain_name": "example.eu",
            "order_period": 1,
            "years": 1,
            "premium": false,
            "contact_id": 3665,
            "name_servers": null,
            "price_excluding_vat_in_cents": 469
        }
    ],
    "amount_excluding_vat_in_cents": 469,
    "transaction_cost_in_cents": 0,
    "vat_percentage": 21,
    "vat_amount_in_cents": 98,
    "total_including_vat_in_cents": 567,
    "payment": {
        "type": "monthly_invoice",
        "monthly_invoice_id": 1600,
        "wallet_transaction_id": 4300,
        "wallet_balance_in_cents": 9433
    }
}

Possible Errors:

AUTH_002User session has expired
AUTH_003Not logged in: send an API key in X-API-Key
AUTH_006No API key, or the API key lacks the permission
CONTACT_NOT_FOUNDContact not found
DB_001The order could not be placed; nothing was charged
DOMAIN_NOT_AVAILABLEHTTP 409: the domain name is taken (registration), not registered (transfer) or already with us
DOMAIN_PERIOD_NOT_ALLOWEDHTTP 422: this period is not possible for this premium domain name
INPUT_001Unexpected request parameter
INPUT_002Invalid parameter or Idempotency-Key, or the registry refused required_info; fields names it (as for PATCH /v2/contacts/{id}/required_info)
ORDER_001HTTP 402: the wallet balance does not cover the total including VAT; top_up has the amount to add and a link where you top up the wallet
ORDER_002HTTP 409: the price differs from expected_price; the answer has the current price
ORDER_003HTTP 422: the shopping cart would refuse this order; reason says why. contact_required_info: send the listed details as required_info (every mandatory one). holder_not_allowed: use another contact.
ORDER_004HTTP 422: paying from the wallet is not possible for this account; reason says why
ORDER_005HTTP 409: this Idempotency-Key was already used for another request
REG_001HTTP 502: the registry could not be asked; try again later. HTTP 400: the registry refused required_info

POST/domain_names/{id}/renew

API key OK Needs domains.order.create.

Description: Renew one of your active domain names for order_period terms, with the same checks and price as the shopping cart. Paid from your wallet; the line goes on your monthly invoice, marked Via API. Nothing is charged when a check fails or the balance is too low; dry_run returns the price only, and a retry with the same Idempotency-Key header is never charged twice. API keys need domains.order.create.

Parameters & Try It Out:

ParameterTypeDescriptionValidationTest Value
id *
(Path Parameter)
IntegerID of the domain nameRequired Integer
order_periodIntegerNumber of minimum registration periods of the extension (1 to 5, default 1). Premium domain names: at most 3 years.Min: 1, Max: 5
expected_priceIntegerThe price in cents excluding VAT you accept; the order is refused (ORDER_002) when the price differs. Required for premium domain names.Min: 0
dry_runBooleantrue: only check and price the order; nothing is ordered or charged (default false). The answer also says if your wallet covers it (wallet, with top_up when it does not).-
Example Request:
{
    "order_period": 1,
    "expected_price": 639
}
Example Response:
{
    "order_id": 5925,
    "order_status": "paid",
    "dry_run": false,
    "currency": "EUR",
    "items": [
        {
            "id": 22455,
            "status": "unprocessed",
            "product": "Renewal",
            "domain_name": "example.nl",
            "order_period": 1,
            "years": 1,
            "premium": false,
            "domain_name_id": 6731,
            "price_excluding_vat_in_cents": 469
        }
    ],
    "amount_excluding_vat_in_cents": 469,
    "transaction_cost_in_cents": 0,
    "vat_percentage": 21,
    "vat_amount_in_cents": 98,
    "total_including_vat_in_cents": 567,
    "payment": {
        "type": "monthly_invoice",
        "monthly_invoice_id": 1600,
        "wallet_transaction_id": 4300,
        "wallet_balance_in_cents": 9433
    }
}

Possible Errors:

AUTH_002User session has expired
AUTH_003Not logged in: send an API key in X-API-Key
AUTH_006No API key, or the API key lacks the permission
DB_001The order could not be placed; nothing was charged
DOMAIN_NOT_FOUNDDomain name not found or not yours
DOMAIN_PERIOD_NOT_ALLOWEDHTTP 422: this period is not possible for this premium domain name
INPUT_001Unexpected request parameter
INPUT_002Invalid parameter or Idempotency-Key; fields names it
ORDER_001HTTP 402: the wallet balance does not cover the total including VAT; top_up has the amount to add and a link where you top up the wallet
ORDER_002HTTP 409: the price differs from expected_price; the answer has the current price
ORDER_003HTTP 422: the shopping cart would refuse this order; reason says why
ORDER_004HTTP 422: paying from the wallet is not possible for this account; reason says why
ORDER_005HTTP 409: this Idempotency-Key was already used for another request
REG_001HTTP 502: the premium price could not be asked; try again later

POST/domain_names/{id}/restore

API key OK Needs domains.order.create.

Description: Restore one of your expired domain names within its restore period, with the same checks and price as the shopping cart. Paid from your wallet; the line goes on your monthly invoice, marked Via API. Nothing is charged when a check fails or the balance is too low; dry_run returns the price only, and a retry with the same Idempotency-Key header is never charged twice. API keys need domains.order.create.

Parameters & Try It Out:

ParameterTypeDescriptionValidationTest Value
id *
(Path Parameter)
IntegerID of the domain nameRequired Integer
order_periodIntegerNumber of minimum registration periods of the extension (1 to 5, default 1). Premium domain names: at most 3 years.Min: 1, Max: 5
expected_priceIntegerThe price in cents excluding VAT you accept; the order is refused (ORDER_002) when the price differs. Required for premium domain names.Min: 0
dry_runBooleantrue: only check and price the order; nothing is ordered or charged (default false). The answer also says if your wallet covers it (wallet, with top_up when it does not).-
Example Request:
{
    "order_period": 1,
    "dry_run": true
}
Example Response:
{
    "order_id": 5925,
    "order_status": "paid",
    "dry_run": false,
    "currency": "EUR",
    "items": [
        {
            "id": 22455,
            "status": "unprocessed",
            "product": "Restore",
            "domain_name": "example.nl",
            "order_period": 1,
            "years": 1,
            "premium": false,
            "domain_name_id": 6731,
            "price_excluding_vat_in_cents": 469
        }
    ],
    "amount_excluding_vat_in_cents": 469,
    "transaction_cost_in_cents": 0,
    "vat_percentage": 21,
    "vat_amount_in_cents": 98,
    "total_including_vat_in_cents": 567,
    "payment": {
        "type": "monthly_invoice",
        "monthly_invoice_id": 1600,
        "wallet_transaction_id": 4300,
        "wallet_balance_in_cents": 9433
    }
}

Possible Errors:

AUTH_002User session has expired
AUTH_003Not logged in: send an API key in X-API-Key
AUTH_006No API key, or the API key lacks the permission
DB_001The order could not be placed; nothing was charged
DOMAIN_NOT_FOUNDDomain name not found or not yours
DOMAIN_PERIOD_NOT_ALLOWEDHTTP 422: this period is not possible for this premium domain name
INPUT_001Unexpected request parameter
INPUT_002Invalid parameter or Idempotency-Key; fields names it
ORDER_001HTTP 402: the wallet balance does not cover the total including VAT; top_up has the amount to add and a link where you top up the wallet
ORDER_002HTTP 409: the price differs from expected_price; the answer has the current price
ORDER_003HTTP 422: the shopping cart would refuse this order; reason says why
ORDER_004HTTP 422: paying from the wallet is not possible for this account; reason says why
ORDER_005HTTP 409: this Idempotency-Key was already used for another request
REG_001HTTP 502: the premium price could not be asked; try again later

POST/domain_names/punycode

No login needed

Description: Convert a Unicode domain label or full domain name into ASCII punycode (UTS46 non-transitional mode). Example: "münchen" -> "xn--mnchen-3ya". If input contains a dot, TLD is extracted from input (first-pass) for IDN policy checks. language_codes is returned only when the extracted TLD matches domain_top_level and idn_language_codes contains a non-empty list.

Request Body & Try It Out:

ParameterTypeDescriptionValidationTest Value
input *
(Request Body)
StringUnicode domain label or full domain name to convert. When input contains a dot, TLD is extracted from input and must exist in domain_top_level; unknown TLDs, non-IDN TLDs, and unsupported IDN characters for that TLD are rejected. On such errors, response may include error.supported_tlds for frontend suggestions.Required String

Possible Errors:

INPUT_002Missing or invalid input, unknown TLD, unsupported IDN characters for TLD, or TLD does not support IDN (may include error.supported_tlds suggestions)

POST/domain_names/unicode

No login needed

Description: Convert an ASCII punycode domain name to Unicode. Input must start with "xn--", contain a dot, and use a TLD that exists in domain_top_level. Example: "xn--mnchen-3ya.com" -> "münchen.com".

Request Body & Try It Out:

ParameterTypeDescriptionValidationTest Value
input *
(Request Body)
StringASCII punycode domain name to convert. Must start with "xn--" and include a known TLD (for example: xn--mnchen-3ya.com).Required String

Possible Errors:

INPUT_002Missing or invalid input, input does not start with xn--, missing dot/tld, unknown tld, or punycode conversion failed

POST/domain_names/{id}/resend_validation

API key OK Needs domains.holder_validation.resend.

Description: Ask the registry to send the confirmation e-mail to the domain holder again, for a domain name with registry status PENDING_VALIDATION. Possible once per 10 minutes per domain name. Returns the same holder_validation object as GET domain_names/{id}: email is the address it goes to, next_possible_at says when you can send it again. API keys need domains.holder_validation.resend.

Parameters & Try It Out:

ParameterTypeDescriptionValidationTest Value
id *
(Path Parameter)
IntegerID of the domain nameRequired Integer
Example Response:
{
    "pending": true,
    "email": "holder@example.com",
    "last_sent_at": "2026-11-03T15:52:00+00:00",
    "next_possible_at": "2026-11-03T16:02:00+00:00",
    "can_resend": false
}

Possible Errors:

AUTH_002User session has expired
AUTH_003User is not logged in
AUTH_0042FA authentication not complete
AUTH_006API key lacks required permission: domains.holder_validation.resend
DOMAIN_NOT_FOUNDDomain not found or not owned by caller
HOLDER_VALIDATION_001HTTP 409: the domain name is not waiting for the domain holder to confirm
HOLDER_VALIDATION_002HTTP 429: sent less than 10 minutes ago; next_possible_at, retry_after and the Retry-After header say when it is possible again
HOLDER_VALIDATION_003HTTP 502: the registry did not accept the request; try again later or contact support
HOLDER_VALIDATION_004HTTP 503: the registry could not be reached; try again in a few minutes
INPUT_001Invalid domain ID

PATCH/domain_names/{id}/incoming_spam_filter

API key OK Needs domains.email.spam_filter.manage.

Description: Change the incoming spam filter setting of the domain name; a preset other than default needs active email hosting. The change is applied in the background: the response (HTTP 202) has the same fields as GET with status updating, and a non-default preset also waits until mail routing for the domain name is set up and verified. Read GET until status is applied. API keys need domains.email.spam_filter.manage.

Parameters & Try It Out:

ParameterTypeDescriptionValidationTest Value
id *
(Path Parameter)
IntegerID of the domain nameRequired Integer
preset *StringSpam filter sensitivity for the whole domain name. off turns spam filtering off; virus and security checks stay active.One of: default, more_strict, very_strict, less_strict, even_less_strict, off
Example Request:
{
    "preset": "more_strict"
}

Possible Errors:

AUTH_002User session has expired
AUTH_003Authentication required
AUTH_004Two-factor authentication incomplete
AUTH_006Missing domains.email.spam_filter.manage permission
DOMAIN_NOT_FOUNDDomain not found or not owned by caller
INCOMING_SPAM_001Spam filter settings are temporarily unavailable
INCOMING_SPAM_002Only default is possible without active email hosting
INCOMING_SPAM_003Another change is in progress, or the setting needs a review by support
INPUT_001Invalid preset or unexpected request fields

PATCH/domain_names/{id}/assign_to_plan

API key OK Needs domains.plan.manage and domains.view.

Description: Link an active domain name to an active all-in-one plan; both must be yours unless you are an admin. The plan's domain limit counts registered and external domain names together. Returns the same domain object as GET /domain_names/{id}. API keys need domains.plan.manage and domains.view.

Parameters, Request Body & Try It Out:

ParameterTypeDescriptionValidationTest Value
id *
(Path Parameter)
IntegerID of the domain nameRequired Integer
plan_id *IntegerAll-in-one plan ID to link this domain name toMin: 1
plan_id *
(Request Body)
IntegerAll-in-one plan ID to link this domain name toRequired Integer

Possible Errors:

AUTH_002User session has expired
AUTH_003User is not logged in
AUTH_0042FA authentication not complete
AUTH_006API key lacks required permission: domains.plan.manage or domains.view
DB_001Database error occurred while linking domain to plan
DOMAIN_NOT_FOUNDDomain not found
EXT_001Failed to synchronize DNS side effects after linking domain to plan
GENERAL_001Plan not found
INPUT_001Invalid domain ID, inactive plan, inactive domain, already linked domain, plan domain limit reached, or the domain name or plan is being moved to another user

PATCH/domain_names/{id}/remove_from_plan

API key OK Needs domains.plan.manage.

Description: Unlink a registered domain name from its all-in-one plan. Email and website builder must be disabled first; active webhosting does not block unlinking. Returns the same domain payload shape as GET /domain_names/{id}. Requires API key permissions: domains.plan.manage and domains.view.

Parameters & Try It Out:

ParameterTypeDescriptionValidationTest Value
id *
(Path Parameter)
IntegerID of the domain nameRequired Integer

Possible Errors:

AUTH_002User session has expired
AUTH_003User is not logged in
AUTH_0042FA authentication not complete
AUTH_006API key lacks required permission: domains.plan.manage or domains.view
DB_001Database error occurred while unlinking domain from plan
DOMAIN_NOT_FOUNDDomain not found
INPUT_001Invalid domain ID, domain is not linked to a plan, email is enabled, domain email entries exist, website builder is enabled, or the domain name or plan is being moved to another user

PATCH/domain_names/{id}/dns_records

API key OK Needs domains.dns.modify.

Description: Replace the DNS records of an active domain name with DNS control on; records you leave out are deleted (the root NS and SOA records stay). Record names must be the domain name or a subdomain of it. NS and CNAME records are not allowed at the root, and a CNAME cannot share its name with other records. API keys need domains.dns.modify.

Parameters & Try It Out:

ParameterTypeDescriptionValidationTest Value
id *
(Path Parameter)
IntegerID of the domain nameRequired Integer
dns_records *StringDNS records to set. Each record has name (with trailing dot), type (A, AAAA, CNAME, MX, TXT, NS, SRV, ...), ttl (60, 300, 3600, 7200, 14400, 28800 or 86400) and value.-
Example Request:
{
    "dns_records": [
        {
            "name": "www.example.com.",
            "type": "A",
            "ttl": 3600,
            "value": "192.0.2.1"
        },
        {
            "name": "example.com.",
            "type": "MX",
            "ttl": 3600,
            "value": "10 mail.example.com."
        }
    ]
}

Possible Errors:

AUTH_002User session has expired
AUTH_003User is not logged in
AUTH_0042FA authentication not complete
AUTH_006User does not own this domain OR API key lacks required permission: domains.dns.modify
DNS_001DNS record validation failed. Check the fields array for specific validation errors with array indices (e.g., dns_records[2].name)
DNS_002DNS control is not enabled for this domain
DOMAIN_NOT_FOUNDDomain not found
EXT_001Failed to update DNS records
INPUT_001Missing or empty dns_records

PATCH/domain_names/{id}/dnssec/keys

API key OK Needs domains.dnssec.modify.

Description: Replace the DNSSEC keys of an active domain name that does not use our DNS (DNS control off). Send the complete set: keys you leave out are removed, and an empty array turns DNSSEC off. Returns the same DNSSEC state as GET, where allowed_dnssec_records and dnssec_algorithms show how many keys and which algorithms the extension accepts. API keys need domains.dnssec.modify.

Parameters, Request Body & Try It Out:

ParameterTypeDescriptionValidationTest Value
id *
(Path Parameter)
IntegerID of the domain nameRequired Integer
key_data *StringThe complete key set; each key has flags, protocol, algorithm and public_key (base64). An empty array removes all keys.-
expected_dnssec_hashStringdnssec_hash from your last GET. If the keys changed since then, the change is refused.-
key_data *
(Request Body)
ArrayThe complete key set; each key has flags, protocol, algorithm and public_key (base64). An empty array removes all keys.Required Array
expected_dnssec_hash
(Request Body)
Stringdnssec_hash from your last GET. If the keys changed since then, the change is refused.String

Possible Errors:

AUTH_002User session has expired
AUTH_003User is not logged in
AUTH_0042FA authentication not complete
AUTH_006API key lacks required permission: domains.dnssec.modify
DNSSEC_001Domain name not active, a key is invalid, too many keys, or an algorithm the extension does not accept
DNSSEC_002Keys can only be set while DNS control is off
DNSSEC_003The extension does not support DNSSEC
DNSSEC_004The keys changed since your GET (expected_dnssec_hash does not match)
DOMAIN_NOT_FOUNDDomain was not found or is not owned by the caller
EXT_001Failed to update DNSSEC at the domain registry
INPUT_001Invalid domain ID or key_data

PATCH/domain_names/{id}/dnssec/status

API key OK Needs domains.dnssec.modify.

Description: Turn DNSSEC on or off for an active domain name that uses our DNS (DNS control on). Turning it on creates the keys and sends them to the registry; turning it off removes them. Returns the same DNSSEC state as GET. API keys need domains.dnssec.modify.

Parameters, Request Body & Try It Out:

ParameterTypeDescriptionValidationTest Value
id *
(Path Parameter)
IntegerID of the domain nameRequired Integer
is_dnssec_enabled *Booleantrue turns DNSSEC on, false turns it off.-
expected_dnssec_hashStringdnssec_hash from your last GET. If the keys changed since then, the change is refused.-
is_dnssec_enabled *
(Request Body)
Booleantrue turns DNSSEC on, false turns it off.Required Boolean
expected_dnssec_hash
(Request Body)
Stringdnssec_hash from your last GET. If the keys changed since then, the change is refused.String

Possible Errors:

AUTH_002User session has expired
AUTH_003User is not logged in
AUTH_0042FA authentication not complete
AUTH_006API key lacks required permission: domains.dnssec.modify
DNSSEC_001Domain name not active, or its DNS zone is missing
DNSSEC_002DNSSEC can only be turned on or off while DNS control is on
DNSSEC_003The extension does not support DNSSEC
DNSSEC_004The keys changed since your GET (expected_dnssec_hash does not match)
DOMAIN_NOT_FOUNDDomain was not found or is not owned by the caller
EXT_001Failed to update DNSSEC in our DNS or at the domain registry
INPUT_001Invalid domain ID or is_dnssec_enabled value

PATCH/domain_names/{id}/update_dns_control

API key OK Needs domains.dns.control and domains.view.

Description: Turn DNS control on or off. Turning it on (active domain names only) points the domain name to our nameservers with a new DNS zone of default records, plus DNSSEC where the extension supports it; turning it off removes DNSSEC, the DNS zone and the domain redirections. Returns the same domain object as GET /domain_names/{id}. API keys need domains.dns.control and domains.view.

Parameters & Try It Out:

ParameterTypeDescriptionValidationTest Value
id *
(Path Parameter)
IntegerID of the domain nameRequired Integer
dns_control_enabled *BooleanEnable or disable DNS control.-

Possible Errors:

AUTH_002User session has expired
AUTH_003User is not logged in
AUTH_0042FA authentication not complete
AUTH_006API key lacks required permission: domains.dns.control or domains.view
DNS_001DNS control state validation failed (already enabled/disabled, processing, or inactive domain)
DOMAIN_NOT_FOUNDDomain not found
EXT_001Failed to synchronize DNS control with external providers
INPUT_001Invalid domain ID or payload

PATCH/domain_names/{id}/update_name_servers

API key OK Needs domains.dns.control and domains.view.

Description: Set the nameservers of an active domain name, with glue records for nameservers that have ips. Advanced settings are turned on, and if DNS control is on it is turned off: the DNS zone and DNSSEC are removed. Returns the same domain object as GET /domain_names/{id}. API keys need domains.dns.control and domains.view.

Parameters & Try It Out:

ParameterTypeDescriptionValidationTest Value
id *
(Path Parameter)
IntegerID of the domain nameRequired Integer
domain_name_server_settings *StringObject with a name_servers array. Each nameserver has a name and optional comma-separated ips (for glue records).-
Example Request:
{
    "domain_name_server_settings": {
        "name_servers": [
            {
                "name": "ns1.example.com",
                "ips": ""
            },
            {
                "name": "ns2.example.com",
                "ips": ""
            }
        ]
    }
}

Possible Errors:

AUTH_002User session has expired
AUTH_003User is not logged in
AUTH_0042FA authentication not complete
AUTH_006API key lacks required permission: domains.dns.control or domains.view
DNS_001Nameserver validation failed, domain must be active, or registry rejected the nameserver update
DOMAIN_NOT_FOUNDDomain not found
EXT_001Failed to synchronize nameservers with external providers
INPUT_001Invalid domain ID or payload

PATCH/domain_names/{id}/advanced_settings

API key OK Needs domains.dns.control and domains.view.

Description: Turn access to advanced settings on or off for an active domain name. Turning it off also turns DNS control on if needed, unlinks the DNS template and repairs the DNS records of linked services. Returns the same domain object as GET /domain_names/{id}. API keys need domains.dns.control and domains.view.

Parameters & Try It Out:

ParameterTypeDescriptionValidationTest Value
id *
(Path Parameter)
IntegerID of the domain nameRequired Integer
access_to_advanced_settings *BooleanEnable or disable access to advanced settings.-

Possible Errors:

AUTH_002User session has expired
AUTH_003User is not logged in
AUTH_0042FA authentication not complete
AUTH_006API key lacks required permission: domains.dns.control or domains.view
DB_001Database error occurred while updating advanced settings
DNS_001Domain advanced settings validation failed (domain must be active)
DOMAIN_NOT_FOUNDDomain not found
EXT_001Failed to synchronize DNS side effects
INPUT_001Invalid domain ID or payload

/external_domain_names

GET/external_domain_names/{id}/incoming_spam_filter

API key OK Needs domains.email.spam_filter.view.

Description: Get the incoming spam filter setting. Requires domains.email.spam_filter.view. Returns preset, enabled, status (applied, updating, failed, unknown or unavailable), can_change and a message that explains the status. While status is updating, read it again later.

Parameters & Try It Out:

ParameterTypeDescriptionValidationTest Value
id *
(Path Parameter)
IntegerID of the external domain nameRequired Integer

Possible Errors:

AUTH_002User session has expired
AUTH_003Authentication required
AUTH_004Two-factor authentication incomplete
AUTH_006Missing domains.email.spam_filter.view permission
DOMAIN_NOT_FOUNDDomain not found or not owned by caller
INPUT_001Invalid domain ID

GET/external_domain_names

API key OK Needs domains.view.

Description: Get all external domain names for the current user. Returns an array of brief external domain objects with linked plan (only your own plan) and mail server information where available. API keys need domains.view.

Parameters & Try It Out:

ParameterTypeDescriptionValidationTest Value
pageIntegerPage number for paginationMin: 1
itemsPerPageIntegerNumber of items per pageMin: 1, Max: 100
paginationBooleanEnable or disable pagination-
searchStringSearch external domain namesMin: 1, Max: 255
sort_byStringField to sort by. Valid options: id, name, created_atOne of: id, name, created_at
sort_orderStringSort order. Valid options: asc (ascending) or desc (descending). Default: ascOne of: asc, desc, ASC, DESC
Example Response:
[
    {
        "id": 123,
        "name": "example.com",
        "created_at": "2026-06-30 12:00:00",
        "dns_control_enabled": 1,
        "access_to_advanced_settings": true,
        "added_to_incoming_spam_filter": 0,
        "is_email_enabled": true,
        "plan": {
            "id": 456,
            "created_at": "2026-06-30 12:00:00",
            "expires_at": "2027-06-30 12:00:00",
            "status": "active",
            "plan_info": {
                "id": 9,
                "name": "Plan name",
                "type": "webhosting"
            }
        },
        "mail_server": {
            "id": 7,
            "host_name": "mail.example.com",
            "ip_v4_address": "192.0.2.10",
            "ip_v6_address": "2001:db8::10"
        }
    }
]

Possible Errors:

AUTH_002User session has expired
AUTH_003User is not logged in
AUTH_0042FA authentication not complete
AUTH_006API key lacks required permission: domains.view
DB_001Database error occurred while fetching external domains
INPUT_001Invalid input parameters

GET/external_domain_names/{id}

API key OK Needs domains.view.

Description: Get one external domain name with its plan (only your own plan), mail server, DNS records (when DNS control is on), redirections, email accounts and outgoing email block status. dns_records_check says whether the DNS records for the website, website builder, email and redirections are set correctly, and lists the missing ones. incoming_spam_filter is included when email is enabled. API keys need domains.view.

Parameters & Try It Out:

ParameterTypeDescriptionValidationTest Value
id *
(Path Parameter)
IntegerID of the external domain nameRequired Integer

Possible Errors:

AUTH_002User session has expired
AUTH_003User is not logged in
AUTH_0042FA authentication not complete
AUTH_006API key lacks required permission: domains.view
DB_001Database error occurred while fetching external domain
DOMAIN_NOT_FOUNDExternal domain not found
INPUT_001Invalid external domain ID

POST/external_domain_names

API key OK Needs domains.create.

Description: Add a domain name that is registered elsewhere to your account. It starts with DNS control off and without a plan; use update_dns_control and assign_to_plan to change that. Returns the new external domain name (HTTP 201). API keys need domains.create.

Request Body & Try It Out:

ParameterTypeDescriptionValidationTest Value
name *
(Request Body)
StringExternal domain name to add, for example example.comRequired String

Possible Errors:

AUTH_002User session has expired
AUTH_003User is not logged in
AUTH_0042FA authentication not complete
AUTH_006API key lacks required permission: domains.create
DB_001Database error occurred while creating external domain
INPUT_001Missing or invalid name, already added, not allowed, or registered with us

PATCH/external_domain_names/{id}/incoming_spam_filter

API key OK Needs domains.email.spam_filter.manage.

Description: Change the incoming spam filter setting of the domain name; a preset other than default needs active email hosting. The change is applied in the background: the response (HTTP 202) has the same fields as GET with status updating, and a non-default preset also waits until mail routing for the domain name is set up and verified. Read GET until status is applied. API keys need domains.email.spam_filter.manage.

Parameters & Try It Out:

ParameterTypeDescriptionValidationTest Value
id *
(Path Parameter)
IntegerID of the external domain nameRequired Integer
preset *StringSpam filter sensitivity for the whole domain name. off turns spam filtering off; virus and security checks stay active.One of: default, more_strict, very_strict, less_strict, even_less_strict, off
Example Request:
{
    "preset": "more_strict"
}

Possible Errors:

AUTH_002User session has expired
AUTH_003Authentication required
AUTH_004Two-factor authentication incomplete
AUTH_006Missing domains.email.spam_filter.manage permission
DOMAIN_NOT_FOUNDDomain not found or not owned by caller
INCOMING_SPAM_001Spam filter settings are temporarily unavailable
INCOMING_SPAM_002Only default is possible without active email hosting
INCOMING_SPAM_003Another change is in progress, or the setting needs a review by support
INPUT_001Invalid preset or unexpected request fields

PATCH/external_domain_names/{id}/assign_to_plan

API key OK Needs domains.plan.manage and domains.view.

Description: Link an external domain name to an active all-in-one plan; both must be yours unless you are an admin. The plan's domain limit counts registered and external domain names together. Returns the same object as GET /external_domain_names/{id}. API keys need domains.plan.manage and domains.view.

Parameters, Request Body & Try It Out:

ParameterTypeDescriptionValidationTest Value
id *
(Path Parameter)
IntegerID of the external domain nameRequired Integer
plan_id *IntegerAll-in-one plan ID to link this external domain name toMin: 1
plan_id *
(Request Body)
IntegerAll-in-one plan ID to link this external domain name toRequired Integer

Possible Errors:

AUTH_002User session has expired
AUTH_003User is not logged in
AUTH_0042FA authentication not complete
AUTH_006API key lacks required permission: domains.plan.manage or domains.view
DB_001Database error occurred while linking external domain to plan
DOMAIN_NOT_FOUNDExternal domain not found
EXT_001Failed to synchronize DNS side effects after linking external domain to plan
GENERAL_001Plan not found
INPUT_001Invalid external domain ID, inactive plan, already linked external domain, plan domain limit reached, or the plan is being moved to another user

PATCH/external_domain_names/{id}/remove_from_plan

API key OK Needs domains.plan.manage.

Description: Unlink an external domain name from its all-in-one plan. Email and website builder must be disabled first; active webhosting does not block unlinking. Returns the same external-domain payload shape as GET /external_domain_names/{id}. Requires API key permissions: domains.plan.manage and domains.view.

Parameters & Try It Out:

ParameterTypeDescriptionValidationTest Value
id *
(Path Parameter)
IntegerID of the external domain nameRequired Integer

Possible Errors:

AUTH_002User session has expired
AUTH_003User is not logged in
AUTH_0042FA authentication not complete
AUTH_006API key lacks required permission: domains.plan.manage or domains.view
DB_001Database error occurred while unlinking external domain from plan
DOMAIN_NOT_FOUNDExternal domain not found
INPUT_001Invalid external domain ID, external domain is not linked to a plan, email is enabled, domain email entries exist, website builder is enabled, or the plan is being moved to another user

PATCH/external_domain_names/{id}/update_dns_control

API key OK Needs domains.dns.control and domains.view.

Description: Turn DNS control on or off. Turning it on creates a new DNS zone with our default records and nameservers; turning it off deletes the DNS zone and its records. Returns the same object as GET /external_domain_names/{id}. API keys need domains.dns.control and domains.view.

Parameters & Try It Out:

ParameterTypeDescriptionValidationTest Value
id *
(Path Parameter)
IntegerID of the external domain nameRequired Integer
dns_control_enabled *BooleanEnable or disable DNS control.-

Possible Errors:

AUTH_002User session has expired
AUTH_003User is not logged in
AUTH_0042FA authentication not complete
AUTH_006API key lacks required permission: domains.dns.control or domains.view
DB_001Database error occurred while updating DNS control
DNS_001DNS control is already on or already off
DOMAIN_NOT_FOUNDExternal domain not found
EXT_001Failed to create or delete the DNS zone
INPUT_001Invalid external domain ID or payload

PATCH/external_domain_names/{id}/advanced_settings

API key OK Needs domains.dns.control.

Description: Enable or disable access to advanced settings for an external domain. Disabling ensures external DNS control is enabled, repairs DNS records for linked services, and returns the same external-domain payload shape as GET /external_domain_names/{id}. Requires API key permissions: domains.dns.control and domains.view.

Parameters & Try It Out:

ParameterTypeDescriptionValidationTest Value
id *
(Path Parameter)
IntegerID of the external domain nameRequired Integer
access_to_advanced_settings *BooleanEnable or disable access to advanced settings.-

Possible Errors:

AUTH_002User session has expired
AUTH_003User is not logged in
AUTH_0042FA authentication not complete
AUTH_006API key lacks required permission: domains.dns.control or domains.view
DB_001Database error occurred while updating advanced settings
DNS_001External domain advanced settings validation failed
DOMAIN_NOT_FOUNDExternal domain not found
EXT_001Failed to synchronize DNS side effects
INPUT_001Invalid external domain ID or payload

PATCH/external_domain_names/{id}/dns_records

API key OK Needs domains.dns.modify.

Description: Replace the DNS records of an external domain name with DNS control on; records you leave out are deleted (the root NS and SOA records stay). Record names must be the domain name or a subdomain of it. NS and CNAME records are not allowed at the root, and a CNAME cannot share its name with other records. API keys need domains.dns.modify.

Parameters & Try It Out:

ParameterTypeDescriptionValidationTest Value
id *
(Path Parameter)
IntegerID of the external domain nameRequired Integer
dns_records *StringDNS records to set. Each record has name (with trailing dot), type (A, AAAA, CNAME, MX, TXT, NS, SRV, ...), ttl (60, 300, 3600, 7200, 14400, 28800 or 86400) and value.-

Possible Errors:

AUTH_002User session has expired
AUTH_003User is not logged in
AUTH_0042FA authentication not complete
AUTH_006API key lacks required permission: domains.dns.modify
DB_001Database error occurred while updating DNS records
DNS_001DNS record validation failed. Check the fields array for specific validation errors with array indices (e.g., dns_records[2].name)
DNS_002DNS control is not enabled for this external domain
DOMAIN_NOT_FOUNDExternal domain not found
EXT_001Failed to update DNS records
INPUT_001Invalid external domain ID or payload

/incoming_mail

GET/domain_names/{id}/incoming_sender_rules

API key OK Needs domains.email.sender_rules.view.

Description: Get the allowed and blocked senders of the domain name, or of one address (scope); an address rule overrides the domain rule for the same sender. status is updating until the last change is live, then applied, or failed (send action retry). can_manage says whether you can change the rules now, and limit shows how full the list is. API keys need domains.email.sender_rules.view.

Parameters & Try It Out:

ParameterTypeDescriptionValidationTest Value
id *
(Path Parameter)
IntegerID of the domain nameRequired Integer
scopeStringdomain (default), or one of the email addresses listed in recipients-

Possible Errors:

AUTH_006The API key lacks the required permission
DOMAIN_NOT_FOUNDNo domain name with this ID in your account
INCOMING_SPAM_001Sender rules and quarantine are turned off, or the mail gateway cannot be reached; domain names with over 1,000 addresses need support
INCOMING_SPAM_002The domain name has no active email hosting
INCOMING_SPAM_003Sender rules from an earlier owner or name of the domain need cleanup by support
INPUT_001scope is not domain or an email address of the domain name

GET/domain_names/{id}/quarantine

API key OK Needs domains.email.quarantine.view.

Description: List the mail held in quarantine for the domain name, newest first; only spam can be released or deleted (can_release). complete is false when part of it could not be read, limited true when there was too much to read (filter on recipient or reason). sender_gateway.state review: sender rules cannot be changed; failed_actions: queued releases and deletes of the last hour that failed. API keys need domains.email.quarantine.view.

Parameters & Try It Out:

ParameterTypeDescriptionValidationTest Value
id *
(Path Parameter)
IntegerID of the domain nameRequired Integer
recipientStringall (default), or one email address of the domain name in lower case; filter_recipients in the response lists them, catch-all addresses with held mail included-
reasonStringall (default), spam, virus or attachment-
searchStringText in the subject or sender, at most 200 characters-
pageIntegerPage number, starting at 1-
page_sizeIntegerMessages per page, 1 to 100; default 25-

Possible Errors:

AUTH_006The API key lacks the required permission
DOMAIN_NOT_FOUNDNo domain name with this ID in your account
INCOMING_SPAM_001Sender rules and quarantine are turned off, or the mail gateway cannot be reached; domain names with over 1,000 addresses need support
INCOMING_SPAM_002The domain name has no active email hosting
INPUT_001Invalid recipient, reason, search, page or page_size

GET/domain_names/{id}/quarantine/{message_id}

API key OK Needs domains.email.quarantine.content.

Description: Get one held message with a plain-text preview of its body (text), without HTML, images or attachments. preview_truncated is true when the text was cut short. Messages held for a virus or attachment have no preview: text is null and security_review_required is true. API keys need domains.email.quarantine.content.

Parameters & Try It Out:

ParameterTypeDescriptionValidationTest Value
id *
(Path Parameter)
IntegerID of the domain nameRequired Integer
message_id *
(Path Parameter)
StringMessage ID returned by the quarantine list.Required; 64 lowercase hexadecimal characters
recipientStringRecipient of the message, from the list; makes the lookup faster-
reasonStringReason of the message, from the list; makes the lookup faster-

Possible Errors:

AUTH_006The API key lacks the required permission
DOMAIN_NOT_FOUNDNo domain name with this ID in your account
GENERAL_002The message is no longer in quarantine
INCOMING_SPAM_001Quarantine is turned off, the mail gateway cannot be reached or the quarantine could not be fully checked (try again); domain names with over 1,000 addresses need support
INCOMING_SPAM_002The domain name has no active email hosting
INCOMING_SPAM_003The recipient of the message changed; list the quarantine again
INPUT_001Invalid recipient or reason

GET/domain_names/{id}/quarantine_report_settings

API key OK Needs domains.email.quarantine_reports.view.

Description: Get the quarantine report schedule and mailbox for the domain name or one address (scope). For an address, inherit means it follows the domain and effective shows what applies; with grouping domain (one report for all addresses) address settings are not used. destination_valid is false when the chosen mailbox can no longer receive reports; none are sent until you pick another. API keys need domains.email.quarantine_reports.view.

Parameters & Try It Out:

ParameterTypeDescriptionValidationTest Value
id *
(Path Parameter)
IntegerID of the domain nameRequired Integer
scopeStringdomain (default), or one of the email addresses listed in recipients-

Possible Errors:

AUTH_006The API key lacks the required permission
DOMAIN_NOT_FOUNDNo domain name with this ID in your account
INCOMING_SPAM_001Sender rules, quarantine and its reports are turned off, or the domain name has more than 1,000 addresses (contact support)
INCOMING_SPAM_002The domain name has no active email hosting
INPUT_001scope is not domain or an email address of the domain name

GET/domain_names/{id}/quarantine_report_destinations

API key OK Needs domains.email.quarantine_reports.view.

Description: Search the mailboxes that can receive quarantine reports: active mailboxes on domain names with email hosting in the same account. Forwarders and catch-all addresses are not included. Returns up to 100 per page; next_after is null on the last page. API keys need domains.email.quarantine_reports.view.

Parameters & Try It Out:

ParameterTypeDescriptionValidationTest Value
id *
(Path Parameter)
IntegerID of the domain nameRequired Integer
searchStringText in the mailbox address, at most 200 characters-
afterIntegernext_after from the previous page; default 0 (first page)-

Possible Errors:

AUTH_006The API key lacks the required permission
DOMAIN_NOT_FOUNDNo domain name with this ID in your account
INCOMING_SPAM_001Sender rules, quarantine and its reports are turned off, or the domain name has more than 1,000 addresses (contact support)
INCOMING_SPAM_002The domain name has no active email hosting
INPUT_001search is longer than 200 characters, or after is negative

GET/external_domain_names/{id}/incoming_sender_rules

API key OK Needs domains.email.sender_rules.view.

Description: Get the allowed and blocked senders of the domain name, or of one address (scope); an address rule overrides the domain rule for the same sender. status is updating until the last change is live, then applied, or failed (send action retry). can_manage says whether you can change the rules now, and limit shows how full the list is. API keys need domains.email.sender_rules.view.

Parameters & Try It Out:

ParameterTypeDescriptionValidationTest Value
id *
(Path Parameter)
IntegerID of the external domain nameRequired Integer
scopeStringdomain (default), or one of the email addresses listed in recipients-

Possible Errors:

AUTH_006The API key lacks the required permission
DOMAIN_NOT_FOUNDNo domain name with this ID in your account
INCOMING_SPAM_001Sender rules and quarantine are turned off, or the mail gateway cannot be reached; domain names with over 1,000 addresses need support
INCOMING_SPAM_002The domain name has no active email hosting
INCOMING_SPAM_003Sender rules from an earlier owner or name of the domain need cleanup by support
INPUT_001scope is not domain or an email address of the domain name

GET/external_domain_names/{id}/quarantine

API key OK Needs domains.email.quarantine.view.

Description: List the mail held in quarantine for the domain name, newest first; only spam can be released or deleted (can_release). complete is false when part of it could not be read, limited true when there was too much to read (filter on recipient or reason). sender_gateway.state review: sender rules cannot be changed; failed_actions: queued releases and deletes of the last hour that failed. API keys need domains.email.quarantine.view.

Parameters & Try It Out:

ParameterTypeDescriptionValidationTest Value
id *
(Path Parameter)
IntegerID of the external domain nameRequired Integer
recipientStringall (default), or one email address of the domain name in lower case; filter_recipients in the response lists them, catch-all addresses with held mail included-
reasonStringall (default), spam, virus or attachment-
searchStringText in the subject or sender, at most 200 characters-
pageIntegerPage number, starting at 1-
page_sizeIntegerMessages per page, 1 to 100; default 25-

Possible Errors:

AUTH_006The API key lacks the required permission
DOMAIN_NOT_FOUNDNo domain name with this ID in your account
INCOMING_SPAM_001Sender rules and quarantine are turned off, or the mail gateway cannot be reached; domain names with over 1,000 addresses need support
INCOMING_SPAM_002The domain name has no active email hosting
INPUT_001Invalid recipient, reason, search, page or page_size

GET/external_domain_names/{id}/quarantine/{message_id}

API key OK Needs domains.email.quarantine.content.

Description: Get one held message with a plain-text preview of its body (text), without HTML, images or attachments. preview_truncated is true when the text was cut short. Messages held for a virus or attachment have no preview: text is null and security_review_required is true. API keys need domains.email.quarantine.content.

Parameters & Try It Out:

ParameterTypeDescriptionValidationTest Value
id *
(Path Parameter)
IntegerID of the external domain nameRequired Integer
message_id *
(Path Parameter)
StringMessage ID returned by the quarantine list.Required; 64 lowercase hexadecimal characters
recipientStringRecipient of the message, from the list; makes the lookup faster-
reasonStringReason of the message, from the list; makes the lookup faster-

Possible Errors:

AUTH_006The API key lacks the required permission
DOMAIN_NOT_FOUNDNo domain name with this ID in your account
GENERAL_002The message is no longer in quarantine
INCOMING_SPAM_001Quarantine is turned off, the mail gateway cannot be reached or the quarantine could not be fully checked (try again); domain names with over 1,000 addresses need support
INCOMING_SPAM_002The domain name has no active email hosting
INCOMING_SPAM_003The recipient of the message changed; list the quarantine again
INPUT_001Invalid recipient or reason

GET/external_domain_names/{id}/quarantine_report_settings

API key OK Needs domains.email.quarantine_reports.view.

Description: Get the quarantine report schedule and mailbox for the domain name or one address (scope). For an address, inherit means it follows the domain and effective shows what applies; with grouping domain (one report for all addresses) address settings are not used. destination_valid is false when the chosen mailbox can no longer receive reports; none are sent until you pick another. API keys need domains.email.quarantine_reports.view.

Parameters & Try It Out:

ParameterTypeDescriptionValidationTest Value
id *
(Path Parameter)
IntegerID of the external domain nameRequired Integer
scopeStringdomain (default), or one of the email addresses listed in recipients-

Possible Errors:

AUTH_006The API key lacks the required permission
DOMAIN_NOT_FOUNDNo domain name with this ID in your account
INCOMING_SPAM_001Sender rules, quarantine and its reports are turned off, or the domain name has more than 1,000 addresses (contact support)
INCOMING_SPAM_002The domain name has no active email hosting
INPUT_001scope is not domain or an email address of the domain name

GET/external_domain_names/{id}/quarantine_report_destinations

API key OK Needs domains.email.quarantine_reports.view.

Description: Search the mailboxes that can receive quarantine reports: active mailboxes on domain names with email hosting in the same account. Forwarders and catch-all addresses are not included. Returns up to 100 per page; next_after is null on the last page. API keys need domains.email.quarantine_reports.view.

Parameters & Try It Out:

ParameterTypeDescriptionValidationTest Value
id *
(Path Parameter)
IntegerID of the external domain nameRequired Integer
searchStringText in the mailbox address, at most 200 characters-
afterIntegernext_after from the previous page; default 0 (first page)-

Possible Errors:

AUTH_006The API key lacks the required permission
DOMAIN_NOT_FOUNDNo domain name with this ID in your account
INCOMING_SPAM_001Sender rules, quarantine and its reports are turned off, or the domain name has more than 1,000 addresses (contact support)
INCOMING_SPAM_002The domain name has no active email hosting
INPUT_001search is longer than 200 characters, or after is negative

POST/domain_names/{id}/incoming_sender_rules

API key OK Needs domains.email.sender_rules.manage.

Description: Allow, block or remove one sender for the domain name or one of its addresses (scope); an address rule overrides the domain rule for the same sender. Returns the rules as GET does, with status updating until the change is live. If an earlier change is still running, yours is queued and you get the same 200 answer; an out-of-date version is refused first. API keys need domains.email.sender_rules.manage.

Parameters & Try It Out:

ParameterTypeDescriptionValidationTest Value
id *
(Path Parameter)
IntegerID of the domain nameRequired Integer
scope *Stringdomain, or one of the email addresses listed in recipients by GET-
sender *StringOne sender address or pattern, e.g. *@example.com or sales?@example.com: * matches any text, ? one character. Rules with legacy_pattern true can only be removed. Empty string for retry-
action *Stringallow, block, remove, normal (address only: filter this sender normally despite a domain rule) or retry (apply the current rules again, e.g. after status failed)-
version *Integerversion from your latest GET, so you do not overwrite a change you have not seen-
request_key *StringYour own unique key for this change: 16 to 80 letters, digits or hyphens. Sending the same request again with the same key applies it only once-

Possible Errors:

AUTH_006The API key lacks the required permission
DOMAIN_NOT_FOUNDNo domain name with this ID in your account
INCOMING_SPAM_001Sender rules are turned off, the mail gateway cannot be reached or needs a review (gateway.state review); domain names with over 1,000 addresses need support
INCOMING_SPAM_002The domain name has no active email hosting
INCOMING_SPAM_003version is out of date or the address changed (GET again), request_key was used for another change, or the domain has sender rules under another domain name ID
INCOMING_SPAM_004The list is full; error.limit shows which list and how full it is (used, max). Removing or changing rules still works
INPUT_001Invalid scope, sender, action, version or request_key, an unknown field, or normal for the domain

POST/domain_names/{id}/quarantine/actions

API key OK Needs domains.email.quarantine.release to release, or domains.email.quarantine.delete to delete.

Description: Release or delete held spam and get a status per message: release_requested, deleted, failed (not changed; act again with a new request_key) or unknown (the gateway may have acted; contact support). If no message was changed you get 409 and can send it again. While another action runs, yours is queued (200, status queued). API keys need domains.email.quarantine.release to release, or domains.email.quarantine.delete to delete.

Parameters & Try It Out:

ParameterTypeDescriptionValidationTest Value
id *
(Path Parameter)
IntegerID of the domain nameRequired Integer
recipientStringThe recipient filter of the list, if any; makes the lookup faster-
reasonStringThe reason filter of the list, if any; makes the lookup faster-
ids *String1 to 50 message IDs from GET quarantine-
action *Stringrelease (deliver to the recipient) or delete; spam messages only-
request_key *StringYour own unique key for this request: 16 to 80 letters, digits or hyphens. Sending it again returns the first result instead of acting twice-

Possible Errors:

AUTH_006The API key lacks the required permission
DOMAIN_NOT_FOUNDNo domain name with this ID in your account
GENERAL_002A message is no longer in quarantine; nothing was done
INCOMING_SPAM_001Quarantine is turned off, the mail gateway cannot be reached or the quarantine could not be fully checked (try again); domain names with over 1,000 addresses need support
INCOMING_SPAM_002The domain name has no active email hosting
INCOMING_SPAM_003request_key was used for other messages or another action, a message already had an action, or no message was changed (try again)
INPUT_001Invalid action, ids, request_key, recipient or reason, or a message held for a virus or attachment

POST/domain_names/{id}/quarantine_report_settings

API key OK Needs domains.email.quarantine_reports.manage.

Description: Set the quarantine report schedule and mailbox for the domain name or one address (scope). An address setting overrides the domain; send inherit for both frequency and destination_id to remove it, the only address change allowed with grouping domain. Returns the settings as GET does; if they are busy, your change is queued and shown as saved (200); an out-of-date version is refused first. API keys need domains.email.quarantine_reports.manage.

Parameters & Try It Out:

ParameterTypeDescriptionValidationTest Value
id *
(Path Parameter)
IntegerID of the domain nameRequired Integer
scope *Stringdomain, or one of the email addresses listed in recipients by GET-
frequency *Stringdaily (08:00), twice_daily (08:00 and 20:00), weekly (Monday 08:00) or disabled, Amsterdam time; for an address also inherit (follow the domain)-
destination_id *StringMailbox ID from GET quarantine_report_destinations, or 0 to send each report to the address it is about; for an address also inherit (follow the domain)-
version *Integerversion from your latest GET, so you do not overwrite a change you have not seen-
groupingStringDomain scope only: address (one report per address) or domain (one report for all addresses, needs a mailbox ID in destination_id). Omit to keep the current choice-

Possible Errors:

AUTH_006The API key lacks the required permission
DOMAIN_NOT_FOUNDNo domain name with this ID in your account
INCOMING_SPAM_001Sender rules, quarantine and its reports are turned off, or the domain name has more than 1,000 addresses (contact support)
INCOMING_SPAM_002The domain name has no active email hosting
INCOMING_SPAM_003version is out of date or the address changed (GET again), or address settings were sent while grouping is domain
INPUT_001Invalid scope, frequency, destination_id, version or grouping, the mailbox is not active in your account, or grouping domain without a mailbox

POST/external_domain_names/{id}/incoming_sender_rules

API key OK Needs domains.email.sender_rules.manage.

Description: Allow, block or remove one sender for the domain name or one of its addresses (scope); an address rule overrides the domain rule for the same sender. Returns the rules as GET does, with status updating until the change is live. If an earlier change is still running, yours is queued and you get the same 200 answer; an out-of-date version is refused first. API keys need domains.email.sender_rules.manage.

Parameters & Try It Out:

ParameterTypeDescriptionValidationTest Value
id *
(Path Parameter)
IntegerID of the external domain nameRequired Integer
scope *Stringdomain, or one of the email addresses listed in recipients by GET-
sender *StringOne sender address or pattern, e.g. *@example.com or sales?@example.com: * matches any text, ? one character. Rules with legacy_pattern true can only be removed. Empty string for retry-
action *Stringallow, block, remove, normal (address only: filter this sender normally despite a domain rule) or retry (apply the current rules again, e.g. after status failed)-
version *Integerversion from your latest GET, so you do not overwrite a change you have not seen-
request_key *StringYour own unique key for this change: 16 to 80 letters, digits or hyphens. Sending the same request again with the same key applies it only once-

Possible Errors:

AUTH_006The API key lacks the required permission
DOMAIN_NOT_FOUNDNo domain name with this ID in your account
INCOMING_SPAM_001Sender rules are turned off, the mail gateway cannot be reached or needs a review (gateway.state review); domain names with over 1,000 addresses need support
INCOMING_SPAM_002The domain name has no active email hosting
INCOMING_SPAM_003version is out of date or the address changed (GET again), request_key was used for another change, or the domain has sender rules under another domain name ID
INCOMING_SPAM_004The list is full; error.limit shows which list and how full it is (used, max). Removing or changing rules still works
INPUT_001Invalid scope, sender, action, version or request_key, an unknown field, or normal for the domain

POST/external_domain_names/{id}/quarantine/actions

API key OK Needs domains.email.quarantine.release to release, or domains.email.quarantine.delete to delete.

Description: Release or delete held spam and get a status per message: release_requested, deleted, failed (not changed; act again with a new request_key) or unknown (the gateway may have acted; contact support). If no message was changed you get 409 and can send it again. While another action runs, yours is queued (200, status queued). API keys need domains.email.quarantine.release to release, or domains.email.quarantine.delete to delete.

Parameters & Try It Out:

ParameterTypeDescriptionValidationTest Value
id *
(Path Parameter)
IntegerID of the external domain nameRequired Integer
recipientStringThe recipient filter of the list, if any; makes the lookup faster-
reasonStringThe reason filter of the list, if any; makes the lookup faster-
ids *String1 to 50 message IDs from GET quarantine-
action *Stringrelease (deliver to the recipient) or delete; spam messages only-
request_key *StringYour own unique key for this request: 16 to 80 letters, digits or hyphens. Sending it again returns the first result instead of acting twice-

Possible Errors:

AUTH_006The API key lacks the required permission
DOMAIN_NOT_FOUNDNo domain name with this ID in your account
GENERAL_002A message is no longer in quarantine; nothing was done
INCOMING_SPAM_001Quarantine is turned off, the mail gateway cannot be reached or the quarantine could not be fully checked (try again); domain names with over 1,000 addresses need support
INCOMING_SPAM_002The domain name has no active email hosting
INCOMING_SPAM_003request_key was used for other messages or another action, a message already had an action, or no message was changed (try again)
INPUT_001Invalid action, ids, request_key, recipient or reason, or a message held for a virus or attachment

POST/external_domain_names/{id}/quarantine_report_settings

API key OK Needs domains.email.quarantine_reports.manage.

Description: Set the quarantine report schedule and mailbox for the domain name or one address (scope). An address setting overrides the domain; send inherit for both frequency and destination_id to remove it, the only address change allowed with grouping domain. Returns the settings as GET does; if they are busy, your change is queued and shown as saved (200); an out-of-date version is refused first. API keys need domains.email.quarantine_reports.manage.

Parameters & Try It Out:

ParameterTypeDescriptionValidationTest Value
id *
(Path Parameter)
IntegerID of the external domain nameRequired Integer
scope *Stringdomain, or one of the email addresses listed in recipients by GET-
frequency *Stringdaily (08:00), twice_daily (08:00 and 20:00), weekly (Monday 08:00) or disabled, Amsterdam time; for an address also inherit (follow the domain)-
destination_id *StringMailbox ID from GET quarantine_report_destinations, or 0 to send each report to the address it is about; for an address also inherit (follow the domain)-
version *Integerversion from your latest GET, so you do not overwrite a change you have not seen-
groupingStringDomain scope only: address (one report per address) or domain (one report for all addresses, needs a mailbox ID in destination_id). Omit to keep the current choice-

Possible Errors:

AUTH_006The API key lacks the required permission
DOMAIN_NOT_FOUNDNo domain name with this ID in your account
INCOMING_SPAM_001Sender rules, quarantine and its reports are turned off, or the domain name has more than 1,000 addresses (contact support)
INCOMING_SPAM_002The domain name has no active email hosting
INCOMING_SPAM_003version is out of date or the address changed (GET again), or address settings were sent while grouping is domain
INPUT_001Invalid scope, frequency, destination_id, version or grouping, the mailbox is not active in your account, or grouping domain without a mailbox

/mcp

GET/mcp

API key OK Each MCP tool needs its own permission.

Description: MCP (Model Context Protocol) endpoint for supplier, domain, invoice, and translation management. Same permission requirements as POST method.

Try It Out:

POST/mcp

API key OK Each MCP tool needs its own permission.

Description: MCP (Model Context Protocol) endpoint for supplier, domain, invoice, and translation management. API-key authenticated MCP tool calls require the corresponding mcp_tools permission. Direct API endpoint calls use api_endpoints permissions.

MCP tool permissions:

Try It Out:

Possible Errors:

AUTH_003Invalid or missing authentication token
AUTH_006API key lacks required MCP tool permission

/orders

GET/orders/{id}

API key OK Needs domains.order.create or plans.order.create.

Description: Get one of your orders (from the API or the shopping cart) with the status of each line: unprocessed, processing, processed, awaiting_required_info, transfer_failed, failed or cancelled. sent_to_processing is false while an API order waits to be sent to processing (at most about a minute). API keys need domains.order.create or plans.order.create.

Parameters & Try It Out:

ParameterTypeDescriptionValidationTest Value
id *
(Path Parameter)
IntegerID of the orderRequired Integer
Example Response:
{
    "order_id": 5925,
    "order_status": "processed",
    "created_at": "2026-11-13T17:05:00+00:00",
    "source": "api",
    "sent_to_processing": true,
    "items": [
        {
            "id": 22455,
            "product": "Registration",
            "status": "processed",
            "price_excluding_vat_in_cents": 469,
            "order_period": 1,
            "domain_name": "example.nl",
            "domain_name_id": 13310
        }
    ],
    "payment": {
        "method": "site_wallet",
        "status": "paid",
        "total_including_vat_in_cents": 567
    },
    "invoice": {
        "type": "monthly_invoice",
        "monthly_invoice_id": 1600,
        "invoice_id": null
    }
}

Possible Errors:

AUTH_002User session has expired
AUTH_003Not logged in: send an API key in X-API-Key
AUTH_006No API key, or the API key lacks domains.order.create and plans.order.create
GENERAL_001Order not found or not yours
INPUT_001Invalid order ID

/plans

GET/plans

API key OK Needs domains.view.

Description: Get all all-in-one plans for the current user. Returns an array of plan objects with full details including plan specifications (CPU, RAM, disk, bandwidth), associated domain names, webhosting accounts, and available upgrade options. API keys need domains.view.

Parameters & Try It Out:

ParameterTypeDescriptionValidationTest Value
pageIntegerPage number for paginationMin: 1
itemsPerPageIntegerNumber of items per pageMin: 1, Max: 100
paginationBooleanEnable or disable pagination-
statusStringFilter by plan status. Valid options: active, manually_expired, expired, deletedOne of: active, manually_expired, expired, deleted
sort_byStringField to sort by. Valid options: id, created_at, expires_at, status, nameOne of: id, created_at, expires_at, status, name
sort_orderStringSort order. Valid options: asc (ascending) or desc (descending). Default: descOne of: asc, desc, ASC, DESC

Possible Errors:

AUTH_002User session has expired
AUTH_003User is not logged in
AUTH_0042FA authentication not complete
AUTH_006API key lacks required permission: domains.view
DB_001Database error occurred while fetching plans
INPUT_001Invalid input parameters

GET/plans/{id}

API key OK Needs domains.view.

Description: Get one all-in-one plan by ID with its specifications, linked domain names, hosting accounts, upgrade options and usage. Usage covers storage, this month's hosting bandwidth, the number of domain names and the number of email addresses. Each metric has used, limit (null means unlimited), unit, status (ready, partial or unavailable) and observed_at; partial values are lower bounds.

Parameters & Try It Out:

ParameterTypeDescriptionValidationTest Value
id *
(Path Parameter)
IntegerID of the planRequired Integer

Possible Errors:

AUTH_002User session has expired
AUTH_003User is not logged in
AUTH_0042FA authentication not complete
AUTH_006API key lacks required permission: domains.view
DB_001Database error occurred while fetching plan
GENERAL_001Plan not found
INPUT_001Invalid plan ID

GET/plans/{id}/website_security

API key OK Needs domains.view.

Description: Website security of the plan's hosting account from the nightly scan: hacked websites, security holes and outdated software per website, and the email report settings. status is ready, not_scanned or unavailable. care is the website care offer: available, currency, prices in cents excluding VAT, months, protected_until and the product_id to order it with. API keys need domains.view.

Parameters & Try It Out:

ParameterTypeDescriptionValidationTest Value
id *
(Path Parameter)
IntegerID of the planRequired Integer

Possible Errors:

AUTH_002User session has expired
AUTH_003User is not logged in
AUTH_0042FA authentication not complete
AUTH_006API key lacks required permission: domains.view
DB_001Database error occurred while fetching plan
GENERAL_001Plan not found
GENERAL_002The plan has no active hosting account
INPUT_001Invalid plan ID

POST/plans/order

API key OK Needs plans.order.create.

Description: Order a new plan, optionally with domain names you already have, with the same checks and price as the shopping cart. Paid from your wallet; the line goes on your monthly invoice, marked Via API. Nothing is charged when a check fails or the balance is too low; dry_run returns the price only, and a retry with the same Idempotency-Key header is never charged twice. API keys need plans.order.create.

Parameters & Try It Out:

ParameterTypeDescriptionValidationTest Value
plan_name *StringName of the plan, as in GET plans (for example starter).-
order_periodIntegerNumber of years (1 to 5, default 1).Min: 1, Max: 5
domain_name_idsStringIDs of your active domain names to put in the new plan (no plan yet).-
external_domain_name_idsStringIDs of your external domain names to put in the new plan (no plan yet).-
expected_priceIntegerThe price in cents excluding VAT you accept; the order is refused (ORDER_002) when the price differs.Min: 0
dry_runBooleantrue: only check and price the order; nothing is ordered or charged (default false). The answer also says if your wallet covers it (wallet, with top_up when it does not).-
Example Request:
{
    "plan_name": "starter",
    "order_period": 1,
    "domain_name_ids": [
        6731
    ]
}
Example Response:
{
    "order_id": 5926,
    "order_status": "paid",
    "dry_run": false,
    "currency": "EUR",
    "items": [
        {
            "id": 22456,
            "status": "unprocessed",
            "product": "New all in one plan",
            "plan_name": "starter",
            "order_period": 1,
            "domain_name_ids": [
                6731
            ],
            "external_domain_name_ids": [],
            "price_excluding_vat_in_cents": 3588
        }
    ],
    "amount_excluding_vat_in_cents": 3588,
    "transaction_cost_in_cents": 0,
    "vat_percentage": 21,
    "vat_amount_in_cents": 753,
    "total_including_vat_in_cents": 4341,
    "payment": {
        "type": "monthly_invoice",
        "monthly_invoice_id": 1601,
        "wallet_transaction_id": 4301,
        "wallet_balance_in_cents": 5092
    }
}

Possible Errors:

AUTH_002User session has expired
AUTH_003Not logged in: send an API key in X-API-Key
AUTH_006No API key, or the API key lacks the permission
DB_001The order could not be placed; nothing was charged
DOMAIN_NOT_FOUNDDomain name or external domain name not found or not yours
GENERAL_001No plan with this name
INPUT_001Unexpected request parameter
INPUT_002Invalid parameter or Idempotency-Key; fields names it
ORDER_001HTTP 402: the wallet balance does not cover the total including VAT; top_up has the amount to add and a link where you top up the wallet
ORDER_002HTTP 409: the price differs from expected_price; the answer has the current price
ORDER_003HTTP 422: the shopping cart would refuse this order; reason says why
ORDER_004HTTP 422: paying from the wallet is not possible for this account; reason says why
ORDER_005HTTP 409: this Idempotency-Key was already used for another request

POST/plans/{id}/renew

API key OK Needs plans.order.create.

Description: Renew one of your active plans for order_period years, with the same checks and price as the shopping cart. Paid from your wallet; the line goes on your monthly invoice, marked Via API. Nothing is charged when a check fails or the balance is too low; dry_run returns the price only, and a retry with the same Idempotency-Key header is never charged twice. API keys need plans.order.create.

Parameters & Try It Out:

ParameterTypeDescriptionValidationTest Value
id *
(Path Parameter)
IntegerID of the planRequired Integer
order_periodIntegerNumber of years (1 to 5, default 1).Min: 1, Max: 5
expected_priceIntegerThe price in cents excluding VAT you accept; the order is refused (ORDER_002) when the price differs.Min: 0
dry_runBooleantrue: only check and price the order; nothing is ordered or charged (default false). The answer also says if your wallet covers it (wallet, with top_up when it does not).-
Example Request:
{
    "order_period": 1
}
Example Response:
{
    "order_id": 5926,
    "order_status": "paid",
    "dry_run": false,
    "currency": "EUR",
    "items": [
        {
            "id": 22456,
            "status": "unprocessed",
            "product": "Renew all in one plan",
            "plan_id": 91,
            "plan_name": "starter",
            "order_period": 1,
            "price_excluding_vat_in_cents": 3588
        }
    ],
    "amount_excluding_vat_in_cents": 3588,
    "transaction_cost_in_cents": 0,
    "vat_percentage": 21,
    "vat_amount_in_cents": 753,
    "total_including_vat_in_cents": 4341,
    "payment": {
        "type": "monthly_invoice",
        "monthly_invoice_id": 1601,
        "wallet_transaction_id": 4301,
        "wallet_balance_in_cents": 5092
    }
}

Possible Errors:

AUTH_002User session has expired
AUTH_003Not logged in: send an API key in X-API-Key
AUTH_006No API key, or the API key lacks the permission
DB_001The order could not be placed; nothing was charged
GENERAL_001Plan not found or not yours
INPUT_001Unexpected request parameter
INPUT_002Invalid parameter or Idempotency-Key; fields names it
ORDER_001HTTP 402: the wallet balance does not cover the total including VAT; top_up has the amount to add and a link where you top up the wallet
ORDER_002HTTP 409: the price differs from expected_price; the answer has the current price
ORDER_003HTTP 422: the shopping cart would refuse this order; reason says why
ORDER_004HTTP 422: paying from the wallet is not possible for this account; reason says why
ORDER_005HTTP 409: this Idempotency-Key was already used for another request

POST/plans/{id}/restore

API key OK Needs plans.order.create.

Description: Restore one of your expired or cancelled plans within 14 days after it expired, with the same checks and price as the shopping cart. Paid from your wallet; the line goes on your monthly invoice, marked Via API. Nothing is charged when a check fails or the balance is too low; dry_run returns the price only, and a retry with the same Idempotency-Key header is never charged twice. API keys need plans.order.create.

Parameters & Try It Out:

ParameterTypeDescriptionValidationTest Value
id *
(Path Parameter)
IntegerID of the planRequired Integer
order_periodIntegerNumber of years (1 to 5, default 1).Min: 1, Max: 5
expected_priceIntegerThe price in cents excluding VAT you accept; the order is refused (ORDER_002) when the price differs.Min: 0
dry_runBooleantrue: only check and price the order; nothing is ordered or charged (default false). The answer also says if your wallet covers it (wallet, with top_up when it does not).-
Example Request:
{
    "order_period": 1,
    "dry_run": true
}
Example Response:
{
    "order_id": 5926,
    "order_status": "paid",
    "dry_run": false,
    "currency": "EUR",
    "items": [
        {
            "id": 22456,
            "status": "unprocessed",
            "product": "Restore all in one plan",
            "plan_id": 91,
            "plan_name": "starter",
            "order_period": 1,
            "price_excluding_vat_in_cents": 3588
        }
    ],
    "amount_excluding_vat_in_cents": 3588,
    "transaction_cost_in_cents": 0,
    "vat_percentage": 21,
    "vat_amount_in_cents": 753,
    "total_including_vat_in_cents": 4341,
    "payment": {
        "type": "monthly_invoice",
        "monthly_invoice_id": 1601,
        "wallet_transaction_id": 4301,
        "wallet_balance_in_cents": 5092
    }
}

Possible Errors:

AUTH_002User session has expired
AUTH_003Not logged in: send an API key in X-API-Key
AUTH_006No API key, or the API key lacks the permission
DB_001The order could not be placed; nothing was charged
GENERAL_001Plan not found or not yours
INPUT_001Unexpected request parameter
INPUT_002Invalid parameter or Idempotency-Key; fields names it
ORDER_001HTTP 402: the wallet balance does not cover the total including VAT; top_up has the amount to add and a link where you top up the wallet
ORDER_002HTTP 409: the price differs from expected_price; the answer has the current price
ORDER_003HTTP 422: the shopping cart would refuse this order; reason says why
ORDER_004HTTP 422: paying from the wallet is not possible for this account; reason says why
ORDER_005HTTP 409: this Idempotency-Key was already used for another request

POST/plans/{id}/website_security/settings

API key OK Needs domains.plan.manage.

Description: Change how often the account holder gets the website security emails of the plan's hosting account. Send one or more settings; the others keep their value. Daily emails and reports are sent at 08:00 Europe/Amsterdam, weekly ones on Monday. API keys need domains.plan.manage.

Parameters & Try It Out:

ParameterTypeDescriptionValidationTest Value
id *
(Path Parameter)
IntegerID of the planRequired Integer
hackedStringEmails about hacked websites: immediately or daily. They cannot be turned off.One of: immediately, daily
vulnerabilitiesStringEmails about new high and critical security holes: immediately, daily, weekly or offOne of: immediately, daily, weekly, off
outdatedStringThe report about outdated software and all open holes: weekly, monthly or offOne of: weekly, monthly, off
Example Request:
{
    "vulnerabilities": "daily",
    "outdated": "monthly"
}

Possible Errors:

AUTH_002User session has expired
AUTH_003User is not logged in
AUTH_0042FA authentication not complete
AUTH_006API key lacks required permission: domains.plan.manage
DB_001Database error occurred while saving the settings
GENERAL_001Plan not found
GENERAL_002The plan has no active hosting account
INPUT_001Invalid plan ID or setting, or no setting sent

/shopping_carts

GET/shopping_carts/current/proforma_pdf

API key OK No permission needed.

Description: Download a proforma invoice (PDF) of the current shopping cart (shopping-cart-key cookie) of the logged-in user: products, prices and VAT, marked as not paid, with a payment link and bank transfer details. The bank reference is that of a pending bank transfer payment of this cart (POST /api/payments); without one: PROFORMA_001. Creates no invoice, payment or order. Needs billing details on the cart.

Parameters & Try It Out:

ParameterTypeDescriptionValidationTest Value
languageStringLanguage of the PDF (the page language). Default: the account language.One of: en, nl, de, fr, es, pl, sl, sv
paymentIntegerId of the pending bank transfer payment of this cart whose reference goes on the PDF. Default: the newest one that still fits the cart.Min: 1
bank_transferString0 = leave the bank transfer details out (no payment needed). Default: 1.One of: 0, 1

Possible Errors:

AUTH_002User session has expired
AUTH_003User is not logged in
AUTH_0042FA authentication not complete
AUTH_006API keys can not use this endpoint
DB_001Database error occurred while making the PDF
GENERAL_001The cart is empty or not yours
INPUT_001The cart has no billing details yet
PROFORMA_001The cart has no pending bank transfer payment that fits it (or not the given one)

/tlds

GET/tlds

No login needed

Description: Get all top-level domains with pricing information and related TLD recommendations

Parameters & Try It Out:

ParameterTypeDescriptionValidationTest Value
pageIntegerPage number for paginationMin: 1
itemsPerPageIntegerNumber of items per page (max 100)Min: 1, Max: 100
paginationBooleanEnable or disable pagination (default: true)-
extensionStringFilter by TLD extension (e.g., ".com", ".net")Max: 512
tagStringFilter by TLD tagMax: 255

Possible Errors:

DB_001Database error occurred while fetching TLDs

GET/tlds/{id}

No login needed

Description: Get a specific top-level domain by ID, including related TLD recommendations

Parameters & Try It Out:

ParameterTypeDescriptionValidationTest Value
id *
(Path Parameter)
IntegerID of the tldRequired Integer

Possible Errors:

DB_001Database error occurred while fetching TLD
GENERAL_001TLD not found
INPUT_001Invalid TLD ID

GET/tlds/required_info

API key OK Needs contacts.required_info.

Description: Check which extra details a contact needs to register domain names: send contact_id and tld, or nothing to check the domain names in your shopping cart. Lists the mandatory and optional fields still missing; an empty list means nothing is needed. An item has contact_roles when a role needs another contact than the holder. API keys need contacts.required_info.

Parameters & Try It Out:

ParameterTypeDescriptionValidationTest Value
contact_idIntegerContact ID to check. If provided, tld must also be provided-
tldStringTLD to check (e.g., ".es", ".com"). If provided, contact_id must also be provided-

Possible Errors:

AUTH_002User session has expired
AUTH_003User is not logged in
AUTH_0042FA authentication not complete
AUTH_006The API key lacks the required permission
CONTACT_NOT_FOUNDContact not found
DB_001Database error occurred while fetching required info
INPUT_002Both contact_id and tld must be provided together

/users

GET/users/invoices

API key OK Needs invoices.read.

Description: List your invoices, newest first. API keys need invoices.read.

Parameters & Try It Out:

ParameterTypeDescriptionValidationTest Value
pageIntegerPage number for paginationMin: 1
itemsPerPageIntegerNumber of items per pageMin: 1, Max: 100
paginationBooleanEnable or disable pagination-
date_fromStringFilter invoices created on or after this date/time-
date_toStringFilter invoices created on or before this date/time-
sort_byStringField to sort by. Supports id, creation_date, and vat_percentage. Default is creation_dateOne of: id, creation_date, vat_percentage
sort_orderStringSort order. Default is DESCOne of: ASC, DESC, asc, desc
Example Response:
[
    {
        "id": 472,
        "payment": 652,
        "vat_percentage": 21,
        "amount_excluding_vat_in_cents": 9398,
        "vat_in_cents": 1974,
        "total_including_vat_in_cents": 11372,
        "creation_date": "2026-06-18T12:16:26+02:00",
        "has_pdf": true,
        "pdf_download_url": "/v2/users/invoices/472/pdf",
        "currency": {
            "id": 1,
            "name": "EUR",
            "symbol": "€"
        }
    }
]

Possible Errors:

AUTH_002User session has expired
AUTH_003User is not logged in
AUTH_0042FA authentication not complete
AUTH_005User belongs to a different application host
AUTH_006API key lacks required permission: invoices.read
DB_001Database error occurred while fetching invoices

GET/users/invoices/{id}

API key OK Needs invoices.read.

Description: Get one invoice with its invoice lines. Admins logged in with a session can add user_id to get another customer's invoice. API keys need invoices.read.

Parameters & Try It Out:

ParameterTypeDescriptionValidationTest Value
id *
(Path Parameter)
IntegerID of the invoiceRequired Integer
user_idIntegerOnly return the invoice if it belongs to this customer. Admins logged in with a session can pass any customer's ID; others only their own.Min: 1
Example Response:
{
    "id": 472,
    "payment": 652,
    "vat_percentage": 21,
    "amount_excluding_vat_in_cents": 9398,
    "vat_in_cents": 1974,
    "total_including_vat_in_cents": 11372,
    "creation_date": "2026-06-18T12:16:26+02:00",
    "pdf_download_url": "/v2/users/invoices/472/pdf",
    "currency": {
        "id": 1,
        "name": "EUR",
        "symbol": "€"
    },
    "invoice_lines": [
        {
            "id": 683,
            "price_excluding_vat": 9369,
            "information": {
                "domain_name": "example.jobs"
            }
        }
    ]
}

Possible Errors:

AUTH_002User session has expired
AUTH_003User is not logged in
AUTH_0042FA authentication not complete
AUTH_005User belongs to a different application host
AUTH_006API key lacks required permission: invoices.read, or user_id is not yours and you are not an admin logged in with a session
DB_001Database error occurred while fetching invoice
GENERAL_001Invoice not found
USER_001User not found

GET/users/invoices/{id}/pdf

API key OK Needs invoices.read.

Description: Download the PDF of an invoice. Admins logged in with a session can add user_id to get another customer's invoice. API keys need invoices.read.

Parameters & Try It Out:

ParameterTypeDescriptionValidationTest Value
id *
(Path Parameter)
IntegerID of the invoiceRequired Integer
user_idIntegerOnly return the PDF if the invoice belongs to this customer. Admins logged in with a session can pass any customer's ID; others only their own.Min: 1

Possible Errors:

AUTH_002User session has expired
AUTH_003User is not logged in
AUTH_0042FA authentication not complete
AUTH_005User belongs to a different application host
AUTH_006API key lacks required permission: invoices.read, or user_id is not yours and you are not an admin logged in with a session
DB_001Database error occurred while generating invoice PDF
GENERAL_001Invoice not found
USER_001User not found

GET/users/monthly_invoices

API key OK Needs invoices.read.

Description: List your pending monthly invoices (not yet turned into an invoice), grouped per invoice buyer with totals. Pages count buyer groups. API keys need invoices.read.

Parameters & Try It Out:

ParameterTypeDescriptionValidationTest Value
pageIntegerPage number for paginationMin: 1
itemsPerPageIntegerNumber of buyer groups per pageMin: 1, Max: 100
paginationBooleanEnable or disable pagination-
date_fromStringFilter pending monthly invoices created on or after this date/time-
date_toStringFilter pending monthly invoices created on or before this date/time-
sort_byStringField to sort buyer groups by. Default is buyer_idOne of: buyer_id, first_creation_date, latest_creation_date
sort_orderStringSort order. Default is ASCOne of: ASC, DESC, asc, desc
Example Response:
[
    {
        "buyer": {
            "id": 1,
            "first_name": "Reshad",
            "last_name": "Bashir",
            "email": "reshad@example.com",
            "country": "NL"
        },
        "monthly_invoices": [
            {
                "id": 1,
                "payment": 652,
                "vat_percentage": 21,
                "amount_excluding_vat_in_cents": 5988,
                "vat_in_cents": 1257,
                "total_including_vat_in_cents": 7245,
                "creation_date": "2026-06-08T10:46:37+02:00",
                "currency": {
                    "id": 1,
                    "name": "EUR",
                    "symbol": "€"
                },
                "invoice_lines": [
                    {
                        "id": 1,
                        "price_excluding_vat": 5988,
                        "information": {
                            "created_at": "08-06-2026"
                        }
                    }
                ]
            }
        ],
        "amount_excluding_vat_in_cents": 5988,
        "vat_in_cents": 1257,
        "total_including_vat_in_cents": 7245,
        "pdf_download_url": "/v2/users/monthly_invoices/buyers/1/pdf"
    }
]

Possible Errors:

AUTH_002User session has expired
AUTH_003User is not logged in
AUTH_0042FA authentication not complete
AUTH_005User belongs to a different application host
AUTH_006API key lacks required permission: invoices.read
DB_001Database error occurred while fetching monthly invoices

GET/users/monthly_invoices/buyers/{id}/pdf

API key OK Needs invoices.read.

Description: Download a PDF preview of all pending monthly invoices of one invoice buyer (buyer.id from GET users/monthly_invoices). Admins logged in with a session can add user_id to get another customer's PDF. API keys need invoices.read.

Parameters & Try It Out:

ParameterTypeDescriptionValidationTest Value
id *
(Path Parameter)
IntegerID of the buyerRequired Integer
user_idIntegerOnly use the pending monthly invoices of this customer. Admins logged in with a session can pass any customer's ID; others only their own.Min: 1

Possible Errors:

AUTH_002User session has expired
AUTH_003User is not logged in
AUTH_0042FA authentication not complete
AUTH_005User belongs to a different application host
AUTH_006API key lacks required permission: invoices.read, or user_id is not yours and you are not an admin logged in with a session
DB_001Database error occurred while generating monthly invoice PDF
GENERAL_001Invoice buyer not found or has no pending monthly invoices
USER_001User not found

GET/users/monthly_invoices/{id}

API key OK Needs invoices.read.

Description: Get one pending monthly invoice. Admins logged in with a session can add user_id to get another customer's invoice. API keys need invoices.read.

Parameters & Try It Out:

ParameterTypeDescriptionValidationTest Value
id *
(Path Parameter)
IntegerID of the monthly invoiceRequired Integer
user_idIntegerOnly return the monthly invoice if it belongs to this customer. Admins logged in with a session can pass any customer's ID; others only their own.Min: 1
Example Response:
{
    "id": 1,
    "payment": 652,
    "vat_percentage": 21,
    "amount_excluding_vat_in_cents": 5988,
    "vat_in_cents": 1257,
    "total_including_vat_in_cents": 7245,
    "creation_date": "2026-06-08T10:46:37+02:00",
    "currency": {
        "id": 1,
        "name": "EUR",
        "symbol": "€"
    },
    "invoice_buyer": {
        "id": 1,
        "first_name": "Reshad",
        "last_name": "Bashir",
        "email": "reshad@example.com"
    },
    "metadata": [],
    "invoice_lines": [
        {
            "id": 1,
            "price_excluding_vat": 5988,
            "information": {
                "created_at": "08-06-2026"
            }
        }
    ],
    "pdf_download_url": "/v2/users/monthly_invoices/buyers/1/pdf"
}

Possible Errors:

AUTH_002User session has expired
AUTH_003User is not logged in
AUTH_0042FA authentication not complete
AUTH_005User belongs to a different application host
AUTH_006API key lacks required permission: invoices.read, or user_id is not yours and you are not an admin logged in with a session
DB_001Database error occurred while fetching monthly invoice
GENERAL_001Monthly invoice not found or already invoiced
USER_001User not found

PATCH/users/{id}/monthly_invoicing

API key OK Needs monthly_invoicing.update.

Description: Enable or disable monthly invoicing for the current user. Admins can update users on the current application host. API keys need monthly_invoicing.update.

Parameters & Try It Out:

ParameterTypeDescriptionValidationTest Value
id *
(Path Parameter)
IntegerID of the userRequired Integer
monthly_invoicing *BooleanWhether monthly invoicing should be enabled for the user-
Example Response:
{
    "user_id": 63,
    "email": "user@example.com",
    "monthly_invoicing": true
}

Possible Errors:

AUTH_002User session has expired
AUTH_003User is not logged in
AUTH_0042FA authentication not complete
AUTH_005User belongs to a different application host
AUTH_006Cannot update monthly invoicing for another user
INPUT_001Invalid input parameters
USER_001User not found