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.

400The body or query is not valid.
401The token is missing, wrong or revoked.
402This month's credits or posts are used up. upgrade_url opens the plan page.
403Your plan has no API access, or you are a viewer and tried to add a draft or note.
404The draft does not exist in this workspace.
422The text scored as a Pass, so it was not saved. The reason is in failure.
429Too many requests. Wait retryAfterSeconds, or raise the limit at upgrade_url.
503Scoring 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_draftsList drafts, newest first. Optional status and limit, as in the REST API.
get_draftGet one draft by id, with results for each platform.
create_draftSend a draft to Today, with media and YouTube or TikTok settings. It waits for review.
update_draftChange a draft that still waits for review: text, media or network settings.
upload_mediaGet a signed URL to PUT one image or video to.
finish_media_uploadConfirm the upload and get the media id.
add_noteSave 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.

  1. Open Shortcuts, tap +, and name the shortcut Postlite draft.
  2. 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.
  3. 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 named text set to Shortcut Input.
  4. 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”.
  5. 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.