Sites
OAuth-scopes: reads vereisen sites:read, writes vereisen sites:write.
Twee uitzonderingen, in beide richtingen: de endpoints voor
back-up-export vereisen sites:write
inclusief het uitlezen van de status, terwijl de metrics-endpoints alleen
sites:read vereisen hoewel het POSTs zijn — ze halen data op in plaats
van iets te wijzigen. De metrics-POSTs vereisen wel nog steeds
bewerkrechten op de site — een alleen-lezen samenwerker krijgt 403
{"errors":["Not Authorized"]} terug, zelfs met sites:read.
Een dunning-suspended site geeft 402 service_suspended terug op zijn
show-/update-/destroy- en tool-endpoints (list-endpoints tonen in plaats daarvan
dunning_suspended: true).
Een site die in verwijdering staat — een site die is verwijderd en wacht
op definitief wissen — geeft 403 pending_delete terug op update en delete
en op elk genest site-endpoint, reads inbegrepen, terwijl hij nog steeds in
listresultaten verschijnt en nog steeds oplost op GET /api/sites/:id. Zie
Een site verwijderen.
Gerelateerde site-tooling staat op eigen pagina's: CDN, cache & logs en Shield.
Sites opvragen
Als je de account-ID-header in deze API-aanroep weglaat, worden alle sites teruggegeven die beschikbaar zijn voor je gebruiker. Als je de account-ID-header wel meegeeft, worden alleen sites voor dit account teruggegeven.
GET /api/sites
Verwijderde sites staan hier nog steeds tussen
Verwijderen is herstelbaar, dus een verwijderde site blijft in deze lijst
staan met pending_delete: true totdat hij definitief wordt gewist — hij
verdwijnt niet meer op het moment van verwijderen. Behandelt jouw integratie
deze lijst als "alleen actieve sites", filter dan op pending_delete.
Teruggegeven params
- sites: Array
- id: String
- name: String
- primary_domain: String
- location: String (geografische regio)
- account: Object
- id: String
- name: String
- package: String
- dunning_suspended: Boolean
- pending_delete: Boolean |
truezolang de site wacht op definitief wissen - delete_scheduled_at: DateTime | vastgezette wisdatum;
nullvoor actieve sites - created_at
- updated_at
Site bekijken
GET /api/sites/:id
Een site die in verwijdering staat lost hier nog steeds op — hij geeft géén
404 — maar geeft een bewust beperkte payload terug (het tweede blok hieronder).
Teruggegeven params
- site: Object
- id: String
- name: String
- primary_domain: String
- location: String (geografische regio)
- region: String (Availability Zone)
- package: String
- pending_delete: Boolean | hier
false - php_version: String
- domain_cname: String
- sftp_base_path: String
- dunning_suspended: Boolean | op dit endpoint altijd
false— een geblokkeerde site geeft in plaats daarvan402terug - ssh: Object
- ipaddr: String
- username: String
- password: String
- port: Integer
- domains: Array
- Zie het domains-API-endpoint
- subscription: Object
- id: String
- status: String
- created_at: DateTime
- updated_at: DateTime
- price: Object
- amount_cents: Integer
- term: String
- run_rate: Object | de terugkerende kosten van het abonnement, geserialiseerd als een money-object met een
cents-sleutel (Integer) en eencurrency_iso-sleutel (String) uit het facturatieplan van het account. Het is geen kale integer - sites: Array | elke site op dit abonnement, elk een volledig site-samenvattingsobject (dezelfde vorm als een item in Sites opvragen) — inclusief de site die je hebt opgevraagd. Bij een gedeeld abonnement wordt dit een grote geneste payload
- product: Object
- id: String
- name: String
- account: Object
- id: String
- name: String
- created_at
- updated_at
Teruggegeven params (site in verwijdering)
Zolang een site wacht op definitief wissen staat zijn container uit, dus de
response draagt alleen identiteit plus verwijderstatus — region,
php_version, domain_cname, sftp_base_path, dunning_suspended, ssh,
domains en subscription worden allemaal weggelaten.
- site: Object
- id: String
- name: String
- primary_domain: String
- location: String (geografische regio)
- package: String
- pending_delete: Boolean |
true - status: String |
"pending_delete"(dit veld ontbreekt bij actieve sites) - delete_scheduled_at: DateTime | wanneer de site definitief wordt gewist
- account: Object
- id: String
- name: String
- created_at
- updated_at
Site bijwerken / resizen
PATCH /api/sites/:id
Verwerkt twee bedoelingen:
- Hernoemen (synchroon) — geef
namemee. Geeft202terug met een lege body. - Planwijziging (cart-gemedieerd, asynchroon) — geef
planmee (een Product short_name). Het prijsverschil wordt off-session gefactureerd op de standaard betaalmethode van het account, en de reactie is de gedeelde cart-envelop (zie Orders / Carts) — poll de cart op voltooiing. Er wordt geentask_idteruggegeven. Vereist een single-site-account en een standaard betaalmethode in het bestand; de facturatietermijn blijft behouden.
Wanneer beide velden aanwezig zijn, wordt het hernoemen eerst uitgevoerd; bij een
validatiefout op het hernoemen wordt de resize volledig overgeslagen en is de reactie
422.
Een site die in verwijdering staat kan met geen van beide bedoelingen worden
bijgewerkt: het verzoek wordt afgewezen met 403 pending_delete plus een
delete_scheduled_at-veld, en er verandert niets. Herstel de site eerst.
Params
- name: String | site hernoemen
- plan: String | Product short_name (bijv. "basic")
Teruggegeven params (planwijziging-pad, 202 Accepted)
- status: String |
"accepted" - cart: Object | { token, status, rollup_status, poll_url }
- payment: Object | { status, method_type, hosted_invoice_url }
- orders: Array |
[{ id, status, poll_url }](leeg tijdens het asynchrone venster)
Fouten (planwijziging)
- 400
unknown_product|plankomt niet overeen met een Product short_name - 400
product_unavailable| Product bestaat maar wordt niet aangeboden op het facturatieplan van het account - 400
no_default_payment_method| facturatieaccount niet klaar om te belasten - 422
no_price_for_plan| geen prijs die overeenkomt met de termijn van het account - 422
multi_site_resize_unsupported| account heeft meer dan één actieve site - 422
subscription_not_proratable| abonnement mist Stripe-metadata - 422
cart_pay_failed| de off-session-belasting kon niet worden gestart - 422
billing_settling| de facturatie van de site wordt nog afgewikkeld (het initiële facturatievenster van een net aangemaakte site)
billing_settling is 422, niet 402
De billing-settle-bewaking op een planwijziging (en op
site verwijderen) geeft 422 billing_settling terug. Dit is
onderscheiden van dunning-opschorting, die 402 service_suspended teruggeeft
(zie de paginakop).
Een site herstarten
Herstart de WordPress-container voor een site. Heeft geen invloed op andere containers
zoals de database of redis. Geeft 202 terug.
POST /api/sites/:id/restart
curl -X POST -H "Authorization: Bearer $CLOUDPRESS_TOKEN" -H "X-Auth-Account: $ACCOUNT_ID" \
https://your-instance/api/sites/$SITE_ID/restart
Een site verwijderen
DELETE /api/sites/:id
Verwijdert de site herstelbaar en asynchroon. Geeft 200 terug zodra het
verzoek is geaccepteerd.
De site verdwijnt niet — hij komt gedurende een bewaartermijn in verwijdering te staan, en in die periode geldt:
- Zijn container wordt uitgezet; zijn data, back-ups en infrastructuur blijven bewaard.
- De facturatie wordt onmiddellijk geannuleerd — verlengingen stoppen en de ongebruikte tijd wordt als tegoed op het saldo van het account bijgeschreven.
- Transactionele e-mail voor de site wordt voor de duur van de termijn opgeschort.
- De site blijft in de lijst van
GET /api/sitesstaan metpending_delete: true, enGET /api/sites/:idgeeft hem nog steeds terug (beperkte payload,status: "pending_delete"). - Al het overige rond de site is vergrendeld:
PATCH /api/sites/:id, een tweedeDELETEen elk genest site-endpoint — reads inbegrepen — geven403pending_deleteterug met dedelete_scheduled_atvan de site. delete_scheduled_atwordt op het moment van verwijderen vastgezet op nu + de site-bewaartermijn van het account, die standaard 7 dagen is tenzij het account of zijn facturatieplan een andere waarde instelt.
Wanneer de termijn verstrijkt wordt de site definitief gewist, en dat is
permanent en onomkeerbaar: de CDN pull zone wordt vernietigd, het containerproject
en zijn volumes — de data van de site — worden vernietigd, en de domeinrecords van
de site worden verwijderd, waarmee elke hostnaam vrijkomt. Tot dat moment worden
die hostnamen nog vastgehouden door de site die in verwijdering staat, dus het
koppelen van zo'n hostnaam aan een andere site binnen dezelfde facturatiefamilie
geeft 422 hostname_in_use terug.
sites:write alleen geeft geen recht meer op verwijderen
Een site verwijderen vereist nu dat de gebruiker achter de token lid is van
het account van de site en de rol voor facturatiebeheer heeft — een
accountbeheerder, of een rol met zowel facturatie- als bewerkrechten. Bij een
account dat de facturatie erft, wordt de rol op het facturatieaccount
gecontroleerd. Verhoogde CloudPress-medewerkersrechten volstaan op zichzelf
niet meer: een aanroeper die geen lid van het account is, krijgt 403
{"errors":["Not Authorized"]} waar dezelfde token eerder mogelijk wel slaagde.
Herstellen en vervroegd wissen kunnen niet via de API
Er is geen API-endpoint om een site die in verwijdering staat te herstellen of om hem vervroegd definitief te wissen; beide staan op de pagina van de site in het CloudPress-dashboard. Herstellen is een betaalde nieuwe aanschaf van hetzelfde plan (het abonnement is bij het verwijderen geannuleerd), niet een gratis ongedaanmaking, en direct wissen betekent dat je de rest van de bewaartermijn opgeeft.
Fouten
- 403 | de aanroeper is geen accountlid met de rol voor facturatiebeheer (
{"errors":["Not Authorized"]}) - 403
pending_delete| de site staat al in verwijdering; de body bevatdelete_scheduled_at - 402
service_suspended| de site is dunning-suspended (zie de paginakop) - 422
billing_settling| de facturatie van de site wordt nog afgewikkeld (het initiële facturatievenster van een net aangemaakte site)
Het verwijderen van een site kan invloed hebben op volumekortingen op bestaande sites.
Site-SSO
Dit is een hybride endpoint. Het ondersteunt inloggen voor alle SSO-bewerkingen op een site. Momenteel zijn dat WordPress en phpMyAdmin (database).
Niet beschikbaar via OAuth — SSO vereist een sessie- of API-sleutel-credential.
Zonder de wp_login-rolflag kun je alleen URL's genereren voor WordPress-gebruikers
waaraan de gebruiker van het token expliciet is gekoppeld; met wp_login voor elke
gebruiker.
Alle WP-gebruikers opvragen
Dit geeft ruwe gebruikersgegevens van de WordPress-site terug. Het bijbehorende ID is het interne ID van WordPress, geen CloudPress-gebruiker.
GET /api/sites/:id/sso
Teruggegeven params
- users: Array
- ID: Integer
- user_login: String
- display_name: String
- user_email: String
- user_registered: DateTime
- roles: String
- url: String
Inloggen als gebruiker
POST /api/sites/:id/sso
Bij succes wordt 200 { "url": "..." } teruggegeven; bij falen 400. Geeft 422
{"errors":["Missing username"]} terug wanneer username vereist is maar leeg is.
Params
- kind: String |
wordpress(standaard) ofdatabase - username: String | vereist tenzij
kindexactdatabaseis. De controle test opkind != "database", dus ook wanneer jekindhelemaal weglaat is een username vereist — stuur die dus altijd mee, behalve bij een database-login
Teruggegeven params
- url: String
Tasks
Vraag alle tasks voor een bepaalde site op.
GET /api/sites/{site-id}/tasks
GET /api/sites/{site-id}/tasks/{filter-name}/filter
Filter is optioneel en kan een van de volgende zijn:
- OK
- PENDING
- RUNNING
- CANCELLED
- PAUSED
- FAILED
- TODAY <-- Speciaal filter om alle events van vandaag te tonen.
Alle reacties zijn beperkt tot de 100 meest recente tasks.
Teruggegeven params
Geeft een array van objecten terug:
id: Integername: Stringdata: String | Ruwe data van het eventlabels: Object | Callback-boekhouding wordt eruit gestript — elkecallback_*-sleutel die je bij het plaatsen van een bestelling hebt gezet, is hier geredigeerdstatus: String | OK, PENDING, RUNNING, CANCELLED, PAUSED, FAILEDstart_on: Timestamp | Wanneer de task is gestart. Wordt volledig weggelaten (nietnull) wanneer die niet is gezetend_on: Timestamp | Niet consistent gebruikt, maar kan zijn wanneer de task is voltooid. Wordt volledig weggelaten (nietnull) wanneer die niet is gezetcreated_at: Timestampupdated_at: Timestampperformed_by: Object | Wordt volledig weggelaten wanneer er geen gebruiker aan is toegeschrevenid: String | null | Het ID van de gebruiker, ofnullwanneer de actor is gemaskeerdname: String | Volledige naam van de gebruiker, of een gemaskeerde vervangeremail: String | null |nullwanneer de actor is gemaskeerd
performed_by wordt gemaskeerd voor niet-klant-actoren
Tasks die door het platform zelf zijn uitgevoerd rapporteren
{"id": null, "name": "System", "email": null}, en tasks die door
supportmedewerkers zijn uitgevoerd rapporteren
{"id": null, "name": "Support", "email": null}. Alleen acties van een
gebruiker in je eigen workspace geven een echt ID, een echte naam en een echt
e-mailadres terug. Behandel name als een weergavetekst, niet als een
identifier — match op id en houd er rekening mee dat die null kan zijn.
Een enkele site-task bekijken
GET /api/sites/{site-id}/tasks/{id}
Geeft één task-object terug (dezelfde velden als hierboven).
Fouten
- 404
unknown_task| er hoort geen task met dat id bij deze site
Metrics
Realtime resources
Dit endpoint geeft de realtime-status voor een site terug.
GET /api/sites/{site-id}/metrics/resources
Teruggegeven params
total_storage: Decimal{Image Name}: Object | bijv. "WordPress"cpu: Decimal | Percentage van het totale planstorage: Decimal | GBmemory: Decimal | MB
Ruwe metrics
Dit is een geavanceerd endpoint dat ruwe container-metrics voor een bepaalde site toont. Vanwege de aard van het CloudPress-platform kunnen nieuwe sites metricgegevens teruggeven die zijn aangemaakt vóór het aanmaken van je site. Dit is verwacht gedrag, omdat de site mogelijk al bestaat in afwachting van een klantbestelling.
Bovendien kan het extra containers teruggeven waarmee de klant mogelijk niet rechtstreeks kan werken. Zo bevat 'CloudPress Lite' mogelijk geen redis, maar zie je in deze resultaten toch een redis-container. Ook dit is verwacht gedrag van ons platform.
POST /api/sites/{site-id}/metrics/resources
kind kan een of meer zijn van:
- cpu
- cpu_throttled
- memory
- memory_throttled
- storage
Params
kind: Array |['storage', 'memory'](voorbeeld)period_start: Integer | unix-timestamp (moet binnen de laatste maand vallen)period_end: Integer | unix-timestamp (na period_start, binnen de laatste maand)step: String | standaard '1m'.
De parameters Period en Step hebben geen invloed op de storage-metric. Die geeft altijd de huidige waarde terug.
Teruggegeven params
service_name: Objectid: Integername: Stringimage: Stringresources: Object | Afhankelijk van welke waarden zijn geselecteerdcpu:Array<time, value>cpu_throttled:Array<time, value>memory:Array<time, value>memory_throttled:Array<time, value>storage: Decimal
Fouten
Alle foutbodies gebruiken de array-structuur {"errors": [...]}.
- 422 | lege of ongeldige
kind, ofperiod_start/period_endbuiten de laatste maand / verkeerde volgorde - 502 | upstream metric-service niet beschikbaar
- 400 | onverwachte fout
CDN-metrics
Haal RUWE CDN-metrics op. Een volledige beschrijving van de teruggegeven data vind je op
Bunny's API Documentation Site.
Let op: klik op de 200 onder Responses om de velduitleg te zien.
POST /api/sites/{site-id}/metrics/cdn
Params
period_start: Integer | Unix-timestamp. Heeft voorrang opperiod. (>3 maanden oud → 422)step: String | hourly of monthly. Wordt alleen geraadpleegd metperiod_start.period: String | vooraf ingesteld venster — een van12h,24h,7d,30d. Wordt alleen gebruikt wanneerperiod_startontbreekt. Onbekende waarden → 422.
Teruggegeven params
TotalBandwidthUsed: Integer | Voor de opgegeven periodeTotalOriginTraffic: Integer | Voor de opgegeven periodeTotalRequestsServed: Integer | Voor de opgegeven periodeCacheHitRate: IntegerOriginResponseTimeChart: Object |"2025-11-20T00:00:00Z": 0(ISO8601-timestamp → Integer)BandwidthUsedChart: ObjectBandwidthCachedChart: ObjectCacheHitRateChart: ObjectRequestsServedChart: ObjectPullRequestsPulledChart: ObjectOriginTrafficChart: ObjectGeoTrafficDistribution: Object | bijv."EU: Stockholm, SE": 0Error3xxChart: ObjectError4xxChart: ObjectError5xxChart: Object
De response is Bunny's ruwe statistiekpayload, verbatim weergegeven (alleen
UserBalanceHistoryChart wordt verwijderd). De payload bevat dus meer velden dan
hierboven staan — de aanvraag zet ook de series voor origin-responsetijd en
origin-shield-bandbreedte aan. Lees die veldnamen uit een echte response; de namen
hierboven zijn de namen die dit platform zelf uitleest en de enige die het kan
garanderen.
Eenheden: bandbreedte- en traffictotalen zijn bytes, precies zoals ze upstream
worden teruggegeven; CacheHitRate is een percentage op een schaal van 0–100 en
wordt ongerond doorgegeven. Het controlepaneel rekent bandbreedte om naar KB en
rondt het hitpercentage af — die omrekening geldt hier niet.
Fouten
- 409 | CDN niet actief voor deze site
- 422 | ontbrekende/nul/te-oude
period_start, of onbekendeperiod - 502 | upstream statistiekenophaling mislukt
Voorbeeld: maandelijkse bandbreedte tonen
curl -X POST -d '{"period_start": 1760983782, "step": "monthly"}'
Dit geeft data terug voor de afgelopen maand, in dagelijkse stappen, maar wat
belangrijker is: de waarde TotalBandwidthUsed geldt voor de volledige periode van
30 dagen.
Zie ook Shield-metrics.
Back-ups
Gebruik het Tasks-endpoint om de status van deze acties te volgen.
Alle back-ups opvragen
Geeft een lijst van back-ups voor een bepaalde site terug, gegroepeerd per volume.
Geeft [] terug wanneer er geen volumes zijn; een volume zonder archieven wordt als
{} weergegeven.
GET /api/sites/{site-id}/backups
Teruggegeven params
{label}: Object | bijv. wordpress, of mysqlid: Integer | ID van het volume (vereist voor back-upbewerkingen)size: Decimal | GB - totale ruwe back-upgrootte (niet de ingerichte capaciteit van het volume)usage: Decimal | GB - gecomprimeerde en gededupliceerde back-upgrootte (werkelijk gebruik op schijf)archives: Arrayid: Stringname: Stringcreated: String | in iso8601-formaat
Een back-up maken
PATCH /api/sites/{site-id}/backups/{volume-id}
Geeft 202 terug. Een onbekend volume geeft 404 {"errors":["Volume not found"]}
terug.
Params
name: String | Back-upnaam
Een back-up verwijderen
DELETE /api/sites/{site-id}/backups/{volume-id}
Geeft 202 terug.
Params
backup_id: String | Back-up-ID
Een back-up terugzetten
PATCH /api/sites/{site-id}/restores/{volume-id}
Geeft 202 terug.
Params
backup_id: String | Back-up-ID
Een back-up-export aanvragen
POST /api/sites/{site-id}/backups/{volume-id}/export
Vraag een downloadbare .tar.gz van één back-uparchief aan. Asynchroon: het archief
wordt op object storage gematerialiseerd en er wordt een kortlevende presigned
download-URL aangemaakt. Geeft 202 terug met
{"status": "preparing", "backup_id": "..."} — poll daarna
Exportstatus voor de URL.
Beide export-endpoints vereisen sites:write
Ook het uitlezen van de exportstatus vereist sites:write — een token met
alleen sites:read kan er niet eens op pollen. De statusresponse bevat een URL
die leestoegang tot de volledige back-up geeft, dus beide acties worden als
writes behandeld en vereisen daarnaast bewerkrechten op de site.
Params
backup_id: String (vereist) | Archief-ID uit Alle back-ups opvragen
Fouten
- 422 |
backup_idontbreekt ({"errors":["backup_id is required"]}) - 404 | onbekend volume (
{"errors":["Volume not found"]}) - 403 | de gebruiker achter de token heeft geen bewerkrechten op de site (
{"errors":["Not Authorized"]})
Een 202 garandeert niet dat er een nieuwe export is gestart. Exports worden
per volume één voor één voorbereid, en een verzoek dat binnenkomt terwijl er al
een export loopt, wordt genegeerd. Behandel het status-endpoint — niet een
task-id — als de bron van waarheid voor wat het archief werkelijk doet.
Exportstatus en download
GET /api/sites/{site-id}/backups/{volume-id}/export?backup_id={archive-id}
Geeft de exportstatus van één archief terug, plus de presigned download-URL zodra die
klaar is. Haal die URL op met een gewone HTTPS-GET — hij heeft geen eigen
CloudPress-credentials nodig.
Params
backup_id: String (vereist) | Archief-ID, meegegeven in de querystring
Teruggegeven params
status: String | een vannone,in_progress,ready,expired,failedurl: String | alleen bijready— presigned HTTPS-URL naar de.tar.gzexpires_at: String | alleen bijready— iso8601, wanneer de URL vervaltsize: Integer | alleen bijready— grootte van de export in byteserror: String | alleen bijfailed— leesbare reden van de mislukking
Fouten
- 422 |
backup_idontbreekt ({"errors":["backup_id is required"]}) - 404 | onbekend volume (
{"errors":["Volume not found"]}), of geen archief dat bijbackup_idpast ({"errors":["Backup not found"]}) - 403 | de gebruiker achter de token heeft geen bewerkrechten op de site (
{"errors":["Not Authorized"]})
Behandel url als een bearer-secret
Iedereen die hem heeft, kan de volledige back-up downloaden tot hij vervalt. Hij
wordt alleen teruggegeven zolang status ready is, de response wordt verstuurd
met Cache-Control: no-store, en hij mag nooit worden gelogd, doorgestuurd of
opgeslagen. Zodra status expired wordt, vraag je een nieuwe export aan.
PHP-versie wijzigen
Beschikbare opvragen
GET /api/sites/{site-id}/variants
Teruggegeven params
php:Array<Object>| Momenteel wordt alleenphpteruggegeven.id: Integer |variant_idnodig om de versie te wijzigenlabel: Stringis_default: Boolean | Wordt gebruikt bij het uitrollen van een nieuwe site.active: Boolean | Huidige versie die de site gebruikt
Wijzigen
Bij het wijzigen van de PHP-versie van een site wordt de site herstart met een ander
container-image. Houd er rekening mee dat de site even nodig heeft om te herstarten.
Geeft 202 terug. Het URL-segment moet php zijn — elke andere variant geeft
422 {"errors":["only php version changes are allowed"]} terug.
PATCH /api/sites/{site-id}/variants/php
Params
variant_id: Integer
Teruggegeven params (202 Accepted)
task_id: Integer | Het ID van de task zodat je kunt meekijken.