Publish, schedule, and manage social media across 11 platforms via MCP.
The free social media API built for automation, AI agents, and LLMs.
Get Started » · API Docs · Website · MCP Server
Programmatically publish to 15 platforms from a single API call. Built for developers, AI agents, LLMs, and agentic workflows that need reliable social media automation without browser sessions or manual interaction.
from bulkpublish import BulkPublish
bp = BulkPublish("bp_your_key_here")
bp.posts.create(
content="Launching our new product today!",
channels=[{"channelId": 1, "platform": "x"}, {"channelId": 2, "platform": "linkedin"}],
status="scheduled",
scheduled_at="2026-04-10T09:00:00Z",
)
Most social media tools are built for humans clicking buttons. BulkPublish is built for code — whether that code is written by a developer, an AI agent, an LLM with tool use, or an autonomous workflow.
Create a free account at app.bulkpublish.com.
Go to Settings > Developer in the dashboard and create an API key. Keys start with bp_ and are shown only once — save it securely.
Connect your social accounts in the dashboard under Channels. The API uses your connected channels to publish.
Python
pip install bulkpublish
Node.js
npm install bulkpublish
Homebrew (macOS/Linux)
brew tap azeemkafridi/bulkpublish && brew install bulkpublish
Or call the REST API directly with curl, fetch, requests, or any HTTP client.
curl -X POST https://app.bulkpublish.com/api/posts \
-H "Authorization: Bearer bp_your_key_here" \
-H "Content-Type: application/json" \
-d '{
"content": "Hello from the BulkPublish API!",
"channels": [{"channelId": 1, "platform": "linkedin"}],
"status": "draft"
}'
BulkPublish ships an MCP server so AI assistants can manage your social media directly:
{
"mcpServers": {
"bulkpublish": {
"command": "npx",
"args": ["-y", "@bulkpublish/mcp-server"],
"env": {
"BULKPUBLISH_API_KEY": "bp_your_key_here"
}
}
}
}
50 tools available: create_post, list_channels, upload_media, get_analytics, the interactive compose_post composer (MCP Apps), and more. Runs locally (stdio) or hosted over Streamable HTTP at https://mcp.bulkpublish.com/mcp. See mcp-server/README.md.
BulkPublish includes a 24-skill library for AI agents to plan, adapt, review, schedule, and publish social media content: Social Media Content Skills.
Ready-made tool definitions for autonomous AI agents:
All examples are complete, runnable scripts with error handling.
| Python | Node.js |
|---|---|
|
|
post = bp.posts.create(
content="This will go out tomorrow morning.",
channels=[{"channelId": 1, "platform": "instagram"}],
status="scheduled",
scheduled_at="2026-04-10T09:00:00Z",
timezone="America/New_York",
)
media = bp.media.upload("./product-photo.jpg")
post = bp.posts.create(
content="Our newest product is here.",
channels=[{"channelId": 1, "platform": "instagram"}],
media_files=[media["file"]["id"]],
status="scheduled",
scheduled_at="2026-04-10T12:00:00Z",
)
import csv
from bulkpublish import BulkPublish
bp = BulkPublish("bp_your_key_here")
channels = bp.channels.list()["channels"]
with open("content-calendar.csv") as f:
for row in csv.DictReader(f):
bp.posts.create(
content=row["content"],
channels=[{"channelId": ch["id"], "platform": ch["platform"]} for ch in channels],
status="scheduled",
scheduled_at=row["scheduled_at"],
timezone="America/New_York",
)
More examples in examples/ — including Python automation scripts, Node.js examples, curl reference, and AI agent integrations.
supportedMetrics / supportedTotals) so a 0 is never mistaken for a measurement — see Metrics by PlatformlinkTrackingOverride, to rewrite links through bulkpubli.sh and count the clicks. Reported as linkClicks / totalLinkClicks and measured by BulkPublish rather than the platform, so it works even where the platform reports nothing — see Character LimitspostTypeOverridesFull interactive API documentation: app.bulkpublish.com/docs
https://app.bulkpublish.com
Authorization: Bearer bp_your_key_here
| Method | Endpoint | Description |
|---|---|---|
POST | /api/posts | Create a post (draft, scheduled, or immediate) |
GET | /api/posts | List posts (paginated, filterable by status/date/channel/label) |
GET | /api/posts/:id | Get a post with platform statuses and metrics |
PUT | /api/posts/:id | Update a draft or scheduled post |
DELETE | /api/posts/:id | Delete a post |
POST | /api/posts/:id/publish | Publish a draft immediately |
POST | /api/posts/:id/retry | Retry failed platforms |
POST | /api/posts/:id/approve | Approve a post awaiting team approval (roles with post:approve) |
POST | /api/posts/:id/reject | Reject a pending post back to draft, with an optional reason |
POST | /api/posts/bulk | Bulk delete or retry |
GET | /api/channels | List connected social media channels |
GET | /api/channels/:id/health | Check channel token health |
GET | /api/channels/:id/options | Get platform options (Pinterest boards, YouTube playlists) |
GET | /api/channels/:id/mentions | Search users for @mention (X, Bluesky) |
GET/POST | /api/channel-sets | Saved channel groups for one-click targeting (update/delete via /api/channel-sets/:id) |
GET/POST | /api/rss-feeds | RSS/Atom autopost feeds — new items become posts (update/delete via /api/rss-feeds/:id) |
POST | /api/media | Upload a media file (multipart form, up to 100MB) |
POST | /api/media/multipart/create | Start a chunked upload for large media (videos up to 1GB, 10MB parts) |
POST | /api/media/multipart/complete | Assemble uploaded parts and record the media file |
GET | /api/media | List uploaded media |
GET | /api/analytics/summary | Analytics summary for a date range |
GET | /api/analytics/engagement | Engagement data grouped by day/week/month |
POST | /api/schedules | Create a recurring schedule |
GET | /api/quotas/usage | Check current plan limits and usage |
See the OpenAPI spec for the complete endpoint list.
| Platform | Post Types | Media |
|---|---|---|
| Post, Story | Images, Videos | |
| Feed, Reel, Story, Carousel | Images (JPEG), Videos (MP4, MOV) | |
| X / Twitter | Tweet, Thread | Images, Videos, GIFs |
| TikTok | Video, Photo Slideshow | Videos (MP4, MOV), Images |
| YouTube | Video, Short | Videos (MP4, MOV, WebM, AVI, WMV, FLV) |
| Threads | Post, Thread, Quote Post | Images, Videos |
| Bluesky | Post, Thread | Images |
| Pin | Images, Videos | |
| Google Business Profile | Post, Event, Offer | Images |
| Post, Multi-image, PDF Carousel, Article | Images (JPEG, PNG, GIF), Videos (MP4) | |
| Mastodon | Post, Thread | Images, Videos |
| Snapchat | Story, Saved Story, Spotlight | Exactly 1 image (JPG, PNG) or video (MP4, MOV, vertical, 5–60s, max 1GB) |
pip install bulkpublish
Supports sync and async. Rich docstrings on every method for IDE and LLM consumption.
npm install bulkpublish
Full TypeScript types, zero dependencies, native fetch (Node 18+).
brew tap azeemkafridi/bulkpublish && brew install bulkpublish
Installs the Node SDK via Homebrew.
No SDK needed — any HTTP client works:
curl https://app.bulkpublish.com/api/channels \
-H "Authorization: Bearer bp_your_key_here"
| Limit | Free | Pro | Business |
|---|---|---|---|
| Writes/min | 60 | 60 | 60 |
| Reads/min | 300 | 300 | 300 |
| Daily API requests | 100 | 5,000 | 50,000 |
| API keys | 1 | 5 | 10 |
| Recurring schedules | — | 10 | Unlimited |
See the rate limits guide for headers, backoff strategies, and best practices.
| Platform | Package | Install |
|---|---|---|
| Zapier | BulkPublish on Zapier | Search "BulkPublish" in Zapier |
| n8n | n8n-nodes-bulkpublish | Settings > Community Nodes > n8n-nodes-bulkpublish |
| Homebrew | homebrew-bulkpublish | brew tap azeemkafridi/bulkpublish && brew install bulkpublish |
| Resource | URL |
|---|---|
| Dashboard | app.bulkpublish.com |
| API Docs | app.bulkpublish.com/docs |
| Website | bulkpublish.com |
| support@bulkpublish.com |
MIT
Source-derived launch command. Check the maintainer’s required arguments and credentials before running:
npx -y @bulkpublish/mcp-serverMerge this template into ~/Library/Application Support/Claude/claude_desktop_config.json. Keep existing servers. Add any arguments, credentials, and permissions required by the maintainer; this template has not been install-tested.
{
"mcpServers": {
"io-github-azeemkafridi-bulkpublish": {
"command": "npx",
"args": [
"-y",
"@bulkpublish/mcp-server"
]
}
}
}Restart Claude Desktop completely for changes to take effect. Confirm the server appears connected in the client’s tool list, then try a read-only example from its documentation.
Claude Desktop setup reference@bulkpublish/mcp-servernpmio.github.azeemkafridi/bulkpublish works with any MCP-compatible client. Copy the config snippet from the Configuration section above and add it to the file shown for your client, then restart the application.
~/Library/Application Support/Claude/claude_desktop_config.jsonRestart Claude Desktop completely for changes to take effect.~/.cursor/mcp.jsonRestart Cursor for changes to take effect..vscode/mcp.jsonReload VS Code window for changes to take effect.~/.codeium/windsurf/mcp_config.jsonRestart Windsurf for changes to take effect..mcp.jsonSave at the project root, then start Claude Code in that project and review the MCP server approval prompt. Keep real credentials out of shared files.