Reseller API¶
We provide a REST API that allows you to perform all actions available in the CCP portal.
Authentication¶
You can create an API key under Profile > API Keys. For authentication, you need to include the API key in the HTTP header X-API-Key.
Every API request must also include the header X-Organization-ID. You can find your organization ID in the Organization Management.
You can also specify the organization ID of any of your end-users as a reseller. This gives you API-access to all your end-user resources from your reseller account.
API Documentation¶
We provide a Swagger documentation/UI at https://api.ccp.realtoxmedia.de/api/docs, from which you can directly test the API.
The CCP itself uses the same API for its frontend, so if something is unclear firing the query in your browser's developer tools and checking the request/response can also help you understand.
We are always happy to help you with any questions you have.
Order/Creation Flow¶
You can order Products via POST /api/reseller/contracts. Either you provide the UUID of an end-user or the special value __self__ to create a contract for yourself. The default organization of the end-user will be used.
Contract-Creation Settings¶
Depending on the product, there may be different settings you need to provide. These are in the settings: {} element in the request body and are key-value pairs.
You can fetch all possible options via the GET /api/reseller/products endpoint. For each product, there is an options entry. In this, you see the options together with our enforced validation rules, mappings and e.g. values for selects.
Regular VPS¶
These are all regular VPS Models (VPS, HA VPS, VDS, Storage VPS) Here you must provide
- hostname valid hostname for the VPS, e.g. vserver-1234
- template name of the OS template to use. For possible values see GET /api/reseller/products. The template names are the same over all products.
Configurable VPS¶
For this, use the special Product "VPS-Konfiguratior" / UUID fb8663c7-70b6-4d81-9750-c0d2b5697107.
| Setting | Description | Validation | Required |
|---|---|---|---|
cpu_cores | Number of CPU cores | Integer 1-10, Stepsize:1 | Yes |
ram | RAM in MB | Integer 1024-ORG_MAX_RAM, Stepsize:1024 | Yes |
disk_size | Disk size in GB | Integer 10-1000, Stepsize:10 | Yes |
username | Username for the VPS | String, 3-32 characters, A-Za-Z0-9 | Yes |
password | Password for the VPS | String | Yes |
template_name | OS template (see above) | select values (see above) | Yes |
hostname | Hostname for the VPS | String, valid hostname | Yes |
ipv4_addresses | # of IPv4 addresses | Integer 1-10, Stepsize:1 | Yes |
traffic_display | Traffic in GB to Use | Integer 128+, Stepsize:128 | Yes |
backup_count | # of Backups to allow | Integer 5+, Stepsize:1 | Yes |
snapshot_count | # of Snapshots to allow | Integer 2+, Stepsize:1 | Yes |
ha_upgrade | Upgrade to HA VPS | Boolean | Yes |
10g_upgrade | Upgrade to 10G Uplink | Boolean | Yes |
For Pricing, reference your reselling contract.
Dedicated Server¶
Here you must provide
- hostname valid hostname for the VPS, e.g. vserver-1234
- template name of the OS template to use. For possible values see GET /api/reseller/products
- ip4_subnet_size size of the IPv4-Subnet to allocate (25-29)
- ip4_count number of IPv4 addresses to allocate (NULL, 1-10)
- ip6_subnet_size size of the IPv6-Subnet to allocate (48-64)
- existing_l2vpn UUID of an existing L2VPN to use
Either Provide ipv4_subnet_size OR ip4_count! If you want to use an existing L2VPN as the public VLAN, specify one. The End-User must have access to the L2VPN and ist must be at the same location as the dedicated server. If not provided, we create a fresh L2VPN automatically.
Webhosting¶
No settings necessary.
Domain¶
For this, use the special Product "domain-default" / UUID 0d6d810e-dec2-4a06-8fe5-7d7698d97ae6.
domainvalid domain name, e.g.example.comactioneitherregisterortransferauthcodeoptional if you do a transfer of an existing domainnameserversoptional, space-seperated list of nameservers. If not provided, we use our nameservers. Make sure the zone exists anddig <domain> NS @<nameserver>returns the correct nameservers before you order the domain.ownercRefoptional, ID of the ownerc object, if already exists.ownercDataoptional, stringified JSON object with contact payload (see below)admincRefoptional, ID of the adminc object, if already exists.admincDataoptional, stringified JSON object with contact payload (see below)
For OwnerC/AdminC you must provide EITHER an Ref or Data. The Ref is the ID of an existing contact, the Data is a JSON object (stringified - not as a literal JSON) with the contact data. The contact payload is as follows:
{
"label": "00000000-0000-0000-0000-000000000000",
"first_name": "Max",
"last_name": "Mustermann",
"company_name": "Example GmbH",
"street": "Example Street 12",
"postal_code": "1010",
"city": "Vienna",
"country": "AT",
"telephone": "+43.123456789",
"email": "max.mustermann@example.test",
"fax": ""
}
Fax is optional.
For a lot of TLDs like .de, a telephone number is necessary.
There may also be other restrictions on domains like requiring a company registration or specific country or other requirements ; we/the registry validate them currently. We may add an endpoint where you can fetch the requirements before registering a domain in the future ; these limits are not enforced by us, but by the registry mostly.
As a reminder: Domains are billed yearly, not hourly ;)