Ga naar hoofdinhoud

API

Projecten en back-uptokens beheert u niet alleen in het portaal, maar ook via een HTTP-API — voor uw eigen automatisering of via de Terraform-provider. De API spreekt JSON, staat op https://api.lionbackup.cloud/api/v1 en gebruikt precies dezelfde rechtencontrole als het portaal.

Een sleutel aanmaken​

In het portaal onder Ontwikkelaars maakt u een serviceaccount aan en daarbij een API-sleutel. De sleutel wordt precies één keer getoond — bewaar hem veilig.

Een serviceaccount heeft exact de rechten van de persoon die hem bezit. Wie in het portaal geen projecten mag aanmaken, kan dat via de API evenmin; wordt het account gedeactiveerd of de sleutel verwijderd, dan is de toegang meteen dicht.

De sleutel inwisselen voor een toegangstoken​

De sleutel is geen bearer token: u wisselt hem eerst in voor een kortlevend toegangstoken (een JWT, 15 minuten geldig).

ACCESS_TOKEN=$(curl -s https://authentik.prod.lionbackup.cloud/application/o/token/ \
-d grant_type=client_credentials \
-d client_id=lionbackup-api \
-d client_secret="$LIONBACKUP_API_KEY" \
-d scope="profile lionbackup_api" | jq -r .access_token)

Gebruik voor het inwisselen altijd de host authentik.prod.lionbackup.cloud: de korte naam authentik.lionbackup.cloud antwoordt met een omleiding, en een POST volgt geen omleiding — de aanroep levert dan geen token op.

Daarna stuurt u het token als Authorization-header mee:

API=https://api.lionbackup.cloud/api/v1

curl -s "$API/organizations" -H "Authorization: Bearer $ACCESS_TOKEN"
Ontwikkelomgeving

Voor de ontwikkelomgeving gelden https://api.dev.lionbackup.cloud/api/v1 en https://authentik.dev.lionbackup.cloud/application/o/token/. Een sleutel geldt alleen in de omgeving waarin hij is aangemaakt.

Stap voor stap: een project en een back-uptoken aanmaken​

De volgende aanroepen bouwen op elkaar voort en gaan uit van ACCESS_TOKEN en API uit de vorige paragraaf. De identifiers in de antwoorden zijn voorbeelden.

1. Zones opvragen​

Een project heeft de identifier (UUID) nodig van de zone waarin zijn data moet liggen. Alleen zones met status = active zijn te boeken.

curl -s "$API/zones" -H "Authorization: Bearer $ACCESS_TOKEN"
{
"zones": [
{
"id": "3f0c2a4e-8b1d-4c6a-9e2f-5d7b1a9c0e31",
"name": "de01-1",
"status": "active",
"provider": "Hetzner",
"location_city": "Nürnberg",
"storage_type": "managed object storage"
},
{
"id": "7a9d4b2c-1e5f-4a83-b6c0-2f8e9d1c4a57",
"name": "de01-2",
"status": "preparing",
"provider": "Hetzner",
"location_city": "Falkenstein",
"storage_type": "managed object storage"
}
]
}

De identifier van de gewenste zone kunt u direct in een variabele overnemen:

ZONE_ID=$(curl -s "$API/zones" -H "Authorization: Bearer $ACCESS_TOKEN" \
| jq -r '.zones[] | select(.name == "de01-1") | .id')

2. De organisatie bepalen​

Projecten horen bij een organisatie. De lijst toont elke organisatie waarvan u lid bent, inclusief uw rol — projecten aanmaken mogen owner en admin.

curl -s "$API/organizations" -H "Authorization: Bearer $ACCESS_TOKEN"
{
"organizations": [
{
"id": "9b2e6c1a-4d3f-4e8b-a7c5-0f1d2e3a4b5c",
"name": "Example Ltd",
"status": "approved",
"role": "owner"
}
]
}
ORG_ID=$(curl -s "$API/organizations" -H "Authorization: Bearer $ACCESS_TOKEN" \
| jq -r '.organizations[] | select(.name == "Example Ltd") | .id')

De keuze op naam is bewust: het serviceaccount ziet alle organisaties van zijn eigenaar en de volgorde van de lijst is niet gegarandeerd.

3. Een project aanmaken​

Verplichte velden zijn name (maximaal 100 tekens) en availability_zone_id. Optioneel zijn alert_email, billing_reference, immutable_storage (standaard false) en — alleen bij onveranderbare opslag — retention_days (1 tot 365, standaard 30).

curl -s -X POST "$API/organizations/$ORG_ID/projects" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d "{\"name\":\"web-servers\",\"availability_zone_id\":\"$ZONE_ID\",\"alert_email\":\"ops@example.com\"}"

Antwoord met status 201:

{
"project": {
"id": "ea1296ad-5c7b-4f2e-8a1d-3b6c9e0f7d24",
"name": "web-servers",
"status": "active",
"organization_id": "9b2e6c1a-4d3f-4e8b-a7c5-0f1d2e3a4b5c",
"availability_zone_id": "3f0c2a4e-8b1d-4c6a-9e2f-5d7b1a9c0e31",
"alert_email": "ops@example.com",
"billing_reference": null,
"immutable_storage": false,
"retention_days": null,
"created_at": "2026-09-24 09:41:12.418273"
}
}
PROJECT_ID=ea1296ad-5c7b-4f2e-8a1d-3b6c9e0f7d24

4. Een back-uptoken aanmaken​

Een back-uptoken hoort bij precies één project. Met type = write maakt de client back-ups, met type = read herstelt hij. Zonder opgave ontstaat een schrijftoken voor Linux; operating_system kent Linux, Windows en macOS. Optioneel beperken usage_count_limit, rate_limit_per_minute en rate_limit_per_hour het gebruik.

curl -s -X POST "$API/projects/$PROJECT_ID/tokens" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{"type":"write","operating_system":"Linux"}'

Antwoord met status 201:

{
"token": {
"id": "c4d1e8f2-6a3b-4c9d-8e7f-1a2b3c4d5e6f",
"type": "write",
"secret": "9f3e7b1c…a41c"
}
}
Het geheim verschijnt alleen in dit antwoord

secret is het eigenlijke back-uptoken (128 hexadecimale tekens). Het wordt precies één keer uitgeleverd en is later niet meer op te vragen — het platform bewaart alleen een hash. Sla het meteen op in uw geheimenbeheer.

Een leestoken voor herstel ontstaat op dezelfde manier:

curl -s -X POST "$API/projects/$PROJECT_ID/tokens" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{"type":"read"}'
{
"token": {
"id": "5e6f7a8b-9c0d-4e1f-a2b3-c4d5e6f7a8b9",
"type": "read",
"secret": "d27c0a8e…5b93"
}
}

5. Tokens opsommen​

De lijst bevat alleen metadata — nooit een geheim. Ingetrokken tokens verschijnen niet meer.

curl -s "$API/projects/$PROJECT_ID/tokens" -H "Authorization: Bearer $ACCESS_TOKEN"
{
"tokens": [
{
"id": "5e6f7a8b-9c0d-4e1f-a2b3-c4d5e6f7a8b9",
"type": "read",
"operating_system": "Linux",
"is_active": true,
"usage_count": 0,
"usage_count_limit": null,
"created_at": "2026-09-24 09:43:05.102944",
"expire": null
},
{
"id": "c4d1e8f2-6a3b-4c9d-8e7f-1a2b3c4d5e6f",
"type": "write",
"operating_system": "Linux",
"is_active": true,
"usage_count": 0,
"usage_count_limit": null,
"created_at": "2026-09-24 09:42:37.556210",
"expire": null
}
]
}

6. Een token intrekken​

TOKEN_ID=c4d1e8f2-6a3b-4c9d-8e7f-1a2b3c4d5e6f

curl -s -X DELETE "$API/projects/$PROJECT_ID/tokens/$TOKEN_ID" \
-H "Authorization: Bearer $ACCESS_TOKEN"
{ "deleted": true }

7. Een project sluiten​

Een project wordt niet verwijderd, maar gesloten: de status gaat naar closing, alle schrijftokens worden meteen ingetrokken en het antwoord noemt hun aantal. De aanroep is idempotent — een al gesloten project antwoordt opnieuw met 200.

curl -s -X POST "$API/projects/$PROJECT_ID/close" \
-H "Authorization: Bearer $ACCESS_TOKEN"
{
"project": {
"id": "ea1296ad-5c7b-4f2e-8a1d-3b6c9e0f7d24",
"name": "web-servers",
"status": "closing",
"organization_id": "9b2e6c1a-4d3f-4e8b-a7c5-0f1d2e3a4b5c",
"availability_zone_id": "3f0c2a4e-8b1d-4c6a-9e2f-5d7b1a9c0e31",
"alert_email": "ops@example.com",
"billing_reference": null,
"immutable_storage": false,
"retention_days": null,
"created_at": "2026-09-24 09:41:12.418273"
},
"write_tokens_revoked": 1
}

Wat u moet weten​

Rechten per actie​

De API controleert dezelfde rollen als het portaal:

ActieRol
Project lezen, tokens opsommenelke rol in het project
Project wijzigen, token aanmakenowner, admin, writer
Token intrekkenowner, admin
Project aanmaken, project sluitenowner of admin van de organisatie

404 in plaats van 403​

Een resource die niet bestaat en een resource waarop u geen rol hebt, antwoorden hetzelfde: 404 met {"error":"not_found"}. Zo verraadt de API niet welke identifiers bestaan. Een 403 met permission_denied krijgt u alleen als u de resource mag zien, maar de actie niet mag uitvoeren.

Publicatie naar de zone is asynchroon​

Een nieuw token wordt na het aanmaken overgedragen aan de Storage Zone. Tot dat is gebeurd, wijst de zone het token af met 401 — doorgaans enkele seconden, bij een storing tot aan de volgende synchronisatie. Maak het token dan niet opnieuw aan, maar probeer het later nog eens. Omgekeerd kan een ingetrokken token in de zone nog kort geldig blijven.

Een project sluiten​

Sluiten trekt alle schrijftokens meteen in en zet het project op closing. Leestokens blijven tijdens de bewaartermijn geldig, en zolang er nog een back-up binnen de bewaartermijn valt, kunt u ook nieuwe leestokens aanmaken om opgeslagen back-ups te blijven herstellen. Een project in closing weigert nieuwe schrijftokens (409 project_closed); zodra het closed is, neemt het helemaal geen tokens meer aan. Evenzo weigert een gesloten organisatie nieuwe projecten (409 organization_closed).

Snelheidslimieten​

LimietWaardeGeldt voor
Verzoeken per IP-adres60/minuutelk verzoek aan de API
Verzoeken per serviceaccount60/minuutelk geauthenticeerd verzoek
Grootte van één verzoek1 MBde verzonden inhoud

Elk geauthenticeerd antwoord draagt X-RateLimit-Limit, X-RateLimit-Remaining en X-RateLimit-Reset (Unix-tijd waarop het lopende minuutvenster eindigt). Boven de limiet antwoordt de API met 429, {"error":"rate_limited"} en de header Retry-After — wacht dat aantal seconden en herhaal het verzoek. De Terraform-provider doet dat vanzelf.

De X-RateLimit-*-headers kunnen ontbreken: valt de tellercache van het platform uit, dan telt de API tijdelijk niet per serviceaccount en kondigt dan ook geen budget aan. Vertrouw in uw automatisering op de status 429 en Retry-After, niet op de headers.

Foutformaat​

Elke fout is een JSON-object met precies één veld: {"error":"<code>"}. De code is stabiel en bedoeld voor programma's; vertak op de code, niet alleen op de HTTP-status.

StatusCodeBetekenis
400invalid_requestinhoud is geen JSON, een verplicht veld ontbreekt of een waarde is ongeldig
400invalid_zoneavailability_zone_id is onbekend of de zone is niet active
400retention_out_of_rangeretention_days ligt buiten 1 tot 365
401invalid_tokentoegangstoken ontbreekt, is ongeldig of verlopen, serviceaccount verwijderd
403owner_inactivede persoon die het serviceaccount bezit, is gedeactiveerd
403permission_denieduw rol staat deze actie niet toe
404not_foundresource onbekend of voor u niet zichtbaar
405method_not_allowedhet pad bestaat, de HTTP-methode niet
409organization_closedde organisatie wordt gesloten of is gesloten
409project_closedhet project is closed, of closing en er werd een schrijftoken gevraagd
429rate_limitedsnelheidslimiet — let op Retry-After
500internal_erroronverwachte fout op het platform
503service_unavailabletijdelijk niet beschikbaar — probeer het later opnieuw

Terraform​

Voor Terraform en OpenTofu is er een provider die dezelfde API gebruikt en projecten en back-uptokens als resources beheert. Het bronadres, de inrichting en een volledig voorbeeld vindt u op de pagina Terraform.

Referentie​

De volledige specificatie is als OpenAPI 3.1-document te downloaden: openapi.yaml. De API levert hetzelfde bestand op /api/v1/openapi.yaml — het beschrijft dus altijd precies de versie die draait.

Loading the API reference…