Ga naar inhoud

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 | true zolang de site wacht op definitief wissen
    • delete_scheduled_at: DateTime | vastgezette wisdatum; null voor 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 daarvan 402 terug
    • 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 een currency_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:

  1. Hernoemen (synchroon) — geef name mee. Geeft 202 terug met een lege body.
  2. Planwijziging (cart-gemedieerd, asynchroon) — geef plan mee (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 geen task_id teruggegeven. 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 | plan komt 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/sites staan met pending_delete: true, en GET /api/sites/:id geeft hem nog steeds terug (beperkte payload, status: "pending_delete").
  • Al het overige rond de site is vergrendeld: PATCH /api/sites/:id, een tweede DELETE en elk genest site-endpoint — reads inbegrepen — geven 403 pending_delete terug met de delete_scheduled_at van de site.
  • delete_scheduled_at wordt 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 bevat delete_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) of database
  • username: String | vereist tenzij kind exact database is. De controle test op kind != "database", dus ook wanneer je kind helemaal 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: Integer
  • name: String
  • data: String | Ruwe data van het event
  • labels: Object | Callback-boekhouding wordt eruit gestript — elke callback_*-sleutel die je bij het plaatsen van een bestelling hebt gezet, is hier geredigeerd
  • status: String | OK, PENDING, RUNNING, CANCELLED, PAUSED, FAILED
  • start_on: Timestamp | Wanneer de task is gestart. Wordt volledig weggelaten (niet null) wanneer die niet is gezet
  • end_on: Timestamp | Niet consistent gebruikt, maar kan zijn wanneer de task is voltooid. Wordt volledig weggelaten (niet null) wanneer die niet is gezet
  • created_at: Timestamp
  • updated_at: Timestamp
  • performed_by: Object | Wordt volledig weggelaten wanneer er geen gebruiker aan is toegeschreven
    • id: String | null | Het ID van de gebruiker, of null wanneer de actor is gemaskeerd
    • name: String | Volledige naam van de gebruiker, of een gemaskeerde vervanger
    • email: String | null | null wanneer 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 plan
    • storage: Decimal | GB
    • memory: 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: Object
    • id: Integer
    • name: String
    • image: String
    • resources: Object | Afhankelijk van welke waarden zijn geselecteerd
      • cpu: 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, of period_start/period_end buiten 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 op period. (>3 maanden oud → 422)
  • step: String | hourly of monthly. Wordt alleen geraadpleegd met period_start.
  • period: String | vooraf ingesteld venster — een van 12h, 24h, 7d, 30d. Wordt alleen gebruikt wanneer period_start ontbreekt. Onbekende waarden → 422.
Teruggegeven params
  • TotalBandwidthUsed: Integer | Voor de opgegeven periode
  • TotalOriginTraffic: Integer | Voor de opgegeven periode
  • TotalRequestsServed: Integer | Voor de opgegeven periode
  • CacheHitRate: Integer
  • OriginResponseTimeChart: Object | "2025-11-20T00:00:00Z": 0 (ISO8601-timestamp → Integer)
  • BandwidthUsedChart: Object
  • BandwidthCachedChart: Object
  • CacheHitRateChart: Object
  • RequestsServedChart: Object
  • PullRequestsPulledChart: Object
  • OriginTrafficChart: Object
  • GeoTrafficDistribution: Object | bijv. "EU: Stockholm, SE": 0
  • Error3xxChart: Object
  • Error4xxChart: Object
  • Error5xxChart: 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 onbekende period
  • 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 mysql
    • id: 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: Array
      • id: String
      • name: String
      • created: 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
Fouten
  • 422 | backup_id ontbreekt ({"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 van none, in_progress, ready, expired, failed
  • url: String | alleen bij ready — presigned HTTPS-URL naar de .tar.gz
  • expires_at: String | alleen bij ready — iso8601, wanneer de URL vervalt
  • size: Integer | alleen bij ready — grootte van de export in bytes
  • error: String | alleen bij failed — leesbare reden van de mislukking
Fouten
  • 422 | backup_id ontbreekt ({"errors":["backup_id is required"]})
  • 404 | onbekend volume ({"errors":["Volume not found"]}), of geen archief dat bij backup_id past ({"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 alleen php teruggegeven.
    • id: Integer | variant_id nodig om de versie te wijzigen
    • label: String
    • is_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.