Download OpenAPI specification:Download
The REST API installed apps use to read and change a SitePack site: content, commerce, domains and mailboxes.
Machine-readable: the full OpenAPI document, one Markdown file per section (for example Leads) and an index in llms.txt.
The app API uses the same OAuth flow as the SitePack CLI.
GET /api/authentication/oauth/authorize
?client_id=your-client-id
&scope=content:write%20media:read
&redirect_uri=https://your-app.example/callback
&state=csrf-token
The merchant picks a site and approves the scopes you asked for, then you are sent
back with a code. Exchange it:
POST /api/authentication/oauth/token
Content-Type: application/x-www-form-urlencoded
grant_type=authorization_code&code=…&client_id=…&client_secret=…
Send the result on every request. X-SitePack-Access-Token is the preferred header;
a standard Authorization: Bearer <access_token> is also accepted:
X-SitePack-Access-Token: <access_token>
Access tokens last an hour; refresh them with grant_type=refresh_token.
A token is bound to one site. The site is never a parameter — an app that serves ten merchants holds ten tokens. That is also why a uuid from one site is simply not found on another.
Three things must hold, and they are checked on every request:
Point three is an intersection, re-evaluated per request: if a merchant removes a
scope, it stops working at once rather than when your hour-long token expires.
GET /me shows the scopes in force right now.
An app with no scopes can reach /me and /scopes, and nothing else.
Scopes read section:action. write implies read; nothing else is implied,
and there is no wildcard scope.
Two scopes spend the merchant's money and therefore stand alone — domains:order
and mail:order. Holding domains:write does not let you order a domain.
Ask for the narrowest set that does the job: merchants see every scope you request on the consent screen.
Everything is addressed by uuid. No endpoint takes an auto-increment id and no response returns one. New records get a uuid v7, which is time-ordered, so sorting by uuid sorts by creation.
Every response carries a status. Lists are paginated with page and limit
(max 100):
{
"status": "success",
"items": [],
"pagination": { "page": 1, "limit": 25, "totalRecords": 42, "totalPages": 2 }
}
Errors name a machine-readable code — switch on error.code, never on the message:
{
"status": "error",
"error": { "code": "scope_required", "message": "…", "scope": "content:write" }
}
| Status | Meaning |
|---|---|
400 |
Malformed request |
401 |
No token, or it is invalid or expired |
403 |
Missing scope, or the installation is no longer active |
404 |
Not found — or on another site, which reads the same on purpose |
409 |
Conflict: slug taken, no free mailbox slot, unpaid invoices |
422 |
Validation failed; error.field names the field |
429 |
Rate limited; Retry-After says for how long |
500 |
Failed on our side. internal_error, with a deliberately generic message — the detail is in our logs, not in your response |
Every response carries your budget, so you never have to discover a limit by being cut off:
X-SitePack-RateLimit: 600
X-SitePack-RateLimit-Tokens: 574
X-SitePack-RateLimit-Reset: 1750000060
| Bucket | Limit | Keyed on |
|---|---|---|
| Everything | 600 / minute | your installation — app and site |
Endpoints behind an :order scope |
20 / hour | your installation |
| Refused access tokens | 60 / minute | calling IP address |
/docs and /docs.json |
60 / minute | calling IP address |
| The OAuth endpoints | 120 / minute | calling IP address |
Keying the main budget on the installation rather than on your address means serving many merchants from one server does not throttle you — but it also means one app of yours cannot spend another's budget.
A 429 names Retry-After in seconds. Wait that long; retrying sooner only spends
what is left of the window.
The order bucket is separate because those endpoints charge the merchant: a loop that lists domains is a mistake, a loop that buys them is an invoice.
Subscriptions are declared in your app.json manifest. Payloads are deliberately
thin: arguments carries only the uuid of the resource that changed. Call the
API with that uuid to read the details.
That means a payload can never contain something you are not scoped to read, and can never be stale — by the time a retry lands, embedded values might describe a version that no longer exists, while a uuid always resolves to the current one.
Treat an event as "go look at this", not as data.
style=
attributes are stripped from anything you submit; alignment and colour are lifted
into the element's settings so the intent survives.<script> blocks, on…= handlers and
javascript: URLs are removed from element values. Markup, links and embeds are
left alone — it is scripting specifically that is not yours to add, because the
merchant opens your page in their own admin session.Cache-Control: no-store, private,
since most of what they contain is the merchant's data and all of it is specific to
your token.new."charged": true); below
that you get a checkout_url for the merchant to confirm. Handle both.This reference says what an endpoint does. The help centre says what the thing it changes means to the merchant looking at it — worth reading before you change it on their behalf.
| What you are working on | Help centre |
|---|---|
| Building and publishing an app | Developing apps |
| Pages, blogs, media and categories | Managing content |
| Menus and navigation | Menus and navigation |
| Translating content | Translating content |
| Themes, layouts and element areas | Design and themes |
| Products, collections and stock | Products |
| Orders and their statuses | Orders |
| Form submissions | Form submissions |
| Domains and DNS | Domains and DNS |
| Mailboxes | Mail services |
| Subscription, plan and invoices | Subscription and plan |
Authorization: turning a merchant's consent into an access token, and refreshing or revoking it.
In the help centre: Developing apps.
OAuth 2.0 Token Endpoint
Exchange an authorization code, refresh token, or device code for an access token.
| grant_type required | string Enum: "authorization_code" "refresh_token" "urn:ietf:params:oauth:grant-type:device_code" The grant type being used. |
| client_id required | string The ID of the application. |
| client_secret | string The secret of the application (required for confidential apps). |
| code | string The authorization code (required if grant_type is authorization_code). |
| refresh_token | string The refresh token (required if grant_type is refresh_token). |
{- "access_token": "string",
- "token_type": "Bearer",
- "expires_in": 3600,
- "scope": "string",
- "refresh_token": "string"
}Device Authorization Endpoint
Specifically for the sitepack login flow in the terminal, where the user cannot type a URL but must enter a code.
| client_id required | string The ID of the CLI (e.g., sitepack-cli). |
| scope | string Usually theme:write dev:access. |
{- "client_id": "string",
- "scope": "theme:write dev:access"
}{- "user_code": "ABCD-1234",
- "expires_in": 300,
- "interval": 5
}OAuth 2.0 Introspection Endpoint
Useful for your own microservices or internal checks to see if an X-SitePack-Access-Token is still valid.
{- "active": true,
- "scope": "orders:read",
- "client_id": "my-seo",
- "sub": "user_123",
- "site_id": 987,
- "partner_access": false,
- "exp": 1710854400
}OAuth 2.0 Revocation Endpoint
To break a link directly (e.g., when a user uninstalls the app).
| token required | string The token that needs to be invalidated. |
{- "token": "string"
}{- "status": "revoked"
}Who am I, and what am I allowed to do? Any valid app token may call these.
In the help centre: Developing apps.
Who am I: the app, the site it is installed on and the scopes that are actually in force right now (token n installation), not the ones originally requested.
Required scope: none. Any valid app token may call this.
{- "status": "success",
- "app": {
- "uuid": "0192c3f0-4a1b-7e29-8d67-1c0b5a94f732",
- "name": "Bike Stock Sync",
- "version": 3
}, - "site": {
- "uuid": "0192c3e1-9d52-7b08-a4f3-6e17c025b8d9",
- "name": "Wheelhouse",
- "domain": "wheelhouse.nl"
}, - "installation": {
- "uuid": "0192c3f1-2b64-7c93-8e50-4a19d7f06c25",
- "status": "active",
- "installed_at": "2026-01-08T10:22:31+00:00"
}, - "scopes": [
- "products:read",
- "products:write",
- "inventory:write"
]
}The full scope catalogue, so an app (or a generated client) can discover every scope that exists and which of them it currently holds.
Required scope: none. Any valid app token may call this.
{- "status": "success",
- "scopes": [
- {
- "scope": "products:read",
- "section": "products",
- "action": "read",
- "description": "Read products, variants, images and bundles",
- "implies": [ ],
- "granted": true
}, - {
- "scope": "products:write",
- "section": "products",
- "action": "write",
- "description": "Create, change and delete products and their variants",
- "implies": [
- "products:read"
], - "granted": true
}, - {
- "scope": "orders:read",
- "section": "orders",
- "action": "read",
- "description": "Read webshop orders, their items and payments",
- "implies": [ ],
- "granted": false
}
], - "granted": [
- "products:read",
- "products:write",
- "inventory:write"
]
}This app's own configuration on this site.
In the help centre: Developing apps.
Required scope: app:settings:read — Read this app's own settings on the site
{- "status": "success",
- "settings": {
- "sync_interval": "900",
- "warehouse": "utrecht"
}, - "merchant_settings": {
- "container_id": "GTM-ABC1234",
- "consent_mode": true,
- "track_purchase": true
}
}Replace the settings. A key left out of the payload is removed.
Required scope: app:settings:write — Change this app's own settings on the site
| settings required | object The complete settings map for this app on this site. A replace, not a merge: a key left out is removed. Values are stored as strings; arrays and objects are JSON-encoded first. |
{- "settings": {
- "sync_interval": "900",
- "warehouse": "utrecht"
}
}{- "status": "success",
- "settings": {
- "sync_interval": "900",
- "warehouse": "utrecht"
}
}Which events this app is subscribed to, and every topic that exists.
In the help centre: Developing apps.
Required scope: webhooks:read — Read this app's webhook subscriptions and the available topics
{- "status": "success",
- "subscriptions": [
], - "available_topics": [
- "content.created",
- "content.updated",
- "product.updated",
- "order.created"
], - "managed_in": "app.json"
}Leads: the form submissions visitors send through the site's forms, with their notes. A new one fires the lead.created webhook.
In the help centre: Leads.
Required scope: leads:read — Read form submissions and their notes
| status | integer Enum: 1 2 3 4 5 Example: status=1 Only submissions in this status: 1 new, 2 in contact, 3 waiting on the lead, 4 won, 5 lost. |
| type | integer Enum: 1 2 3 4 Example: type=1 Only submissions of this kind: 1 contact form, 2 newsletter, 3 product enquiry, 4 other. |
| page | integer Example: page=1 Which page to read, starting at 1. Out-of-range pages come back empty rather than as an error. |
| limit | integer Example: limit=25 How many records per page. Defaults to 25, clamped to 100. |
{- "status": "success",
- "items": [
- {
- "uuid": "0192c560-3e91-7c25-86ab-1d47f0b93e58",
- "type": 1,
- "status": 1,
- "source": "contact_form",
- "subject": "Test ride",
- "message": "Hi, I would like to test ride the Aero 2026 in size L this Saturday. Is that possible?",
- "email": "emma@example.com",
- "first_name": "Emma",
- "last_name": "Clarke",
- "company_name": null,
- "job_title": null,
- "phone": "+44 20 7946 0958",
- "address": "12 Baker Street",
- "zip": "NW1 6XE",
- "city": "London",
- "country": "GB",
- "language": "en",
- "rating": 2,
- "value_cents": null,
- "created": "2026-06-12T10:58:03+00:00",
- "updated": "2026-06-12T10:58:03+00:00"
}
], - "pagination": {
- "page": 1,
- "limit": 25,
- "totalRecords": 87,
- "totalPages": 4
}
}The notes on a form submission.
Required scope: leads:read — Read form submissions and their notes
| uuid required | string Example: 0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c The uuid of the form submission. Uuids are unique per site: one from another site reads as not found. |
{- "status": "success",
- "notes": [
- {
- "note": "Called back, wants to book a test ride.",
- "is_system": true,
- "created": "2026-06-12T11:04:21+00:00"
}
]
}Add a note to a form submission.
Required scope: leads:write — Create, change and delete form submissions
| uuid required | string Example: 0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c The uuid of the form submission. Uuids are unique per site: one from another site reads as not found. |
| note required | string The note text. Notes written through the API are marked as system notes, because they did not come from someone typing in the admin. |
{- "note": "Called back, wants to book a test ride."
}{- "status": "success",
- "note": {
- "note": "Called back, wants to book a test ride.",
- "is_system": true,
- "created": "2026-06-12T11:04:21+00:00"
}
}One lead, including the subject and message the visitor sent. A repeat submission from the same email while the lead is still open does not create a new lead: it is added to this one as a note (see the notes endpoint) and fires lead.updated.
Required scope: leads:read — Read form submissions and their notes
| uuid required | string Example: 0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c The uuid of the form submission. Uuids are unique per site: one from another site reads as not found. |
{- "status": "success",
- "lead": {
- "uuid": "0192c560-3e91-7c25-86ab-1d47f0b93e58",
- "type": 1,
- "status": 1,
- "source": "contact_form",
- "subject": "Test ride",
- "message": "Hi, I would like to test ride the Aero 2026 in size L this Saturday. Is that possible?",
- "email": "emma@example.com",
- "first_name": "Emma",
- "last_name": "Clarke",
- "company_name": null,
- "job_title": null,
- "phone": "+44 20 7946 0958",
- "address": "12 Baker Street",
- "zip": "NW1 6XE",
- "city": "London",
- "country": "GB",
- "language": "en",
- "rating": 2,
- "value_cents": null,
- "created": "2026-06-12T10:58:03+00:00",
- "updated": "2026-06-12T10:58:03+00:00"
}
}Required scope: leads:write — Create, change and delete form submissions
| uuid required | string Example: 0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c The uuid of the form submission. Uuids are unique per site: one from another site reads as not found. |
{- "status": "success"
}Required scope: leads:write — Create, change and delete form submissions
| uuid required | string Example: 0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c The uuid of the form submission. Uuids are unique per site: one from another site reads as not found. |
| status required | integer Enum: 1 2 3 4 5 The new status: 1 new, 2 in contact, 3 waiting on the lead, 4 won, 5 lost. |
| value_cents | integer The deal value in cents, stored only with status 4 (won). Status 5 (lost) clears it. |
{- "status": 4,
- "value_cents": 249900
}{- "status": "success",
- "lead": {
- "status": 4,
- "value_cents": 249900,
- "updated": "2026-06-14T09:30:00+00:00",
- "uuid": "0192c560-3e91-7c25-86ab-1d47f0b93e58",
- "type": 1,
- "source": "contact_form",
- "subject": "Test ride",
- "message": "Hi, I would like to test ride the Aero 2026 in size L this Saturday. Is that possible?",
- "email": "emma@example.com",
- "first_name": "Emma",
- "last_name": "Clarke",
- "company_name": null,
- "job_title": null,
- "phone": "+44 20 7946 0958",
- "address": "12 Baker Street",
- "zip": "NW1 6XE",
- "city": "London",
- "country": "GB",
- "language": "en",
- "rating": 2,
- "created": "2026-06-12T10:58:03+00:00"
}
}Webshop customers. Personal data, behind its own scope.
In the help centre: The webshop.
Required scope: customers:read — Read customers and their addresses
| q | string Example: q=jansen Free-text search over name, e-mail and company. |
| page | integer Example: page=1 Which page to read, starting at 1. Out-of-range pages come back empty rather than as an error. |
| limit | integer Example: limit=25 How many records per page. Defaults to 25, clamped to 100. |
{- "status": "success",
- "items": [
- {
- "uuid": "0192c53d-6b40-7f19-92a7-3e81d54c0a6e",
- "email": "emma@example.com",
- "first_name": "Emma",
- "last_name": "Clarke",
- "street": "Baker Street",
- "house_number": "12",
- "house_number_addition": "A",
- "postal_code": "NW1 6XE",
- "city": "London",
- "country": "GB",
- "company_name": null,
- "vat_number": null,
- "phone_number": "+44 20 7946 0958",
- "created": "2026-05-02T18:21:07+00:00"
}
], - "pagination": {
- "page": 1,
- "limit": 25,
- "totalRecords": 1284,
- "totalPages": 52
}
}Required scope: customers:write — Create and change customers
| email required | string The customer's e-mail address. Stored lower-case. |
| first_name | string Given name. |
| last_name | string Family name. |
| street | string Street name, without the number. |
| house_number | string House number. |
| house_number_addition | string Addition to the house number. |
| postal_code | string Postal code. |
| city | string City. |
| country | string Two-letter country code. |
| business | boolean Mark the customer as a business. Only read when the customer is created. |
| company_name | string Company name, for business customers. |
| vat_number | string VAT number, for business customers. |
| phone_number | string Phone number. |
{- "email": "emma@example.com",
- "first_name": "Emma",
- "last_name": "Clarke",
- "street": "Baker Street",
- "house_number": "12",
- "house_number_addition": "A",
- "postal_code": "NW1 6XE",
- "city": "London",
- "country": "GB",
- "business": false,
- "company_name": "Wheelhouse Ltd",
- "vat_number": "NL001234567B01",
- "phone_number": "+44 20 7946 0958"
}{- "status": "success",
- "customer": {
- "uuid": "0192c53d-6b40-7f19-92a7-3e81d54c0a6e",
- "email": "emma@example.com",
- "first_name": "Emma",
- "last_name": "Clarke",
- "street": "Baker Street",
- "house_number": "12",
- "house_number_addition": "A",
- "postal_code": "NW1 6XE",
- "city": "London",
- "country": "GB",
- "company_name": null,
- "vat_number": null,
- "phone_number": "+44 20 7946 0958",
- "created": "2026-05-02T18:21:07+00:00"
}
}Required scope: customers:read — Read customers and their addresses
| uuid required | string Example: 0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c The uuid of the customer. Uuids are unique per site: one from another site reads as not found. |
{- "status": "success",
- "customer": {
- "uuid": "0192c53d-6b40-7f19-92a7-3e81d54c0a6e",
- "email": "emma@example.com",
- "first_name": "Emma",
- "last_name": "Clarke",
- "street": "Baker Street",
- "house_number": "12",
- "house_number_addition": "A",
- "postal_code": "NW1 6XE",
- "city": "London",
- "country": "GB",
- "company_name": null,
- "vat_number": null,
- "phone_number": "+44 20 7946 0958",
- "created": "2026-05-02T18:21:07+00:00"
}
}Required scope: customers:write — Create and change customers
| uuid required | string Example: 0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c The uuid of the customer. Uuids are unique per site: one from another site reads as not found. |
string The customer's e-mail address. Stored lower-case. | |
| first_name | string Given name. |
| last_name | string Family name. |
| street | string Street name, without the number. |
| house_number | string House number. |
| house_number_addition | string Addition to the house number. |
| postal_code | string Postal code. |
| city | string City. |
| country | string Two-letter country code. |
| business | boolean Mark the customer as a business. Only read when the customer is created. |
| company_name | string Company name, for business customers. |
| vat_number | string VAT number, for business customers. |
| phone_number | string Phone number. |
{- "email": "emma@example.com",
- "first_name": "Emma",
- "last_name": "Clarke",
- "street": "Baker Street",
- "house_number": "12",
- "house_number_addition": "A",
- "postal_code": "NW1 6XE",
- "city": "London",
- "country": "GB",
- "business": false,
- "company_name": "Wheelhouse Ltd",
- "vat_number": "NL001234567B01",
- "phone_number": "+44 20 7946 0958"
}{- "status": "success",
- "customer": {
- "uuid": "0192c53d-6b40-7f19-92a7-3e81d54c0a6e",
- "email": "emma@example.com",
- "first_name": "Emma",
- "last_name": "Clarke",
- "street": "Baker Street",
- "house_number": "12",
- "house_number_addition": "A",
- "postal_code": "NW1 6XE",
- "city": "London",
- "country": "GB",
- "company_name": null,
- "vat_number": null,
- "phone_number": "+44 20 7946 0958",
- "created": "2026-05-02T18:21:07+00:00"
}
}Required scope: comments:read — Read comments
| status | integer Enum: 0 1 2 Example: status=0 Only comments in this state: 0 awaiting moderation, 1 approved, 2 rejected. |
| page | integer Example: page=1 Which page to read, starting at 1. Out-of-range pages come back empty rather than as an error. |
| limit | integer Example: limit=25 How many records per page. Defaults to 25, clamped to 100. |
{- "status": "success",
- "items": [
- {
- "uuid": "0192c571-5a26-7e70-93cd-4f18b2ea607d",
- "author_name": "Jeroen",
- "title": "Great bike",
- "comment": "Rides beautifully, even on long trips.",
- "rating": true,
- "status": 0,
- "created": "2026-06-09T19:22:41+00:00"
}
], - "pagination": {
- "page": 1,
- "limit": 25,
- "totalRecords": 51,
- "totalPages": 3
}
}Required scope: comments:write — Moderate and delete comments
| uuid required | string Example: 0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c The uuid of the comment. Uuids are unique per site: one from another site reads as not found. |
{- "status": "success"
}Required scope: comments:write — Moderate and delete comments
| uuid required | string Example: 0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c The uuid of the comment. Uuids are unique per site: one from another site reads as not found. |
| status required | integer Enum: 0 1 2 The moderation decision: 0 awaiting moderation, 1 approved, 2 rejected. |
{- "status": 1
}{- "status": "success",
- "comment": {
- "status": 1,
- "uuid": "0192c571-5a26-7e70-93cd-4f18b2ea607d",
- "author_name": "Jeroen",
- "title": "Great bike",
- "comment": "Rides beautifully, even on long trips.",
- "rating": true,
- "created": "2026-06-09T19:22:41+00:00"
}
}Required scope: products:read — Read products, variants, images and bundles
| q | string Example: q=road bike Free-text search over name, description and brand. |
| sku | string Example: sku=RF-2026-BLUE-54 Exact match on the SKU. |
| barcode | string Example: barcode=8712345678904 Exact match on the barcode (EAN/UPC). |
| page | integer Example: page=1 Which page to read, starting at 1. Out-of-range pages come back empty rather than as an error. |
| limit | integer Example: limit=25 How many records per page. Defaults to 25, clamped to 100. |
{- "status": "success",
- "items": [
- {
- "uuid": "0192c50a-8d21-7b45-9e6f-0c73a2915d8b",
- "name": "Racefiets Aero 2026",
- "slug": "road-bike-aero-2026",
- "sku": "RF-2026-BLUE-54",
- "barcode": "8712345678904",
- "brand": "Wheelhouse",
- "model": "Aero",
- "description": "Light carbon road bike with Shimano 105.",
- "currency": "EUR",
- "price_cents": 129900,
- "price_promo_cents": 119900,
- "stock": 7,
- "archived": false,
- "seo": {
- "meta_description": "Light carbon road bike with Shimano 105.",
- "focus_keyword": "carbon road bike"
}, - "created": "2026-01-15T11:02:38+00:00",
- "modified": "2026-06-11T09:31:04+00:00"
}
], - "pagination": {
- "page": 1,
- "limit": 25,
- "totalRecords": 318,
- "totalPages": 13
}
}Required scope: products:write — Create, change and delete products and their variants
| name required | string The product name. |
| price_cents required | integer The regular price in cents, excluding nothing - it is what the shop shows. Cannot be negative. |
| slug | string The URL segment. Derived from the name when left out. |
| sku | string Your own article number. |
| barcode | string The EAN or UPC. |
| brand | string The brand shown on the product page. |
| model | string The model name. |
| description | string The product description. HTML is allowed. |
| price_promo_cents | integer A sale price in cents, shown struck through against |
| stock | integer The absolute stock level. Use |
| archived | boolean Archived products stay for existing orders but leave the shop. |
| seo | object Search-engine metadata: |
{- "name": "Racefiets Aero 2026",
- "price_cents": 129900,
- "slug": "road-bike-aero-2026",
- "sku": "RF-2026-BLUE-54",
- "barcode": "8712345678904",
- "brand": "Wheelhouse",
- "model": "Aero",
- "description": "Light carbon road bike with Shimano 105.",
- "price_promo_cents": 119900,
- "stock": 7,
- "archived": false,
- "seo": {
- "meta_description": "Light carbon road bike with Shimano 105.",
- "focus_keyword": "carbon road bike"
}
}{- "status": "success",
- "product": {
- "uuid": "0192c50a-8d21-7b45-9e6f-0c73a2915d8b",
- "name": "Racefiets Aero 2026",
- "slug": "road-bike-aero-2026",
- "sku": "RF-2026-BLUE-54",
- "barcode": "8712345678904",
- "brand": "Wheelhouse",
- "model": "Aero",
- "description": "Light carbon road bike with Shimano 105.",
- "currency": "EUR",
- "price_cents": 129900,
- "price_promo_cents": 119900,
- "stock": 7,
- "archived": false,
- "seo": {
- "meta_description": "Light carbon road bike with Shimano 105.",
- "focus_keyword": "carbon road bike"
}, - "created": "2026-01-15T11:02:38+00:00",
- "modified": "2026-06-11T09:31:04+00:00"
}
}Set a single variant's stock to an absolute value. Behind the inventory scope, the same as product-level stock: managing the catalogue must not imply moving stock.
Required scope: inventory:write — Adjust stock and manage stock locations
| uuid required | string Example: 0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c The uuid of the product. Uuids are unique per site: one from another site reads as not found. |
| variantUuid required | string Example: 0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c The uuid of the product. Uuids are unique per site: one from another site reads as not found. |
| stock required | integer The variant's new stock level, as an absolute value. Clamped at zero. Per-location stock is managed through the full variant upsert; this sets the flat level a plain variant uses. |
{- "stock": 12
}{- "status": "success",
- "variant": {
- "uuid": "0192c60a-3b18-7e29-9d75-05af7c831e42",
- "sku": "RF-L-GE",
- "ean": "8710000000001",
- "price_cents": 4495,
- "stock": 6,
- "available": true,
- "media_uuid": "0192c4c5-3a94-7de1-9b26-8c07f5a13d42",
- "position": 0,
- "option_values": {
- "Size": "L",
- "Colour": "Yellow"
}, - "properties": [
- {
- "name": "Materiaal",
- "value": "Katoen"
}
], - "metafields": [
- {
- "name": "GTIN",
- "type": "text",
- "value": "8710000000001"
}
], - "stock_locations": [ ]
}
}Replace a single variant's metafields. The full set: metafields not included are dropped. Stock, properties and facets are left untouched.
Required scope: products:write — Create, change and delete products and their variants
| uuid required | string Example: 0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c The uuid of the product. Uuids are unique per site: one from another site reads as not found. |
| variantUuid required | string Example: 0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c The uuid of the product. Uuids are unique per site: one from another site reads as not found. |
| metafields required | Array of objects The full set of metafields for the variant, each |
{- "metafields": [
- {
- "name": "HS code",
- "type": "text",
- "value": "6109"
}
]
}{- "status": "success",
- "variant": {
- "uuid": "0192c60a-3b18-7e29-9d75-05af7c831e42",
- "sku": "RF-L-GE",
- "ean": "8710000000001",
- "price_cents": 4495,
- "stock": 6,
- "available": true,
- "media_uuid": "0192c4c5-3a94-7de1-9b26-8c07f5a13d42",
- "position": 0,
- "option_values": {
- "Size": "L",
- "Colour": "Yellow"
}, - "properties": [
- {
- "name": "Materiaal",
- "value": "Katoen"
}
], - "metafields": [
- {
- "name": "GTIN",
- "type": "text",
- "value": "8710000000001"
}
], - "stock_locations": [ ]
}
}Required scope: inventory:read — Read stock levels and stock locations
| uuid required | string Example: 0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c The uuid of the product. Uuids are unique per site: one from another site reads as not found. |
{- "status": "success",
- "uuid": "0192c50a-8d21-7b45-9e6f-0c73a2915d8b",
- "stock": 7,
- "transactions": [
- {
- "uuid": "0192c5d7-2b48-7e60-85f1-9c34a0d726be",
- "delta": -1,
- "from": 8,
- "to": 7,
- "source": "order",
- "variant_uuid": null,
- "order_uuid": "0192c5d9-4e7a-7b21-9f3c-2d8e6a1b5c47",
- "created": "2026-06-11T09:31:04+00:00"
}, - {
- "uuid": "0192c5d7-0a16-7c39-84b2-6f7e15c0d982",
- "delta": 5,
- "from": 3,
- "to": 8,
- "source": "admin",
- "variant_uuid": null,
- "order_uuid": null,
- "created": "2026-06-02T13:12:47+00:00"
}
], - "transactions_total": 14
}Required scope: inventory:read — Read stock levels and stock locations
| uuid required | string Example: 0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c The uuid of the product. Uuids are unique per site: one from another site reads as not found. |
| page | integer Default: 1 Example: page=1 Which page to read, starting at 1. Out-of-range pages come back empty rather than as an error. |
| limit | integer <= 100 Default: 25 Example: limit=25 How many records per page. Defaults to 25, clamped to 100. |
{- "status": "success",
- "items": [
- {
- "uuid": "0192c5d7-2b48-7e60-85f1-9c34a0d726be",
- "delta": -1,
- "from": 8,
- "to": 7,
- "source": "order",
- "variant_uuid": null,
- "order_uuid": "0192c5d9-4e7a-7b21-9f3c-2d8e6a1b5c47",
- "created": "2026-06-11T09:31:04+00:00"
}
], - "pagination": {
- "page": 1,
- "limit": 25,
- "totalRecords": 14,
- "totalPages": 1
}
}Adjust stock by a delta. A delta rather than an absolute value, so two apps adjusting at the same time both land instead of overwriting each other.
Required scope: inventory:write — Adjust stock and manage stock locations
| uuid required | string Example: 0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c The uuid of the product. Uuids are unique per site: one from another site reads as not found. |
| delta required | integer How much to move stock by. Negative takes stock away; the result is clamped at zero. A delta rather than an absolute level, so two apps adjusting at the same time both land. |
{- "delta": -1
}{- "status": "success",
- "uuid": "0192c50a-8d21-7b45-9e6f-0c73a2915d8b",
- "stock": 7
}The images attached to a product, in display order.
Required scope: products:read — Read products, variants, images and bundles
| uuid required | string Example: 0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c The uuid of the product. Uuids are unique per site: one from another site reads as not found. |
{- "status": "success",
- "images": [
- {
- "media_uuid": "0192c4c5-3a94-7de1-9b26-8c07f5a13d42",
- "alt_text": "Blue road bike against a white wall",
- "sort_order": 1
}
]
}Replace a product's images, in the given order.
Takes media uuids: an image has to exist in the library already, which is what keeps a product from pointing at a file nobody can manage or delete.
Required scope: products:write — Create, change and delete products and their variants
| uuid required | string Example: 0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c The uuid of the product. Uuids are unique per site: one from another site reads as not found. |
| media required | Array of objects The media uuids to attach, in display order. The first is the main image. Every uuid has to exist in the library already and may appear once; sending |
{- "media": [
- "0192c4c5-3a94-7de1-9b26-8c07f5a13d42",
- "0192c4c5-52e0-7a37-b18d-4f902c65a3e1"
]
}{- "status": "success",
- "images": [
- {
- "media_uuid": "0192c4c5-3a94-7de1-9b26-8c07f5a13d42",
- "alt_text": "Blue road bike against a white wall",
- "sort_order": 1
}
]
}Required scope: products:read — Read products, variants, images and bundles
| uuid required | string Example: 0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c The uuid of the product. Uuids are unique per site: one from another site reads as not found. |
{- "status": "success",
- "options": [
- {
- "uuid": "0192c5f9-7a02-7b61-8c4d-93e5a1f2064b",
- "name": "Size",
- "position": 0,
- "values": [
- "L",
- "XL"
]
}, - {
- "uuid": "0192c5f9-8b13-7a04-9e26-71c4a0d5382f",
- "name": "Colour",
- "position": 1,
- "values": [
- "Yellow",
- "Red"
]
}
]
}Replace the full set of options for a product. Options that are not included are removed. Changing options does not touch the variants; upsert those separately.
Required scope: products:write — Create, change and delete products and their variants
| uuid required | string Example: 0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c The uuid of the product. Uuids are unique per site: one from another site reads as not found. |
| options required | Array of objects The full set of options for the product, each |
{- "options": [
- {
- "name": "Size",
- "values": [
- "L",
- "XL"
]
}, - {
- "name": "Colour",
- "values": [
- "Yellow",
- "Red"
]
}
]
}{- "status": "success",
- "options": [
- {
- "uuid": "0192c5f9-7a02-7b61-8c4d-93e5a1f2064b",
- "name": "Size",
- "position": 0,
- "values": [
- "L",
- "XL"
]
}, - {
- "uuid": "0192c5f9-8b13-7a04-9e26-71c4a0d5382f",
- "name": "Colour",
- "position": 1,
- "values": [
- "Yellow",
- "Red"
]
}
]
}Required scope: products:read — Read products, variants, images and bundles
| uuid required | string Example: 0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c The uuid of the product. Uuids are unique per site: one from another site reads as not found. |
{- "status": "success",
- "variants": [
- {
- "uuid": "0192c60a-3b18-7e29-9d75-05af7c831e42",
- "sku": "RF-L-GE",
- "ean": "8710000000001",
- "price_cents": 4495,
- "stock": 6,
- "available": true,
- "media_uuid": "0192c4c5-3a94-7de1-9b26-8c07f5a13d42",
- "position": 0,
- "option_values": {
- "Size": "L",
- "Colour": "Yellow"
}, - "properties": [
- {
- "name": "Materiaal",
- "value": "Katoen"
}
], - "metafields": [
- {
- "name": "GTIN",
- "type": "text",
- "value": "8710000000001"
}
], - "stock_locations": [ ]
}
]
}Upsert the full set of variants for a product. The body is the complete set;
variants that are not included are removed. A variant carrying a uuid is updated
in place, one without is created.
Required scope: products:write — Create, change and delete products and their variants
| uuid required | string Example: 0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c The uuid of the product. Uuids are unique per site: one from another site reads as not found. |
| variants required | Array of objects The full set of variants for the product; variants that are not included are removed. Pass a variant's |
{- "variants": [
- {
- "sku": "RF-L-GE",
- "ean": "8710000000001",
- "priceCents": 4495,
- "stock": 6,
- "mediaUuid": "0192c4c5-3a94-7de1-9b26-8c07f5a13d42",
- "optionValues": {
- "Size": "L",
- "Colour": "Yellow"
}, - "properties": [
- {
- "name": "Materiaal",
- "value": "Katoen"
}
], - "metafields": [
- {
- "name": "GTIN",
- "type": "text",
- "value": "8710000000001"
}
]
}
]
}{- "status": "success",
- "variants": [
- {
- "uuid": "0192c60a-3b18-7e29-9d75-05af7c831e42",
- "sku": "RF-L-GE",
- "ean": "8710000000001",
- "price_cents": 4495,
- "stock": 6,
- "available": true,
- "media_uuid": "0192c4c5-3a94-7de1-9b26-8c07f5a13d42",
- "position": 0,
- "option_values": {
- "Size": "L",
- "Colour": "Yellow"
}, - "properties": [
- {
- "name": "Materiaal",
- "value": "Katoen"
}
], - "metafields": [
- {
- "name": "GTIN",
- "type": "text",
- "value": "8710000000001"
}
], - "stock_locations": [ ]
}
]
}Required scope: products:write — Create, change and delete products and their variants
| uuid required | string Example: 0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c The uuid of the product. Uuids are unique per site: one from another site reads as not found. |
| variantUuid required | string Example: 0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c The uuid of the product. Uuids are unique per site: one from another site reads as not found. |
{- "status": "success"
}Required scope: products:read — Read products, variants, images and bundles
| uuid required | string Example: 0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c The uuid of the product. Uuids are unique per site: one from another site reads as not found. |
{- "status": "success",
- "product": {
- "uuid": "0192c50a-8d21-7b45-9e6f-0c73a2915d8b",
- "name": "Racefiets Aero 2026",
- "slug": "road-bike-aero-2026",
- "sku": "RF-2026-BLUE-54",
- "barcode": "8712345678904",
- "brand": "Wheelhouse",
- "model": "Aero",
- "description": "Light carbon road bike with Shimano 105.",
- "currency": "EUR",
- "price_cents": 129900,
- "price_promo_cents": 119900,
- "stock": 7,
- "archived": false,
- "seo": {
- "meta_description": "Light carbon road bike with Shimano 105.",
- "focus_keyword": "carbon road bike"
}, - "created": "2026-01-15T11:02:38+00:00",
- "modified": "2026-06-11T09:31:04+00:00"
}
}Required scope: products:write — Create, change and delete products and their variants
| uuid required | string Example: 0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c The uuid of the product. Uuids are unique per site: one from another site reads as not found. |
{- "status": "success"
}Required scope: products:write — Create, change and delete products and their variants
| uuid required | string Example: 0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c The uuid of the product. Uuids are unique per site: one from another site reads as not found. |
| name | string The product name. |
| price_cents | integer The regular price in cents, excluding nothing - it is what the shop shows. Cannot be negative. |
| slug | string The URL segment. Derived from the name when left out. |
| sku | string Your own article number. |
| barcode | string The EAN or UPC. |
| brand | string The brand shown on the product page. |
| model | string The model name. |
| description | string The product description. HTML is allowed. |
| price_promo_cents | integer A sale price in cents, shown struck through against |
| stock | integer The absolute stock level. Use |
| archived | boolean Archived products stay for existing orders but leave the shop. |
| seo | object Search-engine metadata: |
{- "name": "Racefiets Aero 2026",
- "price_cents": 129900,
- "slug": "road-bike-aero-2026",
- "sku": "RF-2026-BLUE-54",
- "barcode": "8712345678904",
- "brand": "Wheelhouse",
- "model": "Aero",
- "description": "Light carbon road bike with Shimano 105.",
- "price_promo_cents": 119900,
- "stock": 7,
- "archived": false,
- "seo": {
- "meta_description": "Light carbon road bike with Shimano 105.",
- "focus_keyword": "carbon road bike"
}
}{- "status": "success",
- "product": {
- "uuid": "0192c50a-8d21-7b45-9e6f-0c73a2915d8b",
- "name": "Racefiets Aero 2026",
- "slug": "road-bike-aero-2026",
- "sku": "RF-2026-BLUE-54",
- "barcode": "8712345678904",
- "brand": "Wheelhouse",
- "model": "Aero",
- "description": "Light carbon road bike with Shimano 105.",
- "currency": "EUR",
- "price_cents": 129900,
- "price_promo_cents": 119900,
- "stock": 7,
- "archived": false,
- "seo": {
- "meta_description": "Light carbon road bike with Shimano 105.",
- "focus_keyword": "carbon road bike"
}, - "created": "2026-01-15T11:02:38+00:00",
- "modified": "2026-06-11T09:31:04+00:00"
}
}Named groups of products, described by rules rather than a fixed membership list.
In the help centre: Products.
List collections.
Required scope: collections:read — Read collections and their rules
| page | integer Example: page=1 Which page to read, starting at 1. Out-of-range pages come back empty rather than as an error. |
| limit | integer Example: limit=25 How many records per page. Defaults to 25, clamped to 100. |
{- "status": "success",
- "items": [
- {
- "uuid": "0192c51b-4e08-7a92-b13c-6d5f80e24a17",
- "name": "Racefietsen",
- "slug": "road-bikes",
- "created": "2026-02-01T10:00:00+00:00"
}
], - "pagination": {
- "page": 1,
- "limit": 25,
- "totalRecords": 9,
- "totalPages": 1
}
}Create a collection, optionally with its rules.
Required scope: collections:write — Create, change and delete collections
| name required | string The collection name. |
| slug | string The URL segment. Derived from the name when left out. |
| rules | Array of objects The rules that decide membership. Same shape as |
{- "name": "Racefietsen",
- "slug": "road-bikes",
- "rules": [
- {
- "column": "brand",
- "value": "Wheelhouse",
- "exact": true
}, - {
- "column": "name",
- "value": "Aero",
- "exact": false
}
]
}{- "status": "success",
- "collection": {
- "uuid": "0192c51b-4e08-7a92-b13c-6d5f80e24a17",
- "name": "Racefietsen",
- "slug": "road-bikes",
- "created": "2026-02-01T10:00:00+00:00"
}
}Read the rules that decide what a collection contains.
Required scope: collections:read — Read collections and their rules
| uuid required | string Example: 0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c The uuid of the collection. Uuids are unique per site: one from another site reads as not found. |
{- "status": "success",
- "rules": [
- {
- "uuid": "0192c51c-9f2d-7e58-8b04-71a3c6d90f25",
- "column": "brand",
- "value": "Wheelhouse",
- "exact": true
}
]
}Replace the rules of a collection.
All of them at once: a collection with half its rules applied selects the wrong products, which is worse than a refused request.
Required scope: collections:write — Create, change and delete collections
| uuid required | string Example: 0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c The uuid of the collection. Uuids are unique per site: one from another site reads as not found. |
| rules required | Array of objects The whole rule set. Each rule needs a |
{- "rules": [
- {
- "column": "brand",
- "value": "Wheelhouse",
- "exact": true
}, - {
- "column": "name",
- "value": "Aero",
- "exact": false
}
]
}{- "status": "success",
- "rules": [
- {
- "uuid": "0192c51c-9f2d-7e58-8b04-71a3c6d90f25",
- "column": "brand",
- "value": "Wheelhouse",
- "exact": true
}
]
}Read one collection.
Required scope: collections:read — Read collections and their rules
| uuid required | string Example: 0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c The uuid of the collection. Uuids are unique per site: one from another site reads as not found. |
{- "status": "success",
- "collection": {
- "uuid": "0192c51b-4e08-7a92-b13c-6d5f80e24a17",
- "name": "Racefietsen",
- "slug": "road-bikes",
- "created": "2026-02-01T10:00:00+00:00"
}
}Delete a collection and its rules.
Required scope: collections:write — Create, change and delete collections
| uuid required | string Example: 0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c The uuid of the collection. Uuids are unique per site: one from another site reads as not found. |
{- "status": "success"
}Change a collection.
Required scope: collections:write — Create, change and delete collections
| uuid required | string Example: 0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c The uuid of the collection. Uuids are unique per site: one from another site reads as not found. |
| name | string The collection name. |
| slug | string The URL segment. |
| rules | Array of objects Replaces every rule of the collection when present. Leave it out to keep them. |
{- "name": "Racefietsen",
- "slug": "road-bikes",
- "rules": [
- {
- "column": "brand",
- "value": "Wheelhouse",
- "exact": true
}, - {
- "column": "name",
- "value": "Aero",
- "exact": false
}
]
}{- "status": "success",
- "collection": {
- "uuid": "0192c51b-4e08-7a92-b13c-6d5f80e24a17",
- "name": "Racefietsen",
- "slug": "road-bikes",
- "created": "2026-02-01T10:00:00+00:00"
}
}Webshop orders: reading them, creating them and moving them through their statuses.
In the help centre: Orders.
Required scope: orders:read — Read webshop orders, their items and payments
| status | integer Enum: 1 2 3 4 5 6 10 Example: status=3 Only orders in this status: 1 new, 2 on hold, 3 processing, 4 shipping, 5 cancelled, 6 refunded, 10 completed. |
| from | string Example: from=2026-06-01 Only orders created on or after this date. |
| to | string Example: to=2026-06-30 Only orders created on or before this date. |
| customer | string Example: customer=0192c53d-6b40-7f19-92a7-3e81d54c0a6e Only orders of one customer, by customer uuid. |
| page | integer Example: page=1 Which page to read, starting at 1. Out-of-range pages come back empty rather than as an error. |
| limit | integer Example: limit=25 How many records per page. Defaults to 25, clamped to 100. |
{- "status": "success",
- "items": [
- {
- "uuid": "0192c52c-1a7f-7d63-84be-25c908f7b361",
- "order_number": "WH-2026-01184",
- "status": 3,
- "currency": "EUR",
- "total_amount_cents": 129900,
- "shipping_costs_cents": 0,
- "customer_uuid": "0192c53d-6b40-7f19-92a7-3e81d54c0a6e",
- "comment": "Please deliver after 5 pm.",
- "created": "2026-06-11T09:34:12+00:00"
}
], - "pagination": {
- "page": 1,
- "limit": 25,
- "totalRecords": 240,
- "totalPages": 10
}
}Create an order from line items. Prices come from the catalogue - a price in the body is ignored - and the order is created unpaid, at status "new".
Required scope: orders:write — Create orders and change their status
| items required | Array of objects The line items: |
| customer required | object Who the order is for. |
| discount_code | string A discount code to claim on the order. An unknown or spent code fails the request. |
| comment | string The customer's own note, shown with the order in the admin. |
| delivery_method | string The delivery method id, as configured on the site. Defaults to "1". |
| payment_method | string Encoded as |
{- "items": [
- {
- "product_uuid": "0192c50a-8d21-7b45-9e6f-0c73a2915d8b",
- "quantity": 1
}, - {
- "product_uuid": "0192c50a-8d21-7b45-9e6f-0c73a2915d8b",
- "variant_uuid": "0192c60a-3b18-7e29-9d75-05af7c831e42",
- "quantity": 2
}
], - "customer": {
- "email": "emma@example.com",
- "first_name": "Emma",
- "last_name": "Clarke",
- "street": "Baker Street",
- "number": "12",
- "number_addition": "A",
- "postal_code": "NW1 6XE",
- "city": "London",
- "country_code": "GB",
- "phone_number": "+44 20 7946 0958",
- "business": false
}, - "discount_code": "LENTE10",
- "comment": "Please deliver after 5 pm.",
- "delivery_method": "1",
- "payment_method": "api__98"
}{- "status": "success",
- "order": {
- "uuid": "0192c52c-1a7f-7d63-84be-25c908f7b361",
- "order_number": "WH-2026-01184",
- "status": 3,
- "currency": "EUR",
- "total_amount_cents": 129900,
- "shipping_costs_cents": 0,
- "customer_uuid": "0192c53d-6b40-7f19-92a7-3e81d54c0a6e",
- "comment": "Please deliver after 5 pm.",
- "created": "2026-06-11T09:34:12+00:00",
- "items": [
- {
- "product_name": "Racefiets Aero 2026",
- "product_barcode": "8712345678904",
- "quantity": 1,
- "price_cents": 129900,
- "total_cents": 129900,
- "variation_sku": null
}
]
}
}The payments recorded against an order.
orders_payments records what was attempted at which gateway, not a status
vocabulary: status is a boolean saying whether the attempt succeeded, and the
method is the gateway and the type chosen there ("mollie" / "ideal"). Reported as
they are stored rather than flattened into an invented status string.
Required scope: orders:read — Read webshop orders, their items and payments
| uuid required | string Example: 0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c The uuid of the order. Uuids are unique per site: one from another site reads as not found. |
{- "status": "success",
- "payments": [
- {
- "amount_cents": 129900,
- "paid": true,
- "gateway": "mollie",
- "method": "ideal",
- "reference": "tr_7Hq4kPz9Xa",
- "created": "2026-06-11T09:34:52+00:00"
}
]
}Required scope: orders:read — Read webshop orders, their items and payments
| uuid required | string Example: 0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c The uuid of the order. Uuids are unique per site: one from another site reads as not found. |
{- "status": "success",
- "order": {
- "uuid": "0192c52c-1a7f-7d63-84be-25c908f7b361",
- "order_number": "WH-2026-01184",
- "status": 3,
- "currency": "EUR",
- "total_amount_cents": 129900,
- "shipping_costs_cents": 0,
- "customer_uuid": "0192c53d-6b40-7f19-92a7-3e81d54c0a6e",
- "comment": "Please deliver after 5 pm.",
- "created": "2026-06-11T09:34:12+00:00",
- "items": [
- {
- "product_name": "Racefiets Aero 2026",
- "product_barcode": "8712345678904",
- "quantity": 1,
- "price_cents": 129900,
- "total_cents": 129900,
- "variation_sku": null
}
]
}
}Required scope: orders:write — Create orders and change their status
| uuid required | string Example: 0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c The uuid of the order. Uuids are unique per site: one from another site reads as not found. |
| status required | integer Enum: 1 2 3 4 5 6 10 The new status: 1 new, 2 on hold, 3 processing, 4 shipping, 5 cancelled, 6 refunded, 10 completed. The same hooks and mails fire as from the admin. |
| comment | string Replaces the customer comment on the order. |
{- "status": 4,
- "comment": "Shipped with PostNL."
}{- "status": "success",
- "order": {
- "status": 4,
- "uuid": "0192c52c-1a7f-7d63-84be-25c908f7b361",
- "order_number": "WH-2026-01184",
- "currency": "EUR",
- "total_amount_cents": 129900,
- "shipping_costs_cents": 0,
- "customer_uuid": "0192c53d-6b40-7f19-92a7-3e81d54c0a6e",
- "comment": "Please deliver after 5 pm.",
- "created": "2026-06-11T09:34:12+00:00"
}
}Required scope: discounts:read — Read discount codes
| page | integer Example: page=1 Which page to read, starting at 1. Out-of-range pages come back empty rather than as an error. |
| limit | integer Example: limit=25 How many records per page. Defaults to 25, clamped to 100. |
{- "status": "success",
- "items": [
- {
- "uuid": "0192c54e-2c85-7a06-b7d3-49f61e830c92",
- "code": "LENTE10",
- "type": "percentage",
- "value": 10,
- "status": 1,
- "redeemable": true,
- "archived": false,
- "used_at": null,
- "created": "2026-03-01T08:00:00+00:00"
}
], - "pagination": {
- "page": 1,
- "limit": 25,
- "totalRecords": 31,
- "totalPages": 2
}
}Required scope: discounts:write — Create, change and delete discount codes
| code required | string The code a customer types at checkout. Stored upper-case and unique per site. |
| type | string Enum: "fixed" "percentage" What |
| value required | integer An amount in cents for |
{- "code": "LENTE10",
- "type": "percentage",
- "value": 10
}{- "status": "success",
- "discount_code": {
- "uuid": "0192c54e-2c85-7a06-b7d3-49f61e830c92",
- "code": "LENTE10",
- "type": "percentage",
- "value": 10,
- "status": 1,
- "redeemable": true,
- "archived": false,
- "used_at": null,
- "created": "2026-03-01T08:00:00+00:00"
}
}Required scope: discounts:read — Read discount codes
| uuid required | string Example: 0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c The uuid of the discount code. Uuids are unique per site: one from another site reads as not found. |
{- "status": "success",
- "discount_code": {
- "uuid": "0192c54e-2c85-7a06-b7d3-49f61e830c92",
- "code": "LENTE10",
- "type": "percentage",
- "value": 10,
- "status": 1,
- "redeemable": true,
- "archived": false,
- "used_at": null,
- "created": "2026-03-01T08:00:00+00:00"
}
}Codes are archived rather than deleted: a code that has been handed to customers must keep existing for the orders that already used it.
Required scope: discounts:write — Create, change and delete discount codes
| uuid required | string Example: 0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c The uuid of the discount code. Uuids are unique per site: one from another site reads as not found. |
{- "status": "success"
}Shipping labels, read only: buying one costs money at a carrier and cannot be undone.
In the help centre: Shop settings.
List shipping labels, optionally for one order.
Required scope: shipping:read — Read shipping labels and their track and trace codes
| order | string Example: order=0192c52c-1a7f-7d63-84be-25c908f7b361 Only labels of one order, by order uuid. |
| page | integer Example: page=1 Which page to read, starting at 1. Out-of-range pages come back empty rather than as an error. |
| limit | integer Example: limit=25 How many records per page. Defaults to 25, clamped to 100. |
{- "status": "success",
- "items": [
- {
- "uuid": "0192c55f-7d13-7b84-9f52-08ea6c491d37",
- "order_uuid": "0192c52c-1a7f-7d63-84be-25c908f7b361",
- "provider": "sendcloud",
- "carrier": "PostNL",
- "shipping_method": "PostNL Standaard",
- "track_trace_code": "3SABCD1234567",
- "created": "2026-06-12T07:14:29+00:00"
}
], - "pagination": {
- "page": 1,
- "limit": 25,
- "totalRecords": 96,
- "totalPages": 4
}
}Read one shipping label, including its track and trace code.
Required scope: shipping:read — Read shipping labels and their track and trace codes
| uuid required | string Example: 0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c The uuid of the shipping label. Uuids are unique per site: one from another site reads as not found. |
{- "status": "success",
- "shipping_label": {
- "uuid": "0192c55f-7d13-7b84-9f52-08ea6c491d37",
- "order_uuid": "0192c52c-1a7f-7d63-84be-25c908f7b361",
- "provider": "sendcloud",
- "carrier": "PostNL",
- "shipping_method": "PostNL Standaard",
- "track_trace_code": "3SABCD1234567",
- "created": "2026-06-12T07:14:29+00:00"
}
}Pages: their metadata, their element tree and their publish state.
In the help centre: Managing content.
Required scope: content:read — Read pages, their elements and revisions
| slug required | string Example: slug=about-us The slug to test. |
| parent_uuid | string Example: parent_uuid=0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c Test the slug under this parent page. Slugs are unique per parent, not per site. |
{- "status": "success",
- "slug": "about-us",
- "valid": false
}Required scope: content:read — Read pages, their elements and revisions
| q | string Example: q=about Free-text search over the page title and slug. |
| type | string Enum: "page" "landing_page" "content" Example: type=page Only pages of this type. |
| status | string Enum: "published" "draft" Example: status=published Only pages in this state. |
| page | integer Example: page=1 Which page to read, starting at 1. Out-of-range pages come back empty rather than as an error. |
| limit | integer Example: limit=25 How many records per page. Defaults to 25, clamped to 100. |
{- "status": "success",
- "items": [
- {
- "uuid": "0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c",
- "title": "About us",
- "slug": "about-us",
- "type": "page",
- "status": "published",
- "locale": "en",
- "is_menu_item": true,
- "parent_uuid": null,
- "created": "2026-03-04T09:12:41+00:00",
- "modified": "2026-05-19T14:02:07+00:00"
}
], - "pagination": {
- "page": 1,
- "limit": 25,
- "totalRecords": 42,
- "totalPages": 2
}
}Required scope: content:write — Create, change, publish and delete pages
| title required | string The page title. |
| slug | string The URL segment. Derived from the title when left out, and unique per parent page. |
| type | string Enum: "page" "landing_page" "content" What kind of page this is. Defaults to |
| status | string Enum: "published" "draft" Defaults to |
| parent_uuid | string Nest the page under another page. Send |
| is_menu_item | boolean Offer the page in the menu picker. |
| template_key | string A theme template to render with. Setting one makes the page a |
| image | string The header image URL. Send |
| seo | object Search-engine metadata: |
| elements | Array of objects The element tree. Sanitised on the way in: inline |
{- "title": "About us",
- "slug": "about-us",
- "type": "page",
- "status": "draft",
- "parent_uuid": "0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c",
- "is_menu_item": true,
- "template_key": "landing/product-launch",
- "seo": {
- "custom_title": "About Wheelhouse | Bikes since 1978",
- "meta_description": "Who we are and where to find us.",
- "no_index": false
}, - "elements": [
- {
- "type": "pageHeading",
- "value": "About us",
- "settings": {
- "align": "center"
}
}, - {
- "type": "text",
- "value": "<p>We have been building bikes since 1978.</p>",
- "settings": {
- "align": "left",
- "textColor": "#202223"
}
}
]
}{- "status": "success",
- "content": {
- "uuid": "0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c",
- "title": "About us",
- "slug": "about-us",
- "type": "page",
- "status": "published",
- "locale": "en",
- "is_menu_item": true,
- "parent_uuid": null,
- "created": "2026-03-04T09:12:41+00:00",
- "modified": "2026-05-19T14:02:07+00:00",
- "seo": {
- "custom_title": "About Wheelhouse | Bikes since 1978",
- "meta_description": "Who we are and where to find us.",
- "open_graph_description": "Building bikes since 1978.",
- "focus_keyword": "bike shop london",
- "no_index": false,
- "score": 78
}, - "template_key": null,
- "editor_version": 1
}
}Required scope: content:write — Create, change, publish and delete pages
| uuid required | string Example: 0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c The uuid of the page. Uuids are unique per site: one from another site reads as not found. |
{- "status": "success",
- "content": {
- "uuid": "0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c",
- "title": "About us",
- "slug": "about-us",
- "type": "page",
- "status": "published",
- "locale": "en",
- "is_menu_item": true,
- "parent_uuid": null,
- "created": "2026-03-04T09:12:41+00:00",
- "modified": "2026-05-19T14:02:07+00:00"
}
}Required scope: content:write — Create, change, publish and delete pages
| uuid required | string Example: 0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c The uuid of the page. Uuids are unique per site: one from another site reads as not found. |
{- "status": "success",
- "content": {
- "status": "draft",
- "uuid": "0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c",
- "title": "About us",
- "slug": "about-us",
- "type": "page",
- "locale": "en",
- "is_menu_item": true,
- "parent_uuid": null,
- "created": "2026-03-04T09:12:41+00:00",
- "modified": "2026-05-19T14:02:07+00:00"
}
}The stored revisions of a page: what it looked like before each save.
Required scope: content:read — Read pages, their elements and revisions
| uuid required | string Example: 0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c The uuid of the page. Uuids are unique per site: one from another site reads as not found. |
{- "status": "success",
- "revisions": [
- {
- "uuid": "0192c4a2-1b70-7f6e-84a1-2d0c5e9b7a13",
- "created": "2026-05-19T14:02:07+00:00"
}, - {
- "uuid": "0192c4a2-0c31-7b95-8f27-13d6e0a48c52",
- "created": "2026-04-02T08:41:19+00:00"
}
]
}Roll a page back to one of its revisions.
The rollback is itself a save, so the replaced state becomes the newest revision - undoing a rollback is another rollback, not a lost version.
Required scope: content:write — Create, change, publish and delete pages
| uuid required | string Example: 0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c The uuid of the page. Uuids are unique per site: one from another site reads as not found. |
| revisionUuid required | string Example: 0192c4a2-1b70-7f6e-84a1-2d0c5e9b7a13 The uuid of the revision to restore, from |
{- "status": "success",
- "content": {
- "uuid": "0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c",
- "title": "About us",
- "slug": "about-us",
- "type": "page",
- "status": "published",
- "locale": "en",
- "is_menu_item": true,
- "parent_uuid": null,
- "created": "2026-03-04T09:12:41+00:00",
- "modified": "2026-05-19T14:02:07+00:00",
- "seo": {
- "custom_title": "About Wheelhouse | Bikes since 1978",
- "meta_description": "Who we are and where to find us.",
- "open_graph_description": "Building bikes since 1978.",
- "focus_keyword": "bike shop london",
- "no_index": false,
- "score": 78
}, - "template_key": null,
- "editor_version": 1,
- "elements": [
- {
- "type": "pageHeading",
- "value": "About us",
- "settings": {
- "align": "center"
}
}, - {
- "type": "text",
- "value": "<p>We have been building bikes since 1978.</p>",
- "settings": {
- "align": "left",
- "textColor": "#202223"
}
}
]
}
}Required scope: content:read — Read pages, their elements and revisions
| uuid required | string Example: 0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c The uuid of the page. Uuids are unique per site: one from another site reads as not found. |
{- "status": "success",
- "uuid": "0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c",
- "elements": [
- {
- "type": "pageHeading",
- "value": "About us",
- "settings": {
- "align": "center"
}
}, - {
- "type": "text",
- "value": "<p>We have been building bikes since 1978.</p>",
- "settings": {
- "align": "left",
- "textColor": "#202223"
}
}
]
}Replace a page's element tree. Inline style= attributes are stripped and their
alignment/colour lifted into element settings, the same rule the editor and the
page generator follow.
Required scope: content:write — Create, change, publish and delete pages
| uuid required | string Example: 0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c The uuid of the page. Uuids are unique per site: one from another site reads as not found. |
| elements required | Array of objects The whole element tree, in render order. Sending |
{- "elements": [
- {
- "type": "pageHeading",
- "value": "About us",
- "settings": {
- "align": "center"
}
}, - {
- "type": "text",
- "value": "<p>We have been building bikes since 1978.</p>",
- "settings": {
- "align": "left",
- "textColor": "#202223"
}
}
]
}{- "status": "success",
- "uuid": "0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c",
- "elements": [
- {
- "type": "pageHeading",
- "value": "About us",
- "settings": {
- "align": "center"
}
}, - {
- "type": "text",
- "value": "<p>We have been building bikes since 1978.</p>",
- "settings": {
- "align": "left",
- "textColor": "#202223"
}
}
]
}Required scope: content:read — Read pages, their elements and revisions
| uuid required | string Example: 0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c The uuid of the page. Uuids are unique per site: one from another site reads as not found. |
{- "status": "success",
- "content": {
- "uuid": "0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c",
- "title": "About us",
- "slug": "about-us",
- "type": "page",
- "status": "published",
- "locale": "en",
- "is_menu_item": true,
- "parent_uuid": null,
- "created": "2026-03-04T09:12:41+00:00",
- "modified": "2026-05-19T14:02:07+00:00",
- "seo": {
- "custom_title": "About Wheelhouse | Bikes since 1978",
- "meta_description": "Who we are and where to find us.",
- "open_graph_description": "Building bikes since 1978.",
- "focus_keyword": "bike shop london",
- "no_index": false,
- "score": 78
}, - "template_key": null,
- "editor_version": 1,
- "elements": [
- {
- "type": "pageHeading",
- "value": "About us",
- "settings": {
- "align": "center"
}
}, - {
- "type": "text",
- "value": "<p>We have been building bikes since 1978.</p>",
- "settings": {
- "align": "left",
- "textColor": "#202223"
}
}
]
}
}Required scope: content:write — Create, change, publish and delete pages
| uuid required | string Example: 0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c The uuid of the page. Uuids are unique per site: one from another site reads as not found. |
{- "status": "success"
}Required scope: content:write — Create, change, publish and delete pages
| uuid required | string Example: 0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c The uuid of the page. Uuids are unique per site: one from another site reads as not found. |
| title | string The page title. |
| slug | string The URL segment. Derived from the title when left out, and unique per parent page. |
| type | string Enum: "page" "landing_page" "content" What kind of page this is. Defaults to |
| status | string Enum: "published" "draft" Defaults to |
| parent_uuid | string Nest the page under another page. Send |
| is_menu_item | boolean Offer the page in the menu picker. |
| template_key | string A theme template to render with. Setting one makes the page a |
| image | string The header image URL. Send |
| seo | object Search-engine metadata: |
| elements | Array of objects The element tree. Sanitised on the way in: inline |
{- "title": "About us",
- "slug": "about-us",
- "type": "page",
- "status": "draft",
- "parent_uuid": "0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c",
- "is_menu_item": true,
- "template_key": "landing/product-launch",
- "seo": {
- "custom_title": "About Wheelhouse | Bikes since 1978",
- "meta_description": "Who we are and where to find us.",
- "no_index": false
}, - "elements": [
- {
- "type": "pageHeading",
- "value": "About us",
- "settings": {
- "align": "center"
}
}, - {
- "type": "text",
- "value": "<p>We have been building bikes since 1978.</p>",
- "settings": {
- "align": "left",
- "textColor": "#202223"
}
}
]
}{- "status": "success",
- "content": {
- "uuid": "0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c",
- "title": "About us",
- "slug": "about-us",
- "type": "page",
- "status": "published",
- "locale": "en",
- "is_menu_item": true,
- "parent_uuid": null,
- "created": "2026-03-04T09:12:41+00:00",
- "modified": "2026-05-19T14:02:07+00:00",
- "seo": {
- "custom_title": "About Wheelhouse | Bikes since 1978",
- "meta_description": "Who we are and where to find us.",
- "open_graph_description": "Building bikes since 1978.",
- "focus_keyword": "bike shop london",
- "no_index": false,
- "score": 78
}, - "template_key": null,
- "editor_version": 1
}
}Blog posts. Publishing one also indexes it for site search.
In the help centre: Managing content.
Required scope: blogs:read — Read blog posts and blog categories
| q | string Example: q=winter Free-text search over the post title and slug. |
| page | integer Example: page=1 Which page to read, starting at 1. Out-of-range pages come back empty rather than as an error. |
| limit | integer Example: limit=25 How many records per page. Defaults to 25, clamped to 100. |
{- "status": "success",
- "items": [
- {
- "uuid": "0192c4b3-77d1-7c02-b8ae-5f3d91c40e77",
- "title": "Winter tyres: what to look for",
- "slug": "winter-tyres-what-to-look-for",
- "status": "published",
- "tags": [
- "maintenance",
- "winter"
], - "created": "2026-02-11T08:00:00+00:00",
- "modified": "2026-02-13T16:44:02+00:00"
}
], - "pagination": {
- "page": 1,
- "limit": 25,
- "totalRecords": 18,
- "totalPages": 1
}
}Required scope: blogs:write — Create, change, publish and delete blog posts
| title required | string The post title. |
| slug | string The URL segment. Derived from the title when left out. |
| status | string Enum: "published" "draft" Defaults to |
| tags | Array of objects Tag names. A comma-separated string is accepted too. Replaces the current tags. |
| main_image | string The header image URL, also used as the social preview. |
| seo | object Search-engine metadata: |
| elements | Array of objects The element tree of the post, sanitised the same way a page's is. |
{- "title": "Winter tyres: what to look for",
- "slug": "winter-tyres-what-to-look-for",
- "status": "draft",
- "tags": [
- "maintenance",
- "winter"
], - "seo": {
- "custom_title": "Winter tyres for your bike | Wheelhouse",
- "meta_description": "What to look for when choosing winter tyres."
}, - "elements": [
- {
- "type": "pageHeading",
- "value": "About us",
- "settings": {
- "align": "center"
}
}, - {
- "type": "text",
- "value": "<p>We have been building bikes since 1978.</p>",
- "settings": {
- "align": "left",
- "textColor": "#202223"
}
}
]
}{- "status": "success",
- "blog": {
- "uuid": "0192c4b3-77d1-7c02-b8ae-5f3d91c40e77",
- "title": "Winter tyres: what to look for",
- "slug": "winter-tyres-what-to-look-for",
- "status": "published",
- "tags": [
- "maintenance",
- "winter"
], - "created": "2026-02-11T08:00:00+00:00",
- "modified": "2026-02-13T16:44:02+00:00",
- "seo": {
- "custom_title": "Winter tyres for your bike | Wheelhouse",
- "meta_description": "What to look for when choosing winter tyres.",
- "focus_keyword": "winter bike tyres"
}
}
}Required scope: blogs:write — Create, change, publish and delete blog posts
| uuid required | string Example: 0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c The uuid of the blog post. Uuids are unique per site: one from another site reads as not found. |
{- "status": "success",
- "blog": {
- "uuid": "0192c4b3-77d1-7c02-b8ae-5f3d91c40e77",
- "title": "Winter tyres: what to look for",
- "slug": "winter-tyres-what-to-look-for",
- "status": "published",
- "tags": [
- "maintenance",
- "winter"
], - "created": "2026-02-11T08:00:00+00:00",
- "modified": "2026-02-13T16:44:02+00:00"
}
}Required scope: blogs:write — Create, change, publish and delete blog posts
| uuid required | string Example: 0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c The uuid of the blog post. Uuids are unique per site: one from another site reads as not found. |
{- "status": "success",
- "blog": {
- "status": "draft",
- "uuid": "0192c4b3-77d1-7c02-b8ae-5f3d91c40e77",
- "title": "Winter tyres: what to look for",
- "slug": "winter-tyres-what-to-look-for",
- "tags": [
- "maintenance",
- "winter"
], - "created": "2026-02-11T08:00:00+00:00",
- "modified": "2026-02-13T16:44:02+00:00"
}
}Required scope: blogs:read — Read blog posts and blog categories
| uuid required | string Example: 0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c The uuid of the blog post. Uuids are unique per site: one from another site reads as not found. |
{- "status": "success",
- "blog": {
- "uuid": "0192c4b3-77d1-7c02-b8ae-5f3d91c40e77",
- "title": "Winter tyres: what to look for",
- "slug": "winter-tyres-what-to-look-for",
- "status": "published",
- "tags": [
- "maintenance",
- "winter"
], - "created": "2026-02-11T08:00:00+00:00",
- "modified": "2026-02-13T16:44:02+00:00",
- "seo": {
- "custom_title": "Winter tyres for your bike | Wheelhouse",
- "meta_description": "What to look for when choosing winter tyres.",
- "focus_keyword": "winter bike tyres"
}, - "elements": [
- {
- "type": "pageHeading",
- "value": "About us",
- "settings": {
- "align": "center"
}
}, - {
- "type": "text",
- "value": "<p>We have been building bikes since 1978.</p>",
- "settings": {
- "align": "left",
- "textColor": "#202223"
}
}
]
}
}Required scope: blogs:write — Create, change, publish and delete blog posts
| uuid required | string Example: 0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c The uuid of the blog post. Uuids are unique per site: one from another site reads as not found. |
{- "status": "success"
}Required scope: blogs:write — Create, change, publish and delete blog posts
| uuid required | string Example: 0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c The uuid of the blog post. Uuids are unique per site: one from another site reads as not found. |
| title | string The post title. |
| slug | string The URL segment. Derived from the title when left out. |
| status | string Enum: "published" "draft" Defaults to |
| tags | Array of objects Tag names. A comma-separated string is accepted too. Replaces the current tags. |
| main_image | string The header image URL, also used as the social preview. |
| seo | object Search-engine metadata: |
| elements | Array of objects The element tree of the post, sanitised the same way a page's is. |
{- "title": "Winter tyres: what to look for",
- "slug": "winter-tyres-what-to-look-for",
- "status": "draft",
- "tags": [
- "maintenance",
- "winter"
], - "seo": {
- "custom_title": "Winter tyres for your bike | Wheelhouse",
- "meta_description": "What to look for when choosing winter tyres."
}, - "elements": [
- {
- "type": "pageHeading",
- "value": "About us",
- "settings": {
- "align": "center"
}
}, - {
- "type": "text",
- "value": "<p>We have been building bikes since 1978.</p>",
- "settings": {
- "align": "left",
- "textColor": "#202223"
}
}
]
}{- "status": "success",
- "blog": {
- "uuid": "0192c4b3-77d1-7c02-b8ae-5f3d91c40e77",
- "title": "Winter tyres: what to look for",
- "slug": "winter-tyres-what-to-look-for",
- "status": "published",
- "tags": [
- "maintenance",
- "winter"
], - "created": "2026-02-11T08:00:00+00:00",
- "modified": "2026-02-13T16:44:02+00:00",
- "seo": {
- "custom_title": "Winter tyres for your bike | Wheelhouse",
- "meta_description": "What to look for when choosing winter tyres.",
- "focus_keyword": "winter bike tyres"
}
}
}The post types installed apps add to a site, such as cinemas or branches. A post type and its fields come from the app, read only, with a JSON Schema of the fields; its entries are created, changed and deleted here.
In the help centre: Content from apps.
Required scope: posts:read — Read the post types installed apps add to the site, and their entries
{- "status": "success",
- "post_types": [
- {
- "key": "cinemas",
- "name": "Cinemas",
- "singular_name": "Cinema",
- "app_uuid": "0192c3f0-4a1b-7e29-8d67-1c0b5a94f732",
- "public": true,
- "slug": "cinemas",
- "sort": "title",
- "entries_count": 12,
- "fields": [
- {
- "key": "city",
- "type": "text",
- "label": "City",
- "required": true,
- "help": null,
- "options": [ ]
}, - {
- "key": "format",
- "type": "options",
- "label": "Format",
- "required": false,
- "help": null,
- "options": [
- {
- "value": "standard",
- "label": "Standard"
}, - {
- "value": "imax",
- "label": "IMAX"
}
]
}, - {
- "key": "screens",
- "type": "number",
- "label": "Screens",
- "required": false,
- "help": null,
- "options": [ ]
}
], - "fields_schema": {
- "type": "object",
- "properties": {
- "city": {
- "field_type": "text",
- "description": "City",
- "type": "string",
- "maxLength": 500,
- "hint": "One line of plain text."
}, - "format": {
- "field_type": "options",
- "description": "Format",
- "type": [
- "string",
- "null"
], - "enum": [
- "standard",
- "imax",
- null
], - "options": [
- {
- "value": "standard",
- "label": "Standard"
}, - {
- "value": "imax",
- "label": "IMAX"
}
]
}, - "screens": {
- "field_type": "number",
- "description": "Screens",
- "type": [
- "number",
- "null"
]
}
}, - "required": [
- "city"
], - "additionalProperties": false
}, - "archive": {
- "post_type": "cinemas",
- "url": "/cinemas",
- "seo_title": "All our cinemas in the Netherlands",
- "seo_description": "Find a cinema near you: twelve locations, from Arnhem to Zwolle, with IMAX and 4DX.",
- "focus_keyword": "cinemas",
- "no_index": false,
- "modified": "2026-10-07T10:15:00+02:00"
}
}
]
}Required scope: posts:read — Read the post types installed apps add to the site, and their entries
| postType required | string[a-z0-9-]+ Example: cinemas The post type key, as returned by |
{- "status": "success",
- "post_type": {
- "key": "cinemas",
- "name": "Cinemas",
- "singular_name": "Cinema",
- "app_uuid": "0192c3f0-4a1b-7e29-8d67-1c0b5a94f732",
- "public": true,
- "slug": "cinemas",
- "sort": "title",
- "entries_count": 12,
- "fields": [
- {
- "key": "city",
- "type": "text",
- "label": "City",
- "required": true,
- "help": null,
- "options": [ ]
}, - {
- "key": "format",
- "type": "options",
- "label": "Format",
- "required": false,
- "help": null,
- "options": [
- {
- "value": "standard",
- "label": "Standard"
}, - {
- "value": "imax",
- "label": "IMAX"
}
]
}, - {
- "key": "screens",
- "type": "number",
- "label": "Screens",
- "required": false,
- "help": null,
- "options": [ ]
}
], - "fields_schema": {
- "type": "object",
- "properties": {
- "city": {
- "field_type": "text",
- "description": "City",
- "type": "string",
- "maxLength": 500,
- "hint": "One line of plain text."
}, - "format": {
- "field_type": "options",
- "description": "Format",
- "type": [
- "string",
- "null"
], - "enum": [
- "standard",
- "imax",
- null
], - "options": [
- {
- "value": "standard",
- "label": "Standard"
}, - {
- "value": "imax",
- "label": "IMAX"
}
]
}, - "screens": {
- "field_type": "number",
- "description": "Screens",
- "type": [
- "number",
- "null"
]
}
}, - "required": [
- "city"
], - "additionalProperties": false
}, - "archive": {
- "post_type": "cinemas",
- "url": "/cinemas",
- "seo_title": "All our cinemas in the Netherlands",
- "seo_description": "Find a cinema near you: twelve locations, from Arnhem to Zwolle, with IMAX and 4DX.",
- "focus_keyword": "cinemas",
- "no_index": false,
- "modified": "2026-10-07T10:15:00+02:00"
}
}
}Required scope: posts:read — Read the post types installed apps add to the site, and their entries
| postType required | string[a-z0-9-]+ Example: cinemas The post type key, as returned by |
{- "status": "success",
- "archive": {
- "post_type": "cinemas",
- "url": "/cinemas",
- "seo_title": "All our cinemas in the Netherlands",
- "seo_description": "Find a cinema near you: twelve locations, from Arnhem to Zwolle, with IMAX and 4DX.",
- "focus_keyword": "cinemas",
- "no_index": false,
- "modified": "2026-10-07T10:15:00+02:00"
}
}The page title, meta description, focus keyword and no-index of the overview page
(/<slug>). Only what is sent changes; an empty string clears a text.
Required scope: posts:write — Create, change and delete entries of the post types installed apps add
| postType required | string[a-z0-9-]+ Example: cinemas The post type key, as returned by |
| seo_title | string The title for search engines. An empty string clears it, the overview then uses the post type name. |
| seo_description | string The meta description. An empty string clears it. |
| focus_keyword | string The SEO focus keyword. |
| no_index | boolean Keep the overview page out of search engines and the sitemap. |
{- "seo_title": "All our cinemas in the Netherlands",
- "seo_description": "Find a cinema near you: twelve locations, from Arnhem to Zwolle, with IMAX and 4DX.",
- "focus_keyword": "cinemas",
- "no_index": false
}{- "status": "success",
- "archive": {
- "post_type": "cinemas",
- "url": "/cinemas",
- "seo_title": "All our cinemas in the Netherlands",
- "seo_description": "Find a cinema near you: twelve locations, from Arnhem to Zwolle, with IMAX and 4DX.",
- "focus_keyword": "cinemas",
- "no_index": false,
- "modified": "2026-10-07T10:15:00+02:00"
}
}Required scope: posts:read — Read the post types installed apps add to the site, and their entries
| postType required | string[a-z0-9-]+ Example: cinemas The post type key, as returned by |
| q | string Example: q=arnhem Free-text search over the entry title and slug. |
| page | integer Example: page=1 Which page to read, starting at 1. Out-of-range pages come back empty rather than as an error. |
| limit | integer Example: limit=25 How many records per page. Defaults to 25, clamped to 100. |
{- "status": "success",
- "items": [
- {
- "post_type": "cinemas",
- "uuid": "0192c61b-5c27-7f38-8a46-17b0d8e942c3",
- "title": "Vue Arnhem",
- "slug": "vue-arnhem",
- "url": "/cinemas/vue-arnhem",
- "visible": true,
- "position": 0,
- "fields": {
- "city": "Arnhem",
- "format": "imax",
- "screens": 9
}, - "seo_title": null,
- "seo_description": null,
- "focus_keyword": null,
- "no_index": false,
- "modified": "2026-09-30T10:00:00+00:00",
- "created": "2026-09-30T10:00:00+00:00"
}
], - "pagination": {
- "page": 1,
- "limit": 25,
- "totalRecords": 12,
- "totalPages": 1
}
}Required scope: posts:write — Create, change and delete entries of the post types installed apps add
| postType required | string[a-z0-9-]+ Example: cinemas The post type key, as returned by |
| title required | string The entry title. |
| slug | string The URL segment. Derived from the title when left out, and made unique per post type. |
| fields | object Field key => value, following the |
| visible | boolean Whether the entry shows on the website. New entries are visible. |
| position | integer Sort position, for post types that sort by position. |
| seo_title | string The title for search engines. An empty string clears it. |
| seo_description | string The meta description. An empty string clears it. |
| focus_keyword | string The SEO focus keyword. |
| no_index | boolean Keep this entry out of search engines. |
{- "title": "Vue Arnhem",
- "slug": "vue-arnhem",
- "fields": {
- "city": "Arnhem",
- "format": "imax",
- "screens": 9
}, - "visible": true,
- "position": 0,
- "seo_title": "Vue Arnhem - cinema in the city centre",
- "seo_description": "Nine screens, including IMAX, next to Arnhem Central station.",
- "focus_keyword": "cinema arnhem",
- "no_index": false
}{- "status": "success",
- "entry": {
- "post_type": "cinemas",
- "uuid": "0192c61b-5c27-7f38-8a46-17b0d8e942c3",
- "title": "Vue Arnhem",
- "slug": "vue-arnhem",
- "url": "/cinemas/vue-arnhem",
- "visible": true,
- "position": 0,
- "fields": {
- "city": "Arnhem",
- "format": "imax",
- "screens": 9
}, - "seo_title": null,
- "seo_description": null,
- "focus_keyword": null,
- "no_index": false,
- "modified": "2026-09-30T10:00:00+00:00",
- "created": "2026-09-30T10:00:00+00:00"
}
}Required scope: posts:read — Read the post types installed apps add to the site, and their entries
| postType required | string[a-z0-9-]+ Example: cinemas The post type key, as returned by |
| uuid required | string Example: 0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c The uuid of the post-type. Uuids are unique per site: one from another site reads as not found. |
{- "status": "success",
- "entry": {
- "post_type": "cinemas",
- "uuid": "0192c61b-5c27-7f38-8a46-17b0d8e942c3",
- "title": "Vue Arnhem",
- "slug": "vue-arnhem",
- "url": "/cinemas/vue-arnhem",
- "visible": true,
- "position": 0,
- "fields": {
- "city": "Arnhem",
- "format": "imax",
- "screens": 9
}, - "seo_title": null,
- "seo_description": null,
- "focus_keyword": null,
- "no_index": false,
- "modified": "2026-09-30T10:00:00+00:00",
- "created": "2026-09-30T10:00:00+00:00"
}
}Required scope: posts:write — Create, change and delete entries of the post types installed apps add
| postType required | string[a-z0-9-]+ Example: cinemas The post type key, as returned by |
| uuid required | string Example: 0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c The uuid of the post-type. Uuids are unique per site: one from another site reads as not found. |
{- "status": "success"
}Only what is sent changes: a field left out of "fields" keeps its value, a field sent as null is cleared.
Required scope: posts:write — Create, change and delete entries of the post types installed apps add
| postType required | string[a-z0-9-]+ Example: cinemas The post type key, as returned by |
| uuid required | string Example: 0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c The uuid of the post-type. Uuids are unique per site: one from another site reads as not found. |
| title | string The entry title. |
| slug | string The URL segment. Derived from the title when left out, and made unique per post type. |
| fields | object Field key => value, following the |
| visible | boolean Whether the entry shows on the website. New entries are visible. |
| position | integer Sort position, for post types that sort by position. |
| seo_title | string The title for search engines. An empty string clears it. |
| seo_description | string The meta description. An empty string clears it. |
| focus_keyword | string The SEO focus keyword. |
| no_index | boolean Keep this entry out of search engines. |
{- "title": "Vue Arnhem",
- "slug": "vue-arnhem",
- "fields": {
- "city": "Arnhem",
- "format": "imax",
- "screens": 9
}, - "visible": true,
- "position": 0,
- "seo_title": "Vue Arnhem - cinema in the city centre",
- "seo_description": "Nine screens, including IMAX, next to Arnhem Central station.",
- "focus_keyword": "cinema arnhem",
- "no_index": false
}{- "status": "success",
- "entry": {
- "post_type": "cinemas",
- "uuid": "0192c61b-5c27-7f38-8a46-17b0d8e942c3",
- "title": "Vue Arnhem",
- "slug": "vue-arnhem",
- "url": "/cinemas/vue-arnhem",
- "visible": true,
- "position": 0,
- "fields": {
- "city": "Arnhem",
- "format": "imax",
- "screens": 9
}, - "seo_title": null,
- "seo_description": null,
- "focus_keyword": null,
- "no_index": false,
- "modified": "2026-09-30T10:00:00+00:00",
- "created": "2026-09-30T10:00:00+00:00"
}
}The element areas outside a page: the homepage, the footer and the sidebar. An area is replaced as a whole.
In the help centre: Design and themes.
Read one element area.
Required scope: elements:read — Read homepage, footer and sidebar elements
| area required | string Example: footer The element area: |
{- "status": "success",
- "area": "footer",
- "elements": [
- {
- "type": "text",
- "content": "<p>Wheelhouse Ltd, 12 Baker Street, London</p>",
- "background_color": "#f6f6f7",
- "text_color": "#202223",
- "background": null,
- "sort_order": 1,
- "row_order": 1
}
]
}Replace one element area.
The whole area at once: elements are ordered and reference each other by position, so a partial write would leave the caller reasoning about the order of operations.
Required scope: elements:write — Change homepage, footer and sidebar elements
| area required | string Example: footer The element area: |
| elements required | Array of objects The whole area, in render order. Every element needs a |
{- "elements": [
- {
- "type": "text",
- "content": "<p>Wheelhouse Ltd, 12 Baker Street, London</p>",
- "background_color": "#f6f6f7",
- "text_color": "#202223",
- "background": null,
- "sort_order": 1,
- "row_order": 1
}
]
}{- "status": "success",
- "area": "footer",
- "elements": [
- {
- "type": "text",
- "content": "<p>Wheelhouse Ltd, 12 Baker Street, London</p>",
- "background_color": "#f6f6f7",
- "text_color": "#202223",
- "background": null,
- "sort_order": 1,
- "row_order": 1
}
]
}Per-locale translations of pages, blogs, products and categories, plus the overviews that show what is missing or has gone stale.
In the help centre: Translating content.
What still needs doing in one locale: items with no translation at all, and items whose translation has gone stale because the source text changed.
Required scope: translations:read — Read content translations and site locales
| locale required | string Example: de A locale that is active on this site. |
| type | string Enum: "page" "blog" "product" "category" Example: type=page Only this content type. All four are walked when it is left out. |
| limit | integer Example: limit=50 How many items to report per bucket. Clamped to 1-500, defaults to 100. |
{- "status": "success",
- "locale": "de",
- "missing": [
- {
- "type": "page",
- "uuid": "0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c",
- "name": "About us",
- "strings": 14,
- "translated": 0,
- "outdated": 0
}
], - "needs_review": [
- {
- "type": "blog",
- "uuid": "0192c4b3-77d1-7c02-b8ae-5f3d91c40e77",
- "name": "Winter tyres: what to look for",
- "strings": 22,
- "translated": 22,
- "outdated": 3
}
], - "totals": {
- "total": 412,
- "translated": 355,
- "outdated": 3,
- "missing_items": 1,
- "needs_review_items": 1
}
}How far along every active locale is - enough to decide which one to work on next without walking each item.
Required scope: translations:read — Read content translations and site locales
{- "status": "success",
- "locales": [
- {
- "locale": "de",
- "strings": 412,
- "translated": 355,
- "outdated": 3,
- "missing_items": 1,
- "needs_review_items": 1,
- "percentage_translated": 86
}, - {
- "locale": "nl",
- "strings": 412,
- "translated": 412,
- "outdated": 0,
- "missing_items": 0,
- "needs_review_items": 0,
- "percentage_translated": 100
}
]
}Required scope: translations:read — Read content translations and site locales
| type required | string Example: page The translatable content type: |
| uuid required | string Example: 0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c The uuid of the translated item. Uuids are unique per site: one from another site reads as not found. |
{- "status": "success",
- "type": "page",
- "uuid": "0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c",
- "translations": [
- {
- "uuid": "0192c5b5-1e73-7f40-95c8-7d604ba2e138",
- "locale": "de",
- "content_type": "page",
- "content_uuid": "0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c",
- "slug": "ueber-uns",
- "name": "Über uns",
- "custom_title": "Über Wheelhouse | Fahrräder seit 1978",
- "meta_description": "Wer wir sind und wo Sie uns finden.",
- "open_graph_description": null,
- "focus_keyword": null,
- "strings": {
- "elements#0.value": "<p>Wir bauen seit 1978 Fahrräder.</p>"
}, - "modified": "2026-06-04T10:15:33+00:00"
}
]
}What there is to translate for one locale: the source strings, the current translation and how stale it is.
Required scope: translations:read — Read content translations and site locales
| type required | string Example: page The translatable content type: |
| uuid required | string Example: 0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c The uuid of the translated item. Uuids are unique per site: one from another site reads as not found. |
| locale required | string Example: de A locale that is active on this site. |
{- "status": "success",
- "type": "page",
- "uuid": "0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c",
- "locale": "de",
- "translation": {
- "fields": [
- {
- "path": "field#name",
- "type": "text",
- "source": "About us",
- "value": "Über uns",
- "html": false,
- "outdated": false,
- "field": "name"
}, - {
- "path": "field#meta_description",
- "type": "text",
- "source": "Who we are and where to find us.",
- "value": null,
- "html": false,
- "outdated": false,
- "field": "meta_description"
}
], - "body": [
- {
- "path": "elements#0.value",
- "type": "html",
- "source": "<p>We have been building bikes since 1978.</p>",
- "value": "<p>Wir bauen seit 1978 Fahrräder.</p>",
- "html": true,
- "outdated": true
}
], - "total": 14,
- "translated": 12,
- "outdated": 1
}
}Required scope: translations:write — Create and change content translations
| type required | string Example: page The translatable content type: |
| uuid required | string Example: 0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c The uuid of the translated item. Uuids are unique per site: one from another site reads as not found. |
| locale required | string Example: de A locale that is active on this site. |
| values required | object The translated strings, keyed by the |
{- "values": {
- "field#name": "Über uns",
- "field#meta_description": "Wer wir sind und wo Sie uns finden.",
- "elements#0.value": "<p>Wir bauen seit 1978 Fahrräder.</p>"
}
}{- "status": "success",
- "translation": {
- "uuid": "0192c5b5-1e73-7f40-95c8-7d604ba2e138",
- "locale": "de",
- "content_type": "page",
- "content_uuid": "0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c",
- "slug": "ueber-uns",
- "name": "Über uns",
- "custom_title": "Über Wheelhouse | Fahrräder seit 1978",
- "meta_description": "Wer wir sind und wo Sie uns finden.",
- "open_graph_description": null,
- "focus_keyword": null,
- "strings": {
- "elements#0.value": "<p>Wir bauen seit 1978 Fahrräder.</p>"
}, - "modified": "2026-06-04T10:15:33+00:00"
}
}Required scope: translations:write — Create and change content translations
| type required | string Example: page The translatable content type: |
| uuid required | string Example: 0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c The uuid of the translated item. Uuids are unique per site: one from another site reads as not found. |
| locale required | string Example: de A locale that is active on this site. |
{- "status": "success"
}Required scope: translations:write — Create and change content translations
| type required | string Example: page The translatable content type: |
| uuid required | string Example: 0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c The uuid of the translated item. Uuids are unique per site: one from another site reads as not found. |
| locale required | string Example: de A locale that is active on this site. |
| values required | object The translated strings, keyed by the |
{- "values": {
- "field#name": "Über uns",
- "field#meta_description": "Wer wir sind und wo Sie uns finden.",
- "elements#0.value": "<p>Wir bauen seit 1978 Fahrräder.</p>"
}
}{- "status": "success",
- "translation": {
- "uuid": "0192c5b5-1e73-7f40-95c8-7d604ba2e138",
- "locale": "de",
- "content_type": "page",
- "content_uuid": "0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c",
- "slug": "ueber-uns",
- "name": "Über uns",
- "custom_title": "Über Wheelhouse | Fahrräder seit 1978",
- "meta_description": "Wer wir sind und wo Sie uns finden.",
- "open_graph_description": null,
- "focus_keyword": null,
- "strings": {
- "elements#0.value": "<p>Wir bauen seit 1978 Fahrräder.</p>"
}, - "modified": "2026-06-04T10:15:33+00:00"
}
}The media library. Metadata only - uploading bytes goes through the upload endpoint.
In the help centre: Managing content.
Required scope: media:read — Read the media library
| q | string Example: q=road bike Free-text search over the file name and alt text. |
| type | string Enum: "image" "document" "audio" "video" Example: type=image Only files of this kind. |
| page | integer Example: page=1 Which page to read, starting at 1. Out-of-range pages come back empty rather than as an error. |
| limit | integer Example: limit=25 How many records per page. Defaults to 25, clamped to 100. |
{- "status": "success",
- "items": [
- {
- "uuid": "0192c4c5-3a94-7de1-9b26-8c07f5a13d42",
- "file_name": "road-bike-blue.jpg",
- "file_type": "image",
- "mime_type": "image/jpeg",
- "file_size": 284113,
- "alt_text": "Blue road bike against a white wall",
- "created": "2026-01-22T12:40:18+00:00"
}
], - "pagination": {
- "page": 1,
- "limit": 25,
- "totalRecords": 134,
- "totalPages": 6
}
}Required scope: media:read — Read the media library
| uuid required | string Example: 0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c The uuid of the media item. Uuids are unique per site: one from another site reads as not found. |
{- "status": "success",
- "media": {
- "uuid": "0192c4c5-3a94-7de1-9b26-8c07f5a13d42",
- "file_name": "road-bike-blue.jpg",
- "file_type": "image",
- "mime_type": "image/jpeg",
- "file_size": 284113,
- "alt_text": "Blue road bike against a white wall",
- "created": "2026-01-22T12:40:18+00:00"
}
}Required scope: media:write — Upload, change and delete media
| uuid required | string Example: 0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c The uuid of the media item. Uuids are unique per site: one from another site reads as not found. |
{- "status": "success"
}Required scope: media:write — Upload, change and delete media
| uuid required | string Example: 0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c The uuid of the media item. Uuids are unique per site: one from another site reads as not found. |
| file_name | string The name shown in the library. Renaming does not move the file: |
| alt_text | string The alt text used wherever the image is rendered. |
{- "file_name": "road-bike-blue.jpg",
- "alt_text": "Blue road bike against a white wall"
}{- "status": "success",
- "media": {
- "uuid": "0192c4c5-3a94-7de1-9b26-8c07f5a13d42",
- "file_name": "road-bike-blue.jpg",
- "file_type": "image",
- "mime_type": "image/jpeg",
- "file_size": 284113,
- "alt_text": "Blue road bike against a white wall",
- "created": "2026-01-22T12:40:18+00:00"
}
}Required scope: categories:read — Read content and product categories
| q | string Example: q=race Free-text search over the category name and slug. |
| type | string Enum: "blog" "page" "product" Example: type=product Only categories of this kind. |
| page | integer Example: page=1 Which page to read, starting at 1. Out-of-range pages come back empty rather than as an error. |
| limit | integer Example: limit=25 How many records per page. Defaults to 25, clamped to 100. |
{- "status": "success",
- "items": [
- {
- "uuid": "0192c4d7-6512-7ab8-91cf-4e2a7b60d938",
- "name": "Racefietsen",
- "slug": "road-bikes",
- "type": "product",
- "seo": {
- "custom_title": "Buy road bikes | Wheelhouse",
- "meta_description": "Our full range of road bikes.",
- "focus_keyword": "buy road bike"
}, - "created": "2025-11-03T15:22:09+00:00",
- "modified": "2026-04-18T09:07:44+00:00"
}
], - "pagination": {
- "page": 1,
- "limit": 25,
- "totalRecords": 12,
- "totalPages": 1
}
}Required scope: categories:write — Create, change and delete categories
| name required | string The category name. |
| slug | string The URL segment. Derived from the name when left out. |
| type | string Enum: "blog" "page" "product" What the category groups. Defaults to |
| parent_uuid | string Nest under another category. Send |
| seo | object Search-engine metadata: |
{- "name": "Racefietsen",
- "slug": "road-bikes",
- "type": "product",
- "parent_uuid": "0192c4d7-6512-7ab8-91cf-4e2a7b60d938",
- "seo": {
- "custom_title": "Buy road bikes | Wheelhouse",
- "meta_description": "Our full range of road bikes."
}
}{- "status": "success",
- "category": {
- "uuid": "0192c4d7-6512-7ab8-91cf-4e2a7b60d938",
- "name": "Racefietsen",
- "slug": "road-bikes",
- "type": "product",
- "seo": {
- "custom_title": "Buy road bikes | Wheelhouse",
- "meta_description": "Our full range of road bikes.",
- "focus_keyword": "buy road bike"
}, - "created": "2025-11-03T15:22:09+00:00",
- "modified": "2026-04-18T09:07:44+00:00"
}
}Required scope: categories:read — Read content and product categories
| uuid required | string Example: 0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c The uuid of the category. Uuids are unique per site: one from another site reads as not found. |
{- "status": "success",
- "category": {
- "uuid": "0192c4d7-6512-7ab8-91cf-4e2a7b60d938",
- "name": "Racefietsen",
- "slug": "road-bikes",
- "type": "product",
- "seo": {
- "custom_title": "Buy road bikes | Wheelhouse",
- "meta_description": "Our full range of road bikes.",
- "focus_keyword": "buy road bike"
}, - "created": "2025-11-03T15:22:09+00:00",
- "modified": "2026-04-18T09:07:44+00:00"
}
}Required scope: categories:write — Create, change and delete categories
| uuid required | string Example: 0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c The uuid of the category. Uuids are unique per site: one from another site reads as not found. |
{- "status": "success"
}Required scope: categories:write — Create, change and delete categories
| uuid required | string Example: 0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c The uuid of the category. Uuids are unique per site: one from another site reads as not found. |
| name | string The category name. |
| slug | string The URL segment. Derived from the name when left out. |
| type | string Enum: "blog" "page" "product" What the category groups. Defaults to |
| parent_uuid | string Nest under another category. Send |
| seo | object Search-engine metadata: |
{- "name": "Racefietsen",
- "slug": "road-bikes",
- "type": "product",
- "parent_uuid": "0192c4d7-6512-7ab8-91cf-4e2a7b60d938",
- "seo": {
- "custom_title": "Buy road bikes | Wheelhouse",
- "meta_description": "Our full range of road bikes."
}
}{- "status": "success",
- "category": {
- "uuid": "0192c4d7-6512-7ab8-91cf-4e2a7b60d938",
- "name": "Racefietsen",
- "slug": "road-bikes",
- "type": "product",
- "seo": {
- "custom_title": "Buy road bikes | Wheelhouse",
- "meta_description": "Our full range of road bikes.",
- "focus_keyword": "buy road bike"
}, - "created": "2025-11-03T15:22:09+00:00",
- "modified": "2026-04-18T09:07:44+00:00"
}
}Required scope: redirects:read — Read URL redirects
| q | string Example: q=oude- Free-text search over both sides of the redirect. |
| page | integer Example: page=1 Which page to read, starting at 1. Out-of-range pages come back empty rather than as an error. |
| limit | integer Example: limit=25 How many records per page. Defaults to 25, clamped to 100. |
{- "status": "success",
- "items": [
- {
- "uuid": "0192c4f9-59ba-7e37-97d4-1a8c6b230e5f",
- "from": "/oude-pagina",
- "to": "/about-us",
- "type": 301,
- "hits": 214
}
], - "pagination": {
- "page": 1,
- "limit": 25,
- "totalRecords": 63,
- "totalPages": 3
}
}Required scope: redirects:write — Create, change and delete URL redirects
| from required | string The path to redirect away from, relative to the site root. |
| to required | string Where to send the visitor: a site-relative path or an absolute URL. |
| type | integer Enum: 301 302 The HTTP status: 301 (permanent, the default) or 302 (temporary). |
{- "from": "/oude-pagina",
- "to": "/about-us",
- "type": 301
}{- "status": "success",
- "redirect": {
- "uuid": "0192c4f9-59ba-7e37-97d4-1a8c6b230e5f",
- "from": "/oude-pagina",
- "to": "/about-us",
- "type": 301,
- "hits": 214
}
}Required scope: redirects:read — Read URL redirects
| uuid required | string Example: 0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c The uuid of the redirect. Uuids are unique per site: one from another site reads as not found. |
{- "status": "success",
- "redirect": {
- "uuid": "0192c4f9-59ba-7e37-97d4-1a8c6b230e5f",
- "from": "/oude-pagina",
- "to": "/about-us",
- "type": 301,
- "hits": 214
}
}Required scope: redirects:write — Create, change and delete URL redirects
| uuid required | string Example: 0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c The uuid of the redirect. Uuids are unique per site: one from another site reads as not found. |
{- "status": "success"
}Required scope: redirects:write — Create, change and delete URL redirects
| uuid required | string Example: 0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c The uuid of the redirect. Uuids are unique per site: one from another site reads as not found. |
| from | string The path to redirect away from. |
| to | string Where to send the visitor. |
| type | integer Enum: 301 302 The HTTP status. |
{- "from": "/oude-pagina",
- "to": "/about-us",
- "type": 301
}{- "status": "success",
- "redirect": {
- "uuid": "0192c4f9-59ba-7e37-97d4-1a8c6b230e5f",
- "from": "/oude-pagina",
- "to": "/about-us",
- "type": 301,
- "hits": 214
}
}The site USPs (unique selling points): the small title, text and icon items the theme shows in the topbar and elsewhere. An ordered, site-level list.
In the help centre: Managing content.
Required scope: usp:read — Read the site USPs (unique selling points)
{- "status": "success",
- "usps": [
- {
- "uuid": "0192c5b5-3e18-7a46-9d72-64bc8a015f3a",
- "title": "Free shipping",
- "text": "Vanaf €50 in Nederland",
- "icon": "truck",
- "visible": true,
- "derive_shipping": false,
- "sort_order": 10
}
]
}Reorder the whole list in one call: the "usps" array of uuids is the new order.
Nothing is written unless every uuid resolves, so a typo cannot half-reorder the list.
Required scope: usp:write — Create, change, reorder and delete USPs
| usps required | Array of objects The USP uuids in their new order. Every USP has to be listed; nothing is written unless all of them resolve. |
{- "usps": [
- "0192c5b5-3e18-7a46-9d72-64bc8a015f3a",
- "0192c5b6-08d7-7f23-8c41-7a90bd52e1c8"
]
}{- "status": "success",
- "usps": [
- {
- "uuid": "0192c5b5-3e18-7a46-9d72-64bc8a015f3a",
- "title": "Free shipping",
- "text": "Vanaf €50 in Nederland",
- "icon": "truck",
- "visible": true,
- "derive_shipping": false,
- "sort_order": 10
}
]
}Required scope: usp:write — Create, change, reorder and delete USPs
| title required | string The USP heading. |
| text | string The supporting line under the title. |
| icon | string The icon name the theme renders. |
| visible | boolean Whether the theme shows this USP. |
| derive_shipping | boolean Let the USP text be filled from the shop's shipping settings instead of a fixed text. |
| sort_order | integer Position in the list; lower comes first. |
{- "title": "Free shipping",
- "text": "Vanaf €50 in Nederland",
- "icon": "truck",
- "visible": true,
- "derive_shipping": false,
- "sort_order": 10
}{- "status": "success",
- "usp": {
- "uuid": "0192c5b5-3e18-7a46-9d72-64bc8a015f3a",
- "title": "Free shipping",
- "text": "Vanaf €50 in Nederland",
- "icon": "truck",
- "visible": true,
- "derive_shipping": false,
- "sort_order": 10
}
}Required scope: usp:read — Read the site USPs (unique selling points)
| uuid required | string Example: 0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c The uuid of the usp. Uuids are unique per site: one from another site reads as not found. |
{- "status": "success",
- "usp": {
- "uuid": "0192c5b5-3e18-7a46-9d72-64bc8a015f3a",
- "title": "Free shipping",
- "text": "Vanaf €50 in Nederland",
- "icon": "truck",
- "visible": true,
- "derive_shipping": false,
- "sort_order": 10
}
}Required scope: usp:write — Create, change, reorder and delete USPs
| uuid required | string Example: 0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c The uuid of the usp. Uuids are unique per site: one from another site reads as not found. |
{- "status": "success"
}Required scope: usp:write — Create, change, reorder and delete USPs
| uuid required | string Example: 0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c The uuid of the usp. Uuids are unique per site: one from another site reads as not found. |
| title | string The USP heading. |
| text | string The supporting line under the title. |
| icon | string The icon name the theme renders. |
| visible | boolean Whether the theme shows this USP. |
| derive_shipping | boolean Let the USP text be filled from the shop's shipping settings instead of a fixed text. |
| sort_order | integer Position in the list; lower comes first. |
{- "title": "Free shipping",
- "text": "Vanaf €50 in Nederland",
- "icon": "truck",
- "visible": true,
- "derive_shipping": false,
- "sort_order": 10
}{- "status": "success",
- "usp": {
- "uuid": "0192c5b5-3e18-7a46-9d72-64bc8a015f3a",
- "title": "Free shipping",
- "text": "Vanaf €50 in Nederland",
- "icon": "truck",
- "visible": true,
- "derive_shipping": false,
- "sort_order": 10
}
}The active theme and its layouts, read only - so an app knows what it renders into.
In the help centre: Design and themes.
List the layouts a page can be assigned to.
Required scope: themes:read — Read the active theme, its layouts and its design settings
{- "status": "success",
- "layouts": [
- {
- "name": "Standaard",
- "template": "layouts/default.html.twig"
}, - {
- "name": "Landingspagina",
- "template": "layouts/landing.html.twig"
}
]
}Read the theme's design settings: its declared colours/fonts/etc. and the values the staging preview currently renders with.
Required scope: themes:read — Read the active theme, its layouts and its design settings
{- "status": "success",
- "theme": {
- "uuid": "019200a1-7b3c-7c1a-9b2e-2f4d6a8c0e11",
- "name": "Modern",
- "watching": true
}, - "settings": [
- {
- "key": "header-background-color",
- "type": "colour",
- "label": "Header background",
- "default": "#ffffff"
}, - {
- "key": "heading-font",
- "type": "font",
- "label": "Heading font",
- "default": "Open_Sans"
}, - {
- "key": "link-text-decoration",
- "type": "options",
- "label": "Link underline style",
- "default": "underline",
- "options": [
- "none",
- "underline",
- "overline",
- "line-through"
]
}
], - "values": {
- "header-background-color": "#0b1220",
- "heading-font": "Roboto"
}, - "staging_overrides": {
- "header-background-color": "#0b1220",
- "heading-font": "Roboto"
}
}Change the theme design settings on the staging preview. Only the keys sent are changed; the values apply to the staging site only, never the live site, until a person promotes them in the admin.
Required scope: themes:write — Change the theme design settings (colours, fonts) on the staging preview
| settings required | object The setting values to change, keyed by setting key. Only the keys you send are changed. They apply to the staging preview only, never the live site, until a person promotes them in the admin. Values are staging-scoped by design. |
{- "settings": {
- "header-background-color": "#0b1220",
- "heading-font": "Roboto"
}
}{- "status": "success",
- "theme": {
- "uuid": "019200a1-7b3c-7c1a-9b2e-2f4d6a8c0e11",
- "name": "Modern",
- "watching": true
}, - "settings": [
- {
- "key": "header-background-color",
- "type": "colour",
- "label": "Header background",
- "default": "#ffffff"
}, - {
- "key": "heading-font",
- "type": "font",
- "label": "Heading font",
- "default": "Open_Sans"
}, - {
- "key": "link-text-decoration",
- "type": "options",
- "label": "Link underline style",
- "default": "underline",
- "options": [
- "none",
- "underline",
- "overline",
- "line-through"
]
}
], - "values": {
- "header-background-color": "#0b1220",
- "heading-font": "Roboto"
}, - "staging_overrides": {
- "header-background-color": "#0b1220",
- "heading-font": "Roboto"
}
}Read the active theme.
Required scope: themes:read — Read the active theme, its layouts and its design settings
{- "status": "success",
- "theme": {
- "name": "Modern",
- "background_color": "#ffffff",
- "background_image": null
}
}Required scope: sites:read — Read the site settings, notices and brand book
{- "status": "success",
- "site": {
- "uuid": "0192c3e1-9d52-7b08-a4f3-6e17c025b8d9",
- "name": "Wheelhouse",
- "domain": "wheelhouse.nl",
- "protocol": "https",
- "locale": "en"
}
}Required scope: sites:write — Change the site settings, notices and brand book
| name | string The site name, as shown in the admin. |
| locale | string The default locale of the site. Translations hang off this one. |
{- "name": "Wheelhouse",
- "locale": "en"
}{- "status": "success",
- "site": {
- "uuid": "0192c3e1-9d52-7b08-a4f3-6e17c025b8d9",
- "name": "Wheelhouse",
- "locale": "en"
}
}Required scope: sites:read — Read the site settings, notices and brand book
{- "status": "success",
- "social_media": {
- "twitter": null,
- "youtube": null,
- "pinterest": null,
- "tiktok": null,
}
}Send only the networks to change; the others keep their URL, and null or an empty string unlinks a network. A URL that is not on the network's own domain is refused with a 422 and nothing is changed.
Required scope: sites:write — Change the site settings, notices and brand book
string The Facebook profile URL, on facebook.com or fb.com. null or "" unlinks it. | |
string The X / Twitter profile URL, on x.com or twitter.com. null or "" unlinks it. | |
string The Instagram profile URL, on instagram.com. null or "" unlinks it. | |
| youtube | string The YouTube profile URL, on youtube.com or youtu.be. null or "" unlinks it. |
string The Pinterest profile URL, on pinterest.com, a country domain such as pinterest.nl, or pin.it. null or "" unlinks it. | |
| tiktok | string The TikTok profile URL, on tiktok.com. null or "" unlinks it. |
string The LinkedIn profile URL, on linkedin.com. null or "" unlinks it. |
{
}{- "status": "success",
- "social_media": {
- "twitter": null,
- "youtube": null,
- "pinterest": null,
- "tiktok": null,
}
}Required scope: statistics:read — Read site statistics and conversions
| from | string Example: from=2026-06-01 First day to report on. Defaults to 30 days ago. |
| to | string Example: to=2026-06-03 Last day to report on. Defaults to today. |
{- "status": "success",
- "days": [
- {
- "day": "2026-06-01",
- "views": 1284,
- "visitors": 903
}, - {
- "day": "2026-06-02",
- "views": 1411,
- "visitors": 1002
}, - {
- "day": "2026-06-03",
- "views": 998,
- "visitors": 742
}
]
}The modules installed on the site and their settings. An app can configure a module but cannot install or remove one.
In the help centre: Site settings.
List the modules active on this site.
Required scope: modules:read — Read the site modules and their settings
{- "status": "success",
- "modules": [
- {
- "key": "ContactForm",
- "name": "Contact form",
- "description": "Let visitors leave a message.",
- "icon": "envelope"
}, - {
- "key": "OnlineStore",
- "name": "Webshop",
- "description": "Sell products from your site.",
- "icon": "shopping-cart"
}
]
}Read one module's settings.
Required scope: modules:read — Read the site modules and their settings
| key required | string Example: ContactForm The module key, as returned by |
{- "status": "success",
- "module": "ContactForm",
- "settings": {
- "recipient": "info@wheelhouse.nl",
- "send_confirmation": "1"
}
}Change a module's settings.
A merge, not a replace: these settings belong to the merchant and are shared with the admin screens, so an app that knows about two settings must not wipe a third it has never heard of.
Required scope: modules:write — Change module settings
| key required | string Example: ContactForm The module key, as returned by |
| settings required | object The settings to write, as a flat name/value map. A merge, not a replace: a setting left out keeps its value, so an app cannot wipe a setting it has never heard of. At least one setting is required. |
{- "settings": {
- "recipient": "sales@wheelhouse.nl"
}
}{- "status": "success",
- "module": "ContactForm",
- "settings": {
- "recipient": "sales@wheelhouse.nl",
- "send_confirmation": "1"
}
}The site's invoices.
Required scope: billing:read — Read the subscription, plan and invoices
| page | integer Example: page=1 Which page to read, starting at 1. Out-of-range pages come back empty rather than as an error. |
| limit | integer Example: limit=25 How many records per page. Defaults to 25, clamped to 100. |
{- "status": "success",
- "items": [
- {
- "invoice_number": "2026-004182",
- "currency": "EUR",
- "amount_cents": 1500,
- "total_amount_cents": 1815,
- "paid": "2026-06-01T04:11:09+00:00"
}
], - "pagination": {
- "page": 1,
- "limit": 25,
- "totalRecords": 24,
- "totalPages": 1
}
}Required scope: billing:read — Read the subscription, plan and invoices
{- "status": "success",
- "subscriptions": [
- {
- "type": "sp_2026_shop",
- "price": 25,
- "quantity": 1,
- "renewal_interval": "+1 month",
- "status": 10,
- "start_date": "2026-01-01T00:00:00+00:00",
- "end_date": null,
- "renewal_date": "2026-08-01T00:00:00+00:00"
}
]
}Required scope: domains:read — Read domains, DNS records and domain holders
| domain required | string Example: domain=wheelhouse The name to check. Without an extension every extension we sell is checked. |
{- "status": "success",
- "results": [
- {
- "domain": "wheelhouse.nl",
- "extension": "nl",
- "available": false,
- "price_cents": 995
}, - {
- "domain": "wheelhouse.be",
- "extension": "be",
- "available": true,
- "price_cents": 1295
}
]
}Required scope: domains:read — Read domains, DNS records and domain holders
{- "status": "success",
- "suggestions": [
- {
- "domain": "wheelhouse.shop",
- "extension": "shop",
- "available": true,
- "price_cents": 2495
}
]
}Order one or more domains.
On a site with an MRR of at least one euro the mandate is already active, so the order is charged straight away. On a free or trial site a checkout URL comes back instead and the merchant confirms - an app cannot make someone who has never paid start paying.
Required scope: domains:order — Order domains, which may be charged to the merchant
| domains required | Array of objects The domain names to order, with their extension. A single string is accepted too. |
| holder_uuid | string The registrant contact to register under, from |
{- "domains": [
- "wheelhouse.be"
], - "holder_uuid": "0192c5c6-8a34-7b19-9d02-46e5f7013b8a"
}{- "status": "success",
- "order_uuid": "0192c5e8-4c19-7a53-b806-7d2f5a91e0c4",
- "added": [
- "wheelhouse.be"
], - "skipped": [ ],
- "charged": false,
- "checkout_url": "/admin/shop/checkout/0192c5e8-4c19-7a53-b806-7d2f5a91e0c4"
}The registrant contacts available on this site.
Required scope: domains:read — Read domains, DNS records and domain holders
{- "status": "success",
- "holders": [
- {
- "uuid": "0192c5c6-8a34-7b19-9d02-46e5f7013b8a",
- "company_name": "Wheelhouse Ltd",
- "first_name": "Emma",
- "last_name": "Clarke",
- "city": "London",
- "country_code": "GB"
}
]
}Required scope: domains:read — Read domains, DNS records and domain holders
{- "status": "success",
- "domains": [
- {
- "uuid": "0192c582-8b47-7d31-a05e-6c29f74b1e83",
- "domain": "wheelhouse.nl",
- "status": 10,
- "protocol": "https",
- "auto_renewal": true,
- "provider": "openprovider",
- "dns_provider": "sitepack",
- "mail_provider": "qboxmail"
}
]
}Required scope: domains:read — Read domains, DNS records and domain holders
| uuid required | string Example: 0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c The uuid of the domain. Uuids are unique per site: one from another site reads as not found. |
{- "status": "success",
- "records": {
- "records": [
- {
- "type": "A",
- "name": "@",
- "value": "185.31.17.20",
- "priority": null,
- "locked": true
}, - {
- "type": "MX",
- "name": "@",
- "value": "mx1.qboxmail.com",
- "priority": 10,
- "locked": false
}
], - "nameservers": [
- "ns1.sitepack.io",
- "ns2.sitepack.io"
]
}
}Replace the DNS records of a domain.
The whole zone at once: a zone with half a change applied can point a live domain at nothing, and DNS mistakes take a TTL to undo. The change is applied at the DNS provider straight away and the zone comes back as it is afterwards.
Required scope: domains:write — Change DNS records and domain holders
| uuid required | string Example: 0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c The uuid of the domain. Uuids are unique per site: one from another site reads as not found. |
| records required | Array of objects The whole zone. Each record needs |
{- "records": [
- {
- "type": "A",
- "name": "@",
- "value": "185.31.17.20",
- "priority": null,
- "locked": true
}, - {
- "type": "MX",
- "name": "@",
- "value": "mx1.qboxmail.com",
- "priority": 10,
- "locked": false
}
]
}{- "status": "success",
- "domain": "wheelhouse.nl",
- "records": [
- {
- "type": "A",
- "name": "@",
- "value": "185.31.17.20",
- "priority": null,
- "locked": true
}, - {
- "type": "MX",
- "name": "@",
- "value": "mx1.qboxmail.com",
- "priority": 10,
- "locked": false
}
], - "changes": {
- "zone": "wheelhouse-nl",
- "added": [
- "MX wheelhouse.nl. 10 mx1.qboxmail.com. ttl 3600"
], - "removed": [ ],
- "summary": "1 record(s) added, 0 removed"
}
}Required scope: domains:read — Read domains, DNS records and domain holders
| uuid required | string Example: 0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c The uuid of the domain. Uuids are unique per site: one from another site reads as not found. |
{- "status": "success",
- "domain": {
- "uuid": "0192c582-8b47-7d31-a05e-6c29f74b1e83",
- "domain": "wheelhouse.nl",
- "status": 10,
- "protocol": "https",
- "auto_renewal": true,
- "provider": "openprovider",
- "dns_provider": "sitepack",
- "mail_provider": "qboxmail"
}
}Required scope: mail:read — Read mailboxes and mailbox slots
{- "status": "success",
- "mailboxes": [
- {
- "uuid": "0192c593-4f18-7a62-b9d7-3081ea562c94",
- "address": "sales@wheelhouse.nl",
- "status": 20,
- "provider": "qboxmail",
- "password_change_supported": true,
- "created": "2026-04-07T13:55:11+00:00"
}
]
}Provision a mailbox.
Within the free slots this needs mail:write. Beyond them it adds a EUR 1/month subscription, which is spending, so it needs mail:order - without it the request stops at 409 rather than quietly costing the merchant money.
Required scope: mail:write — Create, change and delete mailboxes within the free slots
| local_part required | string What goes before the @. Letters, digits and . - _ + only. |
| domain | string Which domain of the site to create the mailbox on. The site's primary domain is used when it is left out. |
{- "local_part": "sales",
- "domain": "wheelhouse.nl"
}{- "status": "success",
- "mailbox": {
- "uuid": "0192c593-4f18-7a62-b9d7-3081ea562c94",
- "address": "sales@wheelhouse.nl",
- "status": 20,
- "provider": "qboxmail",
- "password_change_supported": true,
- "created": "2026-04-07T13:55:11+00:00"
}, - "password": "f3a91c07d24b8e65",
- "charged": false
}Required scope: mail:read — Read mailboxes and mailbox slots
| uuid required | string Example: 0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c The uuid of the mailbox. Uuids are unique per site: one from another site reads as not found. |
{- "status": "success",
- "quota": {
- "max_quota": 5368709120,
- "used_quota": 851443712,
- "used_quota_human": "812 MB",
- "messages": 4301
}
}Required scope: mail:write — Create, change and delete mailboxes within the free slots
| uuid required | string Example: 0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c The uuid of the mailbox. Uuids are unique per site: one from another site reads as not found. |
{- "status": "success",
- "password": "b70e14c9a5d2f831"
}Required scope: mail:read — Read mailboxes and mailbox slots
| uuid required | string Example: 0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c The uuid of the mailbox. Uuids are unique per site: one from another site reads as not found. |
{- "status": "success",
- "mailbox": {
- "uuid": "0192c593-4f18-7a62-b9d7-3081ea562c94",
- "address": "sales@wheelhouse.nl",
- "status": 20,
- "provider": "qboxmail",
- "password_change_supported": true,
- "created": "2026-04-07T13:55:11+00:00"
}
}Required scope: mail:write — Create, change and delete mailboxes within the free slots
| uuid required | string Example: 0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c The uuid of the mailbox. Uuids are unique per site: one from another site reads as not found. |
{- "status": "success"
}