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§
POST /v1/posts/{id}/submitmoves a draft topending_approval. Its targets stayheld.- The approver reads the post and its
content_hash, then callsapprovewith that hash. - If the content changed in between, the call fails with
409 content_changedand nothing is signed. - 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.