Appearance
website
27 endpoints.
GET /api/v1/website/items
List Items By Sku
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
skus | query | yes | string | Comma-separated item codes/SKUs |
200 — Successful Response
json
{
"type": "array",
"items": {
"properties": {
"sku": {
"type": "string",
"title": "Sku"
},
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Name"
},
"uom": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Uom"
},
"is_sales": {
"type": "boolean",
"title": "Is Sales"
},
"is_stock_item": {
"type": "boolean",
"title": "Is Stock Item"
},
"disabled": {
"type": "boolean",
"title": "Disabled"
}
},
"type": "object",
"required": [
"sku",
"name",
"uom",
"is_sales",
"is_stock_item",
"disabled"
],
"title": "WebsiteItem"
},
"title": "Response List Items By Sku Api V1 Website Items Get"
}422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}GET /api/v1/website/item-prices
List Item Prices
General list pricing only (customer_id IS NULL) — not customer-specific negotiated rates.
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
skus | query | yes | string | Comma-separated item codes/SKUs |
price_list | query | no | Price list name; omit for all enabled selling price lists |
200 — Successful Response
json
{
"type": "array",
"items": {
"properties": {
"sku": {
"type": "string",
"title": "Sku"
},
"price_list": {
"type": "string",
"title": "Price List"
},
"currency": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Currency"
},
"rate": {
"type": "number",
"title": "Rate"
},
"rate_gbp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"title": "Rate Gbp"
},
"min_qty": {
"type": "number",
"title": "Min Qty"
}
},
"type": "object",
"required": [
"sku",
"price_list",
"currency",
"rate",
"rate_gbp",
"min_qty"
],
"title": "WebsiteItemPrice"
},
"title": "Response List Item Prices Api V1 Website Item Prices Get"
}422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}GET /api/v1/website/customers
Find Customer By Email
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
email | query | yes | string | Exact email match (case-insensitive) |
200 — Successful Response
json
{
"type": "array",
"items": {
"properties": {
"id": {
"type": "string",
"title": "Id"
},
"name": {
"type": "string",
"title": "Name"
},
"email": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Email"
},
"phone": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Phone"
},
"currency": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Currency"
},
"disabled": {
"type": "boolean",
"title": "Disabled"
},
"customer_group": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Customer Group"
},
"default_price_list": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Default Price List"
}
},
"type": "object",
"required": [
"id",
"name",
"email",
"phone",
"currency",
"disabled",
"customer_group",
"default_price_list"
],
"title": "WebsiteCustomer"
},
"title": "Response Find Customer By Email Api V1 Website Customers Get"
}422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}POST /api/v1/website/customers
Create Website Customer
Create a brand-new Customer for a first-time website checkout. No generic /accounting/documents/{doctype} equivalent exists — Customer was never one of the doctypes that endpoint supports (see accounting_documents._ITEM_DOCS) — so this is a small, purpose-built create, same spirit as the rest of this module. Group/territory are resolved by name if a row with that name exists; left unset otherwise (both nullable) rather than failing the whole checkout over it.
Request body
json
{
"properties": {
"name": {
"type": "string",
"title": "Name"
},
"email": {
"type": "string",
"title": "Email"
},
"phone": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Phone"
}
},
"type": "object",
"required": [
"name",
"email"
],
"title": "WebsiteCustomerIn"
}201 — Successful Response
json
{
"properties": {
"id": {
"type": "string",
"title": "Id"
},
"name": {
"type": "string",
"title": "Name"
},
"email": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Email"
},
"phone": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Phone"
},
"currency": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Currency"
},
"disabled": {
"type": "boolean",
"title": "Disabled"
},
"customer_group": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Customer Group"
},
"default_price_list": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Default Price List"
}
},
"type": "object",
"required": [
"id",
"name",
"email",
"phone",
"currency",
"disabled",
"customer_group",
"default_price_list"
],
"title": "WebsiteCustomer"
}422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}POST /api/v1/website/orders/{order_id}/pay
Pay Website Order
Start a Paystack checkout for an already-created+submitted Sales Order — thin wrapper around the same accounting_payment_paystack.init_quote_like_payment that powers the public "Pay Now" link on a Quotation/Sales Order PDF (GET /paystack/pay-quote/{token}). Deliberately calls the service directly with the caller's own callback_url instead of reusing that GET route, which hardcodes a redirect back to this platform's own /portal — the external website needs its shopper landing back on its own checkout success page. Once Paystack confirms payment, the existing webhook (settlement == "quote_like") books the on-account Payment Entry automatically — no separate booking call needed from the caller.
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
order_id | path | yes | integer |
Request body
json
{
"properties": {
"callback_url": {
"type": "string",
"title": "Callback Url"
}
},
"type": "object",
"required": [
"callback_url"
],
"title": "WebsiteOrderPayIn"
}200 — Successful Response
json
{
"properties": {
"ok": {
"type": "boolean",
"title": "Ok"
},
"authorization_url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Authorization Url"
},
"reference": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Reference"
},
"message": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Message"
}
},
"type": "object",
"required": [
"ok"
],
"title": "WebsiteOrderPayOut"
}422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}POST /api/v1/settings/website/extract-favicon
Extract Favicon
Isolate the icon/symbol mark from an uploaded logo (dropping any wordmark) via Gemini image generation, and return it as a real transparent-background PNG. See app.services.favicon_extract for the green-screen-then-key-out trick (mirrors app.apps.erp.grids.accounting's item-photo generator). Pure preview: nothing is persisted here, the caller still has to Save.
Request body
json
{
"properties": {
"logo_url": {
"type": "string",
"maxLength": 750000,
"title": "Logo Url"
}
},
"type": "object",
"required": [
"logo_url"
],
"title": "ExtractFaviconIn"
}200 — Successful Response
json
{}422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}POST /api/v1/settings/website/generate-hero-image
Generate Hero Image
Generate a photographic hero banner from a text brief via Gemini image generation. Pure preview like extract_favicon: nothing is persisted here, the caller still has to Save (into branding.hero_image_url).
Request body
json
{
"properties": {
"prompt": {
"type": "string",
"maxLength": 500,
"title": "Prompt"
}
},
"type": "object",
"required": [
"prompt"
],
"title": "GenerateHeroImageIn"
}200 — Successful Response
json
{}422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}POST /api/v1/settings/website/generate-social-image
Generate Social Image
Generate a link-preview (og:image) picture from a text brief. Same preview-only contract as generate_hero_image — nothing is persisted, the caller still has to Save (into branding.social_image_url).
16:9 rather than the 1.91:1 crawlers actually want because that is the nearest SUPPORTED_ASPECT_RATIOS value; websites's /api/og-image covers whatever comes back into an exact 1200x630 frame, so the small difference is cropped, never letterboxed.
Request body
json
{
"properties": {
"prompt": {
"type": "string",
"maxLength": 500,
"title": "Prompt"
}
},
"type": "object",
"required": [
"prompt"
],
"title": "GenerateSocialImageIn"
}200 — Successful Response
json
{}422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}GET /api/v1/settings/website
Get Settings
200 — Successful Response
json
{}PUT /api/v1/settings/website
Update Settings
Request body
json
{
"properties": {
"display_mode": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Display Mode"
},
"paystack_enabled": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"title": "Paystack Enabled"
},
"published": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"title": "Published"
},
"auth_required_for_pricing": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"title": "Auth Required For Pricing"
},
"show_buy_now": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"title": "Show Buy Now"
},
"builder_chat_enabled": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"title": "Builder Chat Enabled"
},
"store_name": {
"anyOf": [
{
"type": "string",
"maxLength": 255
},
{
"type": "null"
}
],
"title": "Store Name"
},
"tagline": {
"anyOf": [
{
"type": "string",
"maxLength": 255
},
{
"type": "null"
}
],
"title": "Tagline"
},
"branding": {
"anyOf": [
{
"properties": {
"logo_url": {
"anyOf": [
{
"type": "string",
"maxLength": 750000
},
{
"type": "null"
}
],
"title": "Logo Url"
},
"favicon_url": {
"anyOf": [
{
"type": "string",
"maxLength": 400000
},
{
"type": "null"
}
],
"title": "Favicon Url"
},
"hero_image_url": {
"anyOf": [
{
"type": "string",
"maxLength": 750000
},
{
"type": "null"
}
],
"title": "Hero Image Url"
},
"social_image_url": {
"anyOf": [
{
"type": "string",
"maxLength": 750000
},
{
"type": "null"
}
],
"title": "Social Image Url"
},
"primary_color": {
"anyOf": [
{
"type": "string",
"maxLength": 20
},
{
"type": "null"
}
],
"title": "Primary Color"
},
"accent_color": {
"anyOf": [
{
"type": "string",
"maxLength": 20
},
{
"type": "null"
}
],
"title": "Accent Color"
},
"chrome_color": {
"anyOf": [
{
"type": "string",
"maxLength": 20
},
{
"type": "null"
}
],
"title": "Chrome Color"
},
"support_email": {
"anyOf": [
{
"type": "string",
"maxLength": 255
},
{
"type": "null"
}
],
"title": "Support Email"
},
"whatsapp_number": {
"anyOf": [
{
"type": "string",
"maxLength": 32
},
{
"type": "null"
}
],
"title": "Whatsapp Number"
},
"phone": {
"anyOf": [
{
"type": "string",
"maxLength": 120
},
{
"type": "null"
}
],
"title": "Phone"
},
"address": {
"anyOf": [
{
"type": "string",
"maxLength": 255
},
{
"type": "null"
}
],
"title": "Address"
},
"trading_hours": {
"anyOf": [
{
"type": "string",
"maxLength": 500
},
{
"type": "null"
}
],
"title": "Trading Hours"
},
"prices_include_vat": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"title": "Prices Include Vat"
},
"vat_rate": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"title": "Vat Rate"
},
"vat_registered": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"title": "Vat Registered"
}
},
"type": "object",
"title": "BrandingIn"
},
{
"type": "null"
}
]
},
"shipping_options": {
"anyOf": [
{
"items": {
"properties": {
"key": {
"type": "string",
"maxLength": 64,
"title": "Key"
},
"label": {
"type": "string",
"maxLength": 120,
"title": "Label"
},
"amount": {
"type": "number",
"title": "Amount",
"default": 0
}
},
"type": "object",
"required": [
"key",
"label"
],
"title": "ShippingOptionIn"
},
"type": "array"
},
{
"type": "null"
}
],
"title": "Shipping Options"
},
"template": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Template"
},
"value_props": {
"anyOf": [
{
"items": {
"properties": {
"title": {
"type": "string",
"maxLength": 80,
"title": "Title"
},
"description": {
"type": "string",
"maxLength": 200,
"title": "Description",
"default": ""
}
},
"type": "object",
"required": [
"title"
],
"title": "ValuePropIn"
},
"type": "array"
},
{
"type": "null"
}
],
"title": "Value Props"
},
"hero_eyebrow": {
"anyOf": [
{
"type": "string",
"maxLength": 120
},
{
"type": "null"
}
],
"title": "Hero Eyebrow"
},
"hero_heading": {
"anyOf": [
{
"type": "string",
"maxLength": 200
},
{
"type": "null"
}
],
"title": "Hero Heading"
},
"hero_subtext": {
"anyOf": [
{
"type": "string",
"maxLength": 500
},
{
"type": "null"
}
],
"title": "Hero Subtext"
},
"shipping_flat_base": {
"anyOf": [
{
"type": "number",
"minimum": 0
},
{
"type": "null"
}
],
"title": "Shipping Flat Base"
},
"shipping_flat_qty": {
"anyOf": [
{
"type": "integer",
"minimum": 0
},
{
"type": "null"
}
],
"title": "Shipping Flat Qty"
},
"shipping_flat_extra": {
"anyOf": [
{
"type": "number",
"minimum": 0
},
{
"type": "null"
}
],
"title": "Shipping Flat Extra"
},
"ga4_measurement_id": {
"anyOf": [
{
"type": "string",
"maxLength": 20
},
{
"type": "null"
}
],
"title": "Ga4 Measurement Id"
},
"meta_pixel_id": {
"anyOf": [
{
"type": "string",
"maxLength": 32
},
{
"type": "null"
}
],
"title": "Meta Pixel Id"
},
"google_ads_id": {
"anyOf": [
{
"type": "string",
"maxLength": 20
},
{
"type": "null"
}
],
"title": "Google Ads Id"
},
"ga4_enabled": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"title": "Ga4 Enabled"
},
"meta_pixel_enabled": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"title": "Meta Pixel Enabled"
},
"google_ads_enabled": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"title": "Google Ads Enabled"
},
"checkout_webhook_enabled": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"title": "Checkout Webhook Enabled"
},
"checkout_webhook_url": {
"anyOf": [
{
"type": "string",
"maxLength": 500
},
{
"type": "null"
}
],
"title": "Checkout Webhook Url"
},
"checkout_email_notify_enabled": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"title": "Checkout Email Notify Enabled"
},
"checkout_email_notify_address": {
"anyOf": [
{
"type": "string",
"maxLength": 255
},
{
"type": "null"
}
],
"title": "Checkout Email Notify Address"
},
"checkout_erp_push_enabled": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"title": "Checkout Erp Push Enabled"
},
"checkout_erp_push_url": {
"anyOf": [
{
"type": "string",
"maxLength": 500
},
{
"type": "null"
}
],
"title": "Checkout Erp Push Url"
}
},
"type": "object",
"title": "WebsiteIn",
"description": "Partial update — a field omitted (``None``) is left untouched."
}200 — Successful Response
json
{}422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}PUT /api/v1/settings/website/checkout-webhook-secret
Set Checkout Webhook Secret
Request body
json
{
"properties": {
"secret": {
"type": "string",
"maxLength": 255,
"title": "Secret",
"default": ""
}
},
"type": "object",
"title": "CheckoutWebhookSecretIn"
}200 — Successful Response
json
{}422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}PUT /api/v1/settings/website/checkout-erp-push-credentials
Set Checkout Erp Push Credentials
Request body
json
{
"properties": {
"api_key": {
"type": "string",
"maxLength": 255,
"title": "Api Key",
"default": ""
},
"api_secret": {
"type": "string",
"maxLength": 255,
"title": "Api Secret",
"default": ""
}
},
"type": "object",
"title": "CheckoutErpPushCredentialsIn"
}200 — Successful Response
json
{}422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}GET /api/v1/settings/website/storage
Get Storage
What this site's purchased size allows and what it's using — the "Storage" card on the Website page. See :mod:app.apps.instances.services.website_storage for what counts.
200 — Successful Response
json
{}GET /api/v1/settings/website/conversions
Get Conversions
200 — Successful Response
json
{}GET /api/v1/settings/website/pages
Get Pages
200 — Successful Response
json
{}PUT /api/v1/settings/website/pages
Set Pages
Request body
json
{
"properties": {
"pages": {
"additionalProperties": {
"type": "boolean"
},
"type": "object",
"title": "Pages"
}
},
"type": "object",
"required": [
"pages"
],
"title": "PageToggleIn"
}200 — Successful Response
json
{}422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}GET /api/v1/settings/website/pages/{slug}/blocks
Get Page Blocks
One page's block composition, for the Website Builder's page canvas. 404 on a page that has never been built — opening the canvas must not be what creates a page (see website_pages.get_blocks).
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
slug | path | yes | string |
200 — Successful Response
json
{}422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}PUT /api/v1/settings/website/pages/{slug}/blocks
Put Page Blocks
Replace one page's block composition. admin, not superuser, to match the GET above and the Content Pages checkboxes an admin already owns — composing a page is editing content, not changing what the tenant is sold.
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
slug | path | yes | string |
Request body
json
{
"properties": {
"blocks": {
"items": {
"properties": {
"id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Id"
},
"block": {
"type": "string",
"title": "Block"
},
"props": {
"anyOf": [
{
"additionalProperties": true,
"type": "object"
},
{
"type": "null"
}
],
"title": "Props"
}
},
"type": "object",
"required": [
"block"
],
"title": "PageBlockIn"
},
"type": "array",
"title": "Blocks"
}
},
"type": "object",
"required": [
"blocks"
],
"title": "PageBlocksIn"
}200 — Successful Response
json
{}422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}POST /api/v1/settings/website/domain
Set Domain
Kick off custom-domain provisioning: validates the hostname, checks it isn't already claimed by another site, then queues the DNS-check + nginx/certbot automation as a background job (can take up to ~a minute — see :func:app.apps.instances.services.website_provisioning.provision_domain).
Request body
json
{
"properties": {
"domain": {
"type": "string",
"maxLength": 253,
"title": "Domain"
}
},
"type": "object",
"required": [
"domain"
],
"title": "DomainIn"
}200 — Successful Response
json
{}422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}DELETE /api/v1/settings/website/domain
Clear Domain
200 — Successful Response
json
{}GET /api/v1/settings/website/domain/status
Domain Status
Lightweight poll target for the builder form's domain status badge.
200 — Successful Response
json
{}POST /api/v1/settings/website/temp-domain
Set Temp Domain
Provision an instant <label>.lubb.co.za subdomain — unlike /domain, no DNS action is needed from the caller (the platform owns that zone); the DNS record itself is created as part of the background job. Independent of /domain — both can be live on the same site at once.
Request body
json
{
"properties": {
"label": {
"type": "string",
"maxLength": 32,
"title": "Label"
}
},
"type": "object",
"required": [
"label"
],
"title": "TempDomainIn"
}200 — Successful Response
json
{}422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}DELETE /api/v1/settings/website/temp-domain
Clear Temp Domain
200 — Successful Response
json
{}GET /api/v1/settings/website/temp-domain/status
Temp Domain Status
200 — Successful Response
json
{}GET /api/v1/settings/website/brief
Get Brief
The brief, its questions, the client's answers and their apply state.
200 — Successful Response
json
{}POST /api/v1/settings/website/brief/send
Send Brief
Email the client their link.
Re-sendable on purpose — clients lose emails — and the token is NOT rotated on a re-send, so a link already sitting in someone's inbox keeps working and half-finished answers are not stranded.
Request body
json
{
"properties": {
"recipient_name": {
"anyOf": [
{
"type": "string",
"maxLength": 160
},
{
"type": "null"
}
],
"title": "Recipient Name"
},
"recipient_email": {
"type": "string",
"format": "email",
"title": "Recipient Email"
},
"intro_note": {
"anyOf": [
{
"type": "string",
"maxLength": 4000
},
{
"type": "null"
}
],
"title": "Intro Note"
}
},
"type": "object",
"required": [
"recipient_email"
],
"title": "SendIn"
}200 — Successful Response
json
{}422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}POST /api/v1/settings/website/brief/apply
Apply One
Push ONE answer onto the site. Per-field by design — see the service.
Request body
json
{
"properties": {
"key": {
"type": "string",
"maxLength": 64,
"minLength": 1,
"title": "Key"
}
},
"type": "object",
"required": [
"key"
],
"title": "ApplyIn"
}200 — Successful Response
json
{}422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}