Skip to content

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.

SettingDescriptionValidationRequired
cpu_coresNumber of CPU coresInteger 1-10, Stepsize:1Yes
ramRAM in MBInteger 1024-ORG_MAX_RAM, Stepsize:1024Yes
disk_sizeDisk size in GBInteger 10-1000, Stepsize:10Yes
usernameUsername for the VPSString, 3-32 characters, A-Za-Z0-9Yes
passwordPassword for the VPSStringYes
template_nameOS template (see above)select values (see above)Yes
hostnameHostname for the VPSString, valid hostnameYes
ipv4_addresses# of IPv4 addressesInteger 1-10, Stepsize:1Yes
traffic_displayTraffic in GB to UseInteger 128+, Stepsize:128Yes
backup_count# of Backups to allowInteger 5+, Stepsize:1Yes
snapshot_count# of Snapshots to allowInteger 2+, Stepsize:1Yes
ha_upgradeUpgrade to HA VPSBooleanYes
10g_upgradeUpgrade to 10G UplinkBooleanYes

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.

  • domain valid domain name, e.g. example.com
  • action either register or transfer
  • authcode optional if you do a transfer of an existing domain
  • nameservers optional, space-seperated list of nameservers. If not provided, we use our nameservers. Make sure the zone exists and dig <domain> NS @<nameserver> returns the correct nameservers before you order the domain.

  • ownercRef optional, ID of the ownerc object, if already exists.

  • ownercData optional, stringified JSON object with contact payload (see below)
  • admincRef optional, ID of the adminc object, if already exists.
  • admincData optional, 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": ""
}
Label should be something unique, probably e.g. your internal contact ID from your system.
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 ;)