The SupportHost reseller API lets your own software sell and manage domains: check availability, register, transfer, renew and restore names, then manage their nameservers, contacts, transfer lock and WHOIS privacy. Every operation is paid from your prepaid credit at your reseller price.
It is a JSON REST API for developers who integrate SupportHost domains into a storefront, a control panel or a billing system.
What you can do
- Catalog — read your net price list and the TLDs you can sell, and check whether a name is available.
- Domains — register, transfer, renew and restore domains, and read their state.
- Domain management — nameservers, contacts, EPP code, transfer lock, WHOIS privacy and auto-renew.
- Account — your charges and your credit balance.
Base URLs
Environment | Base URL |
|---|---|
Sandbox | https://sandbox.supporthost.com/api/v1 |
Production | https://portal.supporthost.com/api/v1 |
Build and test your integration against the sandbox first: it behaves like production, with test money and a simulated registry (see Sandbox account). Paths are the same on both, so going live only changes the base URL and the token. Sandbox and production accounts and tokens are separate.
Requests and responses are JSON: send Accept: application/json on every call, and Content-Type: application/json when you send a body.
First request in 2 minutes
- Create a sandbox account and an API token (Sandbox account).
- Save the token in an environment variable:
export API_TOKEN="your-token". - Ask for your price list:
curl "https://sandbox.supporthost.com/api/v1/reseller/pricing" \
-H "Accept: application/json" \
-H "Authorization: Bearer $API_TOKEN"
The answer lists every TLD you can sell with your net price per term. A 401 means the token is missing or wrong; a 403 with not_reseller or credit_disabled means the account is not enabled for the reseller API yet (see Authentication).
Get your price list #
GET
/reseller/pricing
Your net prices for every TLD you can sell, in your account’s currency. This is also the list of TLDs available to you: a TLD that is not here cannot be registered or transferred through the API.
For each TLD, register and renew list every term you can buy
(years from min_years to max_years) with its price; transfer lists
only the minimum term, the one a transfer buys. grace_fee and
redemption_fee are added to a renewal in grace and to a restore;
null means none is charged. Prices are net of tax.
idn says whether the API accepts a Unicode name on the TLD (a Unicode
name on a TLD with idn: false is refused as invalid_domain); it is
not a statement about which scripts the registry supports.
registrant_countries lists the registrant countries (ISO codes) the
TLD accepts: a register or transfer with a registrant elsewhere is
refused as invalid_contact before any credit is taken. null means
the panel knows no country restriction, not that the registry has none.
A transfer always requires auth_code, whatever the TLD.
- Authentication: bearer Token
- Rate limit: 10 req/min per account
Responses
-
200Your price list.
Response body
application/json-
dataobject2 properties
-
currencystring -
tldsarray of object12 properties
-
extensionstring -
min_yearsinteger -
max_yearsinteger -
registerarray of object2 properties
-
yearsinteger -
pricenumber
-
-
renewarray of object2 properties
-
yearsinteger -
pricenumber
-
-
transferarray of object2 properties
-
yearsinteger -
pricenumber
-
-
grace_feenumber | null -
redemption_feenumber | null -
grace_daysinteger -
redemption_daysinteger -
idnboolean -
registrant_countriesarray of string | null
-
-
-
-
401Missing, invalid or expired token. MessageError -
403not_resellercredit_disabledforbiddenip_not_allowedip_whitelist_misconfiguredResellerError -
429Rate limit exceeded. Retry after the number of seconds inRetry-After. MessageError
cURL
curl 'https://portal.supporthost.com/api/v1/reseller/pricing' \
-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/pricing', [
'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/pricing', {
headers: {
Authorization: `Bearer ${process.env.API_TOKEN}`,
Accept: 'application/json',
},
});
console.log(await response.json());
200
{
"data": {
"currency": "EUR",
"tlds": [
{
"extension": ".com",
"min_years": 1,
"max_years": 10,
"register": [
{
"years": 1,
"price": 11.1699999999999999289457264239899814128875732421875
}
],
"renew": [
{
"years": 1,
"price": 11.1699999999999999289457264239899814128875732421875
}
],
"transfer": [
{
"years": 1,
"price": 11.1699999999999999289457264239899814128875732421875
}
],
"grace_fee": null,
"redemption_fee": 79.900000000000005684341886080801486968994140625,
"grace_days": 30,
"redemption_days": 30,
"idn": true,
"registrant_countries": null
}
]
}
}
Error responses share one format: see Errors.
Next steps
- Authentication — tokens, permissions and the IP whitelist.
- Working with domains — the whole domain lifecycle: check, register, renew, transfer, restore and manage.
- Errors and Rate limits and idempotency — what to handle before you go live.