</API>
Build any automation for social.
One REST API for six networks. Plug Pubrivo into your agents, your automation tools, or something nobody has built yet.
- TikTok
- YouTube
- X
- Threads
$ curl https://app.pubrivo.com/api/posts -H "Authorization: Bearer pbv_…" \
-d '{"text":"Saturday, 8am.","channelIds":[…],"scheduledAt":"…"}'
201 Created
{
"data": {
"id": "3c9a…",
"variants": [
{ "network": "facebook", "status": "scheduled" },
{ "network": "threads", "status": "scheduled" }
]
}
}How it works
From key to first post in four steps.
- 01
Get your API key
Create one in Settings › API keys. Every plan has the API, Free included. It can schedule; tick publishing now or webhooks if it needs them. The key is shown once.
- 02
Authenticate
Send it as a Bearer token. curl, Postman, n8n, a shell script — anything that speaks HTTPS and JSON. No SDK to install.
- 03
Make your first call
List your Channels, then create a Post against them — once you have verified your email. The response tells you where every network’s copy has got to.
- 04
Automate it
Schedule from a spreadsheet, publish from CI, cancel from a Slack command. The calendar in the app shows all of it.
curl https://app.pubrivo.com/api/posts \
-H "Authorization: Bearer pbv_…" \
-H "Content-Type: application/json" \
-d '{
"text": "New drop lands Saturday. 🟡",
"channelIds": ["8f1c…", "b27e…"],
"scheduledAt": "2027-01-23T08:00:00Z"
}'const res = await fetch('https://app.pubrivo.com/api/posts', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.PUBRIVO_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
text: 'New drop lands Saturday. 🟡',
channelIds: ['8f1c…', 'b27e…'],
scheduledAt: '2027-01-23T08:00:00Z',
}),
})
const { data: post } = await res.json()import os, requests
res = requests.post(
"https://app.pubrivo.com/api/posts",
headers={"Authorization": f"Bearer {os.environ['PUBRIVO_API_KEY']}"},
json={
"text": "New drop lands Saturday. 🟡",
"channelIds": ["8f1c…", "b27e…"],
"scheduledAt": "2027-01-23T08:00:00Z",
},
)
post = res.json()["data"]$ch = curl_init('https://app.pubrivo.com/api/posts');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('PUBRIVO_API_KEY'),
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'text' => 'New drop lands Saturday. 🟡',
'channelIds' => ['8f1c…', 'b27e…'],
'scheduledAt' => '2027-01-23T08:00:00Z',
]),
]);
$post = json_decode(curl_exec($ch), true)['data'];curl https://app.pubrivo.com/api/posts \
-H "Authorization: Bearer pbv_…" \
-H "Content-Type: application/json" \
-d '{
"text": "We are live.",
"channelIds": ["8f1c…"],
"media": [{ "url": "https://cdn.example.com/launch.mp4" }]
}'await fetch('https://app.pubrivo.com/api/posts', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.PUBRIVO_API_KEY}`,
'Content-Type': 'application/json',
},
// No scheduledAt: it goes out now. Needs the posts:publish scope.
body: JSON.stringify({
text: 'We are live.',
channelIds: ['8f1c…'],
media: [{ url: 'https://cdn.example.com/launch.mp4' }],
}),
})requests.post(
"https://app.pubrivo.com/api/posts",
headers={"Authorization": f"Bearer {os.environ['PUBRIVO_API_KEY']}"},
# No scheduledAt: it goes out now. Needs the posts:publish scope.
json={
"text": "We are live.",
"channelIds": ["8f1c…"],
"media": [{"url": "https://cdn.example.com/launch.mp4"}],
},
)// No scheduledAt: it goes out now. Needs the posts:publish scope.
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([
'text' => 'We are live.',
'channelIds' => ['8f1c…'],
'media' => [['url' => 'https://cdn.example.com/launch.mp4']],
]));curl https://app.pubrivo.com/api/channels \
-H "Authorization: Bearer pbv_…"const res = await fetch('https://app.pubrivo.com/api/channels', {
headers: { Authorization: `Bearer ${process.env.PUBRIVO_API_KEY}` },
})
const { data: channels } = await res.json()
// [{ id, network: 'instagram', name, state: 'connected', canPostNow: true }, …]channels = requests.get(
"https://app.pubrivo.com/api/channels",
headers={"Authorization": f"Bearer {os.environ['PUBRIVO_API_KEY']}"},
).json()["data"]$ch = curl_init('https://app.pubrivo.com/api/channels');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('PUBRIVO_API_KEY')],
]);
$channels = json_decode(curl_exec($ch), true)['data'];curl "https://app.pubrivo.com/api/posts?from=2027-01-18T00:00:00Z&to=2027-01-25T00:00:00Z" \
-H "Authorization: Bearer pbv_…"const url = new URL('https://app.pubrivo.com/api/posts')
url.searchParams.set('from', '2027-01-18T00:00:00Z')
url.searchParams.set('to', '2027-01-25T00:00:00Z')
const { data, nextCursor } = await (
await fetch(url, { headers: { Authorization: `Bearer ${process.env.PUBRIVO_API_KEY}` } })
).json()page = requests.get(
"https://app.pubrivo.com/api/posts",
headers={"Authorization": f"Bearer {os.environ['PUBRIVO_API_KEY']}"},
params={"from": "2027-01-18T00:00:00Z", "to": "2027-01-25T00:00:00Z"},
).json()
posts, cursor = page["data"], page.get("nextCursor")$q = http_build_query(['from' => '2027-01-18T00:00:00Z', 'to' => '2027-01-25T00:00:00Z']);
$ch = curl_init('https://app.pubrivo.com/api/posts?' . $q);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('PUBRIVO_API_KEY')],
]);
$page = json_decode(curl_exec($ch), true);What you get
Pubrivo, wired into whatever you use.
- REST
A plain JSON API
Channels, Posts, media, cancel and retry. Predictable URLs, one envelope, real HTTP status codes.
- MCP
An MCP server
Claude, ChatGPT, Cursor and any MCP client can schedule and publish posts — with your consent, per Workspace.
- OAS
Reference and explorer
OpenAPI 3.1, generated from the schemas that validate every request. Send live calls from the browser.
- HOOK
Webhooks
Hear the moment a post publishes or fails. Signed payloads, retried with backoff for 24 hours.
- AUTH
Keys and OAuth
Workspace API keys for your scripts. OAuth 2.1 with PKCE for AI assistants, through MCP.
- NO-CODE
n8n and Make
Their HTTP modules call the API directly. Paste the key, point at an endpoint, done.
Built for production
The details that decide whether you sleep through the night.
- Additive-only changes
- A field may be added. None is ever renamed or removed — an integration you write today keeps working.
- Safe retries
- Send the same Post twice within 10 minutes and you get the first one back, not a double post.
- Errors that say why
- A refused Post says why, in words you can show your user. A plan limit names the plan that lifts it, when one would.
- Failure reasons per network
- needs_reconnect, rejected_by_platform, media_problem — and the network’s own words alongside.
- Large media, direct
- Upload up to 2 GB straight to storage with a signed URL, or hand us a public https link to fetch.
- Honest limits
- 60 requests a minute per credential, a Retry-After when you pass it, and up to 500 Posts a page.
For AI agents
Ask your assistant to schedule the week.
Connect Claude, ChatGPT or Cursor to Pubrivo’s MCP server. Sign in, approve it for one Workspace, choose what it may do — and go from idea to scheduled without leaving the conversation.
Connect your agentSchedule this week’s three launch posts for 8am on Facebook and Threads.
schedule_post × 3Done — Tue, Wed and Thu at 08:00. They’re on your Pubrivo calendar, labelled “via Claude”.
Questions
Before you write the first request.
What is the Pubrivo API?
A REST API over HTTPS with JSON bodies. It does what the composer does — read your Channels, schedule or publish a Post to several networks at once, upload media, cancel, and retry a failure — because the app itself is built on it.
Which plans include it?
All of them, Free included. Posts and uploads made through the API count against the same plan limits as the app, and nothing is metered or billed per request.
Is there GraphQL?
No. One REST API, described by an OpenAPI 3.1 document you can feed to any client generator.
Why can’t a key schedule something two minutes out?
Posts made by a key or an app must be at least 15 minutes ahead, so there is always a window to catch a mistake before it is public. Publishing immediately is its own scope, posts:publish, that you grant on purpose.
Can I see what a script posted?
Yes. Every Post made through the API lands on the same calendar as everything else. Home and the calendar’s Agenda view label it with the key or app that made it and the person behind it.
What are the rate limits?
60 requests a minute for each key or app. Past that you get a 429 with a Retry-After header saying when to try again.
What can’t the API do?
Connect a Channel: that happens in the app, where you sign in to the network. Edit a Post once it is made: cancel it and create it again. Members and billing stay in the app too.
Which networks?
Facebook Pages, Instagram, TikTok, YouTube, X and Threads. Posts to X use Post credits, bought in the app. LinkedIn is not supported.
Your key is one click away.
Free plan, no card, no request quota to buy.