Aan de slag met de API
API-conventies
Regels voor elk Serverside.com-API-endpoint: basis-URL, naamgeving, geldeenheden, succes- en foutantwoorden, paginering, foutcodes, herhalingen en idempotentie.
Basis-URL en versies
https://api.serverside.com
Elk pad begint met een versiesegment, /v1. Aanvragen en antwoorden zijn JSON via HTTPS; stuur Content-Type: application/json bij elke aanvraag met een body. Elk antwoord bevat een X-Request-Id-header.
Namen en waarden
| Waar | Stijl | Voorbeeld |
|---|---|---|
| Queryparameters | camelCase | ?pageSize=50&sortColumn=name |
| JSON-aanvraag- en antwoordvelden | camelCase | "plan", "primaryIpv4" |
| Toegestane waarden | UPPER_SNAKE_CASE-tekenreeksen | "GRACEFUL_RESTART", "RAID10" |
Een veld met vaste waarden vermeldt deze onder Allowed values op de endpointpagina. Alle verzamelingen gebruiken hoofdletters, behalve location van een foutdetail, dat alleen in foutantwoorden voorkomt. De API vergelijkt hoofdletterongevoelig: semi_annually wordt dus gelezen als SEMI_ANNUALLY. Andere spelling (SemiAnnually), een getal in plaats van de naam of een kommagescheiden lijst wordt geweigerd met 400; de fout noemt de toegestane waarden. De enige uitzondering is het type van een bestelitem, dat exact BAREMETAL of IP_BLOCK moet zijn.
ID's zijn UUID's; een veld zonder ID is null, nooit een lege tekenreeks. Sommige ID-velden accepteren ook een onveranderlijke naam: de slug van een dedicated-serverconfiguratie (epyc-9354p) en de code van een datacenter, drie letters voor de stedelijke regio plus een locatienummer (ams1). Waar/onwaar-velden beginnen als vraag met is, zoals isLocked; velden met een eenheid noemen die: speedMbps, memoryGb, sizeBytes. Een verstuurde duur is in seconden.
IP-adressen en netwerken worden als tekenreeksen verstuurd, zoals "192.0.2.10" en "192.0.2.0/28". IPv4 moet in de gebruikelijke puntnotatie staan; 10.1 en 010.0.0.1 worden geweigerd. IPv6 mag elke notatie gebruiken, maar zonder haken of zone. Tijdstempels zijn ISO 8601-tekenreeksen. Een verstuurde tijdstempel moet een offset bevatten: 2026-09-20T00:00:00Z en 2026-09-20T02:00:00+02:00 zijn hetzelfde moment; 2026-09-20T00:00:00 wordt geweigerd. Elke tijdstempel van de API is UTC en eindigt op Z.
Aanvraagbody's
Een niet door het endpoint gedeclareerde JSON-eigenschap wordt geweigerd met 400 VALIDATION_ERROR; het detail INVALID_BODY noemt die eigenschap. Zo wordt een verkeerd gespeld optioneel veld opgemerkt in plaats van genegeerd.
PATCH wijzigt alleen wat de body noemt: weggelaten velden behouden hun waarde, en het antwoord is 200 met de resource zoals GET die teruggeeft. De drie PATCH-bewerkingen voor server, virtueel netwerk en SSH-sleutel accepteren één veld, name; een null-naam laat de naam ongewijzigd. PUT vervangt één hele instelling, zoals opstartmodus of iPXE-script; ook lock en unlock zijn een PUT-paar.
Geld
Bedragen zijn gehele getallen in de valuta van hun record, vermeld als currency (pricing.currency bij configuraties). Gehele getallen houden elk bedrag exact. De meeste JSON-parsers lezen decimalen zoals 0.10 als binaire drijvendekommagetallen, die deze niet exact kunnen opslaan: in JavaScript is 0.1 + 0.2 gelijk aan 0.30000000000000004. De veldnaam geeft de schaal:
- Een naam die eindigt op
Millicentstelt duizendsten van een cent:150000is 1,50. Prijzen en tarieven op configuraties, bestellingen en abonnementen worden zo geschreven, zodat uurtarieven centfracties behouden. - Alle andere geldvelden tellen centen:
12999is 129,99. Dit geldt voor facturen, betalingen, gebruikskosten en accounttegoed.
Een bestelling bevat alleen de prijs. Belasting, kortingen en het verschuldigde bedrag staan op de factuur (Facturering).
Succes- en foutantwoorden
De HTTP-status onderscheidt de twee formaten: 2xx is succes, alles daarbuiten een fout; success herhaalt dat in de body.
Succes
{
"success": true,
"data": { },
"pagination": {
"totalRecords": 42,
"page": 1,
"pageSize": 25,
"totalPages": 2
}
}
| Veld | Betekenis |
|---|---|
success | true. |
data | De inhoud: een object of bij lijstendpoints een array. |
pagination | Bij gepagineerde lijsten (Paginering). Elk ander antwoord laat dit weg. |
Een aanroep die iets maakt antwoordt met 201 en het gemaakte object in het formaat van een leesaanvraag. 202 Accepted betekent dat de wijziging nog wordt toegepast. Aansluiten en loskoppelen van een server op een virtueel netwerk en wisselen van opstartmodus geven de voortgang in data: status APPLYING en since, het moment van acceptatie. Verwijderen van een server antwoordt met 202 zonder body tijdens afbraak. 204 No Content heeft helemaal geen body. Factuur-pdf downloaden is het enige endpoint dat een bestand teruggeeft in plaats van JSON.
Fout
{
"success": false,
"data": null,
"code": "VALIDATION_ERROR",
"message": "pageSize: Must be between 1 and 1000.",
"traceId": "SRV-7F3A-0C21-9B4E-51D2",
"details": [
{
"code": "INVALID_VALUE",
"message": "Must be between 1 and 1000.",
"field": "pageSize",
"location": "query"
}
]
}
| Veld | Betekenis |
|---|---|
success | false. |
data | null, behalve bij een geweigerde factuurbetaling: dan bevat het het betalingsresultaat (Facturering). |
code | Wat misging als stabiele UPPER_SNAKE_CASE-code. Vertak hierop samen met de status. Behandel een onbekende code op basis van de status. |
message | Een zin voor mensen. De formulering kan veranderen; parse deze niet. |
traceId | Aanvraag-ID, gelijk aan de X-Request-Id-header. Vermeld deze bij contact met support. |
details | Eén vermelding per probleem bij validatiefouten en enkele andere fouten. Elk heeft een eigen code, message, betrokken field (null bij een probleem met de hele aanvraag) en de location: body, query, route of header. |
Foutbody's delen success en data met succesantwoorden; een client kan beide met één type lezen.
Paginering
Acht lijsten geven alle regels tegelijk zonder pagination: Regio's opvragen, OS-images opvragen, Applicaties opvragen, Voedingsgezondheid opvragen, Consolesessies opvragen, Virtuele media opvragen, Beveiligingsscan opvragen en Scanplugins opvragen. Elke andere lijst is gepagineerd en gebruikt dezelfde parameters:
| Parameter | Standaard | Opmerkingen |
|---|---|---|
page | 1 | Begint bij 1. Een pagina na de laatste geeft lege data. |
pageSize | 25 | 1 tot 1000. Buiten dat bereik geeft 400. |
sortColumn | geen | Het sorteerveld. |
ascending | true | false keert de sortering om. |
search | geen | Vrije tekst; spaties voor en achter worden verwijderd. De doorzochte velden hangen af van het endpoint. |
filter[<field>] | geen | Eén parameter per gefilterd veld. |
pagination herhaalt page en pageSize en voegt totalRecords en totalPages toe. Vraag voor een hele lijst pagina's op totdat page totalPages bereikt. Een lege lijst antwoordt met totalPages 0; controleer dat eerst. Stoppen bij de eerste lege pagina werkt ook. Elke gepagineerde lijst sorteert als laatste op de regel-ID, zodat regels met dezelfde sortColumn hun volgorde tussen pagina's behouden.
curl --request GET \
--url 'https://api.serverside.com/v1/baremetal?page=2&pageSize=100&sortColumn=name' \
--header 'Authorization: Bearer <api-key>'Een tekstfilter vindt elke waarde die de tekst hoofdletterongevoelig bevat. Een filter op een veld met toegestane waarden gebruikt de API-schrijfwijze, filter[status]=CANCELLATION_REQUESTED; een waar/onwaar-filter accepteert true of false. Ongeldige waarden, niet-filterbare namen en alle filters op lijsten zonder filterondersteuning worden geweigerd met 400 VALIDATION_ERROR en detail INVALID_VALUE. De field daarvan is de verstuurde sleutel (filter[status]). Een lege waarde betekent geen filter.
sortColumn en namen binnen filter[...] horen niet bij het stabiele contract. Een onbekende sortColumn wordt genegeerd; de lijst komt in standaardvolgorde terug.
Fouten
Statussen
| Status | Betekenis | Wat te doen |
|---|---|---|
400 | Aanvraag niet leesbaar: onjuist JSON, verkeerd type, niet-gedeclareerde eigenschap, waarde buiten bereik, onbekende toegestane waarde of tijdstempel zonder offset. | Corrigeer de aanvraag; dezelfde aanvraag mislukt opnieuw. |
401 | Sleutel ontbreekt, is onjuist, uitgeschakeld of verlopen, of het endpoint vereist een consolesessie (Authenticatie). | Verstuur een geldige sleutel. |
403 | Sleutel geldig maar mist de gecontroleerde machtiging. | Gebruik een sleutel met die machtiging. |
404 | Geen object met die ID in uw organisatie of geen endpoint op dat pad. Resources van andere organisaties krijgen hetzelfde antwoord. | Controleer ID en pad. |
405, 406, 408, 413, 415 | Methode (Allow noemt de toegestane), Accept-header, timing, grootte of inhoudstype van de body onjuist. | Corrigeer de aanvraag. |
409 | Conflict: duplicaat, resource in gebruik of bewerking loopt al. | Herhaal na Retry-After indien aanwezig; los anders het conflict op. |
422 | Aanvraag gelezen maar geweigerd door een resourceregel of de huidige toestand. | Wijzig wat u aanvraagt. |
500 | Fout aan onze kant. | Probeer later opnieuw; stuur bij aanhouden de traceId naar support. |
502 | Een systeem achter de API antwoordde met een fout. | Probeer later opnieuw. |
503 | Een systeem achter de API is onbereikbaar of een functie is gepauzeerd. Altijd met Retry-After. | Herhaal na Retry-After. |
504 | Een systeem achter de API antwoordde niet op tijd. | Probeer later opnieuw. |
Retry-After is een aantal seconden. Elke 503 bevat dit, evenals elke 409 die vanzelf oplost, zoals een herstartende beheercontroller. Leesaanvragen herhalen na 500, 502 of 504 is veilig. Van wijzigende aanroepen accepteren alleen de vijf onder Idempotentie een sleutel die herhalen veilig maakt. Lees voor elke andere herhaling wat er bestaat, want de eerste aanvraag kan zijn uitgevoerd.
Validatie
Twee codes bevatten een lijst details:
VALIDATION_ERROR,400: de aanvraag kon niet worden gelezen. Detail-codeisINVALID_BODYwanneer de JSON-body zelf onleesbaar is: syntaxisfout, verkeerd type, ontbrekend verplicht lid, niet-gedeclareerd lid of waarde buiten toegestane veldwaarden.INVALID_VALUEgeldt voor query-, route- of headerwaarden en voor gelezen bodyvelden die een gedeclareerde lengte- of bereiklimiet schenden.VALUE_OUT_OF_RANGEmarkeert een getal dat de bewerking zelf controleert.VALIDATION_FAILED,422: de aanvraag is gelezen en door één of meer regels geweigerd. Elke detail-codenoemt de regel, zoalsBILLING_CYCLE_UNAVAILABLEbij een bestelling;locationisnull.
Een bodyveld wordt genoemd met JSON-pad en array-indexen (items[0].plan, billingAddress.countryCode). Een queryveld heet zoals verstuurd, een routeveld naar de parameter en een header naar de headernaam. Bij één detail luidt message field: problem; bij meerdere The request has N problems: gevolgd door elk probleem.
Een bestelling met een factureringscyclus die de configuratie niet aanbiedt:
{
"success": false,
"data": null,
"code": "VALIDATION_FAILED",
"message": "cycle: This billing cycle is not offered.",
"traceId": "SRV-1A2B-3C4D-5E6F-7A8B",
"details": [
{
"code": "BILLING_CYCLE_UNAVAILABLE",
"message": "This billing cycle is not offered.",
"field": "cycle",
"location": null
}
]
}
Een onbekende ID in de body wordt behandeld naar wat deze noemt. Configuratie, image, applicatie, segment of interface zijn catalogusitems; onbekende leveren 422 met een velddetail, zoals OFFERING_NOT_FOUND op items[0].plan. De ID van iets dat uw organisatie bezit (server, netwerk, SSH-sleutel) geeft 404 ENTITY_NOT_FOUND zonder veld. Een ID van een andere organisatie ziet er zo hetzelfde uit als een niet-bestaande. Een datacenter is de uitzondering: onbekende code geeft detail DATACENTER_NOT_FOUND, onbekende UUID geeft 422 OFFERING_NOT_AVAILABLE.
Codes
Codes die elk endpoint kan teruggeven:
| Code | Status | Betekenis |
|---|---|---|
VALIDATION_ERROR | 400 | Aanvraag niet leesbaar; zie details. |
BAD_REQUEST | 400 | De HTTP-aanvraag zelf kon niet worden gelezen. |
UNAUTHENTICATED | 401 | Zie Authenticatiefouten. |
NO_PERMISSION | 403 | Sleutel mist de door het endpoint genoemde machtiging. |
ENTITY_NOT_FOUND | 404 | Geen resource met die ID in uw organisatie. |
ROUTE_NOT_FOUND | 404 | Geen endpoint op dat pad. |
METHOD_NOT_ALLOWED | 405 | Pad bestaat maar methode niet; Allow noemt de toegestane methoden. |
ENTITY_ALREADY_EXISTS | 409 | Resource met dezelfde identiteit bestaat al. |
ENTITY_IN_USE | 409 | Resource in gebruik en kan niet worden verwijderd of verplaatst. |
ENTITY_STATE_INVALID | 422 | Toestand staat de bewerking niet toe, zonder specifiekere code. |
VALIDATION_FAILED | 422 | Een regel weigerde de aanvraag; zie details. |
INTERNAL_ERROR | 500 | Fout aan onze kant. |
UPSTREAM_ERROR | 502 | Systeem achter de API antwoordde met een fout. |
UPSTREAM_UNAVAILABLE | 503 | Systeem achter de API onbereikbaar. Retry-After: 30. |
UPSTREAM_TIMEOUT | 504 | Time-out bij een systeem achter de API. |
Codes voor dedicated servers:
| Code | Status | Betekenis |
|---|---|---|
SERVICE_SUSPENDED | 422 | Dienst opgeschort; niets kan wijzigen totdat deze is hersteld. |
SERVICE_LOCKED | 422 | Dienst vergrendeld. |
SERVICE_DELETING | 422 | Dienst wordt verwijderd en weigert hetzelfde als een opgeschorte dienst. |
OPERATION_IN_PROGRESS | 409 | Andere bewerking loopt op de server. |
BMC_RESET_IN_PROGRESS | 409 | Beheercontroller herstart. Retry-After: 30. |
BMC_UNREACHABLE | 503 | Beheercontroller antwoordt niet. Retry-After: 30. |
BMC_REQUEST_FAILED | 502 | Beheercontroller gaf een fout. |
KVM_SESSION_REQUEST_IN_PROGRESS | 409 | Aanvraag voor een consolesessie loopt al. Retry-After: 10. |
OPERATION_NOT_SUPPORTED_PLATFORM | 422 | Serverhardware ondersteunt de bewerking niet. |
PRIMARY_IPV4_REQUIRED | 422 | Implementatie vereist een primair IPv4-adres op de server. |
ISO_LIMIT_REACHED | 422 | Organisatie heeft het maximale aantal ISO's. |
ISO_UPLOAD_INCOMPLETE | 422 | ISO-upload niet afgerond of niet verifieerbaar. |
VIRTUAL_MEDIA_EJECT_FAILED | 502 | Beheercontroller kon media niet uitwerpen. |
VIRTUAL_MEDIA_ATTACH_TIMEOUT | 504 | Time-out bij koppelen van virtuele media. |
NETWORK_METRICS_UNAVAILABLE | 503 | Verkeersmetingen nu niet leesbaar. Retry-After: 30. |
Codes voor bestellingen en facturering:
| Code | Status | Betekenis |
|---|---|---|
OFFERING_NOT_AVAILABLE | 422 | Configuratie niet zo bestelbaar: uitverkocht in dat datacenter, geen adresruimte of onbekende datacenter-UUID. |
USAGE_BILLING_DISABLED | 422 | Uurfacturering niet ingeschakeld voor de organisatie (Snelstart). |
BILLING_ADDRESS_REQUIRED | 422 | Organisatie heeft geen factuuradres. |
PAYMENT_FAILED | 422 | Betaling niet mogelijk: kaart geweigerd of geen accounttegoed; data bevat het resultaat. |
INVOICE_CANNOT_ACCEPT_PAYMENT | 422 | Factuur al betaald, geannuleerd of terugbetaald, niets verschuldigd of betaling wacht op bevestiging. |
SUBSCRIPTION_NOT_ACTIVE | 422 | Abonnement al opgezegd. |
SUBSCRIPTION_SERVER_TRANSFERRED | 422 | Een gefactureerde server hoort nu bij een andere organisatie; niets gewijzigd. |
TERMINATION_BLOCKED | 422 | Een abonnementsitem kan nu niet worden opgezegd; niets gewijzigd. |
BUNDLED_ITEM_CANCELLATION_BLOCKED | 422 | IP-blok kwam bij een server; verwijderen van de server geeft het vrij. |
SUBSCRIPTION_CANCELLATION_INCOMPLETE | 422 | Sommige items opgezegd voordat één mislukte. Opnieuw versturen is veilig. |
IDEMPOTENCY_KEY_REUSED | 409 | Idempotency-Key al gebruikt voor een andere aanvraag. |
ORDER_CREATION_IN_PROGRESS | 409 | Aanvraag met dezelfde Idempotency-Key maakt nog de bestelling. Retry-After: 5. |
ORDER_PROVISIONING_IN_PROGRESS | 409 | Aanmaak met dezelfde Idempotency-Key loopt nog. Retry-After: 5. |
PROVISIONING_FAILED | 409 | Niets in een uurorder of uuraanvraag voor server of IP-blok kon worden ingericht. |
VAT_SERVICE_UNAVAILABLE | 503 | Controle van EU-btw-nummer niet afgerond. Retry-After: 30. |
STRIPE_PROVIDER_ERROR | 502 | Betaalprovider is mislukt. |
Netwerkcodes staan bij hun aanroepen in IP-adressen beheren en Virtuele netwerken instellen. Detailcodes van VALIDATION_FAILED worden genoemd in de handleiding van de betreffende bewerking.
Idempotentie
Vijf bewerkingen accepteren een Idempotency-Key-header van maximaal 200 tekens: een bestelling maken, een dedicated server maken, een IP-blok maken en een server op een virtueel netwerk aansluiten of loskoppelen. Verstuur een nieuwe waarde voor elke nieuwe actie en dezelfde waarde bij herhaling van die actie.
De drie aanmaakaanroepen delen één sleutelverzameling per organisatie; een sleutel wordt nooit vergeten. Een herhaling met dezelfde sleutel en dezelfde aankoop (factureringscyclus, promotiecode en items) plaatst niets nieuws en antwoordt met 200 in plaats van 201 en wat de eerste aanvraag maakte. Bestelling maken zet ook data.isReplayed op true. Een configuratie in de ene aanvraag met slug noemen en in de andere met ID geldt nog als dezelfde aankoop, net als datacenter-code en ID. Dezelfde sleutel met een andere aankoop wordt geweigerd met 409 IDEMPOTENCY_KEY_REUSED. Loopt de eerste aanvraag nog, dan krijgt een herhaling 409 ORDER_CREATION_IN_PROGRESS of ORDER_PROVISIONING_IN_PROGRESS met Retry-After: 5; probeer na dat aantal seconden opnieuw.
Bij virtuele-netwerkaanroepen hoort een sleutel bij de server en blijft deze bewaard tot 90 dagen na toepassing. Een herhaling antwoordt weer met 202 zonder een tweede wijziging in te plannen; dezelfde sleutel met een ander netwerk of segment krijgt 409 IDEMPOTENCY_KEY_REUSED. Een tweede wijziging terwijl de eerste wordt toegepast krijgt 409 NETWORK_CHANGE_IN_PROGRESS met Retry-After: 10.
Aanvraaglimieten
Elke API-sleutel heeft eigen limieten:
| Aanvragen | Limiet |
|---|---|
Lezen (GET) | 1.000 per minuut |
Schrijven (POST, PUT, PATCH, DELETE) | 100 per minuut |
De limieten worden vóór de API afgedwongen; de API zelf verstuurt geen 429.
Een implementatie elke 20 seconden opvragen, zoals in de handleidingen, gebruikt 3 leesaanvragen per minuut.