Ga naar inhoud

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

  1. Je plaatst een bestelling met een callback-object (POST /api/orders, POST /api/orders/domain of POST /api/cpanel_accounts).
  2. CloudPress accepteert de bestelling (202 Accepted) en richt asynchroon in als een taak.
  3. Wanneer de taak voltooid is (of mislukt), stuurt CloudPress een HTTP POST naar de url van je callback.
  4. 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-bestellingen
  • POST /api/orders/domain — bestellingen voor domeinregistratie/-verhuizing
  • POST /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) en Accept: 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 | true wanneer de taak eindigde op OK; false wanneer hij eindigde op FAILED of CANCELLED.
  • data: String | Het data-veld van de taak — dezelfde vrije resultaattekst die GET /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. timestamp is 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 inkomende POST /api/webhooks/task/{task-id} starten een levering) levert een nieuwe timestamp op 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-url die 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 data van de taak.
  • success: Boolean (vereist) | true → taak OK; false → taak FAILED.

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) | all om de hele pull zone leeg te maken, of paths om specifieke paden leeg te maken.
  • paths: Array<String> (vereist wanneer mode paths is) | 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 | true wanneer er niets leeg te maken viel; task_id ontbreekt 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_id ontbreekt, of is geen positief geheel getal.
  • 400 invalid_mode | mode is all noch paths.
  • 400 missing_paths | mode is paths, maar er is geen bruikbaar pad opgegeven.
  • 400 too_many_paths | meer dan 100 items in paths.
  • 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.