fb-pixel
SupportHost italian

Domains

Register, transfer, renew and restore domains, paid from the account credit, and read a domain’s state by name.

Every money-moving call accepts an Idempotency-Key header: a retry with the same key returns the original response (with Idempotent-Replayed: true) and never charges twice.

Get a domain by name #

GET /reseller/domains/{name}

Returns the current state of one of your domains: status, dates, auto-renew and whether a transfer is pending or failed. The id in the response is the one the Domain management calls are addressed by.

Use it to poll an operation that answered 202. It reads the state stored on this server and never contacts the registry, so it is cheap to call.

Parameters

Path

  • name string required

Responses

  • 200

    The domain.

    Response body application/json
    • data object
      8 properties
      • id integer
      • name string
      • status string
        Allowed values pending pending_registration pending_transfer active expired grace redemption pending_delete transferring_away transferred_away transfer_failed cancelled fraud
      • registration_date string | null
      • expiration_date string | null
      • next_due_date string | null
      • auto_renew boolean
      • transfer object
        2 properties
        • pending boolean
        • failed boolean
  • 401 Missing, invalid or expired token. MessageError
  • 403 not_reseller credit_disabled forbidden ip_not_allowed ip_whitelist_misconfigured ResellerError
  • 404 not_found ResellerError
  • 429 Rate limit exceeded. Retry after the number of seconds in Retry-After. MessageError

cURL

curl 'https://portal.supporthost.com/api/v1/reseller/domains/{name}' \
  -H "Authorization: Bearer $API_TOKEN" \
  -H 'Accept: application/json'

PHP

Install Guzzle once: composer require guzzlehttp/guzzle

<?php

require 'vendor/autoload.php';

$client = new GuzzleHttp\Client();

$response = $client->request('GET', 'https://portal.supporthost.com/api/v1/reseller/domains/{name}', [
    'headers' => [
        'Authorization' => 'Bearer ' . getenv('API_TOKEN'),
        'Accept' => 'application/json',
    ],
]);

echo $response->getBody();

Node.js

// Save as a .mjs file (ES module, Node 18+): it uses top-level await.
const response = await fetch('https://portal.supporthost.com/api/v1/reseller/domains/{name}', {
  headers: {
    Authorization: `Bearer ${process.env.API_TOKEN}`,
    Accept: 'application/json',
  },
});

console.log(await response.json());

Response

200

{
  "data": {
    "id": 1042,
    "name": "example.com",
    "status": "active",
    "registration_date": "2026-09-15",
    "expiration_date": "2027-09-15",
    "next_due_date": "2027-09-15",
    "auto_renew": false,
    "transfer": {
      "pending": false,
      "failed": false
    }
  }
}

Error responses share one format: see Errors.

Register a domain #

POST /reseller/domains/register

Registers an available name, paid from your credit at your net price. Check availability and price first with GET /reseller/domains/check.

  • years defaults to the TLD’s minimum term; GET /reseller/pricing lists the terms you can buy.
  • nameservers (2–5 host names) is optional: omitted, the default nameservers configured on this server are used.
  • registrant is the owner contact. The phone is +CC.NNNN (e.g. +39.0212345678), or a local number plus phone_country_code (ISO country, e.g. IT).
  • extra_fields is an object of string values for the registry-specific data some TLDs require (entity type, tax codes, language…). Which keys are required depends on the TLD and on this server’s configuration, and some are only required depending on another field’s answer. Send a checkbox as "1". Keys the TLD does not declare are ignored. A missing or invalid field answers 422 invalid_contact, whose fields map names every field to fix.
  • source is optional: your platform’s own additional fields, as your platform holds them, for this server to translate into extra_fields. A key you send in extra_fields wins over a translated one.

Side effects: the charge is taken from your credit before the registry is contacted, and refunded automatically if the registry refuses. On 424 registrar_unknown the registry did not confirm the outcome and the charge is NOT refunded while it is reconciled: do not retry with a new Idempotency-Key.

Parameters

Header

  • Idempotency-Key string
    Optional. 1–255 printable ASCII characters, scoped to your account. A retry with the same key and the same request returns the stored response byte for byte (with Idempotent-Replayed: true) and never charges twice. The same key with a different request answers 422 idempotency_key_reused; while the first request is still running, 409 idempotency_in_progress (retry after retry_after seconds). Keys are kept for 30 days. See Idempotency in the introduction.
    • Min length 1
    • Max length 255

    See Rate limits and idempotency.

Body application/json required

  • name string required
    The domain to register, e.g. example.com. A Unicode (IDN) name is accepted only on a TLD that supports it, and is converted to its ASCII form; otherwise 422 invalid_domain.
    • Max length 255
  • years integer
    Registration term. Defaults to the TLD’s minimum; must be one of the register terms GET /reseller/pricing lists for the TLD, otherwise 422 invalid_years (with allowed_years).
    • Minimum 1
  • nameservers array of string
    2 to 5 nameserver host names. Optional: when omitted, the default nameservers configured on this server are used.
    • Min items 2
    • Max items 5
    • Pattern ^[A-Za-z0-9.\-]+$
    • Max length 255
  • registrant object required
    The owner contact of the domain, the only contact these calls take. The registrar fills the other roles the TLD needs (admin, tech, billing) on its own: most copy the registrant, some use contacts of their own. Change a role afterwards with the client API contacts update.
    11 properties
    • first_name string required
      • Max length 100
    • last_name string required
      • Max length 100
    • organization string | null
      Company name. Some TLDs require it and some refuse it: either case answers 422 invalid_contact.
      • Max length 200
    • email string required
      • Format email
      • Max length 200
    • phone string required
      International format +CC.NUMBER, e.g. +39.0212345678. You may instead send a local number here together with registrant.phone_country_code (ISO country, e.g. IT).
      • Pattern ^\+[0-9]{1,3}\.[0-9]{1,14}$
      • Max length 30
    • street1 string required
      • Max length 200
    • street2 string | null
      • Max length 200
    • city string required
      • Max length 100
    • state_province string | null
      • Max length 100
    • postal_code string required
      • Max length 20
    • country_code string required
      ISO 3166-1 alpha-2 country code, e.g. IT. When the TLD lists registrant_countries in GET /reseller/pricing, it must be one of them, otherwise 422 invalid_contact before any credit is taken.
      • Min length 2
      • Max length 2
      Allowed values AF AL DZ AD AO AI AQ AG SA AR
      240 more values AM AW AU AT AZ BS BH BD BB BE BZ BJ BM BT BY BO BA BW BR BN BG BF BI KH CM CA CV BQ CZ TD CL CN CY VA CO KM CD CG KP KR CR CI HR CU CW DK DM EC EG SV AE ER EE SZ ET FJ PH FI FR GA GM GE GS DE GH JM JP GI DJ JO GR GD GL GP GU GT GG GN GQ GW GY GF HT HN IN ID IR IQ IE IS BV CX NF IM KY CC CK FK FO HM MP MH UM PN SB TC VI VG AX IL IT JE KZ KE KG KI XK KW LA LS LV LB LR LY LI LT LU MK MG MW MY MV ML MT MA MQ MR MU YT MX FM MD MC MN ME MS MZ MM NA NR NP NI NE NG NU NO NC NZ OM NL PK PW PA PG PY PE PF PL PT PR QA HK MO GB CF DO RE RO RW RU EH KN LC MF VC BL PM WS AS SM SH SN RS SC SL SG SX SY SK SI SO ES LK US SS ZA SD SR SJ SE CH ST TJ TW TZ TF PS IO TH TL TG TK TO TT TN TR TM TV UA UG HU UY UZ VU VE VN WF YE ZM ZW
  • extra_fields map of string
    Registry-specific data some TLDs require (e.g. entity type, tax codes, language). Which keys are required depends on the TLD and on this server’s configuration, and some are only required depending on the answer to another field. Values are strings: send a checkbox as "1". Keys the TLD does not declare are ignored. A missing or invalid field answers 422 invalid_contact with a fields map naming each field to fix.
  • source object
    Optional. The additional domain fields of your own platform, sent as your platform holds them, for this server to translate into extra_fields. A registrar module generated by this server fills it in: you do not need it when you send extra_fields yourself. A key you send in extra_fields always wins over a translated one.
    5 properties
    • platform string
      Your platform, lower case: whmcs, hostbill.
      • Pattern ^[a-z][a-z0-9-]*$
      • Max length 32
    • version string | null
      Your platform’s own version, e.g. 8.13.1: field names differ between versions.
      • Max length 50
    • module_version string | null
      Version of the registrar module sending the request.
      • Max length 50
    • fields map of string
      The platform’s additional fields, name => value, exactly as the platform holds them (e.g. "Legal Type": "Companies/one man companies"). At most 50, values up to 255 characters.
    • translated array of string
      The extra_fields keys your module translated itself from source.fields. This server’s own translation wins over them; keys not listed here are yours and win over it.
      • Max items 100
      • Max length 64

Responses

  • 200

    Registered.

    Idempotent-Replayed string response header
    true when this response is the replay of an earlier request with the same Idempotency-Key.
    Response body application/json
    • data object
      3 properties
      • state string
        • Value completed
      • domain object
        8 properties
        • id integer
        • name string
        • status string
          Allowed values pending pending_registration pending_transfer active expired grace redemption pending_delete transferring_away transferred_away transfer_failed cancelled fraud
        • registration_date string | null
        • expiration_date string | null
        • next_due_date string | null
        • auto_renew boolean
        • transfer object
          2 properties
          • pending boolean
          • failed boolean
      • charges array of object
        8 properties
        • id integer
        • action string
          Allowed values register transfer renew restore grace_fee redemption_fee
        • years integer
        • currency string
        • net number
        • tax number
        • gross number
        • status string
          Allowed values pending billable invoiced refunded
  • 202 Accepted — completes later

    Accepted but not completed yet: the registry has taken the request and will finish it later. Your credit has already been debited; the charges stay pending until the operation completes (then they are billed on your next monthly invoice) and are refunded automatically if it fails. Poll GET /reseller/domains/{name} until status leaves pending_registration / pending_transfer (a failed transfer shows transfer.failed: true).

    Idempotent-Replayed string response header
    true when this response is the replay of an earlier request with the same Idempotency-Key.
    Response body application/json
    • data object
      3 properties
      • state string
        • Value pending
      • domain object
        8 properties
        • id integer
        • name string
        • status string
          Allowed values pending pending_registration pending_transfer active expired grace redemption pending_delete transferring_away transferred_away transfer_failed cancelled fraud
        • registration_date string | null
        • expiration_date string | null
        • next_due_date string | null
        • auto_renew boolean
        • transfer object
          2 properties
          • pending boolean
          • failed boolean
      • charges array of object
        8 properties
        • id integer
        • action string
          Allowed values register transfer renew restore grace_fee redemption_fee
        • years integer
        • currency string
        • net number
        • tax number
        • gross number
        • status string
          Allowed values pending billable invoiced refunded
  • 401 Missing, invalid or expired token. MessageError
  • 402 insufficient_credit ResellerError
  • 403 not_reseller credit_disabled forbidden ip_not_allowed ip_whitelist_misconfigured ResellerError
  • 409 operation_in_progress idempotency_in_progress ResellerError
  • 422 invalid_request invalid_contact invalid_domain tld_not_sellable invalid_years domain_unavailable registration_data_missing registrar_error invalid_idempotency_key idempotency_key_reused ResellerError
  • 424 registrar_unknown ResellerError
  • 429 Rate limit exceeded. Retry after the number of seconds in Retry-After. MessageError
  • 500 operation_failed ResellerError
  • 503 whois_unavailable ResellerError

cURL

# Idempotency-Key is optional: a retry with the same key is never processed twice.
curl -X POST 'https://portal.supporthost.com/api/v1/reseller/domains/register' \
  -H "Authorization: Bearer $API_TOKEN" \
  -H 'Accept: application/json' \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: 00000000-0000-4000-8000-000000000000' \
  -d '{
  "name": "example.com",
  "years": 1,
  "nameservers": [
    "ns1.example.net",
    "ns2.example.net"
  ],
  "registrant": {
    "first_name": "Mario",
    "last_name": "Rossi",
    "organization": "Example Srl",
    "email": "mario.rossi@example.com",
    "phone": "+39.0212345678",
    "street1": "Via Roma 1",
    "city": "Milano",
    "state_province": "MI",
    "postal_code": "20121",
    "country_code": "IT"
  }
}'

PHP

<?php

require 'vendor/autoload.php';

$client = new GuzzleHttp\Client();

$response = $client->request('POST', 'https://portal.supporthost.com/api/v1/reseller/domains/register', [
    'headers' => [
        'Authorization' => 'Bearer ' . getenv('API_TOKEN'),
        'Accept' => 'application/json',
        // Optional: a retry with the same key is never processed twice.
        'Idempotency-Key' => '00000000-0000-4000-8000-000000000000',
    ],
    'json' => [
        'name' => 'example.com',
        'years' => 1,
        'nameservers' => [
            'ns1.example.net',
            'ns2.example.net',
        ],
        'registrant' => [
            'first_name' => 'Mario',
            'last_name' => 'Rossi',
            'organization' => 'Example Srl',
            'email' => 'mario.rossi@example.com',
            'phone' => '+39.0212345678',
            'street1' => 'Via Roma 1',
            'city' => 'Milano',
            'state_province' => 'MI',
            'postal_code' => '20121',
            'country_code' => 'IT',
        ],
    ],
]);

echo $response->getBody();

Node.js

const response = await fetch('https://portal.supporthost.com/api/v1/reseller/domains/register', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.API_TOKEN}`,
    Accept: 'application/json',
    'Content-Type': 'application/json',
    // Optional: a retry with the same key is never processed twice.
    'Idempotency-Key': '00000000-0000-4000-8000-000000000000',
  },
  body: JSON.stringify({
    "name": "example.com",
    "years": 1,
    "nameservers": [
      "ns1.example.net",
      "ns2.example.net"
    ],
    "registrant": {
      "first_name": "Mario",
      "last_name": "Rossi",
      "organization": "Example Srl",
      "email": "mario.rossi@example.com",
      "phone": "+39.0212345678",
      "street1": "Via Roma 1",
      "city": "Milano",
      "state_province": "MI",
      "postal_code": "20121",
      "country_code": "IT"
    }
  }),
});

console.log(await response.json());

Response

200

{
  "data": {
    "state": "completed",
    "domain": {
      "id": 1042,
      "name": "example.com",
      "status": "active",
      "registration_date": "2026-09-15",
      "expiration_date": "2027-09-15",
      "next_due_date": "2027-09-15",
      "auto_renew": false,
      "transfer": {
        "pending": false,
        "failed": false
      }
    },
    "charges": [
      {
        "id": 5310,
        "action": "register",
        "years": 1,
        "currency": "EUR",
        "net": 11.1699999999999999289457264239899814128875732421875,
        "tax": 2.45999999999999996447286321199499070644378662109375,
        "gross": 13.6300000000000007815970093361102044582366943359375,
        "status": "billable"
      }
    ]
  }
}

202

{
  "data": {
    "state": "pending",
    "domain": {
      "id": 1042,
      "name": "example.com",
      "status": "pending_registration",
      "registration_date": "2026-09-15",
      "expiration_date": "2027-09-15",
      "next_due_date": "2027-09-15",
      "auto_renew": false,
      "transfer": {
        "pending": false,
        "failed": false
      }
    },
    "charges": [
      {
        "id": 5310,
        "action": "register",
        "years": 1,
        "currency": "EUR",
        "net": 11.1699999999999999289457264239899814128875732421875,
        "tax": 2.45999999999999996447286321199499070644378662109375,
        "gross": 13.6300000000000007815970093361102044582366943359375,
        "status": "pending"
      }
    ]
  }
}

Error responses share one format: see Errors.

Transfer a domain in #

POST /reseller/domains/transfer

Starts the transfer of a registered name to your account, paid from your credit at your net transfer price. The body is the register body plus auth_code (the EPP code from the current registrar); years is not accepted, a transfer always buys the TLD’s minimum term.

registrant, nameservers and extra_fields follow the same rules as POST /reseller/domains/register, including the per-TLD extra_fields and the 422 invalid_contact answer with its fields map.

Most transfers answer 202: the registry and the losing registrar take from hours to several days to complete one. The charge is refunded automatically if the transfer fails.

Parameters

Header

  • Idempotency-Key string
    Optional. 1–255 printable ASCII characters, scoped to your account. A retry with the same key and the same request returns the stored response byte for byte (with Idempotent-Replayed: true) and never charges twice. The same key with a different request answers 422 idempotency_key_reused; while the first request is still running, 409 idempotency_in_progress (retry after retry_after seconds). Keys are kept for 30 days. See Idempotency in the introduction.
    • Min length 1
    • Max length 255

    See Rate limits and idempotency.

Body application/json required

  • name string required
    The domain to transfer in, e.g. example.org.
    • Max length 255
  • nameservers array of string
    2 to 5 nameserver host names. Optional: when omitted, the default nameservers configured on this server are used.
    • Min items 2
    • Max items 5
    • Pattern ^[A-Za-z0-9.\-]+$
    • Max length 255
  • registrant object required
    The owner contact of the domain, the only contact these calls take. The registrar fills the other roles the TLD needs (admin, tech, billing) on its own: most copy the registrant, some use contacts of their own. Change a role afterwards with the client API contacts update.
    11 properties
    • first_name string required
      • Max length 100
    • last_name string required
      • Max length 100
    • organization string | null
      Company name. Some TLDs require it and some refuse it: either case answers 422 invalid_contact.
      • Max length 200
    • email string required
      • Format email
      • Max length 200
    • phone string required
      International format +CC.NUMBER, e.g. +39.0212345678. You may instead send a local number here together with registrant.phone_country_code (ISO country, e.g. IT).
      • Pattern ^\+[0-9]{1,3}\.[0-9]{1,14}$
      • Max length 30
    • street1 string required
      • Max length 200
    • street2 string | null
      • Max length 200
    • city string required
      • Max length 100
    • state_province string | null
      • Max length 100
    • postal_code string required
      • Max length 20
    • country_code string required
      ISO 3166-1 alpha-2 country code, e.g. IT. When the TLD lists registrant_countries in GET /reseller/pricing, it must be one of them, otherwise 422 invalid_contact before any credit is taken.
      • Min length 2
      • Max length 2
      Allowed values AF AL DZ AD AO AI AQ AG SA AR
      240 more values AM AW AU AT AZ BS BH BD BB BE BZ BJ BM BT BY BO BA BW BR BN BG BF BI KH CM CA CV BQ CZ TD CL CN CY VA CO KM CD CG KP KR CR CI HR CU CW DK DM EC EG SV AE ER EE SZ ET FJ PH FI FR GA GM GE GS DE GH JM JP GI DJ JO GR GD GL GP GU GT GG GN GQ GW GY GF HT HN IN ID IR IQ IE IS BV CX NF IM KY CC CK FK FO HM MP MH UM PN SB TC VI VG AX IL IT JE KZ KE KG KI XK KW LA LS LV LB LR LY LI LT LU MK MG MW MY MV ML MT MA MQ MR MU YT MX FM MD MC MN ME MS MZ MM NA NR NP NI NE NG NU NO NC NZ OM NL PK PW PA PG PY PE PF PL PT PR QA HK MO GB CF DO RE RO RW RU EH KN LC MF VC BL PM WS AS SM SH SN RS SC SL SG SX SY SK SI SO ES LK US SS ZA SD SR SJ SE CH ST TJ TW TZ TF PS IO TH TL TG TK TO TT TN TR TM TV UA UG HU UY UZ VU VE VN WF YE ZM ZW
  • extra_fields map of string
    Registry-specific data some TLDs require (e.g. entity type, tax codes, language). Which keys are required depends on the TLD and on this server’s configuration, and some are only required depending on the answer to another field. Values are strings: send a checkbox as "1". Keys the TLD does not declare are ignored. A missing or invalid field answers 422 invalid_contact with a fields map naming each field to fix.
  • source object
    Optional. The additional domain fields of your own platform, sent as your platform holds them, for this server to translate into extra_fields. A registrar module generated by this server fills it in: you do not need it when you send extra_fields yourself. A key you send in extra_fields always wins over a translated one.
    5 properties
    • platform string
      Your platform, lower case: whmcs, hostbill.
      • Pattern ^[a-z][a-z0-9-]*$
      • Max length 32
    • version string | null
      Your platform’s own version, e.g. 8.13.1: field names differ between versions.
      • Max length 50
    • module_version string | null
      Version of the registrar module sending the request.
      • Max length 50
    • fields map of string
      The platform’s additional fields, name => value, exactly as the platform holds them (e.g. "Legal Type": "Companies/one man companies"). At most 50, values up to 255 characters.
    • translated array of string
      The extra_fields keys your module translated itself from source.fields. This server’s own translation wins over them; keys not listed here are yours and win over it.
      • Max items 100
      • Max length 64
  • auth_code string required
    The transfer authorisation (EPP) code, obtained from the domain’s current registrar. Always required, whatever the TLD: the panel does not know reliably which registries transfer without one, so it never starts a transfer without it.
    • Max length 255

Responses

  • 200

    Transferred.

    Idempotent-Replayed string response header
    true when this response is the replay of an earlier request with the same Idempotency-Key.
    Response body application/json
    • data object
      3 properties
      • state string
        • Value completed
      • domain object
        8 properties
        • id integer
        • name string
        • status string
          Allowed values pending pending_registration pending_transfer active expired grace redemption pending_delete transferring_away transferred_away transfer_failed cancelled fraud
        • registration_date string | null
        • expiration_date string | null
        • next_due_date string | null
        • auto_renew boolean
        • transfer object
          2 properties
          • pending boolean
          • failed boolean
      • charges array of object
        8 properties
        • id integer
        • action string
          Allowed values register transfer renew restore grace_fee redemption_fee
        • years integer
        • currency string
        • net number
        • tax number
        • gross number
        • status string
          Allowed values pending billable invoiced refunded
  • 202 Accepted — completes later

    Accepted but not completed yet: the registry has taken the request and will finish it later. Your credit has already been debited; the charges stay pending until the operation completes (then they are billed on your next monthly invoice) and are refunded automatically if it fails. Poll GET /reseller/domains/{name} until status leaves pending_registration / pending_transfer (a failed transfer shows transfer.failed: true).

    Idempotent-Replayed string response header
    true when this response is the replay of an earlier request with the same Idempotency-Key.
    Response body application/json
    • data object
      3 properties
      • state string
        • Value pending
      • domain object
        8 properties
        • id integer
        • name string
        • status string
          Allowed values pending pending_registration pending_transfer active expired grace redemption pending_delete transferring_away transferred_away transfer_failed cancelled fraud
        • registration_date string | null
        • expiration_date string | null
        • next_due_date string | null
        • auto_renew boolean
        • transfer object
          2 properties
          • pending boolean
          • failed boolean
      • charges array of object
        8 properties
        • id integer
        • action string
          Allowed values register transfer renew restore grace_fee redemption_fee
        • years integer
        • currency string
        • net number
        • tax number
        • gross number
        • status string
          Allowed values pending billable invoiced refunded
  • 401 Missing, invalid or expired token. MessageError
  • 402 insufficient_credit ResellerError
  • 403 not_reseller credit_disabled forbidden ip_not_allowed ip_whitelist_misconfigured ResellerError
  • 409 operation_in_progress idempotency_in_progress ResellerError
  • 422 invalid_request invalid_contact invalid_domain tld_not_sellable invalid_years domain_unavailable domain_not_registered registration_data_missing registrar_error invalid_idempotency_key idempotency_key_reused ResellerError
  • 424 registrar_unknown ResellerError
  • 429 Rate limit exceeded. Retry after the number of seconds in Retry-After. MessageError
  • 500 operation_failed ResellerError
  • 503 whois_unavailable ResellerError

cURL

# Idempotency-Key is optional: a retry with the same key is never processed twice.
curl -X POST 'https://portal.supporthost.com/api/v1/reseller/domains/transfer' \
  -H "Authorization: Bearer $API_TOKEN" \
  -H 'Accept: application/json' \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: 00000000-0000-4000-8000-000000000000' \
  -d '{
  "name": "example.org",
  "auth_code": "kX7#p2Qz9w",
  "nameservers": [
    "ns1.example.net",
    "ns2.example.net"
  ],
  "registrant": {
    "first_name": "Mario",
    "last_name": "Rossi",
    "organization": "Example Srl",
    "email": "mario.rossi@example.com",
    "phone": "+39.0212345678",
    "street1": "Via Roma 1",
    "city": "Milano",
    "state_province": "MI",
    "postal_code": "20121",
    "country_code": "IT"
  }
}'

PHP

<?php

require 'vendor/autoload.php';

$client = new GuzzleHttp\Client();

$response = $client->request('POST', 'https://portal.supporthost.com/api/v1/reseller/domains/transfer', [
    'headers' => [
        'Authorization' => 'Bearer ' . getenv('API_TOKEN'),
        'Accept' => 'application/json',
        // Optional: a retry with the same key is never processed twice.
        'Idempotency-Key' => '00000000-0000-4000-8000-000000000000',
    ],
    'json' => [
        'name' => 'example.org',
        'auth_code' => 'kX7#p2Qz9w',
        'nameservers' => [
            'ns1.example.net',
            'ns2.example.net',
        ],
        'registrant' => [
            'first_name' => 'Mario',
            'last_name' => 'Rossi',
            'organization' => 'Example Srl',
            'email' => 'mario.rossi@example.com',
            'phone' => '+39.0212345678',
            'street1' => 'Via Roma 1',
            'city' => 'Milano',
            'state_province' => 'MI',
            'postal_code' => '20121',
            'country_code' => 'IT',
        ],
    ],
]);

echo $response->getBody();

Node.js

const response = await fetch('https://portal.supporthost.com/api/v1/reseller/domains/transfer', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.API_TOKEN}`,
    Accept: 'application/json',
    'Content-Type': 'application/json',
    // Optional: a retry with the same key is never processed twice.
    'Idempotency-Key': '00000000-0000-4000-8000-000000000000',
  },
  body: JSON.stringify({
    "name": "example.org",
    "auth_code": "kX7#p2Qz9w",
    "nameservers": [
      "ns1.example.net",
      "ns2.example.net"
    ],
    "registrant": {
      "first_name": "Mario",
      "last_name": "Rossi",
      "organization": "Example Srl",
      "email": "mario.rossi@example.com",
      "phone": "+39.0212345678",
      "street1": "Via Roma 1",
      "city": "Milano",
      "state_province": "MI",
      "postal_code": "20121",
      "country_code": "IT"
    }
  }),
});

console.log(await response.json());

Response

200

{
  "data": {
    "state": "completed",
    "domain": {
      "id": 1043,
      "name": "example.org",
      "status": "active",
      "registration_date": "2021-05-03",
      "expiration_date": "2027-05-03",
      "next_due_date": "2027-05-03",
      "auto_renew": false,
      "transfer": {
        "pending": false,
        "failed": false
      }
    },
    "charges": [
      {
        "id": 5312,
        "action": "transfer",
        "years": 1,
        "currency": "EUR",
        "net": 11.1699999999999999289457264239899814128875732421875,
        "tax": 2.45999999999999996447286321199499070644378662109375,
        "gross": 13.6300000000000007815970093361102044582366943359375,
        "status": "billable"
      }
    ]
  }
}

202

{
  "data": {
    "state": "pending",
    "domain": {
      "id": 1043,
      "name": "example.org",
      "status": "pending_transfer",
      "registration_date": null,
      "expiration_date": null,
      "next_due_date": null,
      "auto_renew": false,
      "transfer": {
        "pending": true,
        "failed": false
      }
    },
    "charges": [
      {
        "id": 5312,
        "action": "transfer",
        "years": 1,
        "currency": "EUR",
        "net": 11.1699999999999999289457264239899814128875732421875,
        "tax": 2.45999999999999996447286321199499070644378662109375,
        "gross": 13.6300000000000007815970093361102044582366943359375,
        "status": "pending"
      }
    ]
  }
}

Error responses share one format: see Errors.

Renew a domain #

POST /reseller/domains/{name}/renew

Adds years to an active or grace domain, paid from your credit. A domain in grace also pays the TLD’s grace fee (a separate grace_fee charge). A domain in redemption must be restored first (409 restore_required).

If the domain already has an open renewal invoice for that term, your credit pays that invoice instead of creating a charge: charges is then empty and paid_invoice_id / paid_invoice_covers name the invoice and the domains it renewed (an invoice can cover several of your domains; paid_invoice_covers_truncated: true means the list was cut at 50).

Parameters

Path

  • name string required

Header

  • Idempotency-Key string
    Optional. 1–255 printable ASCII characters, scoped to your account. A retry with the same key and the same request returns the stored response byte for byte (with Idempotent-Replayed: true) and never charges twice. The same key with a different request answers 422 idempotency_key_reused; while the first request is still running, 409 idempotency_in_progress (retry after retry_after seconds). Keys are kept for 30 days. See Idempotency in the introduction.
    • Min length 1
    • Max length 255

    See Rate limits and idempotency.

Body application/json required

  • years integer required
    Years to add. Must be one of the renew terms GET /reseller/pricing lists for the TLD, otherwise 422 invalid_years (with allowed_years).
    • Minimum 1
    • Maximum 999

Responses

  • 200

    Renewed.

    Idempotent-Replayed string response header
    true when this response is the replay of an earlier request with the same Idempotency-Key.
    Response body application/json
    • data object
      6 properties
      • state string
        • Value completed
      • domain object
        8 properties
        • id integer
        • name string
        • status string
          Allowed values pending pending_registration pending_transfer active expired grace redemption pending_delete transferring_away transferred_away transfer_failed cancelled fraud
        • registration_date string | null
        • expiration_date string | null
        • next_due_date string | null
        • auto_renew boolean
        • transfer object
          2 properties
          • pending boolean
          • failed boolean
      • charges array of object
        8 properties
        • id integer
        • action string
          Allowed values register transfer renew restore grace_fee redemption_fee
        • years integer
        • currency string
        • net number
        • tax number
        • gross number
        • status string
          Allowed values pending billable invoiced refunded
      • paid_invoice_id integer
      • paid_invoice_covers array of string
      • paid_invoice_covers_truncated boolean
  • 202 Accepted — completes later

    Accepted but not confirmed yet. pending: the registrar has not confirmed the operation; your credit has already been used, and its charges stay pending until the domain’s dates move, then they are billed (poll GET /reseller/domains/{name} and watch expiration_date / next_due_date). not_settled: your credit was applied to an open renewal invoice that it did not fully pay, so the domain is NOT renewed yet. In neither case is anything refunded automatically: if the operation did not happen, support follows up. Do not retry with a new Idempotency-Key.

    Idempotent-Replayed string response header
    true when this response is the replay of an earlier request with the same Idempotency-Key.
    Response body application/json
    • data object
      6 properties
      • state string
        Allowed values pending not_settled
      • domain object
        8 properties
        • id integer
        • name string
        • status string
          Allowed values pending pending_registration pending_transfer active expired grace redemption pending_delete transferring_away transferred_away transfer_failed cancelled fraud
        • registration_date string | null
        • expiration_date string | null
        • next_due_date string | null
        • auto_renew boolean
        • transfer object
          2 properties
          • pending boolean
          • failed boolean
      • charges array of object
        8 properties
        • id integer
        • action string
          Allowed values register transfer renew restore grace_fee redemption_fee
        • years integer
        • currency string
        • net number
        • tax number
        • gross number
        • status string
          Allowed values pending billable invoiced refunded
      • paid_invoice_id integer
      • paid_invoice_covers array of string
      • paid_invoice_covers_truncated boolean
  • 401 Missing, invalid or expired token. MessageError
  • 402 insufficient_credit ResellerError
  • 403 not_reseller credit_disabled forbidden ip_not_allowed ip_whitelist_misconfigured ResellerError
  • 404 not_found ResellerError
  • 409 restore_required renewal_in_progress operation_in_progress idempotency_in_progress ResellerError
  • 422 invalid_request invalid_years domain_not_renewable registrar_error invalid_idempotency_key idempotency_key_reused ResellerError
  • 424 registrar_unknown ResellerError
  • 429 Rate limit exceeded. Retry after the number of seconds in Retry-After. MessageError

cURL

# Idempotency-Key is optional: a retry with the same key is never processed twice.
curl -X POST 'https://portal.supporthost.com/api/v1/reseller/domains/{name}/renew' \
  -H "Authorization: Bearer $API_TOKEN" \
  -H 'Accept: application/json' \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: 00000000-0000-4000-8000-000000000000' \
  -d '{
  "years": 1
}'

PHP

<?php

require 'vendor/autoload.php';

$client = new GuzzleHttp\Client();

$response = $client->request('POST', 'https://portal.supporthost.com/api/v1/reseller/domains/{name}/renew', [
    'headers' => [
        'Authorization' => 'Bearer ' . getenv('API_TOKEN'),
        'Accept' => 'application/json',
        // Optional: a retry with the same key is never processed twice.
        'Idempotency-Key' => '00000000-0000-4000-8000-000000000000',
    ],
    'json' => [
        'years' => 1,
    ],
]);

echo $response->getBody();

Node.js

const response = await fetch('https://portal.supporthost.com/api/v1/reseller/domains/{name}/renew', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.API_TOKEN}`,
    Accept: 'application/json',
    'Content-Type': 'application/json',
    // Optional: a retry with the same key is never processed twice.
    'Idempotency-Key': '00000000-0000-4000-8000-000000000000',
  },
  body: JSON.stringify({
    "years": 1
  }),
});

console.log(await response.json());

Response

200

{
  "data": {
    "state": "completed",
    "domain": {
      "id": 1042,
      "name": "example.com",
      "status": "active",
      "registration_date": "2026-09-15",
      "expiration_date": "2028-09-15",
      "next_due_date": "2028-09-15",
      "auto_renew": false,
      "transfer": {
        "pending": false,
        "failed": false
      }
    },
    "charges": [
      {
        "id": 5311,
        "action": "renew",
        "years": 1,
        "currency": "EUR",
        "net": 11.1699999999999999289457264239899814128875732421875,
        "tax": 2.45999999999999996447286321199499070644378662109375,
        "gross": 13.6300000000000007815970093361102044582366943359375,
        "status": "billable"
      }
    ],
    "paid_invoice_id": 20790,
    "paid_invoice_covers": [
      "example.com",
      "example.net"
    ],
    "paid_invoice_covers_truncated": true
  }
}

202

{
  "data": {
    "state": "pending",
    "domain": {
      "id": 1042,
      "name": "example.com",
      "status": "active",
      "registration_date": "2026-09-15",
      "expiration_date": "2027-09-15",
      "next_due_date": "2027-09-15",
      "auto_renew": false,
      "transfer": {
        "pending": false,
        "failed": false
      }
    },
    "charges": [
      {
        "id": 5311,
        "action": "renew",
        "years": 1,
        "currency": "EUR",
        "net": 11.1699999999999999289457264239899814128875732421875,
        "tax": 2.45999999999999996447286321199499070644378662109375,
        "gross": 13.6300000000000007815970093361102044582366943359375,
        "status": "pending"
      }
    ],
    "paid_invoice_id": 20790,
    "paid_invoice_covers": [
      "example.com",
      "example.net"
    ],
    "paid_invoice_covers_truncated": true
  }
}

Error responses share one format: see Errors.

Restore a domain from redemption #

POST /reseller/domains/{name}/restore

Recovers a domain in redemption and renews it for one year, paid from your credit: a restore charge priced as a one-year renewal, plus the TLD’s redemption fee as a separate redemption_fee charge. No body. Like renew, it pays an open renewal invoice for the domain instead when there is one (paid_invoice_* fields, empty charges).

Parameters

Path

  • name string required

Header

  • Idempotency-Key string
    Optional. 1–255 printable ASCII characters, scoped to your account. A retry with the same key and the same request returns the stored response byte for byte (with Idempotent-Replayed: true) and never charges twice. The same key with a different request answers 422 idempotency_key_reused; while the first request is still running, 409 idempotency_in_progress (retry after retry_after seconds). Keys are kept for 30 days. See Idempotency in the introduction.
    • Min length 1
    • Max length 255

    See Rate limits and idempotency.

Responses

  • 200

    Restored.

    Idempotent-Replayed string response header
    true when this response is the replay of an earlier request with the same Idempotency-Key.
    Response body application/json
    • data object
      6 properties
      • state string
        • Value completed
      • domain object
        8 properties
        • id integer
        • name string
        • status string
          Allowed values pending pending_registration pending_transfer active expired grace redemption pending_delete transferring_away transferred_away transfer_failed cancelled fraud
        • registration_date string | null
        • expiration_date string | null
        • next_due_date string | null
        • auto_renew boolean
        • transfer object
          2 properties
          • pending boolean
          • failed boolean
      • charges array of object
        8 properties
        • id integer
        • action string
          Allowed values register transfer renew restore grace_fee redemption_fee
        • years integer
        • currency string
        • net number
        • tax number
        • gross number
        • status string
          Allowed values pending billable invoiced refunded
      • paid_invoice_id integer
      • paid_invoice_covers array of string
      • paid_invoice_covers_truncated boolean
  • 202 Accepted — completes later

    Accepted but not confirmed yet. pending: the registrar has not confirmed the operation; your credit has already been used, and its charges stay pending until the domain’s dates move, then they are billed (poll GET /reseller/domains/{name} and watch expiration_date / next_due_date). not_settled: your credit was applied to an open renewal invoice that it did not fully pay, so the domain is NOT renewed yet. In neither case is anything refunded automatically: if the operation did not happen, support follows up. Do not retry with a new Idempotency-Key.

    Idempotent-Replayed string response header
    true when this response is the replay of an earlier request with the same Idempotency-Key.
    Response body application/json
    • data object
      6 properties
      • state string
        Allowed values pending not_settled
      • domain object
        8 properties
        • id integer
        • name string
        • status string
          Allowed values pending pending_registration pending_transfer active expired grace redemption pending_delete transferring_away transferred_away transfer_failed cancelled fraud
        • registration_date string | null
        • expiration_date string | null
        • next_due_date string | null
        • auto_renew boolean
        • transfer object
          2 properties
          • pending boolean
          • failed boolean
      • charges array of object
        8 properties
        • id integer
        • action string
          Allowed values register transfer renew restore grace_fee redemption_fee
        • years integer
        • currency string
        • net number
        • tax number
        • gross number
        • status string
          Allowed values pending billable invoiced refunded
      • paid_invoice_id integer
      • paid_invoice_covers array of string
      • paid_invoice_covers_truncated boolean
  • 401 Missing, invalid or expired token. MessageError
  • 402 insufficient_credit ResellerError
  • 403 not_reseller credit_disabled forbidden ip_not_allowed ip_whitelist_misconfigured ResellerError
  • 404 not_found ResellerError
  • 409 renewal_in_progress operation_in_progress idempotency_in_progress ResellerError
  • 422 domain_not_restorable registrar_error invalid_idempotency_key idempotency_key_reused ResellerError
  • 424 registrar_unknown ResellerError
  • 429 Rate limit exceeded. Retry after the number of seconds in Retry-After. MessageError

cURL

# Idempotency-Key is optional: a retry with the same key is never processed twice.
curl -X POST 'https://portal.supporthost.com/api/v1/reseller/domains/{name}/restore' \
  -H "Authorization: Bearer $API_TOKEN" \
  -H 'Accept: application/json' \
  -H 'Idempotency-Key: 00000000-0000-4000-8000-000000000000'

PHP

<?php

require 'vendor/autoload.php';

$client = new GuzzleHttp\Client();

$response = $client->request('POST', 'https://portal.supporthost.com/api/v1/reseller/domains/{name}/restore', [
    'headers' => [
        'Authorization' => 'Bearer ' . getenv('API_TOKEN'),
        'Accept' => 'application/json',
        // Optional: a retry with the same key is never processed twice.
        'Idempotency-Key' => '00000000-0000-4000-8000-000000000000',
    ],
]);

echo $response->getBody();

Node.js

const response = await fetch('https://portal.supporthost.com/api/v1/reseller/domains/{name}/restore', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.API_TOKEN}`,
    Accept: 'application/json',
    // Optional: a retry with the same key is never processed twice.
    'Idempotency-Key': '00000000-0000-4000-8000-000000000000',
  },
});

console.log(await response.json());

Response

200

{
  "data": {
    "state": "completed",
    "domain": {
      "id": 1042,
      "name": "example.com",
      "status": "active",
      "registration_date": "2026-09-15",
      "expiration_date": "2028-09-15",
      "next_due_date": "2028-09-15",
      "auto_renew": false,
      "transfer": {
        "pending": false,
        "failed": false
      }
    },
    "charges": [
      {
        "id": 5313,
        "action": "restore",
        "years": 1,
        "currency": "EUR",
        "net": 11.1699999999999999289457264239899814128875732421875,
        "tax": 2.45999999999999996447286321199499070644378662109375,
        "gross": 13.6300000000000007815970093361102044582366943359375,
        "status": "billable"
      }
    ],
    "paid_invoice_id": 20790,
    "paid_invoice_covers": [
      "example.com",
      "example.net"
    ],
    "paid_invoice_covers_truncated": true
  }
}

202

{
  "data": {
    "state": "pending",
    "domain": {
      "id": 1042,
      "name": "example.com",
      "status": "redemption",
      "registration_date": "2026-09-15",
      "expiration_date": "2027-09-15",
      "next_due_date": "2027-09-15",
      "auto_renew": false,
      "transfer": {
        "pending": false,
        "failed": false
      }
    },
    "charges": [
      {
        "id": 5313,
        "action": "restore",
        "years": 1,
        "currency": "EUR",
        "net": 11.1699999999999999289457264239899814128875732421875,
        "tax": 2.45999999999999996447286321199499070644378662109375,
        "gross": 13.6300000000000007815970093361102044582366943359375,
        "status": "pending"
      }
    ],
    "paid_invoice_id": 20790,
    "paid_invoice_covers": [
      "example.com",
      "example.net"
    ],
    "paid_invoice_covers_truncated": true
  }
}

Error responses share one format: see Errors.

Update the registrant #

PUT /reseller/domains/{name}/registrant

Replaces the owner contact of one of your domains at the registry. The body is the registrant and extra_fields of POST /reseller/domains/register, with the same rules: send the full contact, not only what changes. Registry-specific fields you do not send keep the value the domain was registered with.

Free of charge. completed: false means the registry accepted the change but applies it later; message explains.

Parameters

Path

  • name string required

Body application/json required

  • registrant object required
    The owner contact of the domain.
    11 properties
    • first_name string required
      • Max length 100
    • last_name string required
      • Max length 100
    • organization string | null
      Company name. Some TLDs require it and some refuse it: either case answers 422 invalid_contact.
      • Max length 200
    • email string required
      • Format email
      • Max length 200
    • phone string required
      International format +CC.NUMBER, e.g. +39.0212345678. You may instead send a local number here together with registrant.phone_country_code (ISO country, e.g. IT).
      • Pattern ^\+[0-9]{1,3}\.[0-9]{1,14}$
      • Max length 30
    • street1 string required
      • Max length 200
    • street2 string | null
      • Max length 200
    • city string required
      • Max length 100
    • state_province string | null
      • Max length 100
    • postal_code string required
      • Max length 20
    • country_code string required
      ISO 3166-1 alpha-2 country code, e.g. IT.
      • Min length 2
      • Max length 2
      Allowed values AF AL DZ AD AO AI AQ AG SA AR
      240 more values AM AW AU AT AZ BS BH BD BB BE BZ BJ BM BT BY BO BA BW BR BN BG BF BI KH CM CA CV BQ CZ TD CL CN CY VA CO KM CD CG KP KR CR CI HR CU CW DK DM EC EG SV AE ER EE SZ ET FJ PH FI FR GA GM GE GS DE GH JM JP GI DJ JO GR GD GL GP GU GT GG GN GQ GW GY GF HT HN IN ID IR IQ IE IS BV CX NF IM KY CC CK FK FO HM MP MH UM PN SB TC VI VG AX IL IT JE KZ KE KG KI XK KW LA LS LV LB LR LY LI LT LU MK MG MW MY MV ML MT MA MQ MR MU YT MX FM MD MC MN ME MS MZ MM NA NR NP NI NE NG NU NO NC NZ OM NL PK PW PA PG PY PE PF PL PT PR QA HK MO GB CF DO RE RO RW RU EH KN LC MF VC BL PM WS AS SM SH SN RS SC SL SG SX SY SK SI SO ES LK US SS ZA SD SR SJ SE CH ST TJ TW TZ TF PS IO TH TL TG TK TO TT TN TR TM TV UA UG HU UY UZ VU VE VN WF YE ZM ZW
  • extra_fields map of string
    Registry-specific data some TLDs require (e.g. entity type, tax codes, language). Which keys are required depends on the TLD and on this server’s configuration, and some are only required depending on the answer to another field. Values are strings: send a checkbox as "1". Keys the TLD does not declare are ignored. A missing or invalid field answers 422 invalid_contact with a fields map naming each field to fix.
  • source object
    Optional. The additional domain fields of your own platform, sent as your platform holds them, for this server to translate into extra_fields. A registrar module generated by this server fills it in: you do not need it when you send extra_fields yourself. A key you send in extra_fields always wins over a translated one.
    5 properties
    • platform string
      Your platform, lower case: whmcs, hostbill.
      • Pattern ^[a-z][a-z0-9-]*$
      • Max length 32
    • version string | null
      Your platform’s own version, e.g. 8.13.1: field names differ between versions.
      • Max length 50
    • module_version string | null
      Version of the registrar module sending the request.
      • Max length 50
    • fields map of string
      The platform’s additional fields, name => value, exactly as the platform holds them (e.g. "Legal Type": "Companies/one man companies"). At most 50, values up to 255 characters.
    • translated array of string
      The extra_fields keys your module translated itself from source.fields. This server’s own translation wins over them; keys not listed here are yours and win over it.
      • Max items 100
      • Max length 64

Responses

  • 200

    Updated, or accepted by the registry.

    Response body application/json
    • data object
      3 properties
      • completed boolean
      • message string
      • domain map of any

cURL

curl -X PUT 'https://portal.supporthost.com/api/v1/reseller/domains/{name}/registrant' \
  -H "Authorization: Bearer $API_TOKEN" \
  -H 'Accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{
  "registrant": {
    "first_name": "Mario",
    "last_name": "Rossi",
    "organization": "Example Srl",
    "email": "mario.rossi@example.com",
    "phone": "+39.0212345678",
    "street1": "Via Roma 1",
    "city": "Milano",
    "state_province": "MI",
    "postal_code": "20121",
    "country_code": "IT"
  },
  "source": {
    "platform": "whmcs",
    "version": "8.13.1",
    "module_version": "1.0.0",
    "fields": {
      "Legal Type": "Companies/one man companies",
      "Tax ID": "01234567890"
    },
    "translated": []
  }
}'

PHP

<?php

require 'vendor/autoload.php';

$client = new GuzzleHttp\Client();

$response = $client->request('PUT', 'https://portal.supporthost.com/api/v1/reseller/domains/{name}/registrant', [
    'headers' => [
        'Authorization' => 'Bearer ' . getenv('API_TOKEN'),
        'Accept' => 'application/json',
    ],
    'json' => [
        'registrant' => [
            'first_name' => 'Mario',
            'last_name' => 'Rossi',
            'organization' => 'Example Srl',
            'email' => 'mario.rossi@example.com',
            'phone' => '+39.0212345678',
            'street1' => 'Via Roma 1',
            'city' => 'Milano',
            'state_province' => 'MI',
            'postal_code' => '20121',
            'country_code' => 'IT',
        ],
        'source' => [
            'platform' => 'whmcs',
            'version' => '8.13.1',
            'module_version' => '1.0.0',
            'fields' => [
                'Legal Type' => 'Companies/one man companies',
                'Tax ID' => '01234567890',
            ],
            'translated' => [],
        ],
    ],
]);

echo $response->getBody();

Node.js

const response = await fetch('https://portal.supporthost.com/api/v1/reseller/domains/{name}/registrant', {
  method: 'PUT',
  headers: {
    Authorization: `Bearer ${process.env.API_TOKEN}`,
    Accept: 'application/json',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "registrant": {
      "first_name": "Mario",
      "last_name": "Rossi",
      "organization": "Example Srl",
      "email": "mario.rossi@example.com",
      "phone": "+39.0212345678",
      "street1": "Via Roma 1",
      "city": "Milano",
      "state_province": "MI",
      "postal_code": "20121",
      "country_code": "IT"
    },
    "source": {
      "platform": "whmcs",
      "version": "8.13.1",
      "module_version": "1.0.0",
      "fields": {
        "Legal Type": "Companies/one man companies",
        "Tax ID": "01234567890"
      },
      "translated": []
    }
  }),
});

console.log(await response.json());

Response

200

{
  "data": {
    "completed": true,
    "message": "Contact updated.",
    "domain": {
      "id": 1042,
      "name": "example.com",
      "status": "active",
      "registration_date": "2026-09-15",
      "expiration_date": "2027-09-15",
      "next_due_date": "2027-09-15",
      "auto_renew": false,
      "transfer": {
        "pending": false,
        "failed": false
      }
    }
  }
}

Error responses share one format: see Errors.