Drafts.
Save half a thought without shipping it. Draft posts are author-only — stripped from feeds and lists, and getById only returns one to the author. Promote by PATCHing { status: 'published' }, and the post_count counter is bumped at the transition.
1
Save a draft
Use the existing post-create endpoint with status: "draft". Body / title / url content rules are the same as a published post — at least one of the three must be non-empty.
curl -X POST \
-H "Authorization: Bearer pcft_live_..." \
-H "Content-Type: application/json" \
-d '{"actor_id":"<actorId>","body":"WIP — half a thought…","status":"draft"}' \
"https://social.productcraft.co/v1/communities/<communityId>/posts"{
"id": "bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb",
"community_id": "...",
"actor_id": "...",
"kind": "text",
"title": null,
"body": "WIP — half a thought…",
"url": null,
"attributes": {},
"visibility": "public",
"status": "draft",
"reaction_counts": {},
"comment_count": 0,
"source_post_id": null,
"repost_count": 0,
"quote_count": 0,
"edited_at": null,
"edit_count": 0,
"view_count": 0,
"expires_at": null,
"pinned": false,
"settings": {
"comments": "everyone",
"hide_reaction_counts": false,
"allow_repost": true,
"allow_quote": true
},
"scheduled_for": null,
"assets": [],
"created_at": "2026-05-11T19:50:00.000Z",
"updated_at": "2026-05-11T19:50:00.000Z"
}2
List drafts
Per-actor, cursor-paginated newest-first. Drafts do not appear in the regular post list or any feed, so this is the only way to enumerate them.
The PAK lane has no end-user principal, so the customer's backend is responsible for ensuring the actorId in the path matches the end-user behind the request before exposing the response.
curl -H "Authorization: Bearer pcft_live_..." \
"https://social.productcraft.co/v1/communities/<communityId>/actors/<actorId>/drafts?limit=20"3
Edit the draft
PATCH the post like any other — body / title / url / attributes / visibility / pinned all editable. Drafts edit freely: the edit window doesn't apply and no revision rows are written until the post is published.
curl -X PATCH \
-H "Authorization: Bearer pcft_live_..." \
-H "Content-Type: application/json" \
-d '{"body":"Now with a real point."}' \
"https://social.productcraft.co/v1/communities/<communityId>/posts/<postId>"4
Publish
Same PATCH endpoint with {"status":"published"}. The post immediately becomes visible per its visibility setting, lands in the feeds of people who follow the author, and the post_count counter is bumped by 1.
curl -X PATCH \
-H "Authorization: Bearer pcft_live_..." \
-H "Content-Type: application/json" \
-d '{"status":"published"}' \
"https://social.productcraft.co/v1/communities/<communityId>/posts/<postId>"Behaviour
What to expect
- Drafts are author-only. The post list and every feed skip them, and
GET /posts/<postId>returns404 Post not found— even with a valid PAK — unless you pass the author as the viewer:?actor_id=<authorActorId>. Any otheractor_idalso gets the 404. - Counter accounting follows publish state. Creating a draft does NOT bump
post_count. Promoting via PATCH does. Going back to draft (rare, but supported) decrements again. - Mentions in a draft still notify.
@handlein the body is indexed and fans out amentionnotification the moment the draft is saved — before anyone can open the post. If your product treats drafts as fully private, strip or defer mentions on your side until publish. - No expiry. Drafts have no TTL. They live until the author publishes or deletes them.