Callbacks
Een callback is een uitgaande melding per verzoek die je aan een bestelling
koppelt, zodat CloudPress naar je URL POSTt op het moment dat het asynchrone
werk van de bestelling klaar is — in plaats van dat jij de taak pollt. Je geeft
de callback op wanneer je de bestelling plaatst; CloudPress vuurt hem af zodra de
taak van die bestelling een eindstatus bereikt (OK, FAILED of
CANCELLED).
Callback vs. billing-webhook
Een callback is per verzoek — hij hoort bij de ene bestelling waaraan je hem koppelt en vuurt één keer. Een billing-webhook is plan-niveau — geconfigureerd door een admin op het facturatieplan, vuurt bij elke levenscyclusgebeurtenis van een dienst onder dat plan. Verschillende mechanismen; zie de vergelijking hieronder.
Hoe het werkt
- Je plaatst een bestelling met een
callback-object (POST /api/orders,POST /api/orders/domainofPOST /api/cpanel_accounts). - CloudPress accepteert de bestelling (
202 Accepted) en richt asynchroon in als een taak. - Wanneer de taak voltooid is (of mislukt), stuurt CloudPress een HTTP
POSTnaar deurlvan je callback. - Als je geen callback registreert, poll dan in plaats daarvan
GET /api/tasks/{task-id}.
Levering wordt opnieuw geprobeerd, maar is niet gegarandeerd. Een levering
die met een niet-2xx-status wordt afgerond, wordt opnieuw geprobeerd, dus je
ontvanger moet idempotent zijn — maar een levering die helemaal niet tot stand
komt (verbinding geweigerd, timeout) wordt niet opnieuw geprobeerd en gaat
verloren. Lees Levering en retries voordat je callbacks
als enige signaal gebruikt.
Een callback registreren
Voeg een callback-object toe aan de body van de bestelling. Drie endpoints
accepteren het:
POST /api/orders— site-bestellingenPOST /api/orders/domain— bestellingen voor domeinregistratie/-verhuizingPOST /api/cpanel_accounts— bestellingen voor cPanel-hostingaccounts
Params
- callback: Object (optioneel) | Wordt afgevuurd wanneer de asynchrone taak van de bestelling voltooid is.
- url: String (vereist) | Volledig gekwalificeerde HTTPS-URL die de POST ontvangt.
- authorization: String (optioneel) | Wordt letterlijk als de
Authorization-header op de callback meegestuurd. Geef de volledige waarde op — bijv.Bearer 12345,Token 12345, of een ruw token.
curl -X POST https://my.cloudpress.com/api/orders \
-H "Authorization: Bearer $CLOUDPRESS_TOKEN" \
-H "X-Auth-Account: $ACCOUNT_ID" \
-H "Content-Type: application/json" \
-d '{
"order": { "plan": "basic", "term": "monthly" },
"callback": {
"url": "https://your-app.example.com/cloudpress/callback",
"authorization": "Bearer your-shared-secret"
}
}'
Wat CloudPress verstuurt
Wanneer de taak klaar is, stuurt CloudPress een POST naar je url:
- Headers:
Authorization: <jouw authorization-waarde>(letterlijk; weggelaten als je er geen hebt opgegeven) enAccept: application/json. - Body: JSON.
{
"timestamp": 1727303593,
"success": true,
"data": "Site provisioned. Primary domain: example.com"
}
Body-params
- timestamp: Integer | Unix-epoch (seconden) waarop deze levering in de wachtrij is gezet. Stabiel over de retries van één levering heen, maar geen unieke gebeurtenissleutel — zie Levering en retries.
- success: Boolean |
truewanneer de taak eindigde opOK;falsewanneer hij eindigde opFAILEDofCANCELLED. - data: String | Het
data-veld van de taak — dezelfde vrije resultaattekst dieGET /api/tasks/{task-id}retourneert.
success: false betekent niet altijd dat de taak is mislukt
Een geannuleerde taak vuurt de callback ook af, en rapporteert
"success": false — op de lijn niet te onderscheiden van een echte
mislukking. De body bevat geen statusveld om ze uit elkaar te houden. Maakt
dat onderscheid voor jou uit, lees de taak dan met
GET /api/tasks/{task-id}, waar CANCELLED en FAILED aparte waarden zijn.
Levering en retries
Callbacks delen de uitgaande leveringslaag van CloudPress (dezelfde die door billing-webhooks wordt gebruikt).
Een timeout of geweigerde verbinding wordt nooit opnieuw geprobeerd
Alleen leveringen die worden afgerond als een HTTP-reactie met een
niet-2xx-status komen in het retry-schema terecht. Komt het verzoek
helemaal niet tot stand — verbinding geweigerd, DNS- of TLS-fout, of de
timeout van 30 seconden die verstrijkt — dan wordt de levering één keer
geprobeerd en daarna definitief opgegeven. Er wordt niets opnieuw in de
wachtrij gezet en niets opnieuw verstuurd, dus een ontvanger die ook maar
even onbereikbaar is, verliest die callback voorgoed.
Behandel callbacks daarom als best-effort. Houd voor alles wat je je niet
kunt veroorloven te missen een periodieke poll van
GET /api/tasks/{task-id} aan als vangnet, in plaats van alleen op de
callback te vertrouwen.
- Timeout: 30 seconden per poging.
- Succes: elke HTTP
2xx. Een afgeronde niet-2xx-reactie is een mislukte levering en wordt opnieuw geprobeerd. Een verbindingsfout of timeout niet — zie de waarschuwing hierboven. - Retries: de eerste retry gaat 5 minuten na de oorspronkelijke poging uit, en daarna elke 15 minuten.
- Opgeven: de retries stoppen 4 uur na de eerste poging.
- Idempotentie: door retries kan dezelfde callback meer dan eens aankomen,
dus je ontvanger moet idempotent zijn.
timestampis geen veilige deduplicatiesleutel — hij is stabiel over de retries van één levering heen, maar een taak die meer dan eens wordt afgerond (zowel de provisioning-job als een inkomendePOST /api/webhooks/task/{task-id}starten een levering) levert een nieuwetimestampop voor hetzelfde resultaat. De body bevat ook geen task-id, dus correleer op iets wat je zelf in de hand hebt: zet een order- of taakreferentie in de callback-urldie je registreert, en zorg dat de handler twee keer kan draaien.
Alles hieronder is de inkomende richting
De callback die hierboven is beschreven, is uitgaand — CloudPress die
naar jouw URL POSTt. De overige endpoints op deze pagina zijn het
spiegelbeeld: /api/webhooks/*-routes die de eigen
provisioning-infrastructuur van CloudPress naar de API aanroept. Ze
staan hier gedocumenteerd omdat een post ernaartoe de uitgaande callback
hierboven triggert, maar ze horen niet bij de normale flow van een
integrator — ze authenticeren met een back-end systeem-API-sleutel en zijn
geblokkeerd voor OAuth-tokens. Haal de twee richtingen niet door
elkaar.
Bereikbaarheid testen
GET /api/webhooks/task
Retourneert het bron-IP dat CloudPress voor je verzoek ziet, zodat je netwerkbereikbaarheid / allow-listing kunt bevestigen voordat je op een callback vertrouwt.
Geretourneerde params
- ip_address: String
Op het pad van de cache-webhook bestaat een identieke test —
GET /api/webhooks/cdn_cache.
Een taakresultaat rapporteren
POST /api/webhooks/task/{task-id}
Dit is het endpoint dat een taak binnen CloudPress als voltooid markeert — zo
rapporteert de provisioning-infrastructuur een resultaat terug, en het posten van
dat resultaat triggert je geregistreerde uitgaande callback. Het werkt de data
van de taak bij, zet de status (OK / FAILED) en vuurt vervolgens de callback af.
Account-scope vereist (X-Auth-Account). Niet beschikbaar via OAuth — dit
endpoint authenticeert met een back-end API-sleutel (het wordt normaal
gesproken aangeroepen door CloudPress-infrastructuur, niet door integrators).
Retourneert altijd 200, zelfs voor een onbekende task-ID. Idempotent: een
herhaalde post met dezelfde data + success wordt op digest gededupliceerd en
is een no-op.
Params
- data: Any (optioneel) | Toegevoegd aan de
datavan de taak. - success: Boolean (vereist) |
true→ taakOK;false→ taakFAILED.
Een CDN-cachepurge aanvragen
POST /api/webhooks/cdn_cache
Het inkomende endpoint waarmee de hostingcontainer van een site CloudPress
vraagt om de CDN-cache van die site leeg te maken — bijvoorbeeld wanneer een
WordPress-cacheplug-in na een publicatie de paginacache leegt. CloudPress zoekt
de site op, opent een taak met de naam site.cache.cdn_purge en
voert de purge asynchroon uit.
Niet beschikbaar via OAuth. Dit endpoint authenticeert met een back-end
systeem-API-sleutel vanaf een toegestaan IP-adres — het wordt aangeroepen
door CloudPress-infrastructuur, niet door integrators. Een OAuth-token
wordt geweigerd met 403 insufficient_scope, dus een app van derden kan
de CDN van een klant nooit namens de infrastructuur leegmaken.
Params
- cs_project_id: Integer (vereist) | Het interne project-id van de site. Moet een positief geheel getal zijn.
- mode: String (vereist) |
allom de hele pull zone leeg te maken, ofpathsom specifieke paden leeg te maken. - paths:
Array<String>(vereist wanneermodepathsis) | Maximaal 100 items. Een pad dat eindigt op/of dat een*bevat, is een prefix-purge; al het andere maakt precies dat object leeg.
{ "cs_project_id": 4821, "mode": "paths", "paths": ["/", "/blog/*"] }
Geretourneerde params
- status: String | Altijd
"accepted". - task_id: Integer | De purge-taak om te pollen — aanwezig wanneer er een purge in de wachtrij is gezet.
- noop: Boolean |
truewanneer er niets leeg te maken viel;task_idontbreekt dan.
202 Accepted betekent geaccepteerd, niet "purge bevestigd" — de purge draait
buiten de request om en probeert het intern opnieuw bij tijdelijke CDN-fouten. Een
onbekende site, of een site zonder actieve CDN, is eveneens een geaccepteerde
no-op ({"status":"accepted","noop":true}) in plaats van een fout, zodat de
aanroeper "site weg" nooit van "leeggemaakt" hoeft te onderscheiden.
Omdat de aanroeper infrastructuur is en geen persoon, wordt de resulterende taak
in de taakgeschiedenis van de site toegeschreven aan System.
Fouten
- 400
invalid_cs_project_id|cs_project_idontbreekt, of is geen positief geheel getal. - 400
invalid_mode|modeisallnochpaths. - 400
missing_paths|modeispaths, maar er is geen bruikbaar pad opgegeven. - 400
too_many_paths| meer dan 100 items inpaths. - 401 | authenticatie- of allow-listfout op het IP-adres.
- 403
insufficient_scope| er is een OAuth-token gebruikt.
Wil je als integrator de CDN-cache van een site leegmaken, gebruik dan de gewone per-site-endpoints — zie De cache leegmaken en Een cachelaag leegmaken.
Bereikbaarheid van de cache-webhook testen
GET /api/webhooks/cdn_cache
Dezelfde connectiviteitstest als
GET /api/webhooks/task, op het pad van de
cache-webhook.
Geretourneerde params
- ip_address: String
Callbacks vs. billing-webhooks
| Callback | Billing-webhook | |
|---|---|---|
| Geconfigureerd op | Per verzoek, in het callback-object op een bestelling |
Het facturatieplan (admin-UI) |
| Scope | De ene taak / bestelling waaraan hij was gekoppeld | Levenscyclusgebeurtenissen van sites, cPanel-accounts en domeinen onder dat plan |
| Vuurt | Eén keer, wanneer die taak OK / FAILED / CANCELLED bereikt |
Bij elke created / resized / registered / renewed / … gebeurtenis |
| Body | { "timestamp", "success", "data" } (het taakresultaat) |
{ "action", "site" }, { "action", "cpanel_account_link" } of { "action", "domain" } |
Zie Billing Webhooks voor het mechanisme op planniveau.