How to Schedule Instagram Stories via API

Instagram has no native Story scheduling — the Graph API publishes immediately. Here's how to queue Stories and fire them at an exact time, with Node, Python and curl.

Can you schedule an Instagram Story?

Not in the Instagram app, and not natively through the API. Instagram’s Graph API has no scheduled_publish_time for Stories — the publish call goes out the moment you make it. Anything advertised as Story scheduling is a system holding your media and calling the API for you at the right second.

That matters more for Stories than for anything else on Instagram, because a Story is live for 24 hours. Publishing an hour late doesn’t just delay it — it moves the whole window, and it will expire an hour later than you intended.

What the API allows for Stories

Account typeInstagram professional (Business or Creator)
MediaRequired — one image or one video. Stories are single-media
CaptionNot supported. Instagram ignores caption text on Stories
CarouselNot available for Stories
Lifetime24 hours
Post statsNot returned for Stories

Interactive stickers — polls, questions, countdowns, link stickers — cannot be added through the API. Those remain app-only, and no third-party tool can add them for you.

The publishing flow, briefly

Stories use the same two-step container model as the rest of Instagram publishing:

  1. POST /{ig-user-id}/media with media_type=STORIES and an image_url or video_url — returns a container id
  2. POST /{ig-user-id}/media_publish with that id — the Story goes live

Video containers need a processing wait between the two calls, and an unpublished container expires after 24 hours. There is no third call that says “publish this at 07:00 tomorrow.” If you want scheduled Stories, you own the timer — which means holding the OAuth token, refreshing it before it expires, polling container status, retrying transient failures, and surviving a process restart.

Schedule a Story for an exact time

Postproxy holds the media and the token, runs the container and publish steps at the chosen moment, and takes one request:

Terminal window
curl -X POST "https://api.postproxy.dev/api/posts" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"post": {
"scheduled_at": "2026-08-05T07:00:00-07:00"
},
"profiles": ["instagram"],
"media": ["https://your-cdn.com/story.jpg"],
"platforms": {
"instagram": { "format": "story" }
}
}'

format: "story" is what distinguishes it from a feed post. No caption is needed — Instagram would ignore one.

In Node

await fetch("https://api.postproxy.dev/api/posts", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.POSTPROXY_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
post: { scheduled_at: "2026-08-05T07:00:00-07:00" },
profiles: ["instagram"],
media: ["https://your-cdn.com/story.jpg"],
platforms: { instagram: { format: "story" } },
}),
});

In Python

import os, requests
requests.post(
"https://api.postproxy.dev/api/posts",
headers={"Authorization": f"Bearer {os.environ['POSTPROXY_API_KEY']}"},
json={
"post": {"scheduled_at": "2026-08-05T07:00:00-07:00"},
"profiles": ["instagram"],
"media": ["https://your-cdn.com/story.jpg"],
"platforms": {"instagram": {"format": "story"}},
},
timeout=30,
)

What tends to go wrong

The media URL expires before Instagram fetches it. Instagram pulls the file itself, asynchronously, after the container call. A pre-signed URL with a short lifetime can die in between. Use URLs valid for at least an hour.

A caption was expected to appear. Stories have no caption field. Text has to be burned into the image or video before upload.

A carousel was expected. Stories are single-media. Several images means several Stories.

Scheduling far ahead against a short-lived asset. The Story publishes at your chosen time, but it still only lives 24 hours from that moment — the schedule sets the start of the window, not an extension of it.

Stories, Reels and feed posts together

The same request shape covers all three; only format changes — story, reel, or omit it for a feed post. Scheduling Instagram Reels covers the Reels path, and posting to Instagram via API covers the container model, permissions and app review in full.

Ready to get started?

Start with our free plan and scale as your needs grow. No credit card required.