API Endpoints
Every endpoint an API integration can call, on one page. Each row links to the API Reference, where you find the parameters, the request body and example responses.
The basics
- Base URL:
https://api.sitepack.eu - Paths:
/api/public/v1/...for site data,/api/authentication/oauth/...for tokens. - Authentication:
X-SitePack-Access-Token: <access_token>on every request.Authorization: Bearer <access_token>works too. - Format: JSON in and out. Send
Content-Type: application/jsonwith a body. - One site per token: the site is never part of the URL. An app on ten sites holds ten tokens.
You get the access token through the OAuth flow. It lasts an hour; refresh it with the refresh token.
GET https://api.sitepack.eu/api/public/v1/leads/0192c560-3e91-7c25-86ab-1d47f0b93e58
X-SitePack-Access-Token: YOUR_ACCESS_TOKEN
{
"status": "success",
"lead": {
"uuid": "0192c560-3e91-7c25-86ab-1d47f0b93e58",
"email": "emma@example.com",
"first_name": "Emma",
"last_name": "Clarke",
"company_name": null,
"phone": "+44 20 7946 0958",
"city": "London",
"country": "GB",
"source": "Contact form",
"status": 1,
"created": "2026-06-12T10:58:03+00:00"
}
}
Lists and pagination
A list endpoint takes page (from 1) and limit (25 by default, at most 100) and answers with items and pagination:
{
"status": "success",
"items": [ { "uuid": "..." } ],
"pagination": { "page": 1, "limit": 25, "totalRecords": 87, "totalPages": 4 }
}
A page past the end comes back empty, not as an error.
Errors
An error has "status": "error" and an error object. Switch on error.code, never on the message:
{
"status": "error",
"error": { "code": "scope_required", "message": "...", "scope": "leads:read" }
}
| Status | Meaning | What to do |
|---|---|---|
400 | Malformed request. | Check the JSON body. |
401 | No token, or the token is invalid or expired. | Refresh the token. If refreshing fails, the merchant removed your app. |
403 | Your app lacks the scope, or the installation is no longer active. | Add the scope to auth.scopes in app.json; the merchant approves it on the next consent. |
404 | Not found on this site. | A uuid from another site is always not found. |
409 | Conflict, such as a slug that is taken. | The message says what conflicts. |
422 | Validation failed. | error.field names the field. |
429 | Too many requests. | Wait the number of seconds in Retry-After. |
500 | Failed on our side (internal_error). | Retry later; contact us if it keeps failing. |
Rate limits
Every response carries your budget:
X-SitePack-RateLimit: 600
X-SitePack-RateLimit-Tokens: 574
X-SitePack-RateLimit-Reset: 1750000060
| Bucket | Limit | Counted per |
|---|---|---|
| Everything | 600 per minute | installation (your app on one site) |
Endpoints behind an :order scope | 20 per hour | installation |
| The OAuth endpoints | 120 per minute | IP address |
Because the main budget is per installation, serving many merchants from one server does not slow you down.
From a webhook to the data
Webhooks tell you that something happened, not what. The payload holds the uuid of the record in arguments.uuid; you read the record with the matching endpoint. That way your scopes are checked when you read, and you always get the current version.
For example, a new lead:
{
"uuid": "019f4a1c-5e2b-7d10-8a3e-2f6c9b1d0e47",
"test_mode": false,
"topic": "lead.created",
"site": "019eca47-21a4-7935-8636-641e7370897b",
"created_at": "2026-10-07T09:12:44Z",
"arguments": { "uuid": "0192c560-3e91-7c25-86ab-1d47f0b93e58" }
}
- Verify the signature, see Webhooks.
- Look up the access token you stored for
site. - Call
GET /api/public/v1/leads/{arguments.uuid}with theleads:readscope.
const event = JSON.parse(rawBody);
if (event.topic === 'lead.created') {
const token = await tokenForSite(event.site);
const response = await fetch(`https://api.sitepack.eu/api/public/v1/leads/${event.arguments.uuid}`, {
headers: { 'X-SitePack-Access-Token': token },
});
const { lead } = await response.json();
// lead.email, lead.first_name, lead.phone, ...
}
Which endpoint belongs to which topic is in the topic table. The Example Integration shows the same flow for paid orders, with token storage and refresh.
Every endpoint
The scope column is what the merchant must have granted. A write scope includes its read scope. "Any token" means every valid app token may call it.
Getting started
OAuth
| Endpoint | What it does | Scope |
|---|---|---|
GET /api/authentication/oauth/authorize | Ask a merchant for consent | none |
POST /api/authentication/oauth/authorize | Ask a merchant for consent | none |
POST /api/authentication/oauth/device/code | Start device authorization | none |
POST /api/authentication/oauth/introspect | Inspect a token | any token |
POST /api/authentication/oauth/register | Register an MCP connector client | none |
POST /api/authentication/oauth/revoke | Revoke a token | none |
POST /api/authentication/oauth/token | Exchange a code for a token | none |
GET /api/authentication/oauth/whoami | Identify a token | any token |
Meta
| Endpoint | What it does | Scope |
|---|---|---|
GET /api/public/v1/me | Who am I | any token |
GET /api/public/v1/scopes | List every scope | any token |
App settings
| Endpoint | What it does | Scope |
|---|---|---|
GET /api/public/v1/app/settings | Read app settings | app:settings:read |
PUT /api/public/v1/app/settings | Replace app settings | app:settings:write |
Webhooks
| Endpoint | What it does | Scope |
|---|---|---|
GET /api/public/v1/webhooks | List webhook subscriptions | webhooks:read |
Leads & customers
Leads
| Endpoint | What it does | Scope |
|---|---|---|
GET /api/public/v1/leads | List leads | leads:read |
GET /api/public/v1/leads/{uuid} | Get a lead | leads:read |
PATCH /api/public/v1/leads/{uuid} | Update a lead | leads:write |
DELETE /api/public/v1/leads/{uuid} | Delete a lead | leads:write |
GET /api/public/v1/leads/{uuid}/notes | List lead notes | leads:read |
POST /api/public/v1/leads/{uuid}/notes | Add a lead note | leads:write |
Customers
| Endpoint | What it does | Scope |
|---|---|---|
GET /api/public/v1/customers | List customers | customers:read |
POST /api/public/v1/customers | Create a customer | customers:write |
GET /api/public/v1/customers/{uuid} | Get a customer | customers:read |
PATCH /api/public/v1/customers/{uuid} | Update a customer | customers:write |
Comments
| Endpoint | What it does | Scope |
|---|---|---|
GET /api/public/v1/comments | List comments | comments:read |
PATCH /api/public/v1/comments/{uuid} | Moderate a comment | comments:write |
DELETE /api/public/v1/comments/{uuid} | Delete a comment | comments:write |
Webshop
Products
Collections
| Endpoint | What it does | Scope |
|---|---|---|
GET /api/public/v1/collections | List collections | collections:read |
POST /api/public/v1/collections | Create a collection | collections:write |
GET /api/public/v1/collections/{uuid} | Get a collection | collections:read |
PATCH /api/public/v1/collections/{uuid} | Update a collection | collections:write |
DELETE /api/public/v1/collections/{uuid} | Delete a collection | collections:write |
GET /api/public/v1/collections/{uuid}/rules | List collection rules | collections:read |
PUT /api/public/v1/collections/{uuid}/rules | Replace collection rules | collections:write |
Orders
| Endpoint | What it does | Scope |
|---|---|---|
GET /api/public/v1/orders | List orders | orders:read |
POST /api/public/v1/orders | Create an order | orders:write |
GET /api/public/v1/orders/{uuid} | Get an order | orders:read |
PATCH /api/public/v1/orders/{uuid} | Change an order status | orders:write |
GET /api/public/v1/orders/{uuid}/payments | List order payments | orders:read |
Discounts
| Endpoint | What it does | Scope |
|---|---|---|
GET /api/public/v1/discount-codes | List discount codes | discounts:read |
POST /api/public/v1/discount-codes | Create a discount code | discounts:write |
GET /api/public/v1/discount-codes/{uuid} | Get a discount code | discounts:read |
DELETE /api/public/v1/discount-codes/{uuid} | Archive a discount code | discounts:write |
Shipping
| Endpoint | What it does | Scope |
|---|---|---|
GET /api/public/v1/shipping-labels | List shipping labels | shipping:read |
GET /api/public/v1/shipping-labels/{uuid} | Get a shipping label | shipping:read |
Content
Content
| Endpoint | What it does | Scope |
|---|---|---|
GET /api/public/v1/content | List pages | content:read |
POST /api/public/v1/content | Create a page | content:write |
GET /api/public/v1/content/validate-slug | Check a slug is free | content:read |
GET /api/public/v1/content/{uuid} | Get a page | content:read |
PATCH /api/public/v1/content/{uuid} | Update a page | content:write |
DELETE /api/public/v1/content/{uuid} | Delete a page | content:write |
GET /api/public/v1/content/{uuid}/elements | Get page elements | content:read |
PUT /api/public/v1/content/{uuid}/elements | Replace page elements | content:write |
POST /api/public/v1/content/{uuid}/publish | Publish a page | content:write |
GET /api/public/v1/content/{uuid}/revisions | List page revisions | content:read |
POST /api/public/v1/content/{uuid}/revisions/{revisionUuid}/restore | Restore a page revision | content:write |
POST /api/public/v1/content/{uuid}/unpublish | Unpublish a page | content:write |
Blogs
| Endpoint | What it does | Scope |
|---|---|---|
GET /api/public/v1/blogs | List blog posts | blogs:read |
POST /api/public/v1/blogs | Create a blog post | blogs:write |
GET /api/public/v1/blogs/{uuid} | Get a blog post | blogs:read |
PATCH /api/public/v1/blogs/{uuid} | Update a blog post | blogs:write |
DELETE /api/public/v1/blogs/{uuid} | Delete a blog post | blogs:write |
POST /api/public/v1/blogs/{uuid}/publish | Publish a blog post | blogs:write |
POST /api/public/v1/blogs/{uuid}/unpublish | Unpublish a blog post | blogs:write |
Post types
| Endpoint | What it does | Scope |
|---|---|---|
GET /api/public/v1/post-types | List post types | posts:read |
GET /api/public/v1/post-types/{postType} | Get a post type | posts:read |
GET /api/public/v1/post-types/{postType}/archive | Get a post type overview page | posts:read |
PATCH /api/public/v1/post-types/{postType}/archive | Update a post type overview page | posts:write |
GET /api/public/v1/post-types/{postType}/entries | List post entries | posts:read |
POST /api/public/v1/post-types/{postType}/entries | Create a post entry | posts:write |
GET /api/public/v1/post-types/{postType}/entries/{uuid} | Get a post entry | posts:read |
PATCH /api/public/v1/post-types/{postType}/entries/{uuid} | Update a post entry | posts:write |
DELETE /api/public/v1/post-types/{postType}/entries/{uuid} | Delete a post entry | posts:write |
Elements
| Endpoint | What it does | Scope |
|---|---|---|
GET /api/public/v1/elements | List element areas | elements:read |
GET /api/public/v1/elements/{area} | Get an element area | elements:read |
PUT /api/public/v1/elements/{area} | Replace an element area | elements:write |
Navigation
| Endpoint | What it does | Scope |
|---|---|---|
GET /api/public/v1/navigations | List navigations | navigation:read |
PATCH /api/public/v1/navigations/items/{uuid} | Update a navigation item | navigation:write |
DELETE /api/public/v1/navigations/items/{uuid} | Delete a navigation item | navigation:write |
GET /api/public/v1/navigations/{section}/items | List navigation items | navigation:read |
POST /api/public/v1/navigations/{section}/items | Add a navigation item | navigation:write |
PUT /api/public/v1/navigations/{section}/items | Reorder a navigation | navigation:write |
Translations
| Endpoint | What it does | Scope |
|---|---|---|
GET /api/public/v1/translations/coverage | Read translation coverage | translations:read |
GET /api/public/v1/translations/locales | List site locales | translations:read |
GET /api/public/v1/translations/review/{locale} | List what needs translating | translations:read |
GET /api/public/v1/translations/{type}/{uuid} | List an item's translations | translations:read |
GET /api/public/v1/translations/{type}/{uuid}/{locale} | Get one locale's translation | translations:read |
PUT /api/public/v1/translations/{type}/{uuid}/{locale} | Save a translation | translations:write |
PATCH /api/public/v1/translations/{type}/{uuid}/{locale} | Save a translation | translations:write |
DELETE /api/public/v1/translations/{type}/{uuid}/{locale} | Delete a translation | translations:write |
Media
| Endpoint | What it does | Scope |
|---|---|---|
GET /api/public/v1/media | List media | media:read |
GET /api/public/v1/media/{uuid} | Get a media item | media:read |
PATCH /api/public/v1/media/{uuid} | Update a media item | media:write |
DELETE /api/public/v1/media/{uuid} | Delete a media item | media:write |
Categories
| Endpoint | What it does | Scope |
|---|---|---|
GET /api/public/v1/categories | List categories | categories:read |
POST /api/public/v1/categories | Create a category | categories:write |
GET /api/public/v1/categories/{uuid} | Get a category | categories:read |
PATCH /api/public/v1/categories/{uuid} | Update a category | categories:write |
DELETE /api/public/v1/categories/{uuid} | Delete a category | categories:write |
Tags
| Endpoint | What it does | Scope |
|---|---|---|
GET /api/public/v1/tags | List tags | tags:read |
POST /api/public/v1/tags | Create a tag | tags:write |
GET /api/public/v1/tags/{uuid} | Get a tag | tags:read |
PATCH /api/public/v1/tags/{uuid} | Update a tag | tags:write |
DELETE /api/public/v1/tags/{uuid} | Delete a tag | tags:write |
Redirects
| Endpoint | What it does | Scope |
|---|---|---|
GET /api/public/v1/redirects | List redirects | redirects:read |
POST /api/public/v1/redirects | Create a redirect | redirects:write |
GET /api/public/v1/redirects/{uuid} | Get a redirect | redirects:read |
PATCH /api/public/v1/redirects/{uuid} | Update a redirect | redirects:write |
DELETE /api/public/v1/redirects/{uuid} | Delete a redirect | redirects:write |
USPs
| Endpoint | What it does | Scope |
|---|---|---|
GET /api/public/v1/usps | List USPs | usp:read |
POST /api/public/v1/usps | Create a USP | usp:write |
PUT /api/public/v1/usps | Reorder USPs | usp:write |
GET /api/public/v1/usps/{uuid} | Get a USP | usp:read |
PATCH /api/public/v1/usps/{uuid} | Update a USP | usp:write |
DELETE /api/public/v1/usps/{uuid} | Delete a USP | usp:write |
Theme
| Endpoint | What it does | Scope |
|---|---|---|
GET /api/public/v1/theme | Read the active theme | themes:read |
GET /api/public/v1/theme/layouts | List theme layouts | themes:read |
GET /api/public/v1/theme/settings | Read theme design settings | themes:read |
PATCH /api/public/v1/theme/settings | Change theme design settings | themes:write |
Site
Site
| Endpoint | What it does | Scope |
|---|---|---|
GET /api/public/v1/site | Read the site settings | sites:read |
PATCH /api/public/v1/site | Update the site settings | sites:write |
GET /api/public/v1/site/social-media | Read the social media profiles | sites:read |
PATCH /api/public/v1/site/social-media | Update the social media profiles | sites:write |
GET /api/public/v1/statistics | Read site statistics | statistics:read |
Modules
| Endpoint | What it does | Scope |
|---|---|---|
GET /api/public/v1/modules | List active modules | modules:read |
GET /api/public/v1/modules/{key}/settings | Read module settings | modules:read |
PATCH /api/public/v1/modules/{key}/settings | Update module settings | modules:write |
Billing
| Endpoint | What it does | Scope |
|---|---|---|
GET /api/public/v1/billing/invoices | List invoices | billing:read |
GET /api/public/v1/billing/subscriptions | List subscriptions | billing:read |
Domains
| Endpoint | What it does | Scope |
|---|---|---|
GET /api/public/v1/domains | List domains | domains:read |
GET /api/public/v1/domains/check | Check domain availability | domains:read |
GET /api/public/v1/domains/holders | List domain holders | domains:read |
POST /api/public/v1/domains/order | Order a domain | domains:order |
GET /api/public/v1/domains/suggest | Suggest domain names | domains:read |
GET /api/public/v1/domains/{uuid} | Get a domain | domains:read |
GET /api/public/v1/domains/{uuid}/dns | List DNS records | domains:read |
PUT /api/public/v1/domains/{uuid}/dns | Replace DNS records | domains:write |
Mail
| Endpoint | What it does | Scope |
|---|---|---|
GET /api/public/v1/mail/accounts | List mailboxes | mail:read |
POST /api/public/v1/mail/accounts | Create a mailbox | mail:write |
GET /api/public/v1/mail/accounts/{uuid} | Get a mailbox | mail:read |
DELETE /api/public/v1/mail/accounts/{uuid} | Delete a mailbox | mail:write |
POST /api/public/v1/mail/accounts/{uuid}/change-password | Change a mailbox password | mail:write |
GET /api/public/v1/mail/accounts/{uuid}/quota | Read mailbox usage | mail:read |
GET /api/public/v1/mail/slots | Read free mailbox slots | mail:read |