Skip to content
API and publishers operational
Vol. I · No. 4Docs · API v1

Concepts

Approvals

Who must approve, what approval binds to, and what happens when content changes after someone signed.

An approval is a person saying yes to a specific version of a post. SMMist records it against a sha256 of the content, so a later edit cannot ride on an earlier yes.

Who needs approval§

none
None. Scopes still decide who can publish.
agents
Posts created over the API or MCP by a caller without the approve scope. People in the dashboard skip it.
all
Every post from anyone without the approve scope.

Separately, a key without publish can only draft. That is the default for new keys, and the reason an agent’s first post often comes back with draft_reason: missing_scope.

The flow§

  1. POST /v1/posts/{id}/submit moves a draft to pending_approval. Its targets stay held.
  2. The approver reads the post and its content_hash, then calls approve with that hash.
  3. If the content changed in between, the call fails with 409 content_changed and nothing is signed.
  4. On success the targets are released at publish_at, or at once if that time has passed.
curl $API/v1/posts/$POST_ID/approve \
  -H "Authorization: Bearer $APPROVER_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "content_hash": "4e1f…a09c", "comment": "Fine to go Monday." }'

Edits void the signature§

Editing text, media or targets of an approved post voids the approval and sends it back to pending_approval. The worker also checks at send time: it refuses to publish content whose hash differs from the approved one, so even a bug elsewhere cannot publish unsigned words.