Instagram Reels API: a 100-posts-per-24-hours publish budget
The Instagram content publishing API limits an account to 100 API-published posts per moving 24 hours. A tested Python queue that spreads batch output under it.

Instagram accounts are limited to 100 API-published posts in any moving 24-hour period, and a Reel is published by creating a container with media_type=REELS and a video_url. A batch run can produce far more than 100 clips in an afternoon, so the publishing side needs its own budget, not the generation side.
What the docs state
The cap is per account, and it is a moving window, not a midnight reset. A post made at 3 pm yesterday stops counting at 3 pm today.
| Item | Detail |
|---|---|
| Reel container | Create with media_type=REELS and video_url |
| Rate cap | 100 API-published posts per 24-hour moving period |
A moving-window queue
The class below is plain Python with no dependencies. It records publish times and answers how long to wait before the next post. It only models the limit; the Graph API calls are yours to add, and video_url must point at a public file.
import time
from collections import deque
class PublishBudget:
def __init__(self, limit=100, window=86400):
self.limit, self.window = limit, window
self.sent = deque()
def wait_seconds(self, now=None):
now = time.time() if now is None else now
while self.sent and self.sent[0] <= now - self.window:
self.sent.popleft()
if len(self.sent) < self.limit:
return 0.0
return self.sent[0] + self.window - now
def record(self, now=None):
self.sent.append(time.time() if now is None else now)
b = PublishBudget(limit=3, window=60)
for t in (0, 1, 2):
b.record(t)
print(b.wait_seconds(now=10)) # 50.0Planning generation against the cap
If you can publish 100 a day, there is no gain in finishing 400 clips today. Submit generation in waves that match the publishing rate, and keep the video_url source stable until the post is created. The video API returns unsigned_urls on a completed job, and the jobs docs describe the shared job endpoints and batch waits.
Sume's own admission limits are separate: the generation admission page describes queued and running job limits per plan, and 429 queue_full when a workspace has no capacity left. Back off before retrying, and reuse the same Idempotency-Key for any retried submit.
Operational notes
This post covers only the volume cap. Format requirements for Reels are a separate topic.
- Keep a published log so a restart does not double-post.
- Hold 5 to 10 percent of the 100 in reserve for fixes and reposts.
- Check the container status before counting a post as sent.
- Re-read Meta's page before launch; limits and fields change.
Spreading a batch
Divide the daily budget across the day instead of firing it in one burst. If you hold 90 posts a day, one post every 16 minutes uses the budget evenly and leaves room for fixes. A burst is more likely to hit errors together and harder to recover from.
Keep the generation queue a few hours ahead of the publish queue. That way a slow render does not leave the publisher idle, and a failed render does not stall a scheduled post.
Log every container ID next to its job ID. When a post fails, you can tell whether the video, the container or the publish call was the problem, and you do not recount a failed attempt as a published post unless Meta's limit says it counts.
Sources
Related posts
More in Developers
- Keep your Sora-style create_video() call: map it onto Sume
Sora's seconds, size and input_reference become duration, resolution plus aspect_ratio, and a first frame. Here is that map as a Python wrapper over Sume.
- Luma callback_url or polling: which Sume job mode matches
Luma's API docs list keyframes, loop and callback_url for ray-2. On Sume the equivalent choice is job mode: async, sync up to 30 s, subscribe or webhook.
- Luma API callback_url vs Sume callback_url: signing and retries
Luma's video API takes a callback_url, and so does Sume's /v1/videos. What Sume's callback is signed with, how often it retries, and a Python verifier.
- MCP 2026-07-28 deprecations: SSE, sampling, roots, logging checklist
MCP 2026-07-28 deprecates Roots, Sampling and Logging and reclassifies HTTP+SSE as Deprecated, with 12 months of notice. A checklist for media servers.
Written by Sume