Skip to content

Post.schedule

Queue a Post for a set minute, such as a Product Hunt launch one minute after midnight Pacific.

Action class
None
Approval
Runs on its own
Emits
Post.scheduled
Sites
5 sites
Price
Free
POST https://api.sb/{your-domain}/posts/schedule

Puts a drafted Post on your account’s calendar for a set minute, such as 12:01 a.m. Pacific on launch day. The hub’s definition of Post.schedule.

Inputs

NameTypeDefaultMeaning
postPostRequiredThe drafted Post.
atdatetimeRequiredWhen it goes out.

Outputs

FieldTypeWhat null means
postPostNever null.
post.statusstringNever null: scheduled until publishAt, then published.
post.publishAtdatetimeNever null: the at sent, in UTC.
post.handleHandleNever null: the account it goes out from.
post.formatstringNever null: the network’s format, such as a launch or a thread.

Effects

Action class

None: no approval rule names it, so it runs within its seat’s Permissions and Limits

Modes
  • try: Checks your account can post at at and returns the Post as it would sit on the calendar; nothing is queued.
  • send: Returns the scheduled Post at once: the call settles before anything reaches the network.
  • do: Returns the scheduled Post at once.
Idempotency

Only with a key: the same Idempotency-Key and input return the first Action, and the same key with other input returns 409. Scheduling a scheduled Post again moves it to the new at; it never queues twice.

Saved or shared

The Post’s publishAt is set and its status reads scheduled. At publishAt it goes out and Post.published fires; Post.withdraw before then takes it off the calendar.

Emits

Post.scheduled with { post, handle, venue, publishAt }

Performed by

Content lead

Price

Free on your own account: the platform charges nothing for the call.

On each Venue

SiteFieldsFormats
Facebookbody, link, publishAt1
Instagrambody, format, media, publishAt4
Product Hunttitle, body, media, publishAt1
TikTokbody, media2
YouTubetitle, body, tags, publishAt1

Facebook

Through Facebook.

Our fieldFacebook’s field
Post.bodymessage
Post.linklink
Post.publishAtscheduled_publish_time (Sent with published false)
  • Your role on the page. Posting needs a role that can post; a role removed in Meta’s settings ends the connection with needs-reauth.
Feed image ad, 1440 × 1800, 4:5

Instagram

Through Instagram.

Our fieldInstagram’s field
Post.bodycaption (2,200 characters, 30 hashtags, 20 mentions)
Post.formatmedia_type (IMAGE, CAROUSEL, REELS or STORIES)
Post.mediaimage_url or video_url (A carousel holds up to 20 items, cropped to the first one’s ratio)
Post.publishAtmedia_publish (Instagram has no scheduled publish; the platform holds the Post and publishes it then)
  • A staged post. Instagram drops a staged post after 24 hours, so the agent stages it in the hour it publishes.
  • Account type. A professional account; a personal account refuses with account-not-connected until it switches.
Feed image, 320 to 1,440 pixels wide, 4:5 to 1.91:1 Carousel Reel, 9:16 Story, 9:16

Product Hunt

Through Product Hunt.

Our fieldProduct Hunt’s field
Post.titlename
Post.bodytagline (60 characters: what it does and for whom)
Post.mediathumbnail and gallery (A square 240 × 240 thumbnail; the first gallery image is the link preview)
Post.publishAtlaunch date (Product Hunt takes a day, and the launch goes live at 12:01 am Pacific that day)
  • Launch time. Launches go live at 12:01 am Pacific and the day’s ranking runs to midnight Pacific, so the agent schedules for 12:01 am.
  • Vote asks. Your agent asks your list for feedback, never for upvotes.
  • Replies. Every comment gets a drafted answer within 30 minutes for the first 6 hours.
Launch

TikTok

Through TikTok.

Our fieldTikTok’s field
Post.bodypost_info.title (The caption: 2,200 characters, hashtags included)
Post.mediasource_info.source (FILE_UPLOAD or PULL_FROM_URL)
  • Clips waiting in your inbox. At most 5 in any 24 hours; a sixth waits with quota-reached until one is posted.
  • Upload calls. 6 a minute for your account; the platform queues the rest.
Video Spark Ad

YouTube

Through YouTube.

Our fieldYouTube’s field
Post.titlesnippet.title (100 characters, no < or >)
Post.bodysnippet.description (5,000 bytes, so accented letters count double)
Post.tagssnippet.tags (500 characters in all, commas included)
Post.publishAtstatus.publishAt (Sent with status.privacyStatus private)
  • A scheduled video. Uploads private and goes public at its time; YouTube allows a time only on a video never published before.
  • Comments. Read every 30 minutes, since YouTube sends no webhook for comments.
Video

What try does

AccountWhat try does
FacebookReturns the post as your page will show it, with the time it goes live; nothing is posted or scheduled.
InstagramChecks each image and video against Instagram’s specs and returns the post as it will show; no container is staged and nothing publishes.
Product HuntReturns the launch page as Product Hunt will show it, with the time it goes live in your time zone; nothing is scheduled.
TikTokChecks the clip and caption against what your account reports it allows, and returns the post as it will show; nothing reaches your inbox.
YouTubeChecks the file, title, description and tags against YouTube’s limits and returns the video page as it will read; nothing uploads and no quota is spent.

Refuses when

This call has no refusals of its own. Every call through an account can also meet the shared account refusals: grant-missing, needs-reauth, account-not-connected, over-mandate, quota-reached, venue-rejected.

When it waits

Returns in one response; nothing waits.

Example

Text
Queue the Product Hunt launch for 12:01 a.m. Pacific on Wednesday,
November 4.

To retry, send the same Idempotency-Key: the retry returns the first answer for $0. A new key reads again.

Test values

A sk_test_ key answers these the same way every time, at $0 (every test value).

Test valueAlways returnsWhat it is for
post_test_launch{"status":"scheduled","publishAt":"2026-11-04T08:01:00Z"}Queues on a test account and never publishes, so a launch-day Workflow runs end to end before the real one.
maxCost: 0.0001Refuses with max-costAny priced call with a maxCost of 0.0001 is refused before it spends: the price is above the cap.
rate-limited.testRefuses with rate-limitedAny call naming this hostname answers 429 with Retry-After, so your retry logic runs.
sources-busy.testRefuses with sources-busyAny call naming this hostname answers 503 as if every route were busy, and nothing is spent.

Used by