Change a site
const url = 'http://localhost:3000/api/v1/sites/example';const options = { method: 'PATCH', headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'}, body: '{"name":"example","slug":"example","intro":"example","url":"https://example.com","access":"public","password":"example","expiresAt":"2026-04-15T12:00:00Z","presets":["web"],"theme":{"logo":"2489E9AD-2EE2-8E00-8EC9-32D5F69181C0","accent":"example","background":"example"},"collections":["2489E9AD-2EE2-8E00-8EC9-32D5F69181C0"],"brands":["example"],"site":{"footer":{"text":"example","links":[{"label":"example","href":"example"}],"credit":"example","feedback":"example"},"quick":[{"label":"example","brand":"example","page":"example","asset":"2489E9AD-2EE2-8E00-8EC9-32D5F69181C0","href":"example"}],"terms":"example","listed":true},"rebuild":{"url":"https://example.com","brand":"example"},"domain":"example"}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request PATCH \ --url http://localhost:3000/api/v1/sites/example \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "name": "example", "slug": "example", "intro": "example", "url": "https://example.com", "access": "public", "password": "example", "expiresAt": "2026-04-15T12:00:00Z", "presets": [ "web" ], "theme": { "logo": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "accent": "example", "background": "example" }, "collections": [ "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0" ], "brands": [ "example" ], "site": { "footer": { "text": "example", "links": [ { "label": "example", "href": "example" } ], "credit": "example", "feedback": "example" }, "quick": [ { "label": "example", "brand": "example", "page": "example", "asset": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "href": "example" } ], "terms": "example", "listed": true }, "rebuild": { "url": "https://example.com", "brand": "example" }, "domain": "example" }'Only what is given changes. A new slug keeps the old one leading here, and nobody else may take it while the portal stands: the last five. domain picks another of the organization’s verified domains; null gives it back to the app. A left-out password stays.
Scope: write.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Path Parameters
Section titled “Path Parameters”Site id
Request Bodyrequired
Section titled “Request Bodyrequired”object
What visitors see it called, e.g. Press kit
Its address: /p/{slug}, and {slug}.PORTAL_DOMAIN when the server has one. Lowercase letters, digits and dashes
Public: anyone; password: whoever has it; members: people with access to the project. Either of the last two takes access requests
For access: password. Left out on a change, it stays
What images download as; web, print and social when left out
Collections it shows, in this order. With brands, at least one of the two
Brands whose guidelines it publishes, by slug, each a tab beside the assets, in this order
Its footer, quick grab, terms, and whether search engines may list it (public portals only). Replaces the whole set
object
object
Markdown
object
A URL or mailto:
Quick grab: pinned links in the header
object
With page: a brand the portal carries; the first when left out
Markdown readers accept once before their first download
Search engines may index it; public portals only
Responses
Section titled “Responses”The portal
object
object
Portal: managed by Artbucket; external: hosted elsewhere, what it uses recorded by artbucket site scan; the others are static files deployed to it
An external site’s own address
object
object
object
Markdown
object
A URL or mailto:
Quick grab: pinned links in the header
object
With page: a brand the portal carries; the first when left out
Markdown readers accept once before their first download
Search engines may index it; public portals only
object
The brand whose releases call it, by slug; null once that brand is gone
The hook’s host; the URL itself is never shown
What it answered: an HTTP status, or why there was none
Where visitors go: its domain once verified, else {slug}.PORTAL_DOMAIN when the server has one (not for a members portal), else /p/{slug}
Access requests waiting
Example
{ "data": { "kind": "portal", "access": "public", "presets": [ "web" ], "theme": { "logo": null, "accent": null, "background": null }, "domain": { "record": { "type": "TXT" }, "cname": { "type": "CNAME" } } }}default
Section titled “default”An error
object
object
Examplegenerated
{ "error": { "code": "example", "message": "example", "detail": "example" }}