Skip to main content
POST
Call page.write_article

Authorizations

Authorization
string
header
required

An API key minted at Settings › API & MCP. Send it as Authorization: Bearer <key>. A key carries its holder's own permissions, resolved on every call — revoking a membership closes the key's reach immediately. Keep it in an environment variable (GOOSY_API_KEY), never in a committed file.

Headers

x-request-id
string

Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from A–Z a–z 0–9 . _ : -, starting with a letter or digit; anything else is replaced by a generated id.

Maximum string length: 128

Body

application/json
title
string
required

The article headline, as it should appear. Write it — do not ask the tool to invent one.

Required string length: 1 - 120
summary
string
required

One sentence. It becomes the page's meta description and the archive card's summary, so make it describe the article rather than tease it.

Required string length: 1 - 320
sections
object[]
required

The article body, in order: each entry is a subheading plus its paragraphs. Plain text only — it is escaped, so markup is shown rather than rendered.

Required array length: 1 - 12 elements
site_id
string<uuid>

The site to act on, as a site UUID from page.list. On a site's own page, leave it out where this schema makes it optional: the call acts on the site open there, unless the member names another site. On any other screen (Analytics, the desk, Connections) no site is open, so pass it: call page.list with name set to the site the member named and pass the site_id it returns. When they named no site, call page.list without a name: pass the one site's id when the brand has one, and ask which site they mean when it has several. Never pass an id you composed, or one that names a board, thread or other object.

Pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$
slug
string

Optional URL slug. Leave it out to derive one from the title. A slug that already exists on this site is refused rather than suffixed — a second permanent URL is not what the operator asked for.

Maximum string length: 72
author_name
string

Optional byline. Leave it out unless the operator named an author — an invented author is a claim on their site.

Maximum string length: 120
image_url
string

Optional absolute https URL of the lead image. Leave it out unless the operator supplied one.

workspace
string

Which workspace to run in — its slug. Omit to use your default. With more than one reachable workspace and no default, the call is refused and the choices are listed.

Minimum string length: 1

Response

The call was admitted and dispatched. ok says whether the tool succeeded — a refusal the tool itself produced is still a 200, exactly as it is a successful JSON-RPC result over MCP.

The tool ran and answered.

ok
boolean
required
site_id
string<uuid>
required
Pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$
route
string
required
slug
string
required
source_ref
string
required
workspace
string
required

The slug of the workspace this call ran in.

working_in
object
required

Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.

build_run_id
string