[

[

product

]

]

How to Schedule LinkedIn and Twitter Posts With an API

ยท

7 min read

ยท

By Prateek Singh, founder of VoiceMoat

Summarize with AIClaudeChatGPTPerplexityShareShare

Key takeaways

  • Neither network has a schedule field. LinkedIn and Twitter both publish the moment you call them.

  • You have two routes: run your own queue, or send posts to a scheduling API that holds them for you.

  • Buffer is the cheapest way in, but its developer docs list no webhooks. Typefully, Zernio and Ayrshare all have signed ones.

  • Ask every API three things: can a retry post twice, can a key be limited to drafts, and how long are failed webhooks retried?

  • Always verify a webhook's signature against the raw body before you trust it.

LinkedIn's and Twitter's own APIs can't schedule a post. Both publish as soon as you call them, so scheduling from code means running your own queue and calling the API at the right moment, or sending the post to a scheduling API that holds it for you. For a handful of your own accounts, use a scheduling API. If posting is the core of your product, compare the per-account APIs before you build.

We make VoiceMoat, which has one of these APIs. We cover it near the end, including where the others are better.

What the networks' own APIs do

LinkedIn. On the Posts API, PUBLISHED is the only state accepted when you create a post. To post for a member you need the w_member_social permission, which comes with the Share on LinkedIn product. Access tokens last 60 days, and refresh tokens are for approved partners, so otherwise the member has to sign in again.

Twitter. The create post endpoint has no time field. Twitter's API is pay per use: $0.015 for a post and $0.20 for a post with a link. Our Twitter API pricing guide has the details.

Route 1: build your own queue

You'll need:

  • A sign-in flow for each network, and safe storage for the tokens

  • A table of posts, and a job that runs every minute to pick up what's due

  • A record of each attempt, written before you send it

  • A rule that an unclear answer is never retried, because the post may be live

  • Rate limit handling, and an alert when something fails

The fourth point is the expensive one to get wrong. Our guide to why scheduled posts fail or go out twice covers the failure cases.

Building makes sense when posting is your product, or you need something no vendor offers.

Route 2: use a scheduling API

All of this comes from each company's own docs and pricing pages, read on 9 November 2026.


Buffer

Typefully

Zernio

Ayrshare

VoiceMoat

Style

GraphQL

REST

REST

REST

REST

Way in

Every plan, including Free

Docs list a paid-plan error, so check pricing

First 2 accounts free, then $6 each up to 10

From $149 a month

$69 a month, or $5 for 3 days

Networks

11

6

16 in one request

14

2

Webhooks

None in its docs

Signed, 7 draft events

Signed

Signature optional

Signed, 6 events

Failed webhooks retried

n/a

5 tries over 1 hour

7 tries over about 51 hours

9 tries in about an hour, then up to about 16 hours

4 tries over about 1 hour

How to choose:

If you only want to schedule by hand, our scheduler price comparison is the better read. If you want to do it from Claude or ChatGPT, see what an assistant connection should do on both networks.

What to check in any scheduling API

  • An idempotency key. If a request times out, you don't know whether it worked. Sending it again with the same key should return the first answer and create nothing new.

  • Key permissions. A script that only saves drafts shouldn't be able to post in public.

  • A status for "we don't know". A plain sent or failed hides the dangerous case.

  • How long failed webhooks are retried. If your server is down for two hours, does the event still arrive?

  • The real publish time in the reply. Some tools shift the time you asked for.

How to verify a webhook signature

Anyone who finds your webhook address can send it a fake event, so check each one. Typefully, Zernio, Ayrshare and VoiceMoat all use HMAC-SHA256, though each signs a slightly different string.

  1. Read the raw body before you parse the JSON.

  2. Recompute the signature with your secret.

  3. Compare the two in constant time.

  4. Reject old timestamps where the vendor sends one.

  5. Store the event id and ignore repeats, because retries resend the same event.

  6. Answer with a 2xx quickly, and do the slow work afterwards.

This Node example uses VoiceMoat's format, t=<seconds>,v1=<hex>:

import { createHmac, timingSafeEqual } from "node:crypto";

function isValid(secret, header, rawBody) {
  if (!header) return false;
  const parts = Object.fromEntries(header.split(",").map((p) => p.split("=")));
  if (Math.abs(Date.now() / 1000 - Number(parts.t)) > 300) return false;
  const expected = createHmac("sha256", secret).update(`${parts.t}.${rawBody}`).digest();
  const given = Buffer.from(parts.v1 ?? "", "hex");
  return given.length === expected.length && timingSafeEqual(given, expected);
}
import { createHmac, timingSafeEqual } from "node:crypto";

function isValid(secret, header, rawBody) {
  if (!header) return false;
  const parts = Object.fromEntries(header.split(",").map((p) => p.split("=")));
  if (Math.abs(Date.now() / 1000 - Number(parts.t)) > 300) return false;
  const expected = createHmac("sha256", secret).update(`${parts.t}.${rawBody}`).digest();
  const given = Buffer.from(parts.v1 ?? "", "hex");
  return given.length === expected.length && timingSafeEqual(given, expected);
}
import { createHmac, timingSafeEqual } from "node:crypto";

function isValid(secret, header, rawBody) {
  if (!header) return false;
  const parts = Object.fromEntries(header.split(",").map((p) => p.split("=")));
  if (Math.abs(Date.now() / 1000 - Number(parts.t)) > 300) return false;
  const expected = createHmac("sha256", secret).update(`${parts.t}.${rawBody}`).digest();
  const given = Buffer.from(parts.v1 ?? "", "hex");
  return given.length === expected.length && timingSafeEqual(given, expected);
}

How VoiceMoat's API works

VoiceMoat is an AI social media tool for LinkedIn and Twitter. In Settings, under API and webhooks, you make a key and tick what it can do. Read, drafts and schedule are ticked by default. Publish isn't, because a key with publish posts with no preview.

This schedules a post for your next open slot. The text is invented:

curl https://app.voicemoat.com/api/v1/posts \
  -H "Authorization: Bearer $VOICEMOAT_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: launch-note-1" \
  -d '{"profile":"linkedin","text":"Three hiring mistakes I made twice","schedule":"next_best_slot"}'
curl https://app.voicemoat.com/api/v1/posts \
  -H "Authorization: Bearer $VOICEMOAT_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: launch-note-1" \
  -d '{"profile":"linkedin","text":"Three hiring mistakes I made twice","schedule":"next_best_slot"}'
curl https://app.voicemoat.com/api/v1/posts \
  -H "Authorization: Bearer $VOICEMOAT_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: launch-note-1" \
  -d '{"profile":"linkedin","text":"Three hiring mistakes I made twice","schedule":"next_best_slot"}'
  • Timing: an ISO time at least 10 minutes away, or next_best_slot. Queued posts move by up to 7 minutes, and the reply has the real time.

  • Retries: the same Idempotency-Key within 24 hours returns the stored answer and nothing runs again.

  • Limits: 60 requests a minute per key, and 20 scheduling or posting calls an hour per account, shared with assistants.

  • Unclear results: a 202 with needs_you means the network didn't confirm the post. Don't retry it.

  • Credits: scheduling and posting use none. audenAI, the brain inside VoiceMoat, can draft from a topic, which does use credits, and you decide what goes out.

Webhooks cover post.published, post.failed, post.needs_you, post.scheduled, review.comment and review.approved. Failed deliveries are retried after 1, 10 and 50 minutes. After 20 failures in a row the webhook pauses and you get an email. url can be null: a post someone marked as posted by hand arrives with marked_by_user.

What it can't do:

  • Post anywhere but LinkedIn and Twitter

  • Let your customers connect their accounts, because keys only reach your own profiles

  • Connect through a Zapier app, as there isn't one. Anything that can send an HTTP request works

  • Take file uploads. Media must already be in your VoiceMoat library

  • Move a scheduled post. Cancel it and schedule a new draft

  • Run from a browser, or publish Twitter Articles

Our webhook retry window is also much shorter than Zernio's or Ayrshare's. Posts over the limit are refused, so check them with the LinkedIn or Twitter character counter.


Free

$1 trial

$5 trial

Creator

Pro

Enterprise

Price

$0

$1 for 3 days

$5 for 3 days

$35 a month

$69 a month

$150 a month

API and webhooks

No

No

Yes

No

Yes

Yes

Schedule how far ahead

No scheduling

15 days

15 days

7 days

15 days

30 days

Scheduled posts a day

None

4

4

3

4

5

The full reference needs no account. To try it on your own accounts, the $5 trial includes the API.

Frequently asked questions

Can you schedule a post with the LinkedIn API?

No. PUBLISHED is the only state accepted on create, so you need your own queue or a scheduling API.

Can you schedule a tweet with the Twitter API?

No. The create post endpoint has no time field, so something has to call it at the right moment.

How much does posting through Twitter's API cost?

Twitter lists $0.015 per post and $0.20 for a post with a link.

Is there a free social media scheduling API?

Buffer's API is on every plan including Free, and Zernio doesn't charge for your first 2 accounts, though Twitter usage is passed on.

What is an idempotency key?

A label you send with a request. If you retry with the same label, the service returns the first answer and doesn't act twice.

Why should I verify a webhook signature?

Anyone who finds the address can send a fake event, and the signature proves it came from the vendor.

Does Buffer's API have webhooks?

None were listed in its developer docs on 9 November 2026.

Which VoiceMoat plans include the API?

Pro, Enterprise and the $5 trial. Free, Creator and the $1 trial don't.

AI disclosure

This article was drafted with AI assistance and edited by Prateek Singh. Network rules and competitor details were read on each company's own pages on 9 November 2026. VoiceMoat is our product.

Keep reading

Industry

Best LinkedIn and Twitter Schedulers in 2026: Real Prices, Cheapest First

What it really costs to schedule one LinkedIn and one Twitter account in 2026: nine options priced from each tool's own page, cheapest first, which free plans leave out Twitter, and which one to pick.

8 min read

ยท

Growth

Scheduled Posts Not Working on LinkedIn or Twitter? Fixes

Why scheduled posts fail or go out twice on LinkedIn and Twitter, how to fix each cause in order, what to do with a duplicate, and what a reliable scheduler should do when something breaks.

7 min read

ยท

Both platforms is table stakes: what to compare instead, per-network content, where the writing happens, real analytics and running cost

AI and Voice

Every social MCP connector reaches both platforms. That is not the hard part

We were going to write that connecting one assistant to both Twitter and LinkedIn was rare. It is not. More than twenty connectors do it and several are free, so channel coverage is table stakes and every roundup ranking them by it is measuring the wrong thing. Here is what actually differs between them, and the one thing we read enumerated tool lists for six of them to confirm nobody does at all.

11 min read

ยท

What the X API costs: billed per event rather than per API call, posts with links cost more, and each image bills as a post

Industry

X API pricing in 2026: what it actually costs

The X API is pay-per-use: $0.015 a post, $0.200 with a link and $0.005 a read, rechecked 22 October 2026. What decides your bill is what the rate card leaves out: billable events are not calls, images count as extra posts, endpoint choice changes read costs five-fold, and the read cap moved three times. Plus what the API returns when the money runs out, which we measured because it happened to us.

20 min read

ยท

From the Twitter algorithm series

The Twitter/X algorithm in May 2026: why voice wins under the new transformer

Read โ€บ

[

ready to start?

]

Create more.
Stay unmistakably you.
Grow from there.

3-day trial from $1 ยท Cancel anytime ยท Your content stays private

[

ready to start?

]

Create more.
Stay unmistakably you.
Grow from there.

3-day trial from $1 ยท Cancel anytime ยท Your content stays private

[

ready to start?

]

Create more.
Stay unmistakably you.
Grow from there.

3-day trial from $1 ยท Cancel anytime ยท Your content stays private