BestPost for developers
Through the API, your programs and AI assistants work in your BestPost account: upload media, prepare posts, have texts and subtitles created, schedule. Whatever they create shows up in your planner and calendar right away.
The API is part of the Pro and Business plans.
1. Create a key
In BestPost under Settings, Account, "API and MCP". A key may either only prepare posts, or prepare and schedule them. It starts with bp_ and is shown only once. An account can have 5 keys. A key cannot be used to sign in, to connect a channel or to change billing.
curl https://bestpost.app/api/open/v1/me \
-H "Authorization: Bearer $BESTPOST_API_KEY"The answer shows what the key may do, how much of your plan is used and which rules apply to your account.
2. With Claude and other assistants (MCP)
An assistant that speaks MCP can use BestPost as a tool. You then say, for example: "Upload the folder Autumn as a carousel for Instagram and schedule it for tomorrow 6 pm."
Without installing anything
The address of the MCP server is https://bestpost.app/api/mcp. Add it to your assistant as an MCP server (the Claude app calls it a connector). When you connect, you sign in to BestPost and confirm what the assistant may do. You do not need a key for this.
You can see and disconnect connected assistants in BestPost under Settings, Account, "API and MCP".
If you prefer a key, send it as a header. In Claude Code, for example:
claude mcp add --transport http bestpost https://bestpost.app/api/mcp \
--header "Authorization: Bearer $BESTPOST_API_KEY"This way does not see files on your device. It works with media that is already in BestPost, or with public addresses.
On your own computer, with access to folders
Download the server as a single file. It needs Node 20 or newer.
curl -o bestpost-mcp.mjs https://bestpost.app/api/open/v1/mcp/bestpost-mcp.mjsThen add it to your program, for example Claude Desktop or Claude Code:
{
"mcpServers": {
"bestpost": {
"command": "node",
"args": ["/pfad/zu/bestpost-mcp.mjs"],
"env": { "BESTPOST_API_KEY": "bp_live_..." }
}
}
}The server reads only images and videos, nothing else from your computer.
3. With your own programs (API)
All addresses start with https://bestpost.app/api/open/v1. The key goes into the header Authorization: Bearer …. Times always carry a time zone.
A post from a file
One video, one image, or 2 to 35 images as a carousel. The post is created as a draft. With an Idempotency-Key, a repeated request does not create anything twice. Texts follow the fixed settings of the brand: BestPost replaces dashes, and drops hashtags and emojis when the brand is set to none.
curl -X POST https://bestpost.app/api/open/v1/posts \
-H "Authorization: Bearer $BESTPOST_API_KEY" \
-H "Idempotency-Key: reel-2026-10-12" \
-F "media=@video.mp4" \
-F 'data={
"platforms": {
"instagram": { "text": "Neu im Shop #neu", "firstComment": "Link in der Bio" },
"facebook": { "text": "Neu im Shop" }
},
"scheduledAt": "2026-10-12T18:00:00+02:00"
}'A post from addresses, scheduled right away
Instead of files you can send public https addresses. BestPost fetches the media itself. With schedule, the post is scheduled in the same call if all of its platforms allow it.
curl -X POST https://bestpost.app/api/open/v1/posts \
-H "Authorization: Bearer $BESTPOST_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"mediaUrls": ["https://example.com/bild-1.jpg", "https://example.com/bild-2.jpg"],
"platforms": { "instagram": { "text": "Zwei Bilder, ein Karussell" } },
"scheduledAt": "2026-10-12T18:00:00+02:00",
"schedule": true
}'Texts by BestPost
BestPost listens to and looks at the media and writes a text per platform, plus the title for YouTube and a first comment. As in the app, this counts as one text of your plan. The texts are suggestions: read them before you schedule.
# 1. anfordern
curl -X POST https://bestpost.app/api/open/v1/posts/POST_ID/texts -H "Authorization: Bearer $BESTPOST_API_KEY"
# 2. abholen, bis "status" nicht mehr "running" ist
curl https://bestpost.app/api/open/v1/posts/POST_ID/texts -H "Authorization: Bearer $BESTPOST_API_KEY"
# 3. in den Entwurf schreiben (nur leere Felder)
curl -X POST https://bestpost.app/api/open/v1/posts/POST_ID/texts/apply -H "Authorization: Bearer $BESTPOST_API_KEY"Subtitles
Create and read them first, then burn them in. Burning in cannot be undone and works once per video. Without style, the style you saved as your default in BestPost applies.
# 1. erstellen: die Antwort trägt die Untertitel als SRT
curl -X POST https://bestpost.app/api/open/v1/posts/POST_ID/subtitles -H "Authorization: Bearer $BESTPOST_API_KEY"
# 2. fest ins Video einfügen, hier mit hervorgehobenem Wort
curl -X POST https://bestpost.app/api/open/v1/posts/POST_ID/subtitles/burn \
-H "Authorization: Bearer $BESTPOST_API_KEY" -H "Content-Type: application/json" \
-d '{ "style": { "preset": "karaoke" } }'
# 3. Stand abfragen, bis "status" gleich "burned" ist
curl https://bestpost.app/api/open/v1/posts/POST_ID/subtitles -H "Authorization: Bearer $BESTPOST_API_KEY"Scheduling
curl -X POST https://bestpost.app/api/open/v1/posts/POST_ID/schedule \
-H "Authorization: Bearer $BESTPOST_API_KEY" -H "Content-Type: application/json" \
-d '{ "scheduledAt": "2026-10-12T18:00:00+02:00" }'All addresses
| GET | /me | Account, key permissions, plan usage, rules |
| GET | /channels | Brands and connected channels |
| GET | /channels/{id} | What the platform allows for this channel right now |
| GET | /posts | List posts |
| POST | /posts | Create a post from files or addresses |
| GET | /posts/{id} | Read one post |
| PATCH | /posts/{id} | Change texts, time, name, platforms |
| DELETE | /posts/{id} | Delete a post |
| POST | /posts/{id}/schedule | Schedule a draft |
| POST | /posts/{id}/unschedule | Take a scheduled post back |
| POST | /posts/{id}/texts | Request texts from BestPost |
| GET | /posts/{id}/texts | State and suggestions |
| POST | /posts/{id}/texts/apply | Write the suggestions into the draft |
| POST | /posts/{id}/subtitles | Create subtitles |
| GET | /posts/{id}/subtitles | State, text, progress |
| PUT | /posts/{id}/subtitles | Save corrected subtitles |
| DELETE | /posts/{id}/subtitles | Discard subtitles |
| POST | /posts/{id}/subtitles/burn | Burn the subtitles into the video |
The complete description with every field is available as OpenAPI: https://bestpost.app/api/open/v1/openapi.json
4. Rules
- Never immediately. The earliest time is 10 minutes ahead. That way a mistake can still be taken back.
- TikTok and YouTube. Both require choices from you before every post. A post with one of these platforms therefore stays a draft (
confirmInApp) until you confirm it in the planner with one click. What applies to your account is underrulesin the answer of/me. - Your plan applies here too. Texts, subtitles, drafts and storage count as in the app.
/mereturns the state underusage. - A limit per channel and day. A program schedules only a limited number of posts per channel and day. The numbers are under
rules.maxPerChannelPerDay. - Errors explain themselves. Every rejection carries a sentence and a stable code:
{ "error": "X: „text" ist 301 Zeichen lang, erlaubt sind 280.", "code": "TEXT_ZU_LANG" }The API terms apply. Questions are answered at info@bestpost.app.