Skip to main content

SitePack App API (v1)

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.

Authorization

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.

What your token can do

Three things must hold, and they are checked on every request:

  1. your installation on that site is active;
  2. the app's subscription on that site is active — if the merchant cancels a paid app, API access stops immediately;
  3. the scope is one the merchant actually granted.

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

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.

Identifiers

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.

Responses

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

Rate limits

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.

Webhooks

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.

Things worth knowing before you start

  • Pages are styled through element settings, not inline HTML. Inline style= attributes are stripped from anything you submit; alignment and colour are lifted into the element's settings so the intent survives.
  • Elements cannot carry script. <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.
  • Responses are never cached. They come back 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.
  • Order creation prices from the catalogue. A price in your payload is ignored; orders are created unpaid at status new.
  • Stock moves by delta, not by absolute value, so two apps adjusting at once do not overwrite each other.
  • Paid orders depend on the merchant. On a site with €1+ monthly revenue the mandate is already active and the order is charged ("charged": true); below that you get a checkout_url for the merchant to confirm. Handle both.

Where to read the other half

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

OAuth

Authorization: turning a merchant's consent into an access token, and refreshing or revoking it.

In the help centre: Developing apps.

Ask a merchant for consent

OAuth 2.0 Authorization Endpoint

Directs the user (shop owner or partner) to login and grant permission to the application.

query Parameters
client_id
required
string

The ID of the application (e.g., my-seo).

response_type
required
string
Value: "code"
Example: response_type=code

The type of response requested. Must be "code".

scope
required
string
Example: scope=orders:read products:write

Space-separated list of scopes (e.g., orders:read products:write).

redirect_uri
required
string <uri>

The URI to redirect the user to after approval.

state
required
string

An opaque value used by the client to maintain state between the request and callback (CSRF protection).

site_id
string

Optional: Force the context to one specific site.

account_access
boolean
Default: false

Set to true if a Partner-level token is requested.

Responses

Response samples

Content type
application/json
{
  • "status": "success",
  • "message": "string",
  • "client_name": "string",
  • "scopes": [
    ],
  • "redirect_uri": "string",
  • "state": "string"
}

Ask a merchant for consent

Authorization Endpoint (RFC 6749) URL: GET /api/authentication/oauth/authorize

Responses

Exchange a code for a token

OAuth 2.0 Token Endpoint

Exchange an authorization code, refresh token, or device code for an access token.

Request Body schema: application/x-www-form-urlencoded
required
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).

Responses

Response samples

Content type
application/json
{
  • "access_token": "string",
  • "token_type": "Bearer",
  • "expires_in": 3600,
  • "scope": "string",
  • "refresh_token": "string"
}

Register an MCP connector client

OAuth 2.0 Dynamic Client Registration (MCP connector)

Registers a public OAuth client for the SitePack MCP connector.

Responses

Start device authorization

Device Authorization Endpoint

Specifically for the sitepack login flow in the terminal, where the user cannot type a URL but must enter a code.

Request Body schema: application/json
required
client_id
required
string

The ID of the CLI (e.g., sitepack-cli).

scope
string

Usually theme:write dev:access.

Responses

Request samples

Content type
application/json
{
  • "client_id": "string",
  • "scope": "theme:write dev:access"
}

Response samples

Content type
application/json
{}

Inspect a token

OAuth 2.0 Introspection Endpoint

Useful for your own microservices or internal checks to see if an X-SitePack-Access-Token is still valid.

Authorizations:
None

Responses

Response samples

Content type
application/json
{
  • "active": true,
  • "scope": "orders:read",
  • "client_id": "my-seo",
  • "sub": "user_123",
  • "site_id": 987,
  • "partner_access": false,
  • "exp": 1710854400
}

Revoke a token

OAuth 2.0 Revocation Endpoint

To break a link directly (e.g., when a user uninstalls the app).

Request Body schema: application/json
required
token
required
string

The token that needs to be invalidated.

Responses

Request samples

Content type
application/json
{
  • "token": "string"
}

Response samples

Content type
application/json
{
  • "status": "revoked"
}

Identify a token

Whoami Action

Returns basic account info for the authenticated user.

Authorizations:
None

Responses

Response samples

Content type
application/json
{
  • "id": 1,
  • "email": "user@example.com",
  • "first_name": "John",
  • "last_name": "Doe"
}

Meta

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

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.

Authorizations:
OAuth2

Responses

Response samples

Content type
application/json
{
  • "status": "success",
  • "app": {
    },
  • "site": {
    },
  • "installation": {
    },
  • "scopes": [
    ]
}

List every scope

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.

Authorizations:
OAuth2

Responses

Response samples

Content type
application/json
{
  • "status": "success",
  • "scopes": [
    ],
  • "granted": [
    ]
}

App settings

This app's own configuration on this site.

In the help centre: Developing apps.

Read app settings

Required scope: app:settings:read — Read this app's own settings on the site

Authorizations:
OAuth2

Responses

Response samples

Content type
application/json
{
  • "status": "success",
  • "settings": {
    },
  • "merchant_settings": {
    }
}

Replace app settings

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

Authorizations:
OAuth2
Request Body schema: application/json
required
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.

Responses

Request samples

Content type
application/json
{
  • "settings": {
    }
}

Response samples

Content type
application/json
{
  • "status": "success",
  • "settings": {
    }
}

Webhooks

Which events this app is subscribed to, and every topic that exists.

In the help centre: Developing apps.

List webhook subscriptions

Required scope: webhooks:read — Read this app's webhook subscriptions and the available topics

Authorizations:
OAuth2

Responses

Response samples

Content type
application/json
{
  • "status": "success",
  • "subscriptions": [],
  • "available_topics": [
    ],
  • "managed_in": "app.json"
}

Leads

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.

List leads

Required scope: leads:read — Read form submissions and their notes

Authorizations:
OAuth2
query Parameters
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.

Responses

Response samples

Content type
application/json
{
  • "status": "success",
  • "items": [
    ],
  • "pagination": {
    }
}

List lead notes

The notes on a form submission.

Required scope: leads:read — Read form submissions and their notes

Authorizations:
OAuth2
path Parameters
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.

Responses

Response samples

Content type
application/json
{
  • "status": "success",
  • "notes": [
    ]
}

Add a lead note

Add a note to a form submission.

Required scope: leads:write — Create, change and delete form submissions

Authorizations:
OAuth2
path Parameters
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.

Request Body schema: application/json
required
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.

Responses

Request samples

Content type
application/json
{
  • "note": "Called back, wants to book a test ride."
}

Response samples

Content type
application/json
{
  • "status": "success",
  • "note": {
    }
}

Get a lead

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

Authorizations:
OAuth2
path Parameters
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.

Responses

Response samples

Content type
application/json
{
  • "status": "success",
  • "lead": {
    }
}

Delete a lead

Required scope: leads:write — Create, change and delete form submissions

Authorizations:
OAuth2
path Parameters
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.

Responses

Response samples

Content type
application/json
{
  • "status": "success"
}

Update a lead

Required scope: leads:write — Create, change and delete form submissions

Authorizations:
OAuth2
path Parameters
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.

Request Body schema: application/json
required
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.

Responses

Request samples

Content type
application/json
{
  • "status": 4,
  • "value_cents": 249900
}

Response samples

Content type
application/json
{
  • "status": "success",
  • "lead": {
    }
}

Customers

Webshop customers. Personal data, behind its own scope.

In the help centre: The webshop.

List customers

Required scope: customers:read — Read customers and their addresses

Authorizations:
OAuth2
query Parameters
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.

Responses

Response samples

Content type
application/json
{
  • "status": "success",
  • "items": [
    ],
  • "pagination": {
    }
}

Create a customer

Required scope: customers:write — Create and change customers

Authorizations:
OAuth2
Request Body schema: application/json
required
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.

Responses

Request samples

Content type
application/json
{
  • "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"
}

Response samples

Content type
application/json
{
  • "status": "success",
  • "customer": {
    }
}

Get a customer

Required scope: customers:read — Read customers and their addresses

Authorizations:
OAuth2
path Parameters
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.

Responses

Response samples

Content type
application/json
{
  • "status": "success",
  • "customer": {
    }
}

Update a customer

Required scope: customers:write — Create and change customers

Authorizations:
OAuth2
path Parameters
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.

Request Body schema: application/json
optional
email
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.

Responses

Request samples

Content type
application/json
{
  • "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"
}

Response samples

Content type
application/json
{
  • "status": "success",
  • "customer": {
    }
}

Comments

Comments and reviews visitors leave on the site, and their moderation.

List comments

Required scope: comments:read — Read comments

Authorizations:
OAuth2
query Parameters
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.

Responses

Response samples

Content type
application/json
{
  • "status": "success",
  • "items": [
    ],
  • "pagination": {
    }
}

Delete a comment

Required scope: comments:write — Moderate and delete comments

Authorizations:
OAuth2
path Parameters
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.

Responses

Response samples

Content type
application/json
{
  • "status": "success"
}

Moderate a comment

Required scope: comments:write — Moderate and delete comments

Authorizations:
OAuth2
path Parameters
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.

Request Body schema: application/json
required
status
required
integer
Enum: 0 1 2

The moderation decision: 0 awaiting moderation, 1 approved, 2 rejected.

Responses

Request samples

Content type
application/json
{
  • "status": 1
}

Response samples

Content type
application/json
{
  • "status": "success",
  • "comment": {
    }
}

Products

The catalogue, its variants and its stock.

In the help centre: Products.

List products

Required scope: products:read — Read products, variants, images and bundles

Authorizations:
OAuth2
query Parameters
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.

Responses

Response samples

Content type
application/json
{
  • "status": "success",
  • "items": [
    ],
  • "pagination": {
    }
}

Create a product

Required scope: products:write — Create, change and delete products and their variants

Authorizations:
OAuth2
Request Body schema: application/json
required
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 price_cents. null ends the sale.

stock
integer

The absolute stock level. Use POST /products/{uuid}/stock/adjust for day-to-day movements: a delta does not overwrite what another app just wrote.

archived
boolean

Archived products stay for existing orders but leave the shop.

seo
object

Search-engine metadata: meta_description and focus_keyword.

Responses

Request samples

Content type
application/json
{
  • "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": {
    }
}

Response samples

Content type
application/json
{
  • "status": "success",
  • "product": {
    }
}

Set variant stock

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

Authorizations:
OAuth2
path Parameters
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.

Request Body schema: application/json
required
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.

Responses

Request samples

Content type
application/json
{
  • "stock": 12
}

Response samples

Content type
application/json
{
  • "status": "success",
  • "variant": {
    }
}

Replace variant metafields

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

Authorizations:
OAuth2
path Parameters
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.

Request Body schema: application/json
required
metafields
required
Array of objects

The full set of metafields for the variant, each {name, type, value}. Metafields that are not included are dropped. Stock, properties and facets are left untouched.

Responses

Request samples

Content type
application/json
{
  • "metafields": [
    ]
}

Response samples

Content type
application/json
{
  • "status": "success",
  • "variant": {
    }
}

Read product stock

Required scope: inventory:read — Read stock levels and stock locations

Authorizations:
OAuth2
path Parameters
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.

Responses

Response samples

Content type
application/json
{
  • "status": "success",
  • "uuid": "0192c50a-8d21-7b45-9e6f-0c73a2915d8b",
  • "stock": 7,
  • "transactions": [
    ],
  • "transactions_total": 14
}

List stock changes

Required scope: inventory:read — Read stock levels and stock locations

Authorizations:
OAuth2
path Parameters
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.

query Parameters
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.

Responses

Response samples

Content type
application/json
{
  • "status": "success",
  • "items": [
    ],
  • "pagination": {
    }
}

Adjust product stock

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

Authorizations:
OAuth2
path Parameters
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.

Request Body schema: application/json
required
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.

Responses

Request samples

Content type
application/json
{
  • "delta": -1
}

Response samples

Content type
application/json
{
  • "status": "success",
  • "uuid": "0192c50a-8d21-7b45-9e6f-0c73a2915d8b",
  • "stock": 7
}

List product images

The images attached to a product, in display order.

Required scope: products:read — Read products, variants, images and bundles

Authorizations:
OAuth2
path Parameters
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.

Responses

Response samples

Content type
application/json
{}

Replace product images

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

Authorizations:
OAuth2
path Parameters
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.

Request Body schema: application/json
required
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 [] detaches all of them.

Responses

Request samples

Content type
application/json
{
  • "media": [
    ]
}

Response samples

Content type
application/json
{}

List product options

Required scope: products:read — Read products, variants, images and bundles

Authorizations:
OAuth2
path Parameters
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.

Responses

Response samples

Content type
application/json
{
  • "status": "success",
  • "options": [
    ]
}

Replace product options

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

Authorizations:
OAuth2
path Parameters
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.

Request Body schema: application/json
required
options
required
Array of objects

The full set of options for the product, each {name, values}. Options that are not included are removed. Changing options does not touch the variants; upsert those separately.

Responses

Request samples

Content type
application/json
{
  • "options": [
    ]
}

Response samples

Content type
application/json
{
  • "status": "success",
  • "options": [
    ]
}

List product variants

Required scope: products:read — Read products, variants, images and bundles

Authorizations:
OAuth2
path Parameters
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.

Responses

Response samples

Content type
application/json
{
  • "status": "success",
  • "variants": [
    ]
}

Upsert product variants

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

Authorizations:
OAuth2
path Parameters
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.

Request Body schema: application/json
required
variants
required
Array of objects

The full set of variants for the product; variants that are not included are removed. Pass a variant's uuid to update it in place, or omit it to create a new one. optionValues maps each option name to the chosen value.

Responses

Request samples

Content type
application/json
{
  • "variants": [
    ]
}

Response samples

Content type
application/json
{
  • "status": "success",
  • "variants": [
    ]
}

Delete a product variant

Required scope: products:write — Create, change and delete products and their variants

Authorizations:
OAuth2
path Parameters
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.

Responses

Response samples

Content type
application/json
{
  • "status": "success"
}

Get a product

Required scope: products:read — Read products, variants, images and bundles

Authorizations:
OAuth2
path Parameters
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.

Responses

Response samples

Content type
application/json
{
  • "status": "success",
  • "product": {
    }
}

Delete a product

Required scope: products:write — Create, change and delete products and their variants

Authorizations:
OAuth2
path Parameters
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.

Responses

Response samples

Content type
application/json
{
  • "status": "success"
}

Update a product

Required scope: products:write — Create, change and delete products and their variants

Authorizations:
OAuth2
path Parameters
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.

Request Body schema: application/json
optional
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 price_cents. null ends the sale.

stock
integer

The absolute stock level. Use POST /products/{uuid}/stock/adjust for day-to-day movements: a delta does not overwrite what another app just wrote.

archived
boolean

Archived products stay for existing orders but leave the shop.

seo
object

Search-engine metadata: meta_description and focus_keyword.

Responses

Request samples

Content type
application/json
{
  • "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": {
    }
}

Response samples

Content type
application/json
{
  • "status": "success",
  • "product": {
    }
}

Collections

Named groups of products, described by rules rather than a fixed membership list.

In the help centre: Products.

List collections

List collections.

Required scope: collections:read — Read collections and their rules

Authorizations:
OAuth2
query Parameters
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.

Responses

Response samples

Content type
application/json
{
  • "status": "success",
  • "items": [
    ],
  • "pagination": {
    }
}

Create a collection

Create a collection, optionally with its rules.

Required scope: collections:write — Create, change and delete collections

Authorizations:
OAuth2
Request Body schema: application/json
required
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 PUT /collections/{uuid}/rules, applied as part of creating the collection.

Responses

Request samples

Content type
application/json
{
  • "name": "Racefietsen",
  • "slug": "road-bikes",
  • "rules": [
    ]
}

Response samples

Content type
application/json
{
  • "status": "success",
  • "collection": {
    }
}

List collection rules

Read the rules that decide what a collection contains.

Required scope: collections:read — Read collections and their rules

Authorizations:
OAuth2
path Parameters
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.

Responses

Response samples

Content type
application/json
{
  • "status": "success",
  • "rules": [
    ]
}

Replace collection rules

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

Authorizations:
OAuth2
path Parameters
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.

Request Body schema: application/json
required
rules
required
Array of objects

The whole rule set. Each rule needs a column (the product field to match on) and a value; exact decides whether the value has to match in full or only be contained, and defaults to true.

Responses

Request samples

Content type
application/json
{
  • "rules": [
    ]
}

Response samples

Content type
application/json
{
  • "status": "success",
  • "rules": [
    ]
}

Get a collection

Read one collection.

Required scope: collections:read — Read collections and their rules

Authorizations:
OAuth2
path Parameters
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.

Responses

Response samples

Content type
application/json
{
  • "status": "success",
  • "collection": {
    }
}

Delete a collection

Delete a collection and its rules.

Required scope: collections:write — Create, change and delete collections

Authorizations:
OAuth2
path Parameters
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.

Responses

Response samples

Content type
application/json
{
  • "status": "success"
}

Update a collection

Change a collection.

Required scope: collections:write — Create, change and delete collections

Authorizations:
OAuth2
path Parameters
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.

Request Body schema: application/json
optional
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.

Responses

Request samples

Content type
application/json
{
  • "name": "Racefietsen",
  • "slug": "road-bikes",
  • "rules": [
    ]
}

Response samples

Content type
application/json
{
  • "status": "success",
  • "collection": {
    }
}

Orders

Webshop orders: reading them, creating them and moving them through their statuses.

In the help centre: Orders.

List orders

Required scope: orders:read — Read webshop orders, their items and payments

Authorizations:
OAuth2
query Parameters
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.

Responses

Response samples

Content type
application/json
{
  • "status": "success",
  • "items": [
    ],
  • "pagination": {
    }
}

Create an order

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

Authorizations:
OAuth2
Request Body schema: application/json
required
items
required
Array of objects

The line items: product_uuid and quantity (at least 1). A product with option variants is ordered per variant: set variant_uuid (from GET /products/{uuid}/variants) to the size or colour to send; the variant's price and stock then apply. Prices come from the catalogue - a price sent here is ignored. Stock is taken as soon as the order is placed.

customer
required
object

Who the order is for. email, first_name, last_name, street, number, postal_code, city and country_code are required; number_addition, phone_number, business, company_name and vat_number are optional.

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 gateway__method, the method being a number. Defaults to api__98 (manual invoice): the order is created unpaid, and taking money stays a PSP concern.

Responses

Request samples

Content type
application/json
{
  • "items": [
    ],
  • "customer": {
    },
  • "discount_code": "LENTE10",
  • "comment": "Please deliver after 5 pm.",
  • "delivery_method": "1",
  • "payment_method": "api__98"
}

Response samples

Content type
application/json
{
  • "status": "success",
  • "order": {
    }
}

List order payments

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

Authorizations:
OAuth2
path Parameters
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.

Responses

Response samples

Content type
application/json
{
  • "status": "success",
  • "payments": [
    ]
}

Get an order

Required scope: orders:read — Read webshop orders, their items and payments

Authorizations:
OAuth2
path Parameters
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.

Responses

Response samples

Content type
application/json
{
  • "status": "success",
  • "order": {
    }
}

Change an order status

Required scope: orders:write — Create orders and change their status

Authorizations:
OAuth2
path Parameters
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.

Request Body schema: application/json
required
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. null clears it.

Responses

Request samples

Content type
application/json
{
  • "status": 4,
  • "comment": "Shipped with PostNL."
}

Response samples

Content type
application/json
{
  • "status": "success",
  • "order": {
    }
}

Discounts

Discount codes.

In the help centre: Shop settings.

List discount codes

Required scope: discounts:read — Read discount codes

Authorizations:
OAuth2
query Parameters
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.

Responses

Response samples

Content type
application/json
{
  • "status": "success",
  • "items": [
    ],
  • "pagination": {
    }
}

Create a discount code

Required scope: discounts:write — Create, change and delete discount codes

Authorizations:
OAuth2
Request Body schema: application/json
required
code
required
string

The code a customer types at checkout. Stored upper-case and unique per site.

type
string
Enum: "fixed" "percentage"

What value means. Defaults to fixed.

value
required
integer

An amount in cents for fixed, or a whole percentage (1-100) for percentage.

Responses

Request samples

Content type
application/json
{
  • "code": "LENTE10",
  • "type": "percentage",
  • "value": 10
}

Response samples

Content type
application/json
{
  • "status": "success",
  • "discount_code": {
    }
}

Get a discount code

Required scope: discounts:read — Read discount codes

Authorizations:
OAuth2
path Parameters
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.

Responses

Response samples

Content type
application/json
{
  • "status": "success",
  • "discount_code": {
    }
}

Archive a discount code

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

Authorizations:
OAuth2
path Parameters
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.

Responses

Response samples

Content type
application/json
{
  • "status": "success"
}

Shipping

Shipping labels, read only: buying one costs money at a carrier and cannot be undone.

In the help centre: Shop settings.

List shipping labels

List shipping labels, optionally for one order.

Required scope: shipping:read — Read shipping labels and their track and trace codes

Authorizations:
OAuth2
query Parameters
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.

Responses

Response samples

Content type
application/json
{
  • "status": "success",
  • "items": [
    ],
  • "pagination": {
    }
}

Get a shipping label

Read one shipping label, including its track and trace code.

Required scope: shipping:read — Read shipping labels and their track and trace codes

Authorizations:
OAuth2
path Parameters
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.

Responses

Response samples

Content type
application/json
{
  • "status": "success",
  • "shipping_label": {
    }
}

Content

Pages: their metadata, their element tree and their publish state.

In the help centre: Managing content.

Check a slug is free

Required scope: content:read — Read pages, their elements and revisions

Authorizations:
OAuth2
query Parameters
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.

Responses

Response samples

Content type
application/json
{
  • "status": "success",
  • "slug": "about-us",
  • "valid": false
}

List pages

Required scope: content:read — Read pages, their elements and revisions

Authorizations:
OAuth2
query Parameters
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.

Responses

Response samples

Content type
application/json
{
  • "status": "success",
  • "items": [
    ],
  • "pagination": {
    }
}

Create a page

Required scope: content:write — Create, change, publish and delete pages

Authorizations:
OAuth2
Request Body schema: application/json
required
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 page.

status
string
Enum: "published" "draft"

Defaults to draft, so a page an app is still filling in is not live yet.

parent_uuid
string

Nest the page under another page. Send null to move it back to the top level.

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 landing_page.

image
string

The header image URL. Send null to clear it.

seo
object

Search-engine metadata: custom_title, meta_description, open_graph_description, focus_keyword and no_index. Only the keys you send are written.

elements
Array of objects

The element tree. Sanitised on the way in: inline style= attributes are stripped and scripting removed.

Responses

Request samples

Content type
application/json
{
  • "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": {
    },
  • "elements": [
    ]
}

Response samples

Content type
application/json
{
  • "status": "success",
  • "content": {
    }
}

Publish a page

Required scope: content:write — Create, change, publish and delete pages

Authorizations:
OAuth2
path Parameters
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.

Responses

Response samples

Content type
application/json
{
  • "status": "success",
  • "content": {
    }
}

Unpublish a page

Required scope: content:write — Create, change, publish and delete pages

Authorizations:
OAuth2
path Parameters
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.

Responses

Response samples

Content type
application/json
{
  • "status": "success",
  • "content": {
    }
}

List page revisions

The stored revisions of a page: what it looked like before each save.

Required scope: content:read — Read pages, their elements and revisions

Authorizations:
OAuth2
path Parameters
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.

Responses

Response samples

Content type
application/json
{
  • "status": "success",
  • "revisions": [
    ]
}

Restore a page revision

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

Authorizations:
OAuth2
path Parameters
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 GET /content/{uuid}/revisions.

Responses

Response samples

Content type
application/json
{
  • "status": "success",
  • "content": {
    }
}

Get page elements

Required scope: content:read — Read pages, their elements and revisions

Authorizations:
OAuth2
path Parameters
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.

Responses

Response samples

Content type
application/json
{
  • "status": "success",
  • "uuid": "0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c",
  • "elements": [
    ]
}

Replace page elements

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

Authorizations:
OAuth2
path Parameters
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.

Request Body schema: application/json
required
elements
required
Array of objects

The whole element tree, in render order. Sending [] empties the page. Inline style= attributes are stripped and their alignment and colour lifted into settings; scripting is removed.

Responses

Request samples

Content type
application/json
{
  • "elements": [
    ]
}

Response samples

Content type
application/json
{
  • "status": "success",
  • "uuid": "0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c",
  • "elements": [
    ]
}

Get a page

Required scope: content:read — Read pages, their elements and revisions

Authorizations:
OAuth2
path Parameters
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.

Responses

Response samples

Content type
application/json
{
  • "status": "success",
  • "content": {
    }
}

Delete a page

Required scope: content:write — Create, change, publish and delete pages

Authorizations:
OAuth2
path Parameters
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.

Responses

Response samples

Content type
application/json
{
  • "status": "success"
}

Update a page

Required scope: content:write — Create, change, publish and delete pages

Authorizations:
OAuth2
path Parameters
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.

Request Body schema: application/json
optional
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 page.

status
string
Enum: "published" "draft"

Defaults to draft, so a page an app is still filling in is not live yet.

parent_uuid
string

Nest the page under another page. Send null to move it back to the top level.

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 landing_page.

image
string

The header image URL. Send null to clear it.

seo
object

Search-engine metadata: custom_title, meta_description, open_graph_description, focus_keyword and no_index. Only the keys you send are written.

elements
Array of objects

The element tree. Sanitised on the way in: inline style= attributes are stripped and scripting removed.

Responses

Request samples

Content type
application/json
{
  • "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": {
    },
  • "elements": [
    ]
}

Response samples

Content type
application/json
{
  • "status": "success",
  • "content": {
    }
}

Blogs

Blog posts. Publishing one also indexes it for site search.

In the help centre: Managing content.

List blog posts

Required scope: blogs:read — Read blog posts and blog categories

Authorizations:
OAuth2
query Parameters
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.

Responses

Response samples

Content type
application/json
{
  • "status": "success",
  • "items": [
    ],
  • "pagination": {
    }
}

Create a blog post

Required scope: blogs:write — Create, change, publish and delete blog posts

Authorizations:
OAuth2
Request Body schema: application/json
required
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 draft. Publishing also indexes the post for site search.

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: custom_title, meta_description and focus_keyword.

elements
Array of objects

The element tree of the post, sanitised the same way a page's is.

Responses

Request samples

Content type
application/json
{
  • "title": "Winter tyres: what to look for",
  • "slug": "winter-tyres-what-to-look-for",
  • "status": "draft",
  • "tags": [
    ],
  • "seo": {
    },
  • "elements": [
    ]
}

Response samples

Content type
application/json
{
  • "status": "success",
  • "blog": {
    }
}

Publish a blog post

Required scope: blogs:write — Create, change, publish and delete blog posts

Authorizations:
OAuth2
path Parameters
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.

Responses

Response samples

Content type
application/json
{
  • "status": "success",
  • "blog": {
    }
}

Unpublish a blog post

Required scope: blogs:write — Create, change, publish and delete blog posts

Authorizations:
OAuth2
path Parameters
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.

Responses

Response samples

Content type
application/json
{
  • "status": "success",
  • "blog": {
    }
}

Get a blog post

Required scope: blogs:read — Read blog posts and blog categories

Authorizations:
OAuth2
path Parameters
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.

Responses

Response samples

Content type
application/json
{
  • "status": "success",
  • "blog": {
    }
}

Delete a blog post

Required scope: blogs:write — Create, change, publish and delete blog posts

Authorizations:
OAuth2
path Parameters
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.

Responses

Response samples

Content type
application/json
{
  • "status": "success"
}

Update a blog post

Required scope: blogs:write — Create, change, publish and delete blog posts

Authorizations:
OAuth2
path Parameters
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.

Request Body schema: application/json
optional
title
string

The post title.

slug
string

The URL segment. Derived from the title when left out.

status
string
Enum: "published" "draft"

Defaults to draft. Publishing also indexes the post for site search.

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: custom_title, meta_description and focus_keyword.

elements
Array of objects

The element tree of the post, sanitised the same way a page's is.

Responses

Request samples

Content type
application/json
{
  • "title": "Winter tyres: what to look for",
  • "slug": "winter-tyres-what-to-look-for",
  • "status": "draft",
  • "tags": [
    ],
  • "seo": {
    },
  • "elements": [
    ]
}

Response samples

Content type
application/json
{
  • "status": "success",
  • "blog": {
    }
}

Post types

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.

List post types

Required scope: posts:read — Read the post types installed apps add to the site, and their entries

Authorizations:
OAuth2

Responses

Response samples

Content type
application/json
{
  • "status": "success",
  • "post_types": [
    ]
}

Get a post type

Required scope: posts:read — Read the post types installed apps add to the site, and their entries

Authorizations:
OAuth2
path Parameters
postType
required
string[a-z0-9-]+
Example: cinemas

The post type key, as returned by GET /post-types.

Responses

Response samples

Content type
application/json
{
  • "status": "success",
  • "post_type": {
    }
}

Get a post type overview page

Required scope: posts:read — Read the post types installed apps add to the site, and their entries

Authorizations:
OAuth2
path Parameters
postType
required
string[a-z0-9-]+
Example: cinemas

The post type key, as returned by GET /post-types.

Responses

Response samples

Content type
application/json
{
  • "status": "success",
  • "archive": {
    }
}

Update a post type overview page

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

Authorizations:
OAuth2
path Parameters
postType
required
string[a-z0-9-]+
Example: cinemas

The post type key, as returned by GET /post-types.

Request Body schema: application/json
optional
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.

Responses

Request samples

Content type
application/json
{
  • "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
}

Response samples

Content type
application/json
{
  • "status": "success",
  • "archive": {
    }
}

List post entries

Required scope: posts:read — Read the post types installed apps add to the site, and their entries

Authorizations:
OAuth2
path Parameters
postType
required
string[a-z0-9-]+
Example: cinemas

The post type key, as returned by GET /post-types.

query Parameters
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.

Responses

Response samples

Content type
application/json
{
  • "status": "success",
  • "items": [
    ],
  • "pagination": {
    }
}

Create a post entry

Required scope: posts:write — Create, change and delete entries of the post types installed apps add

Authorizations:
OAuth2
path Parameters
postType
required
string[a-z0-9-]+
Example: cinemas

The post type key, as returned by GET /post-types.

Request Body schema: application/json
required
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 fields_schema of the post type. Required fields must be filled.

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.

Responses

Request samples

Content type
application/json
{
  • "title": "Vue Arnhem",
  • "slug": "vue-arnhem",
  • "fields": {
    },
  • "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
}

Response samples

Content type
application/json
{
  • "status": "success",
  • "entry": {
    }
}

Get a post entry

Required scope: posts:read — Read the post types installed apps add to the site, and their entries

Authorizations:
OAuth2
path Parameters
postType
required
string[a-z0-9-]+
Example: cinemas

The post type key, as returned by GET /post-types.

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.

Responses

Response samples

Content type
application/json
{
  • "status": "success",
  • "entry": {
    }
}

Delete a post entry

Required scope: posts:write — Create, change and delete entries of the post types installed apps add

Authorizations:
OAuth2
path Parameters
postType
required
string[a-z0-9-]+
Example: cinemas

The post type key, as returned by GET /post-types.

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.

Responses

Response samples

Content type
application/json
{
  • "status": "success"
}

Update a post entry

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

Authorizations:
OAuth2
path Parameters
postType
required
string[a-z0-9-]+
Example: cinemas

The post type key, as returned by GET /post-types.

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.

Request Body schema: application/json
optional
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 fields_schema of the post type. A field left out keeps its value; a field sent as null is cleared.

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.

Responses

Request samples

Content type
application/json
{
  • "title": "Vue Arnhem",
  • "slug": "vue-arnhem",
  • "fields": {
    },
  • "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
}

Response samples

Content type
application/json
{
  • "status": "success",
  • "entry": {
    }
}

Elements

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.

List element areas

List the areas an app may address.

Required scope: elements:read — Read homepage, footer and sidebar elements

Authorizations:
OAuth2

Responses

Response samples

Content type
application/json
{
  • "status": "success",
  • "areas": [
    ]
}

Get an element area

Read one element area.

Required scope: elements:read — Read homepage, footer and sidebar elements

Authorizations:
OAuth2
path Parameters
area
required
string
Example: footer

The element area: homepage, footer or sidebar.

Responses

Response samples

Content type
application/json
{
  • "status": "success",
  • "area": "footer",
  • "elements": [
    ]
}

Replace an element area

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

Authorizations:
OAuth2
path Parameters
area
required
string
Example: footer

The element area: homepage, footer or sidebar.

Request Body schema: application/json
required
elements
required
Array of objects

The whole area, in render order. Every element needs a type; sort_order defaults to the position in the array.

Responses

Request samples

Content type
application/json
{
  • "elements": [
    ]
}

Response samples

Content type
application/json
{
  • "status": "success",
  • "area": "footer",
  • "elements": [
    ]
}

Navigation

Menus and their items, including reordering.

In the help centre: Menus and navigation.

List navigations

Required scope: navigation:read — Read navigations and their items

Authorizations:
OAuth2

Responses

Response samples

Content type
application/json
{
  • "status": "success",
  • "navigations": [
    ]
}

Delete a navigation item

Required scope: navigation:write — Change navigations and their items

Authorizations:
OAuth2
path Parameters
uuid
required
string
Example: 0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c

The uuid of the navigation item. Uuids are unique per site: one from another site reads as not found.

Responses

Response samples

Content type
application/json
{
  • "status": "success"
}

Update a navigation item

Required scope: navigation:write — Change navigations and their items

Authorizations:
OAuth2
path Parameters
uuid
required
string
Example: 0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c

The uuid of the navigation item. Uuids are unique per site: one from another site reads as not found.

Request Body schema: application/json
optional
label
string

The text shown in the menu.

url
string

Where the item points.

sort_order
integer

Position within the menu; lower comes first.

parent_uuid
string

Nest this item under another item. Send null to move it back to the top level.

display_as_button
boolean

Render the item as a button.

Responses

Request samples

Content type
application/json
{
  • "label": "About us",
  • "url": "/about-us",
  • "sort_order": 30,
  • "parent_uuid": "0192c5a4-6d29-7c85-8e13-52af7b904d61",
  • "display_as_button": true
}

Response samples

Content type
application/json
{
  • "status": "success",
  • "item": {
    }
}

List navigation items

Required scope: navigation:read — Read navigations and their items

Authorizations:
OAuth2
path Parameters
section
required
string
Example: main

The navigation section, as returned by GET /navigations.

Responses

Response samples

Content type
application/json
{
  • "status": "success",
  • "section": "main",
  • "items": [
    ]
}

Reorder a navigation

Reorder a whole navigation in one call: the "items" array of uuids is the new order. Nothing is written unless every uuid resolves, so a typo cannot leave a menu half reordered.

Required scope: navigation:write — Change navigations and their items

Authorizations:
OAuth2
path Parameters
section
required
string
Example: main

The navigation section, as returned by GET /navigations.

Request Body schema: application/json
required
items
required
Array of objects

The item uuids in their new order. Every item of the menu has to be listed; nothing is written unless all of them resolve.

Responses

Request samples

Content type
application/json
{
  • "items": [
    ]
}

Response samples

Content type
application/json
{
  • "status": "success",
  • "section": "main",
  • "items": [
    ]
}

Add a navigation item

Required scope: navigation:write — Change navigations and their items

Authorizations:
OAuth2
path Parameters
section
required
string
Example: main

The navigation section, as returned by GET /navigations.

Request Body schema: application/json
required
label
required
string

The text shown in the menu.

url
required
string

Where the item points. A site-relative path or an absolute URL.

sort_order
integer

Position within the menu; lower comes first. Defaults to 20.

content_uuid
string

The page this item links to, when it links to one. Kept so the item follows the page if its slug changes.

category_uuid
string

The category this item links to, when it links to one.

parent_uuid
string

Nest this item under another item of the same menu.

display_as_button
boolean

Render the item as a button rather than a link. Defaults to false.

Responses

Request samples

Content type
application/json
{
  • "label": "About us",
  • "url": "/about-us",
  • "sort_order": 30,
  • "content_uuid": "0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c",
  • "category_uuid": "0192c4d7-6512-7ab8-91cf-4e2a7b60d938",
  • "parent_uuid": "0192c5a4-6d29-7c85-8e13-52af7b904d61",
  • "display_as_button": false
}

Response samples

Content type
application/json
{
  • "status": "success",
  • "item": {
    }
}

Translations

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.

List site locales

Required scope: translations:read — Read content translations and site locales

Authorizations:
OAuth2

Responses

Response samples

Content type
application/json
{
  • "status": "success",
  • "locales": [
    ]
}

List what needs translating

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

Authorizations:
OAuth2
path Parameters
locale
required
string
Example: de

A locale that is active on this site. GET /translations/locales lists them.

query Parameters
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.

Responses

Response samples

Content type
application/json
{
  • "status": "success",
  • "locale": "de",
  • "missing": [
    ],
  • "needs_review": [
    ],
  • "totals": {
    }
}

Read translation coverage

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

Authorizations:
OAuth2

Responses

Response samples

Content type
application/json
{
  • "status": "success",
  • "locales": [
    ]
}

List an item's translations

Required scope: translations:read — Read content translations and site locales

Authorizations:
OAuth2
path Parameters
type
required
string
Example: page

The translatable content type: page, blog, product or category.

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.

Responses

Response samples

Content type
application/json
{
  • "status": "success",
  • "type": "page",
  • "uuid": "0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c",
  • "translations": [
    ]
}

Get one locale's translation

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

Authorizations:
OAuth2
path Parameters
type
required
string
Example: page

The translatable content type: page, blog, product or category.

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. GET /translations/locales lists them.

Responses

Response samples

Content type
application/json
{
  • "status": "success",
  • "type": "page",
  • "uuid": "0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c",
  • "locale": "de",
  • "translation": {
    }
}

Save a translation

Required scope: translations:write — Create and change content translations

Authorizations:
OAuth2
path Parameters
type
required
string
Example: page

The translatable content type: page, blog, product or category.

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. GET /translations/locales lists them.

Request Body schema: application/json
required
values
required
object

The translated strings, keyed by the path of the unit they belong to. field#… paths are the item's own fields, region#… paths are strings inside its element tree. A path left out keeps its current translation; an empty string clears one.

Responses

Request samples

Content type
application/json
{
  • "values": {
    }
}

Response samples

Content type
application/json
{
  • "status": "success",
  • "translation": {
    }
}

Delete a translation

Required scope: translations:write — Create and change content translations

Authorizations:
OAuth2
path Parameters
type
required
string
Example: page

The translatable content type: page, blog, product or category.

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. GET /translations/locales lists them.

Responses

Response samples

Content type
application/json
{
  • "status": "success"
}

Save a translation

Required scope: translations:write — Create and change content translations

Authorizations:
OAuth2
path Parameters
type
required
string
Example: page

The translatable content type: page, blog, product or category.

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. GET /translations/locales lists them.

Request Body schema: application/json
required
values
required
object

The translated strings, keyed by the path of the unit they belong to. field#… paths are the item's own fields, region#… paths are strings inside its element tree. A path left out keeps its current translation; an empty string clears one.

Responses

Request samples

Content type
application/json
{
  • "values": {
    }
}

Response samples

Content type
application/json
{
  • "status": "success",
  • "translation": {
    }
}

Media

The media library. Metadata only - uploading bytes goes through the upload endpoint.

In the help centre: Managing content.

List media

Required scope: media:read — Read the media library

Authorizations:
OAuth2
query Parameters
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.

Responses

Response samples

Content type
application/json
{
  • "status": "success",
  • "items": [
    ],
  • "pagination": {
    }
}

Get a media item

Required scope: media:read — Read the media library

Authorizations:
OAuth2
path Parameters
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.

Responses

Response samples

Content type
application/json
{
  • "status": "success",
  • "media": {
    }
}

Delete a media item

Required scope: media:write — Upload, change and delete media

Authorizations:
OAuth2
path Parameters
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.

Responses

Response samples

Content type
application/json
{
  • "status": "success"
}

Update a media item

Required scope: media:write — Upload, change and delete media

Authorizations:
OAuth2
path Parameters
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.

Request Body schema: application/json
optional
file_name
string

The name shown in the library. Renaming does not move the file: url stays the same.

alt_text
string

The alt text used wherever the image is rendered. null clears it.

Responses

Request samples

Content type
application/json
{
  • "file_name": "road-bike-blue.jpg",
  • "alt_text": "Blue road bike against a white wall"
}

Response samples

Content type
application/json
{
  • "status": "success",
  • "media": {
    }
}

Categories

Content and product categories.

In the help centre: Managing content.

List categories

Required scope: categories:read — Read content and product categories

Authorizations:
OAuth2
query Parameters
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.

Responses

Response samples

Content type
application/json
{
  • "status": "success",
  • "items": [
    ],
  • "pagination": {
    }
}

Create a category

Required scope: categories:write — Create, change and delete categories

Authorizations:
OAuth2
Request Body schema: application/json
required
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 blog.

parent_uuid
string

Nest under another category. Send null to move it to the top level; a category cannot be its own parent.

seo
object

Search-engine metadata: custom_title, meta_description and focus_keyword.

Responses

Request samples

Content type
application/json
{
  • "name": "Racefietsen",
  • "slug": "road-bikes",
  • "type": "product",
  • "parent_uuid": "0192c4d7-6512-7ab8-91cf-4e2a7b60d938",
  • "seo": {
    }
}

Response samples

Content type
application/json
{
  • "status": "success",
  • "category": {
    }
}

Get a category

Required scope: categories:read — Read content and product categories

Authorizations:
OAuth2
path Parameters
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.

Responses

Response samples

Content type
application/json
{
  • "status": "success",
  • "category": {
    }
}

Delete a category

Required scope: categories:write — Create, change and delete categories

Authorizations:
OAuth2
path Parameters
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.

Responses

Response samples

Content type
application/json
{
  • "status": "success"
}

Update a category

Required scope: categories:write — Create, change and delete categories

Authorizations:
OAuth2
path Parameters
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.

Request Body schema: application/json
optional
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 blog.

parent_uuid
string

Nest under another category. Send null to move it to the top level; a category cannot be its own parent.

seo
object

Search-engine metadata: custom_title, meta_description and focus_keyword.

Responses

Request samples

Content type
application/json
{
  • "name": "Racefietsen",
  • "slug": "road-bikes",
  • "type": "product",
  • "parent_uuid": "0192c4d7-6512-7ab8-91cf-4e2a7b60d938",
  • "seo": {
    }
}

Response samples

Content type
application/json
{
  • "status": "success",
  • "category": {
    }
}

Tags

Tags.

In the help centre: Managing content.

List tags

Required scope: tags:read — Read tags

Authorizations:
OAuth2
query Parameters
q
string
Example: q=maintenance

Free-text search over the tag name 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.

Responses

Response samples

Content type
application/json
{
  • "status": "success",
  • "items": [
    ],
  • "pagination": {
    }
}

Create a tag

Required scope: tags:write — Create, change and delete tags

Authorizations:
OAuth2
Request Body schema: application/json
required
name
required
string

The tag as a reader sees it.

slug
string

The URL segment. Derived from the name when left out, and unique per site.

description
string

Shown on the tag overview page.

Responses

Request samples

Content type
application/json
{
  • "name": "Onderhoud",
  • "slug": "maintenance",
  • "description": "Everything about looking after your bike."
}

Response samples

Content type
application/json
{
  • "status": "success",
  • "tag": {
    }
}

Get a tag

Required scope: tags:read — Read tags

Authorizations:
OAuth2
path Parameters
uuid
required
string
Example: 0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c

The uuid of the tag. Uuids are unique per site: one from another site reads as not found.

Responses

Response samples

Content type
application/json
{
  • "status": "success",
  • "tag": {
    }
}

Delete a tag

Required scope: tags:write — Create, change and delete tags

Authorizations:
OAuth2
path Parameters
uuid
required
string
Example: 0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c

The uuid of the tag. Uuids are unique per site: one from another site reads as not found.

Responses

Response samples

Content type
application/json
{
  • "status": "success"
}

Update a tag

Required scope: tags:write — Create, change and delete tags

Authorizations:
OAuth2
path Parameters
uuid
required
string
Example: 0192c4a1-8e2f-7a31-9c5d-6b1f0a2d4e8c

The uuid of the tag. Uuids are unique per site: one from another site reads as not found.

Request Body schema: application/json
optional
name
string

The tag as a reader sees it.

description
string

Shown on the tag overview page. null clears it.

Responses

Request samples

Content type
application/json
{
  • "name": "Onderhoud",
  • "description": "Everything about looking after your bike."
}

Response samples

Content type
application/json
{
  • "status": "success",
  • "tag": {
    }
}

Redirects

URL redirects.

In the help centre: SEO and redirects.

List redirects

Required scope: redirects:read — Read URL redirects

Authorizations:
OAuth2
query Parameters
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.

Responses

Response samples

Content type
application/json
{
  • "status": "success",
  • "items": [
    ],
  • "pagination": {
    }
}

Create a redirect

Required scope: redirects:write — Create, change and delete URL redirects

Authorizations:
OAuth2
Request Body schema: application/json
required
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).

Responses

Request samples

Content type
application/json
{
  • "from": "/oude-pagina",
  • "to": "/about-us",
  • "type": 301
}

Response samples

Content type
application/json
{
  • "status": "success",
  • "redirect": {
    }
}

Get a redirect

Required scope: redirects:read — Read URL redirects

Authorizations:
OAuth2
path Parameters
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.

Responses

Response samples

Content type
application/json
{
  • "status": "success",
  • "redirect": {
    }
}

Delete a redirect

Required scope: redirects:write — Create, change and delete URL redirects

Authorizations:
OAuth2
path Parameters
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.

Responses

Response samples

Content type
application/json
{
  • "status": "success"
}

Update a redirect

Required scope: redirects:write — Create, change and delete URL redirects

Authorizations:
OAuth2
path Parameters
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.

Request Body schema: application/json
optional
from
string

The path to redirect away from.

to
string

Where to send the visitor.

type
integer
Enum: 301 302

The HTTP status.

Responses

Request samples

Content type
application/json
{
  • "from": "/oude-pagina",
  • "to": "/about-us",
  • "type": 301
}

Response samples

Content type
application/json
{
  • "status": "success",
  • "redirect": {
    }
}

USPs

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.

List USPs

Required scope: usp:read — Read the site USPs (unique selling points)

Authorizations:
OAuth2

Responses

Response samples

Content type
application/json
{
  • "status": "success",
  • "usps": [
    ]
}

Reorder USPs

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

Authorizations:
OAuth2
Request Body schema: application/json
required
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.

Responses

Request samples

Content type
application/json
{
  • "usps": [
    ]
}

Response samples

Content type
application/json
{
  • "status": "success",
  • "usps": [
    ]
}

Create a USP

Required scope: usp:write — Create, change, reorder and delete USPs

Authorizations:
OAuth2
Request Body schema: application/json
required
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.

Responses

Request samples

Content type
application/json
{
  • "title": "Free shipping",
  • "text": "Vanaf €50 in Nederland",
  • "icon": "truck",
  • "visible": true,
  • "derive_shipping": false,
  • "sort_order": 10
}

Response samples

Content type
application/json
{
  • "status": "success",
  • "usp": {
    }
}

Get a USP

Required scope: usp:read — Read the site USPs (unique selling points)

Authorizations:
OAuth2
path Parameters
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.

Responses

Response samples

Content type
application/json
{
  • "status": "success",
  • "usp": {
    }
}

Delete a USP

Required scope: usp:write — Create, change, reorder and delete USPs

Authorizations:
OAuth2
path Parameters
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.

Responses

Response samples

Content type
application/json
{
  • "status": "success"
}

Update a USP

Required scope: usp:write — Create, change, reorder and delete USPs

Authorizations:
OAuth2
path Parameters
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.

Request Body schema: application/json
optional
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.

Responses

Request samples

Content type
application/json
{
  • "title": "Free shipping",
  • "text": "Vanaf €50 in Nederland",
  • "icon": "truck",
  • "visible": true,
  • "derive_shipping": false,
  • "sort_order": 10
}

Response samples

Content type
application/json
{
  • "status": "success",
  • "usp": {
    }
}

Theme

The active theme and its layouts, read only - so an app knows what it renders into.

In the help centre: Design and themes.

List theme layouts

List the layouts a page can be assigned to.

Required scope: themes:read — Read the active theme, its layouts and its design settings

Authorizations:
OAuth2

Responses

Response samples

Content type
application/json
{
  • "status": "success",
  • "layouts": [
    ]
}

Read theme design settings

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

Authorizations:
OAuth2

Responses

Response samples

Content type
application/json
{
  • "status": "success",
  • "theme": {
    },
  • "settings": [
    ],
  • "values": {
    },
  • "staging_overrides": {
    }
}

Change theme design settings

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

Authorizations:
OAuth2
Request Body schema: application/json
required
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.

Responses

Request samples

Content type
application/json
{
  • "settings": {
    }
}

Response samples

Content type
application/json
{
  • "status": "success",
  • "theme": {
    },
  • "settings": [
    ],
  • "values": {
    },
  • "staging_overrides": {
    }
}

Read the active theme

Read the active theme.

Required scope: themes:read — Read the active theme, its layouts and its design settings

Authorizations:
OAuth2

Responses

Response samples

Content type
application/json
{
  • "status": "success",
  • "theme": {
    }
}

Site

Site settings and statistics.

In the help centre: Site settings.

Read the site settings

Required scope: sites:read — Read the site settings, notices and brand book

Authorizations:
OAuth2

Responses

Response samples

Content type
application/json
{
  • "status": "success",
  • "site": {
    }
}

Update the site settings

Required scope: sites:write — Change the site settings, notices and brand book

Authorizations:
OAuth2
Request Body schema: application/json
optional
name
string

The site name, as shown in the admin.

locale
string

The default locale of the site. Translations hang off this one.

Responses

Request samples

Content type
application/json
{
  • "name": "Wheelhouse",
  • "locale": "en"
}

Response samples

Content type
application/json
{
  • "status": "success",
  • "site": {
    }
}

Read the social media profiles

Required scope: sites:read — Read the site settings, notices and brand book

Authorizations:
OAuth2

Responses

Response samples

Content type
application/json
{}

Update the social media profiles

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

Authorizations:
OAuth2
Request Body schema: application/json
optional
facebook
string

The Facebook profile URL, on facebook.com or fb.com. null or "" unlinks it.

twitter
string

The X / Twitter profile URL, on x.com or twitter.com. null or "" unlinks it.

instagram
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.

pinterest
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.

linkedin
string

The LinkedIn profile URL, on linkedin.com. null or "" unlinks it.

Responses

Response samples

Content type
application/json
{}

Read site statistics

Required scope: statistics:read — Read site statistics and conversions

Authorizations:
OAuth2
query Parameters
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.

Responses

Response samples

Content type
application/json
{
  • "status": "success",
  • "days": [
    ]
}

Modules

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 active modules

List the modules active on this site.

Required scope: modules:read — Read the site modules and their settings

Authorizations:
OAuth2

Responses

Response samples

Content type
application/json
{
  • "status": "success",
  • "modules": [
    ]
}

Read module settings

Read one module's settings.

Required scope: modules:read — Read the site modules and their settings

Authorizations:
OAuth2
path Parameters
key
required
string
Example: ContactForm

The module key, as returned by GET /modules.

Responses

Response samples

Content type
application/json
{
  • "status": "success",
  • "module": "ContactForm",
  • "settings": {
    }
}

Update module settings

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

Authorizations:
OAuth2
path Parameters
key
required
string
Example: ContactForm

The module key, as returned by GET /modules.

Request Body schema: application/json
required
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.

Responses

Request samples

Content type
application/json
{
  • "settings": {
    }
}

Response samples

Content type
application/json
{
  • "status": "success",
  • "module": "ContactForm",
  • "settings": {
    }
}

Billing

The site's own SitePack invoices and subscriptions, read only.

List invoices

The site's invoices.

Required scope: billing:read — Read the subscription, plan and invoices

Authorizations:
OAuth2
query Parameters
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.

Responses

Response samples

Content type
application/json
{
  • "status": "success",
  • "items": [
    ],
  • "pagination": {
    }
}

List subscriptions

Required scope: billing:read — Read the subscription, plan and invoices

Authorizations:
OAuth2

Responses

Response samples

Content type
application/json
{
  • "status": "success",
  • "subscriptions": [
    ]
}

Domains

Domains, DNS and domain ordering.

In the help centre: Domains and DNS.

Check domain availability

Required scope: domains:read — Read domains, DNS records and domain holders

Authorizations:
OAuth2
query Parameters
domain
required
string
Example: domain=wheelhouse

The name to check. Without an extension every extension we sell is checked.

Responses

Response samples

Content type
application/json
{
  • "status": "success",
  • "results": [
    ]
}

Suggest domain names

Required scope: domains:read — Read domains, DNS records and domain holders

Authorizations:
OAuth2

Responses

Response samples

Content type
application/json
{
  • "status": "success",
  • "suggestions": [
    ]
}

Order a domain

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

Authorizations:
OAuth2
Request Body schema: application/json
required
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 GET /domains/holders. The site's default holder is used when it is left out.

Responses

Request samples

Content type
application/json
{
  • "domains": [
    ],
  • "holder_uuid": "0192c5c6-8a34-7b19-9d02-46e5f7013b8a"
}

Response samples

Content type
application/json
{
  • "status": "success",
  • "order_uuid": "0192c5e8-4c19-7a53-b806-7d2f5a91e0c4",
  • "added": [
    ],
  • "skipped": [ ],
  • "charged": false,
  • "checkout_url": "/admin/shop/checkout/0192c5e8-4c19-7a53-b806-7d2f5a91e0c4"
}

List domain holders

The registrant contacts available on this site.

Required scope: domains:read — Read domains, DNS records and domain holders

Authorizations:
OAuth2

Responses

Response samples

Content type
application/json
{
  • "status": "success",
  • "holders": [
    ]
}

List domains

Required scope: domains:read — Read domains, DNS records and domain holders

Authorizations:
OAuth2

Responses

Response samples

Content type
application/json
{
  • "status": "success",
  • "domains": [
    ]
}

List DNS records

Required scope: domains:read — Read domains, DNS records and domain holders

Authorizations:
OAuth2
path Parameters
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.

Responses

Response samples

Content type
application/json
{
  • "status": "success",
  • "records": {
    }
}

Replace DNS records

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

Authorizations:
OAuth2
path Parameters
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.

Request Body schema: application/json
required
records
required
Array of objects

The whole zone. Each record needs type, name and value; priority is for MX and SRV. An empty array is refused - it would take the domain offline.

Responses

Request samples

Content type
application/json
{
  • "records": [
    ]
}

Response samples

Content type
application/json
{
  • "status": "success",
  • "domain": "wheelhouse.nl",
  • "records": [
    ],
  • "changes": {
    }
}

Get a domain

Required scope: domains:read — Read domains, DNS records and domain holders

Authorizations:
OAuth2
path Parameters
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.

Responses

Response samples

Content type
application/json
{
  • "status": "success",
  • "domain": {
    }
}

Mail

Mailbox provisioning.

In the help centre: Mail services.

Read free mailbox slots

Required scope: mail:read — Read mailboxes and mailbox slots

Authorizations:
OAuth2

Responses

Response samples

Content type
application/json
{
  • "status": "success",
  • "used": 2,
  • "total": 3,
  • "free": 1
}

List mailboxes

Required scope: mail:read — Read mailboxes and mailbox slots

Authorizations:
OAuth2

Responses

Response samples

Content type
application/json
{
  • "status": "success",
  • "mailboxes": [
    ]
}

Create a mailbox

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

Authorizations:
OAuth2
Request Body schema: application/json
required
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.

Responses

Request samples

Content type
application/json
{
  • "local_part": "sales",
  • "domain": "wheelhouse.nl"
}

Response samples

Content type
application/json
{
  • "status": "success",
  • "mailbox": {
    },
  • "password": "f3a91c07d24b8e65",
  • "charged": false
}

Read mailbox usage

Required scope: mail:read — Read mailboxes and mailbox slots

Authorizations:
OAuth2
path Parameters
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.

Responses

Response samples

Content type
application/json
{
  • "status": "success",
  • "quota": {
    }
}

Change a mailbox password

Required scope: mail:write — Create, change and delete mailboxes within the free slots

Authorizations:
OAuth2
path Parameters
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.

Responses

Response samples

Content type
application/json
{
  • "status": "success",
  • "password": "b70e14c9a5d2f831"
}

Get a mailbox

Required scope: mail:read — Read mailboxes and mailbox slots

Authorizations:
OAuth2
path Parameters
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.

Responses

Response samples

Content type
application/json
{
  • "status": "success",
  • "mailbox": {
    }
}

Delete a mailbox

Required scope: mail:write — Create, change and delete mailboxes within the free slots

Authorizations:
OAuth2
path Parameters
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.

Responses

Response samples

Content type
application/json
{
  • "status": "success"
}