Give your users social posting you can prove.
Add posting to your product without also building delivery checks, retry rules, connection warnings, and failure alerts. Publishly handles those parts and gives your software the result.
Publishly’s public API is REST at /public/v1, authenticated with scoped, revocable keys. Create a post with POST /public/v1/posts, poll GET /public/v1/posts/:id/status, or subscribe to signed post.receipt and post.failure webhooks. An MCP server ships with the backend, and the Free plan includes real API access — 50 posts/month across 5 accounts.
What your product gets.
One predictable API
Create posts, upload media, connect accounts, read results, and pull analytics through one versioned API.
Keys you can limit and turn off
Give each integration only the access it needs. You can revoke one key without interrupting everything else.
A result for every post
Ask for a post’s status or delivery receipts at any time. Your users never have to guess whether it landed.
Create a post, then get its receipt.
Replace the API key and connection ID. These are the same calls used by the Publishly app and the n8n and Make integrations.
curl -X POST https://publishlyapi.com/api/public/v1/posts \
-H 'Authorization: YOUR_API_KEY' \
-H 'Idempotency-Key: campaign-location-2026-08-14' \
-H 'Content-Type: application/json' \
-d '{
"type": "schedule",
"date": "2026-08-14T18:00:00.000Z",
"shortLink": false,
"tags": [],
"posts": [{
"integration": { "id": "YOUR_CONNECTION_ID" },
"value": [{ "content": "Launch day.", "image": [] }],
"settings": { "__type": "linkedin" }
}]
}'curl https://publishlyapi.com/api/public/v1/posts/POST_ID/receipts \
-H 'Authorization: YOUR_API_KEY'
# response (trimmed to the delivery fields):
{
"postId": "POST_ID",
"latestStage": "confirmed_live",
"receipts": [{
"provider": "linkedin",
"stage": "confirmed_live",
"attempt": 1,
"providerPostId": "urn:li:share:742…",
"providerUrl": "https://www.linkedin.com/feed/update/urn:li:share:742…",
"confirmationMethod": "linkedin_post_read"
}]
}Your app hears about failures immediately.
Give Publishly a callback URL and it sends your app a delivery event as the post moves forward. A confirmed-live event means the platform check found the public post. A failure event includes the reason and whether another safe attempt is coming.
Every webhook is signed with HMAC-SHA256, retried on delivery failure, and recorded — so a missed alert is visible and can be investigated.
Every event carries an X-Publishly-Signature header shaped t=<unix-timestamp>,v1=<hex>. Recompute and compare before you trust the payload:
const [t, v1] = header
.split(',')
.reduce((acc, part) => {
const [k, v] = part.split('=');
return { ...acc, [k]: v };
}, {});
const expected = hmacSha256(signingSecret, `${t}.${rawBody}`);
if (expected !== v1) throw new Error('Bad signature');
// Optionally: reject if t is older than a few minutes.Use code, n8n, Make, or an approved AI assistant.
Every option uses the same delivery checks and retry rules. The n8n and Make packages currently install from this codebase; we do not claim public marketplace listings that are not live.
Built-in MCP server
The server is built in. An approved assistant can publish, schedule, read receipts, and check account health with only the permissions you give it.
Official node source
Publish, schedule, read receipts, check account health, and start a workflow when a verified alert arrives.
Official custom-app source
Ready-made actions for posting, scheduling, receipts, and account health, plus a trigger for verified alerts.
A free tier with a real API key.
The Free plan isn’t a locked demo — it includes API access: 50 posts a month across 5 connected accounts, no credit card required. Build against the real endpoints before you pay for anything.
Developer questions
Is there a free social media posting API?
Yes. Publishly’s Free plan includes real API access — not a locked demo — with 50 posts per month across 5 connected accounts, no credit card required.
How do I get notified when a post fails?
Register a webhook endpoint and Publishly fires a signed post.failure event the moment a post fails, carrying the failure class, code, a plain-English reason, and whether it will be retried. You don’t have to poll for it.
Does the API support scheduling?
Yes. POST /public/v1/posts accepts a future publish time. Each destination emits queued → uploading → sent → confirmed_live receipts, or a failed receipt with a classified reason. Sent is not success.
How do I verify webhook signatures?
Every webhook carries an X-Publishly-Signature header shaped t=<unix-timestamp>,v1=<hex>. Recompute an HMAC-SHA256 over `${timestamp}.${body}` with your signing secret and compare it to v1 — reject the request if they don’t match.
Get an API key in a minute.
Free plan includes API access. No credit card needed.