Approvals
Hold posts your AI agent writes until a person approves them: needs_approval, one-tap approve links by email, approver seats, auto-approve rules, and why an agent can't approve its own posts.
Your agent writes the posts. A person decides what goes out. A post held for approval is never published until someone approves it, and the agent that wrote it can't approve it.
How it works
- The agent holds the post. It calls
queue_post(orschedule_post) withneeds_approval: true, or the REST API with"queueStatus": "pending". The post is saved with statuspending_approval. - Octopost emails the people who approve. Within about 5 minutes, the account owner and any approvers get one email listing every post that's waiting. A burst of 10 posts is one email, not 10.
- One tap to decide. Each post in the email has Approve, Reject and Edit buttons. Opening a button shows the post and asks you to confirm, so mail scanners that open links can't approve anything. Each link works once and expires after 7 days.
- The post goes out, or doesn't. Approved: a queue post publishes in its next queue slot, a scheduled post at its time (right away if that time has passed). Rejected: it stays in the account as a draft and won't be published.
You can also approve and reject on the Posts page. The sidebar shows how many posts are waiting.
Telling your agent
Tell your agent to use needs_approval: true for anything you haven't read word for word, and to tell you to check your email afterwards. The Octopost MCP server and skill already say this, so most agents do it when you ask them to "hold it for my approval".
Queue three posts about the launch for next week and hold them for my approval.
Agents can't approve their own posts
approve_queued_post (MCP) and POST /api/posts/{id}/approve with an API key are refused by default: only people approve. Octopost records which API key or connected app made each post and who approved it.
If you want one agent to review another's posts, turn on Let agents approve posts made by a different agent in Settings > Approvals. Even then, a key or app can never approve a post it made.
Approval guards that apply to every agent:
- A held post can't be published (
/publish), moved into the queue (PUTwithqueueStatus: "queued") or posted by the scheduler until it's approved. - If an agent changes the text, networks, media or thread of a post that was already approved, the post goes back on hold.
- A rejected post can't be queued, scheduled or published again by an agent. You can put it back yourself from the dashboard.
- Approval settings, rules and approvers can only be changed from the dashboard, not with an API key.
Hold every agent post
Turn on Hold every post an agent makes in Settings > Approvals and everything sent with an API key or a connected app waits for approval, even when the agent didn't ask: create_post and REST "publish now" are held instead of published, and so are posts an agent queues or schedules. The response tells the agent the post is pending_approval. Posts you make yourself in the dashboard aren't held.
Auto-approve rules
Rules let some agent posts skip the hold. A rule has a name and one or more conditions, and a post must meet all of them:
| Condition | Matches |
|---|---|
| From | Posts made by one API key or connected app (or any agent) |
| Networks | Posts whose networks are all in the list, e.g. only Bluesky |
| No links | Posts with no links in the text, thread replies or first comment |
Example: "Plain Bluesky posts" (networks: Bluesky, no links) lets those through and holds anything with a link or anything going to X. You can have up to 10 rules. A post approved by a rule records the rule as the approver.
Approvers
On the Premium plan (3 seats) and the Business plan (10 seats) you can invite people to approve: a teammate, a client, an editor. In Settings > Approvals, enter their email. They get an invite link and then the same approval emails you do, and they can sign in at octopost.ink/approver to see everything that's waiting.
Approvers see only the posts waiting for approval. They can approve, reject or edit them, nothing else, and they don't need an Octopost account. Removing an approver ends their access at once and turns off their links.
Approval itself, with the emailed links for the account owner, is on every plan.
Webhooks
Three events follow approvals (see Webhooks):
| Event | Sent when |
|---|---|
post.pending_approval | A post is held for approval. |
post.approved | A person, an allowed agent or an auto-approve rule approved it. |
post.rejected | A person rejected it. |
Their data has postId, content, platforms, scheduledFor and an approval object: state, createdBy (the key or app that made it), decidedBy, decidedAt, edited and autoApproved. Use post.pending_approval to ping a Slack channel or a phone.
API
| Call | What it does |
|---|---|
POST /api/posts with "queueStatus": "pending" | Create a held post (add scheduledFor to hold a scheduled post). |
POST /api/posts/{id}/approve | Approve. From the dashboard always; with an API key only as described above. |
POST /api/posts/{id}/reject | Reject (dashboard only). |
MCP get_post | Includes approval: who made the post and who decided it. |
Details: Posts API.