{
  "markdown": "<div align=\"center\">\n  <img alt=\"BulkPublish Logo\" src=\"logo.svg\" width=\"220\"/>\n\n  <h1>BulkPublish API</h1>\n\n  <p><strong>The free social media API built for automation, AI agents, and LLMs.</strong></p>\n\n  <p>\n    <img src=\"https://img.shields.io/badge/License-MIT-blue.svg\" alt=\"License\">\n    <img src=\"https://img.shields.io/badge/Platforms-15-orange.svg\" alt=\"15 Platforms\">\n    <img src=\"https://img.shields.io/badge/MCP-Server-purple.svg\" alt=\"MCP Server\">\n    <a href=\"https://pypi.org/project/bulkpublish/\"><img src=\"https://img.shields.io/pypi/v/bulkpublish.svg\" alt=\"PyPI\"></a>\n    <a href=\"https://www.npmjs.com/package/bulkpublish\"><img src=\"https://img.shields.io/npm/v/bulkpublish.svg\" alt=\"npm\"></a>\n  </p>\n\n  <p>\n    <img alt=\"Facebook\" src=\".github/assets/platforms/badges/facebook.svg\" width=\"36\">\n    <img alt=\"Instagram\" src=\".github/assets/platforms/badges/instagram.svg\" width=\"36\">\n    <img alt=\"X / Twitter\" src=\".github/assets/platforms/badges/x.svg\" width=\"36\">\n    <img alt=\"TikTok\" src=\".github/assets/platforms/badges/tiktok.svg\" width=\"36\">\n    <img alt=\"YouTube\" src=\".github/assets/platforms/badges/youtube.svg\" width=\"36\">\n    <img alt=\"Threads\" src=\".github/assets/platforms/badges/threads.svg\" width=\"36\">\n    <img alt=\"Bluesky\" src=\".github/assets/platforms/badges/bluesky.svg\" width=\"36\">\n    <img alt=\"Pinterest\" src=\".github/assets/platforms/badges/pinterest.svg\" width=\"36\">\n    <img alt=\"Google Business\" src=\".github/assets/platforms/badges/gmb.svg\" width=\"36\">\n    <img alt=\"LinkedIn\" src=\".github/assets/platforms/badges/linkedin.svg\" width=\"36\">\n    <img alt=\"Mastodon\" src=\".github/assets/platforms/badges/mastodon.svg\" width=\"36\">\n    <img alt=\"Discord\" src=\".github/assets/platforms/badges/discord.svg\" width=\"36\">\n    <img alt=\"Telegram\" src=\".github/assets/platforms/badges/telegram.svg\" width=\"36\">\n    <img alt=\"Tumblr\" src=\".github/assets/platforms/badges/tumblr.svg\" width=\"36\">\n    <img alt=\"Snapchat\" src=\".github/assets/platforms/badges/snapchat.svg\" width=\"36\">\n  </p>\n\n  <p>\n    <a href=\"https://app.bulkpublish.com/register\"><strong>Get Started »</strong></a> ·\n    <a href=\"https://app.bulkpublish.com/docs\">API Docs</a> ·\n    <a href=\"https://www.bulkpublish.com\">Website</a> ·\n    <a href=\"mcp-server/README.md\">MCP Server</a>\n  </p>\n\n  <br/>\n\n  <img alt=\"BulkPublish Multi-Platform Composer\" src=\".github/assets/multi-platform-composer.webp\" width=\"720\"/>\n\n  <br/>\n  <br/>\n</div>\n\nProgrammatically 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.\n\n```python\nfrom bulkpublish import BulkPublish\n\nbp = BulkPublish(\"bp_your_key_here\")\nbp.posts.create(\n    content=\"Launching our new product today!\",\n    channels=[{\"channelId\": 1, \"platform\": \"x\"}, {\"channelId\": 2, \"platform\": \"linkedin\"}],\n    status=\"scheduled\",\n    scheduled_at=\"2026-04-10T09:00:00Z\",\n)\n```\n\n## Why BulkPublish?\n\nMost 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.\n\n- **Headless by design** — No browser, no UI, no OAuth pop-ups at runtime. Connect accounts once in the dashboard, then automate everything via API.\n- **AI-native** — MCP server for Claude, tool definitions for GPT and LangChain, structured JSON responses that LLMs parse reliably.\n- **Agentic-ready** — Deterministic API with clear error codes. AI agents can create posts, check status, retry failures, and read analytics autonomously.\n- **15 platforms, one endpoint** — Facebook, Instagram, X/Twitter, TikTok, YouTube, Threads, Bluesky, Pinterest, Google Business Profile, LinkedIn, Mastodon, Discord, Telegram, Tumblr, Snapchat.\n\n## Use Cases\n\n- **AI social media managers** — Let Claude, GPT, or custom agents schedule and publish posts autonomously\n- **Content pipelines** — RSS-to-social, blog-to-social, newsletter-to-social automation\n- **Bulk scheduling** — Upload a CSV or feed a content calendar and schedule weeks of posts programmatically\n- **Cross-platform syndication** — Publish once to all platforms with per-platform content optimization\n- **Analytics dashboards** — Pull engagement data into your own tools, spreadsheets, or AI analysis\n- **Zapier/n8n/Make alternatives** — Direct API access without middleware, lower latency, more control\n- **LLM-powered content creation** — Generate content with AI, publish it with BulkPublish, track performance, iterate\n\n## Quick Start\n\n### 1. Sign up\n\nCreate a free account at [app.bulkpublish.com](https://app.bulkpublish.com/register).\n\n### 2. Get your API key\n\nGo to **Settings > Developer** in the dashboard and create an API key. Keys start with `bp_` and are shown only once — save it securely.\n\n### 3. Connect platforms\n\nConnect your social accounts in the dashboard under **Channels**. The API uses your connected channels to publish.\n\n### 4. Install an SDK\n\n**Python**\n\n```bash\npip install bulkpublish\n```\n\n**Node.js**\n\n```bash\nnpm install bulkpublish\n```\n\n**Homebrew (macOS/Linux)**\n\n```bash\nbrew tap azeemkafridi/bulkpublish && brew install bulkpublish\n```\n\nOr call the REST API directly with `curl`, `fetch`, `requests`, or any HTTP client.\n\n### 5. Make your first API call\n\n```bash\ncurl -X POST https://app.bulkpublish.com/api/posts \\\n  -H \"Authorization: Bearer bp_your_key_here\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"content\": \"Hello from the BulkPublish API!\",\n    \"channels\": [{\"channelId\": 1, \"platform\": \"linkedin\"}],\n    \"status\": \"draft\"\n  }'\n```\n\n## AI Agent Integration\n\n### MCP Server (Claude, Cursor, Windsurf, Claude Code)\n\nBulkPublish ships an MCP server so AI assistants can manage your social media directly:\n\n```json\n{\n  \"mcpServers\": {\n    \"bulkpublish\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@bulkpublish/mcp-server\"],\n      \"env\": {\n        \"BULKPUBLISH_API_KEY\": \"bp_your_key_here\"\n      }\n    }\n  }\n}\n```\n\n50 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](mcp-server/README.md).\n\n### Social Media Content Skills\n\nBulkPublish includes a 24-skill library for AI agents to plan, adapt, review, schedule, and publish social media content: [Social Media Content Skills](skills/social-media-content-skills/README.md).\n\n\n### LLM Tool Use / Function Calling\n\nReady-made tool definitions for autonomous AI agents:\n\n- **[Claude tool_use example](examples/ai-agents/claude_tool_use.py)** — Anthropic SDK with tool definitions for scheduling posts\n- **[OpenAI function calling example](examples/ai-agents/openai_function.py)** — GPT-4 with functions for post management\n- **[LangChain tool example](examples/ai-agents/langchain_tool.py)** — LangChain agent with BulkPublish tools\n\nAll examples are complete, runnable scripts with error handling.\n\n## Code Examples\n\n### Create a Post\n\n<table>\n<tr><th>Python</th><th>Node.js</th></tr>\n<tr>\n<td>\n\n```python\nfrom bulkpublish import BulkPublish\n\nbp = BulkPublish(\"bp_your_key_here\")\n\npost = bp.posts.create(\n    content=\"Check out our latest update!\",\n    channels=[\n        {\"channelId\": 1, \"platform\": \"facebook\"},\n        {\"channelId\": 2, \"platform\": \"x\"},\n        {\"channelId\": 3, \"platform\": \"linkedin\"},\n    ],\n    status=\"draft\",\n)\n```\n\n</td>\n<td>\n\n```typescript\nimport { BulkPublish } from 'bulkpublish';\n\nconst bp = new BulkPublish({ apiKey: 'bp_your_key_here' });\n\nconst post = await bp.posts.create({\n  content: 'Check out our latest update!',\n  channels: [\n    { channelId: 1, platform: 'facebook' },\n    { channelId: 2, platform: 'x' },\n    { channelId: 3, platform: 'linkedin' },\n  ],\n  status: 'draft',\n});\n```\n\n</td>\n</tr>\n</table>\n\n### Schedule a Post\n\n```python\npost = bp.posts.create(\n    content=\"This will go out tomorrow morning.\",\n    channels=[{\"channelId\": 1, \"platform\": \"instagram\"}],\n    status=\"scheduled\",\n    scheduled_at=\"2026-04-10T09:00:00Z\",\n    timezone=\"America/New_York\",\n)\n```\n\n### Upload Media and Publish\n\n```python\nmedia = bp.media.upload(\"./product-photo.jpg\")\n\npost = bp.posts.create(\n    content=\"Our newest product is here.\",\n    channels=[{\"channelId\": 1, \"platform\": \"instagram\"}],\n    media_files=[media[\"file\"][\"id\"]],\n    status=\"scheduled\",\n    scheduled_at=\"2026-04-10T12:00:00Z\",\n)\n```\n\n### Automation Example: Bulk Schedule from CSV\n\n```python\nimport csv\nfrom bulkpublish import BulkPublish\n\nbp = BulkPublish(\"bp_your_key_here\")\nchannels = bp.channels.list()[\"channels\"]\n\nwith open(\"content-calendar.csv\") as f:\n    for row in csv.DictReader(f):\n        bp.posts.create(\n            content=row[\"content\"],\n            channels=[{\"channelId\": ch[\"id\"], \"platform\": ch[\"platform\"]} for ch in channels],\n            status=\"scheduled\",\n            scheduled_at=row[\"scheduled_at\"],\n            timezone=\"America/New_York\",\n        )\n```\n\nMore examples in [`examples/`](examples/) — including [Python automation scripts](examples/python/), [Node.js examples](examples/node/), [curl reference](examples/curl/), and [AI agent integrations](examples/ai-agents/).\n\n## Features\n\n- **15 platforms** — Facebook, Instagram, X/Twitter, TikTok, YouTube, Threads, Bluesky, Pinterest, Google Business Profile, LinkedIn, Mastodon, Discord, Telegram, Tumblr, Snapchat\n- **Scheduling** — Schedule posts for any future time with timezone support, or let queue slots pick optimal times\n- **Media uploads** — Images (JPEG, PNG, WebP, GIF) and videos (MP4, MOV, WebM) up to 100 MB\n- **Recurring schedules** — Repeat posts daily, weekly, biweekly, or monthly at a set time of day\n- **Analytics** — Track impressions, likes, comments, shares, and engagement. Each platform reports a different subset of metrics, and the response says which (`supportedMetrics` / `supportedTotals`) so a `0` is never mistaken for a measurement — see [Metrics by Platform](guides/platforms.md#metrics-by-platform)\n- **Link tracking** — Opt in per organization, or per post via `linkTrackingOverride`, 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 Limits](guides/platforms.md#character-limits)\n- **Labels** — Organize posts and media with color-coded labels\n- **Bulk operations** — Delete or retry multiple posts in a single request\n- **Threads** — Multi-part thread posts for X, Threads, Bluesky, and Mastodon\n- **Auto first comment** — Automatically add a comment after publishing on any platform\n- **All post types** — Reels, Stories, Carousels, Threads, Shorts, Video — set per-platform via `postTypeOverrides`\n- **Per-platform content** — Customize text and options per platform in a single post\n- **Platform-specific options** — Instagram collaborators, TikTok privacy, YouTube categories, Pinterest boards, and more\n\n## API Reference\n\nFull interactive API documentation: **[app.bulkpublish.com/docs](https://app.bulkpublish.com/docs)**\n\n### Base URL\n\n```\nhttps://app.bulkpublish.com\n```\n\n### Authentication\n\n```\nAuthorization: Bearer bp_your_key_here\n```\n\n### Core Endpoints\n\n| Method | Endpoint | Description |\n|--------|----------|-------------|\n| `POST` | `/api/posts` | Create a post (draft, scheduled, or immediate) |\n| `GET` | `/api/posts` | List posts (paginated, filterable by status/date/channel/label) |\n| `GET` | `/api/posts/:id` | Get a post with platform statuses and metrics |\n| `PUT` | `/api/posts/:id` | Update a draft or scheduled post |\n| `DELETE` | `/api/posts/:id` | Delete a post |\n| `POST` | `/api/posts/:id/publish` | Publish a draft immediately |\n| `POST` | `/api/posts/:id/retry` | Retry failed platforms |\n| `POST` | `/api/posts/:id/approve` | Approve a post awaiting team approval (roles with post:approve) |\n| `POST` | `/api/posts/:id/reject` | Reject a pending post back to draft, with an optional reason |\n| `POST` | `/api/posts/bulk` | Bulk delete or retry |\n| `GET` | `/api/channels` | List connected social media channels |\n| `GET` | `/api/channels/:id/health` | Check channel token health |\n| `GET` | `/api/channels/:id/options` | Get platform options (Pinterest boards, YouTube playlists) |\n| `GET` | `/api/channels/:id/mentions` | Search users for @mention (X, Bluesky) |\n| `GET`/`POST` | `/api/channel-sets` | Saved channel groups for one-click targeting (update/delete via `/api/channel-sets/:id`) |\n| `GET`/`POST` | `/api/rss-feeds` | RSS/Atom autopost feeds — new items become posts (update/delete via `/api/rss-feeds/:id`) |\n| `POST` | `/api/media` | Upload a media file (multipart form, up to 100MB) |\n| `POST` | `/api/media/multipart/create` | Start a chunked upload for large media (videos up to 1GB, 10MB parts) |\n| `POST` | `/api/media/multipart/complete` | Assemble uploaded parts and record the media file |\n| `GET` | `/api/media` | List uploaded media |\n| `GET` | `/api/analytics/summary` | Analytics summary for a date range |\n| `GET` | `/api/analytics/engagement` | Engagement data grouped by day/week/month |\n| `POST` | `/api/schedules` | Create a recurring schedule |\n| `GET` | `/api/quotas/usage` | Check current plan limits and usage |\n\nSee the [OpenAPI spec](openapi.json) for the complete endpoint list.\n\n## Supported Platforms\n\n| Platform | Post Types | Media |\n|----------|-----------|-------|\n| **Facebook** | Post, Story | Images, Videos |\n| **Instagram** | Feed, Reel, Story, Carousel | Images (JPEG), Videos (MP4, MOV) |\n| **X / Twitter** | Tweet, Thread | Images, Videos, GIFs |\n| **TikTok** | Video, Photo Slideshow | Videos (MP4, MOV), Images |\n| **YouTube** | Video, Short | Videos (MP4, MOV, WebM, AVI, WMV, FLV) |\n| **Threads** | Post, Thread, Quote Post | Images, Videos |\n| **Bluesky** | Post, Thread | Images |\n| **Pinterest** | Pin | Images, Videos |\n| **Google Business Profile** | Post, Event, Offer | Images |\n| **LinkedIn** | Post, Multi-image, PDF Carousel, Article | Images (JPEG, PNG, GIF), Videos (MP4) |\n| **Mastodon** | Post, Thread | Images, Videos |\n| **Snapchat** | Story, Saved Story, Spotlight | Exactly 1 image (JPG, PNG) or video (MP4, MOV, vertical, 5–60s, max 1GB) |\n\n## SDKs\n\n### Python\n\n```bash\npip install bulkpublish\n```\n\nSupports sync and async. Rich docstrings on every method for IDE and LLM consumption.\n\n### Node.js / TypeScript\n\n```bash\nnpm install bulkpublish\n```\n\nFull TypeScript types, zero dependencies, native `fetch` (Node 18+).\n\n### Homebrew (macOS/Linux)\n\n```bash\nbrew tap azeemkafridi/bulkpublish && brew install bulkpublish\n```\n\nInstalls the Node SDK via Homebrew.\n\n### REST API\n\nNo SDK needed — any HTTP client works:\n\n```bash\ncurl https://app.bulkpublish.com/api/channels \\\n  -H \"Authorization: Bearer bp_your_key_here\"\n```\n\n## Rate Limits\n\n| Limit | Free | Pro | Business |\n|-------|------|-----|----------|\n| Writes/min | 60 | 60 | 60 |\n| Reads/min | 300 | 300 | 300 |\n| Daily API requests | 100 | 5,000 | 50,000 |\n| API keys | 1 | 5 | 10 |\n\n| Recurring schedules | — | 10 | Unlimited |\n\nSee the [rate limits guide](guides/rate-limits.md) for headers, backoff strategies, and best practices.\n\n## Guides\n\n- [Authentication](guides/authentication.md) — API keys, authorization, key management\n- [Scheduling](guides/scheduling.md) — Scheduled posts, queue slots, recurring schedules, timezones\n- [Media Uploads](guides/media-uploads.md) — File uploads, supported formats, using media in posts\n- [Platform Options](guides/platforms.md) — Per-platform configuration and quirks\n- [Rate Limits](guides/rate-limits.md) — Burst limits, daily quotas, best practices\n\n## Integrations\n\n| Platform | Package | Install |\n|----------|---------|---------|\n| **Zapier** | [BulkPublish on Zapier](https://zapier.com/apps/bulkpublish/integrations) | Search \"BulkPublish\" in Zapier |\n| **n8n** | [n8n-nodes-bulkpublish](https://github.com/azeemkafridi/n8n-nodes-bulkpublish) | Settings > Community Nodes > `n8n-nodes-bulkpublish` |\n| **Homebrew** | [homebrew-bulkpublish](https://github.com/azeemkafridi/homebrew-bulkpublish) | `brew tap azeemkafridi/bulkpublish && brew install bulkpublish` |\n\n## Links\n\n| Resource | URL |\n|----------|-----|\n| Dashboard | [app.bulkpublish.com](https://app.bulkpublish.com) |\n| API Docs | [app.bulkpublish.com/docs](https://app.bulkpublish.com/docs) |\n| Website | [bulkpublish.com](https://www.bulkpublish.com) |\n| Email | support@bulkpublish.com |\n\n## License\n\nMIT\n",
  "bytes": 16570,
  "sha": "cfa4bce7034ebfb9e2762e97f423b68894bbe6231656fd789c8fe3d9490f13fb",
  "repo_slug": "azeemkafridi/bulkpublish-api",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_azeemkafridi_bulkpublish_5b82e6fe/readme"
}