An agent that can publish is useful. An agent that cannot publish until you say so is the one you will actually turn on.
Immediate auto-post is how accounts get restricted. The first weeks of an agent integration should be draft, review, then send. Most posting APIs skip that state: the agent either publishes or it does not, so teams bolt on a second approval tool, or they never let the agent write anything real.
POST /v1/posts with draft: true (MCP: create_post). The post is stored, listed, editable, and invisible to every network. It costs nothing. A failed publish leaves the draft intact, so an approval is not a one-shot.
publish_draft (or the dashboard) sends it, optionally with a scheduledAt. Omitting the time uses whatever the draft already had. Clearing the time publishes now. The agent can be told "never call create_post without draft: true."
Drafts show in the dashboard alongside scheduled posts. The calendar is the approval queue. Edit copy, retarget accounts, move the slot, or delete it.
Even after you approve, you can cap which brands an agent may post from, which networks it may reach, and how much it may do in a day. Approval plus guardrails, not one or the other.
Create with draft: true, review on the calendar, then publish_draft. Walkthrough: human approval for agents.
curl -X POST https://api.postlake.dev/v1/posts \
-H "Authorization: Bearer $POSTLAKE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"text": "Ready when you are",
"profile": "my-brand",
"draft": true
}'Get started free (20 credits, no card) · Agent calendar walkthrough · vs Postiz
Yes. Send draft: true. The post never reaches a network and never spends credits until you (or publish_draft after you said yes) send it.
Same job, different shape. Those are local-first approval apps. PostLake is a hosted API: the draft lives next to scheduling, analytics and the MCP tools, so the agent does not need a second vendor for the gate.
The draft stays. A rejection is not a consume. Fix the copy or the media and try again.