API, MCP and Siri Shortcut
Send drafts to Today from scripts, Siri or the Share Sheet. Postlite scores each one, and nothing posts until you approve it. The API and MCP come with every paid plan: Pro (100 requests a minute), Advanced (200) and Team (400). Each workspace can create up to 2,000 scored drafts a day through the API and MCP together.
Tokens
Create a token under Settings → API tokens. It is shown once, works for the workspace you created it in, and acts as you. Send it in the Authorization header as Bearer pla_…. Revoke it on the same page.
Create a draft
POST /api/v1/drafts with JSON: text (1 to 10,000 characters) and optional platforms (x, threads, bluesky, linkedin, instagram, facebook, tiktok, youtube, pinterest, google_business; default x). The draft lands on Today for review. Instagram, TikTok, YouTube and Pinterest need an image or video: upload it first and pass its id in media. With two accounts on a network, pass account (a handle) to pick one; without it the draft goes to the main account, the one you connected first.
curl -X POST https://postlite.app/api/v1/drafts \
-H "Authorization: Bearer pla_your_token" \
-H "Content-Type: application/json" \
-d '{"text": "Shipped the calendar feed today.", "platforms": ["x", "threads"]}'Returns 201:
{
"draft": {
"id": 42,
"body": "Shipped the calendar feed today.",
"platforms": ["x", "threads"],
"status": "review",
"bucket": "read",
"scheduled_for": null,
"published_at": null,
"created_at": "2026-09-23T18:00:00Z"
}
}Upload a video or image
Three steps. POST /api/v1/media with mime and bytes returns a signed upload.url that lasts two hours. PUT the raw file to it. Then POST /api/v1/media/finish with the same path, mime and bytes, plus width, height and duration_ms if you know them. It returns the media id.
curl -X POST https://postlite.app/api/v1/media \
-H "Authorization: Bearer pla_your_token" \
-H "Content-Type: application/json" \
-d '{"mime": "video/mp4", "bytes": 48213004}'
curl -X PUT "<upload.url from the reply>" \
-H "Content-Type: video/mp4" --data-binary @clip.mp4
curl -X POST https://postlite.app/api/v1/media/finish \
-H "Authorization: Bearer pla_your_token" \
-H "Content-Type: application/json" \
-d '{"path": "<upload.path>", "mime": "video/mp4", "bytes": 48213004,
"width": 1080, "height": 1920, "duration_ms": 41000}'YouTube and TikTok versions
One draft per network, with exactly one video in media. YouTube needs youtube: title (up to 100 characters), privacy (public, unlisted or private), madeForKids and altered (realistic altered or AI-made scenes). Optional: coverUrl (an image from your media library as the thumbnail; it needs a verified channel and is ignored for Shorts), tags, category, defaultLanguage and notifySubscribers (default true). A vertical or square video up to 3 minutes posts as a Short. text is the description. For TikTok, text is the caption and tiktok holds suggested settings; you choose privacy and interactions yourself before approving, as TikTok requires. Pass source_draft_id when it is a version of a post you approved. The reply has a review_url: you finish and approve it in the studio there.
curl -X POST https://postlite.app/api/v1/drafts \
-H "Authorization: Bearer pla_your_token" \
-H "Content-Type: application/json" \
-d '{"platforms": ["youtube"], "media": [17], "source_draft_id": 42,
"text": "What changed when I doubled my price, and who left.",
"youtube": {"title": "I doubled my price. Here is who left.",
"privacy": "public", "madeForKids": false, "altered": false}}'PATCH /api/v1/drafts/42 changes text, media, youtube or tiktok while the draft waits for review.
List drafts
GET /api/v1/drafts?status=review&limit=20. status is review, scheduled or published; limit is 1 to 100. Newest first.
Get one draft
GET /api/v1/drafts/42 returns the draft plus results: one entry per platform with status, permalink and error_human.
Add a note
POST /api/v1/notes with JSON: kind (idea, win or link), body (1 to 2,000 characters) and optional url (http or https). The note waits in your notebook, and the Content editor drafts from it on its next run, Monday or Thursday. Nothing posts. Returns 201 with the note.
curl -X POST https://postlite.app/api/v1/notes \
-H "Authorization: Bearer pla_your_token" \
-H "Content-Type: application/json" \
-d '{"kind": "win", "body": "First customer renewed for a second year."}'Errors
Every error is JSON with an error message.
| 400 | The body or query is not valid. |
|---|---|
| 401 | The token is missing, wrong or revoked. |
| 402 | This month's credits or posts are used up. upgrade_url opens the plan page. |
| 403 | Your plan has no API access, or you are a viewer and tried to add a draft or note. |
| 404 | The draft does not exist in this workspace. |
| 422 | The text scored as a Pass, so it was not saved. The reason is in failure. |
| 429 | Too many requests. Wait retryAfterSeconds, or raise the limit at upgrade_url. |
| 503 | Scoring or the database is unavailable. Try again in a minute. |
MCP
Claude, Cursor and other MCP clients can use Postlite as a remote MCP server. The URL is https://postlite.app/api/mcp (Streamable HTTP). Send the same token in the Authorization header as Bearer pla_…. The plans and errors match the REST API.
Every MCP message counts as one request. Each tools/call counts against your plan’s limit. Setup messages (initialize, ping, tools/list and notifications) count against a separate limit of 60 a minute per token, so connecting a client never uses up your plan’s requests. Send one message per request; batches get a 400. Bodies over 64 KB get a 413.
Claude Code
claude mcp add --transport http postlite https://postlite.app/api/mcp \
--header "Authorization: Bearer pla_your_token"Other clients
Most clients take a JSON config like this one:
{
"mcpServers": {
"postlite": {
"type": "http",
"url": "https://postlite.app/api/mcp",
"headers": { "Authorization": "Bearer pla_your_token" }
}
}
}Tools
| list_drafts | List drafts, newest first. Optional status and limit, as in the REST API. |
|---|---|
| get_draft | Get one draft by id, with results for each platform. |
| create_draft | Send a draft to Today, with media and YouTube or TikTok settings. It waits for review. |
| update_draft | Change a draft that still waits for review: text, media or network settings. |
| upload_media | Get a signed URL to PUT one image or video to. |
| finish_media_upload | Confirm the upload and get the media id. |
| add_note | Save an idea, win or link to your notebook for the Content editor. |
Nothing posts from MCP. Drafts wait on Today until you approve them. Keep the token out of shared config files.
Siri and the Share Sheet
Build this once in the Shortcuts app on iPhone, iPad or Mac. Then say “Hey Siri, Postlite draft”, or share text from Notes or Safari to Postlite.
- Open Shortcuts, tap +, and name the shortcut Postlite draft.
- Tap the info button, turn on Show in Share Sheet, and set it to receive Text. Under “If there's no input”, choose Ask For Text.
- Add Get Contents of URL. URL:
https://postlite.app/api/v1/drafts. Method: POST. Headers:Authorization=Bearer pla_your_token. Request Body: JSON, with a Text field namedtextset to Shortcut Input. - Add Get Dictionary Value for the key
error, then an If that shows the error when it has any value, and otherwise shows “Saved to Postlite”. - Run it once and allow it to connect to postlite.app.
The token sits inside the shortcut, so do not share the shortcut file. Revoke the token if a device is lost.