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

WaarStijlVoorbeeld
QueryparameterscamelCase?pageSize=50&sortColumn=name
JSON-aanvraag- en antwoordveldencamelCase"plan", "primaryIpv4"
Toegestane waardenUPPER_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 Millicents telt duizendsten van een cent: 150000 is 1,50. Prijzen en tarieven op configuraties, bestellingen en abonnementen worden zo geschreven, zodat uurtarieven centfracties behouden.
  • Alle andere geldvelden tellen centen: 12999 is 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
  }
}
VeldBetekenis
successtrue.
dataDe inhoud: een object of bij lijstendpoints een array.
paginationBij 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"
    }
  ]
}
VeldBetekenis
successfalse.
datanull, behalve bij een geweigerde factuurbetaling: dan bevat het het betalingsresultaat (Facturering).
codeWat misging als stabiele UPPER_SNAKE_CASE-code. Vertak hierop samen met de status. Behandel een onbekende code op basis van de status.
messageEen zin voor mensen. De formulering kan veranderen; parse deze niet.
traceIdAanvraag-ID, gelijk aan de X-Request-Id-header. Vermeld deze bij contact met support.
detailsEé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:

ParameterStandaardOpmerkingen
page1Begint bij 1. Een pagina na de laatste geeft lege data.
pageSize251 tot 1000. Buiten dat bereik geeft 400.
sortColumngeenHet sorteerveld.
ascendingtruefalse keert de sortering om.
searchgeenVrije tekst; spaties voor en achter worden verwijderd. De doorzochte velden hangen af van het endpoint.
filter[<field>]geenEé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

StatusBetekenisWat te doen
400Aanvraag 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.
401Sleutel ontbreekt, is onjuist, uitgeschakeld of verlopen, of het endpoint vereist een consolesessie (Authenticatie).Verstuur een geldige sleutel.
403Sleutel geldig maar mist de gecontroleerde machtiging.Gebruik een sleutel met die machtiging.
404Geen 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, 415Methode (Allow noemt de toegestane), Accept-header, timing, grootte of inhoudstype van de body onjuist.Corrigeer de aanvraag.
409Conflict: duplicaat, resource in gebruik of bewerking loopt al.Herhaal na Retry-After indien aanwezig; los anders het conflict op.
422Aanvraag gelezen maar geweigerd door een resourceregel of de huidige toestand.Wijzig wat u aanvraagt.
500Fout aan onze kant.Probeer later opnieuw; stuur bij aanhouden de traceId naar support.
502Een systeem achter de API antwoordde met een fout.Probeer later opnieuw.
503Een systeem achter de API is onbereikbaar of een functie is gepauzeerd. Altijd met Retry-After.Herhaal na Retry-After.
504Een 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-code is INVALID_BODY wanneer de JSON-body zelf onleesbaar is: syntaxisfout, verkeerd type, ontbrekend verplicht lid, niet-gedeclareerd lid of waarde buiten toegestane veldwaarden. INVALID_VALUE geldt voor query-, route- of headerwaarden en voor gelezen bodyvelden die een gedeclareerde lengte- of bereiklimiet schenden. VALUE_OUT_OF_RANGE markeert een getal dat de bewerking zelf controleert.
  • VALIDATION_FAILED, 422: de aanvraag is gelezen en door één of meer regels geweigerd. Elke detail-code noemt de regel, zoals BILLING_CYCLE_UNAVAILABLE bij een bestelling; location is null.

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:

CodeStatusBetekenis
VALIDATION_ERROR400Aanvraag niet leesbaar; zie details.
BAD_REQUEST400De HTTP-aanvraag zelf kon niet worden gelezen.
UNAUTHENTICATED401Zie Authenticatiefouten.
NO_PERMISSION403Sleutel mist de door het endpoint genoemde machtiging.
ENTITY_NOT_FOUND404Geen resource met die ID in uw organisatie.
ROUTE_NOT_FOUND404Geen endpoint op dat pad.
METHOD_NOT_ALLOWED405Pad bestaat maar methode niet; Allow noemt de toegestane methoden.
ENTITY_ALREADY_EXISTS409Resource met dezelfde identiteit bestaat al.
ENTITY_IN_USE409Resource in gebruik en kan niet worden verwijderd of verplaatst.
ENTITY_STATE_INVALID422Toestand staat de bewerking niet toe, zonder specifiekere code.
VALIDATION_FAILED422Een regel weigerde de aanvraag; zie details.
INTERNAL_ERROR500Fout aan onze kant.
UPSTREAM_ERROR502Systeem achter de API antwoordde met een fout.
UPSTREAM_UNAVAILABLE503Systeem achter de API onbereikbaar. Retry-After: 30.
UPSTREAM_TIMEOUT504Time-out bij een systeem achter de API.

Codes voor dedicated servers:

CodeStatusBetekenis
SERVICE_SUSPENDED422Dienst opgeschort; niets kan wijzigen totdat deze is hersteld.
SERVICE_LOCKED422Dienst vergrendeld.
SERVICE_DELETING422Dienst wordt verwijderd en weigert hetzelfde als een opgeschorte dienst.
OPERATION_IN_PROGRESS409Andere bewerking loopt op de server.
BMC_RESET_IN_PROGRESS409Beheercontroller herstart. Retry-After: 30.
BMC_UNREACHABLE503Beheercontroller antwoordt niet. Retry-After: 30.
BMC_REQUEST_FAILED502Beheercontroller gaf een fout.
KVM_SESSION_REQUEST_IN_PROGRESS409Aanvraag voor een consolesessie loopt al. Retry-After: 10.
OPERATION_NOT_SUPPORTED_PLATFORM422Serverhardware ondersteunt de bewerking niet.
PRIMARY_IPV4_REQUIRED422Implementatie vereist een primair IPv4-adres op de server.
ISO_LIMIT_REACHED422Organisatie heeft het maximale aantal ISO's.
ISO_UPLOAD_INCOMPLETE422ISO-upload niet afgerond of niet verifieerbaar.
VIRTUAL_MEDIA_EJECT_FAILED502Beheercontroller kon media niet uitwerpen.
VIRTUAL_MEDIA_ATTACH_TIMEOUT504Time-out bij koppelen van virtuele media.
NETWORK_METRICS_UNAVAILABLE503Verkeersmetingen nu niet leesbaar. Retry-After: 30.

Codes voor bestellingen en facturering:

CodeStatusBetekenis
OFFERING_NOT_AVAILABLE422Configuratie niet zo bestelbaar: uitverkocht in dat datacenter, geen adresruimte of onbekende datacenter-UUID.
USAGE_BILLING_DISABLED422Uurfacturering niet ingeschakeld voor de organisatie (Snelstart).
BILLING_ADDRESS_REQUIRED422Organisatie heeft geen factuuradres.
PAYMENT_FAILED422Betaling niet mogelijk: kaart geweigerd of geen accounttegoed; data bevat het resultaat.
INVOICE_CANNOT_ACCEPT_PAYMENT422Factuur al betaald, geannuleerd of terugbetaald, niets verschuldigd of betaling wacht op bevestiging.
SUBSCRIPTION_NOT_ACTIVE422Abonnement al opgezegd.
SUBSCRIPTION_SERVER_TRANSFERRED422Een gefactureerde server hoort nu bij een andere organisatie; niets gewijzigd.
TERMINATION_BLOCKED422Een abonnementsitem kan nu niet worden opgezegd; niets gewijzigd.
BUNDLED_ITEM_CANCELLATION_BLOCKED422IP-blok kwam bij een server; verwijderen van de server geeft het vrij.
SUBSCRIPTION_CANCELLATION_INCOMPLETE422Sommige items opgezegd voordat één mislukte. Opnieuw versturen is veilig.
IDEMPOTENCY_KEY_REUSED409Idempotency-Key al gebruikt voor een andere aanvraag.
ORDER_CREATION_IN_PROGRESS409Aanvraag met dezelfde Idempotency-Key maakt nog de bestelling. Retry-After: 5.
ORDER_PROVISIONING_IN_PROGRESS409Aanmaak met dezelfde Idempotency-Key loopt nog. Retry-After: 5.
PROVISIONING_FAILED409Niets in een uurorder of uuraanvraag voor server of IP-blok kon worden ingericht.
VAT_SERVICE_UNAVAILABLE503Controle van EU-btw-nummer niet afgerond. Retry-After: 30.
STRIPE_PROVIDER_ERROR502Betaalprovider 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:

AanvragenLimiet
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.