{"version":"6.3.0","docs":"/docs/content-api","integration":"/api/v1/integration.md","openapi":"/api/v1/openapi.json","entities":"/api/content-schema/entities","note":"Each resource is served at GET /api/v1/<name>. Responses are fully defaulted: absent strings are empty strings and absent collections are empty arrays.","resources":{"settings":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"name":{"default":"","description":"Business name as displayed across the site.","type":"string"},"tagline":{"default":"","description":"One-line slogan shown near the logo/footer. Portuguese.","type":"string"},"description":{"default":"","description":"Short description of the business, 1-2 sentences. Portuguese.","type":"string"},"phone":{"default":"","description":"Display phone number, formatted for reading (e.g. \"+351 912 345 678\"). Empty string if none. Derive a tel: URI from it by stripping everything but + and digits.","type":"string"},"email":{"default":"","description":"Public contact email. Empty string if none.","type":"string"},"whatsapp":{"default":"","description":"WhatsApp chat URL (e.g. \"https://wa.me/351912345678\"). Empty string if none.","type":"string"},"appUrl":{"default":"","description":"Mobile app store URL if the business has an app. Empty string if none.","type":"string"},"schedule":{"default":[],"description":"Opening schedule rows, in display order.","type":"array","items":{"type":"object","properties":{"days":{"default":"","description":"Day range label (e.g. \"Seg – Sáb\"). Portuguese.","type":"string"},"hours":{"default":"","description":"Opening hours label (e.g. \"09h – 19h\" or \"Fechado\").","type":"string"}},"description":"One row of the opening schedule."}},"social":{"default":{},"type":"object","properties":{"facebook":{"default":"","description":"Facebook page URL. Empty string if none.","type":"string"},"instagram":{"default":"","description":"Instagram profile URL. Empty string if none.","type":"string"},"linkedin":{"default":"","description":"LinkedIn page URL. Empty string if none.","type":"string"},"x":{"default":"","description":"X/Twitter profile URL. Empty string if none.","type":"string"},"youtube":{"default":"","description":"YouTube channel URL. Empty string if none.","type":"string"}},"description":"Social media profile links."}},"description":"The business: identity, contacts, opening hours and social links. One per site."},"services":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"array","items":{"type":"object","properties":{"slug":{"type":"string","description":"URL-safe unique identifier, lowercase, hyphen-separated."},"title":{"default":"","description":"Service name. Portuguese.","type":"string"},"icon":{"type":"string","enum":["truck","wrench","packageCheck","hammer","boxes","warehouse","arrowDownToLine","zap","clock","shieldCheck"],"description":"Icon key from the fixed icon set (Lucide-style names)."},"image":{"type":"object","properties":{"assetId":{"description":"Asset document id, set by the backoffice after upload.","type":"string"},"url":{"default":"","description":"Absolute URL of the image, served from the blob store's CDN. Use it directly as an image source; no API key is involved. Allow the host in your image optimiser.","type":"string"},"alt":{"default":"","description":"Image alt text. Portuguese.","type":"string"},"width":{"description":"Image width in pixels.","type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"height":{"description":"Image height in pixels.","type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"description":"Illustrative image stored in Vercel Blob."},"tier":{"type":"string","enum":["primary","featured","secondary"],"description":"Display tier: \"primary\" for the main highlighted services, \"featured\" for the secondary highlights, \"secondary\" for the rest."},"short":{"default":"","description":"One-sentence summary shown on service cards. Portuguese.","type":"string"},"description":{"default":"","description":"Full description. Portuguese.","type":"string"},"bullets":{"default":[],"description":"Bullet-point highlights. Portuguese.","type":"array","items":{"type":"string"}}},"required":["slug","icon","tier"],"description":"One service offered by the business."},"description":"Services offered by the business, in display order."},"products":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"array","items":{"type":"object","properties":{"slug":{"type":"string","description":"URL-safe unique identifier, lowercase, hyphen-separated."},"title":{"default":"","description":"Product name. Portuguese.","type":"string"},"icon":{"type":"string","enum":["truck","wrench","packageCheck","hammer","boxes","warehouse","arrowDownToLine","zap","clock","shieldCheck"],"description":"Icon key from the fixed icon set (Lucide-style names)."},"image":{"type":"object","properties":{"assetId":{"description":"Asset document id, set by the backoffice after upload.","type":"string"},"url":{"default":"","description":"Absolute URL of the image, served from the blob store's CDN. Use it directly as an image source; no API key is involved. Allow the host in your image optimiser.","type":"string"},"alt":{"default":"","description":"Image alt text. Portuguese.","type":"string"},"width":{"description":"Image width in pixels.","type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"height":{"description":"Image height in pixels.","type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"description":"Illustrative image stored in Vercel Blob."},"sku":{"default":"","description":"Internal reference or article number. Empty string if none.","type":"string"},"price":{"default":0,"description":"Price amount in the currency below. 0 means the price is not published.","type":"number","minimum":0},"currency":{"default":"EUR","description":"Currency of the price amount.","type":"string","enum":["EUR","USD","GBP"]},"pricePeriod":{"default":"once","description":"Billing period the price refers to: \"once\" for a one-off price, \"month\" or \"year\" for a subscription.","type":"string","enum":["once","month","year"]},"priceNote":{"default":"","description":"Short qualifier shown next to the price (e.g. \"IVA incluído\"). Portuguese.","type":"string"},"short":{"default":"","description":"One-sentence summary shown on product cards. Portuguese.","type":"string"},"description":{"default":"","description":"Full description. Portuguese.","type":"string"},"bullets":{"default":[],"description":"Bullet-point highlights. Portuguese.","type":"array","items":{"type":"string"}},"featured":{"default":false,"description":"True for a product the website should highlight.","type":"boolean"},"available":{"default":true,"description":"False for a product kept on record but not currently sold.","type":"boolean"}},"required":["slug","icon"],"description":"One product sold by the business, at a stated price."},"description":"Products sold by the business, in display order."},"projects":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"array","items":{"type":"object","properties":{"slug":{"type":"string","description":"URL-safe unique identifier, lowercase, hyphen-separated."},"title":{"default":"","description":"Name of the project, as the website should title it. Read this as the heading; a project stored before 6.1.0 may carry only `client`, so fall back to that when this is empty.","type":"string"},"client":{"default":"","description":"Name of the client the work was delivered for. Empty when there is no client to name — the business's own product, or work it may not attribute.","type":"string"},"problem":{"default":"","description":"The situation the client was in. Portuguese.","type":"string"},"solution":{"default":"","description":"What the business did about it. Portuguese.","type":"string"},"results":{"default":"","description":"What the client got out of it. Portuguese.","type":"string"},"links":{"default":[],"description":"Related links, in display order.","type":"array","items":{"type":"object","properties":{"title":{"default":"","description":"Link label. Portuguese. May be empty — fall back to showing the URL.","type":"string"},"url":{"default":"","description":"Absolute URL, including the scheme.","type":"string"}},"description":"One outbound link related to the project, such as the live website."}},"assets":{"default":[],"description":"Every attached file in one list, in display order. Group them by `kind` if your design shows media separately from documents.","type":"array","items":{"type":"object","properties":{"kind":{"type":"string","enum":["image","video","document"],"description":"What the file is, derived from its MIME type: \"image\" and \"video\" are media, everything else is a \"document\". Split a list on this rather than on the file extension."},"url":{"type":"string","description":"Absolute URL of the file, served from the blob store's CDN. Use it directly — as an image source, a video source, or the href of a download link — with no API key involved."},"contentType":{"default":"","description":"MIME type the file was stored with (e.g. \"image/webp\", \"application/pdf\").","type":"string"},"name":{"default":"","description":"Original filename at upload time. Use it as the download label for a document.","type":"string"},"alt":{"default":"","description":"Alt text, when one was written. Often empty — fall back to the surrounding context.","type":"string"},"size":{"description":"File size in bytes, when known.","type":"integer","minimum":0,"maximum":9007199254740991},"width":{"description":"Intrinsic width in pixels. Present for media, absent for documents.","type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"height":{"description":"Intrinsic height in pixels. Present for media, absent for documents.","type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["kind","url"],"description":"One file uploaded through the backoffice and stored in Vercel Blob."}}},"required":["slug"],"description":"One piece of work the business has delivered, told as problem, solution and results. It may have been delivered for a client or be the business's own."},"description":"Projects published by the business, in display order."},"posts":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"array","items":{"type":"object","properties":{"slug":{"type":"string","description":"URL-safe unique identifier, lowercase, hyphen-separated."},"title":{"default":"","description":"Headline of the post. Portuguese.","type":"string"},"excerpt":{"default":"","description":"Standfirst: one or two sentences summarising the post. Plain text, no markup — it is written for a card and for a meta description. Portuguese.","type":"string"},"body":{"default":"","description":"The post itself, as an HTML fragment (no <html> or <body> wrapper). Render it as HTML; it is sanitised on save against a fixed allowlist, so the only elements it can contain are p, h2, h3, h4, strong, em, u, s, code, pre, blockquote, ul, ol, li, a, img, hr, br. Headings start at h2, because the page's h1 is the title above. An <a> carries href, and one leaving the site also carries target and rel. An <img> is always a file from this tenant's own blob store and carries src, alt, width, height and data-align (\"left\", \"center\" or \"right\") — style the alignment yourself, there is no inline CSS. Empty string for a post with no body yet.","type":"string"},"coverImage":{"description":"Lead image for the post, shown on a card and at the top of the page.","type":"object","properties":{"assetId":{"description":"Asset document id, set by the backoffice after upload.","type":"string"},"url":{"default":"","description":"Absolute URL of the image, served from the blob store's CDN. Use it directly as an image source; no API key is involved. Allow the host in your image optimiser.","type":"string"},"alt":{"default":"","description":"Image alt text. Portuguese.","type":"string"},"width":{"description":"Image width in pixels.","type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"height":{"description":"Image height in pixels.","type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}}},"publishedAt":{"default":"","description":"The day the post is dated, as \"YYYY-MM-DD\". Treat it as a calendar date, not an instant: format it in UTC or the day will read as the one before west of Greenwich. Posts arrive newest first.","type":"string"},"updatedOn":{"default":"","description":"The day the post was last revised, as \"YYYY-MM-DD\". Empty when it has not been revised since publishing — useful as dateModified in structured data.","type":"string"},"tags":{"default":[],"description":"Free-text labels the business groups its posts by. Display order. Not a fixed vocabulary and not slugs — slugify them yourself if you route by them.","type":"array","items":{"type":"string"}},"author":{"default":"","description":"Who wrote it, as it should be credited. Empty when the business does not by-line its posts.","type":"string"}},"required":["slug"],"description":"One published post: news, an article, an announcement. Only published posts are served; a draft stays in the backoffice."},"description":"Published posts, newest first by publishedAt. Drafts are absent, so the list is exactly what may be shown."},"testimonials":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"array","items":{"type":"object","properties":{"slug":{"type":"string","description":"URL-safe unique identifier, lowercase, hyphen-separated."},"author":{"default":"","description":"Who said it, as they should be credited. Empty for an anonymous testimonial.","type":"string"},"role":{"default":"","description":"Who the author is, in their own words (e.g. \"Gerente, Padaria Central\"). One line, meant to be read under the name. Portuguese.","type":"string"},"quote":{"default":"","description":"What they said. Plain text, no markup. Portuguese.","type":"string"},"rating":{"default":0,"description":"Stars out of 5. 0 means the testimonial came without a rating — show the words alone rather than zero stars.","type":"integer","minimum":0,"maximum":5},"date":{"default":"","description":"The day it was given, as \"YYYY-MM-DD\". Empty when it is not dated. A calendar date, not an instant: format it in UTC.","type":"string"},"image":{"description":"Photograph of the author, when there is one. Often absent.","type":"object","properties":{"assetId":{"description":"Asset document id, set by the backoffice after upload.","type":"string"},"url":{"default":"","description":"Absolute URL of the image, served from the blob store's CDN. Use it directly as an image source; no API key is involved. Allow the host in your image optimiser.","type":"string"},"alt":{"default":"","description":"Image alt text. Portuguese.","type":"string"},"width":{"description":"Image width in pixels.","type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"height":{"description":"Image height in pixels.","type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}}}},"required":["slug"],"description":"One testimonial: what a client said about the business, and who said it."},"description":"Testimonials the business publishes, in display order."},"faqs":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"array","items":{"type":"object","properties":{"slug":{"type":"string","description":"URL-safe unique identifier, lowercase, hyphen-separated. Stable, so it works as the anchor of a linkable question."},"question":{"default":"","description":"The question, as a client would ask it. Portuguese.","type":"string"},"answer":{"default":"","description":"The answer. Plain text, no markup; split it on its line breaks to lay out paragraphs, like a legal section's body. Portuguese.","type":"string"},"category":{"default":"","description":"Free-text heading this question is grouped under (e.g. \"Entregas\"). Empty for an ungrouped question. Not a fixed vocabulary and not a slug — group by the exact string, and expect an empty one alongside filled ones.","type":"string"}},"required":["slug"],"description":"One frequently asked question and its answer."},"description":"Frequently asked questions, in display order. Questions sharing a category arrive together, in that order."},"locations":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"array","items":{"type":"object","properties":{"slug":{"type":"string","description":"URL-safe unique identifier, lowercase, hyphen-separated."},"city":{"default":"","description":"City or locality name.","type":"string"},"lines":{"default":[],"description":"Address lines, in display order.","type":"array","items":{"type":"string"}},"mapsSearchUrl":{"default":"","description":"Google Maps search/share URL for this address. Empty string if none.","type":"string"},"mapEmbedUrl":{"default":"","description":"Google Maps embed URL (iframe src). Empty string if none.","type":"string"},"primary":{"default":false,"description":"True for the main location (at most one per site).","type":"boolean"}},"required":["slug"],"description":"One physical location of the business."},"description":"Physical locations of the business, in display order."},"values":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"array","items":{"type":"object","properties":{"slug":{"type":"string","description":"URL-safe unique identifier, lowercase, hyphen-separated."},"title":{"default":"","description":"Value name (e.g. Qualidade). Portuguese.","type":"string"},"description":{"default":"","description":"Short explanation of the value. Portuguese.","type":"string"}},"required":["slug"],"description":"One company value."},"description":"Company values, in display order."},"legal":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","propertyNames":{"type":"string","enum":["terms","privacy"]},"additionalProperties":{"type":"object","properties":{"sections":{"default":[],"description":"Ordered sections, as the document should read.","type":"array","items":{"type":"object","properties":{"title":{"default":"","description":"Section heading. Portuguese.","type":"string"},"body":{"default":"","description":"Section body prose; plain text, may contain multiple sentences. Portuguese.","type":"string"}}}}},"description":"One legal document."},"description":"Legal documents the client maintains, keyed by document. Only documents that have been written are present."}}}