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 type | Instagram professional (Business or Creator) |
| Media | Required — one image or one video. Stories are single-media |
| Caption | Not supported. Instagram ignores caption text on Stories |
| Carousel | Not available for Stories |
| Lifetime | 24 hours |
| Post stats | Not 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:
POST /{ig-user-id}/mediawithmedia_type=STORIESand animage_urlorvideo_url— returns a containeridPOST /{ig-user-id}/media_publishwith thatid— 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:
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.