Skip to main content
POST
Call connections.publish_local_post

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
Idempotency-Key
string
required

Your key for this write: send the same key when you retry and the first result comes back instead of a second action. Keys are honoured for at least 24 hours. 1–200 visible ASCII characters. Replaces the idempotency_key body field, which still works until 2026-12-31; this action needs a key on one of the two, and the header is the one to send.

Maximum string length: 200

Body

application/json
piece_id
string
required

The content piece this post came from. It is what makes the published post reconcilable back to what the operator approved — never invent one, and never reuse another piece's id.

text
string
required

The post body, exactly as the operator approved it. On a Business Profile the text IS the post — there is no caption/body split — so do not append hashtags, links or sign-offs the operator did not write.

media_url
string | null
required

One photo or video URL, or null for a text-only post. A Business Profile local post carries at most ONE media item; a second is refused rather than dropped.

media_type
enum<string> | null
required

What media_url points at. Null when there is no media. Must match the asset — a mislabelled type is refused by Google, not silently corrected.

Available options:
image,
video
media_mime_type
string | null
required

The asset's MIME type, e.g. image/jpeg or video/mp4. Null when there is no media. Read it off the asset — never guess one to satisfy the field.

idempotency_key
string

Deprecated on REST: send the Idempotency-Key header instead. Still accepted until 2026-12-31; if both are sent they must match.

confirmation_id
string<uuid>

Omit to propose: the first call says what would happen, returns a confirmation_id and changes nothing. To go ahead, send the same arguments again with that confirmation_id, on a member's own API key; a service account's key can propose but never confirm.

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
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.

state
string
Allowed value: "confirmation_required"
confirmation_id
string<uuid>
expires_in_seconds
integer
request_summary
string

What will happen, in one sentence, for a person to approve before confirming.

external_post_id
string
status
enum<string>

Google's OWN state for the post, not our optimism. A fresh post is very often publishing — report that as 'Google is still processing it', never as live.

Available options:
scheduled,
publishing,
published,
failed,
unknown