Sume bulk item expires_at: 90 minutes start at dispatch, not at submit
A Sume run's expires_at is 90 minutes from created_at. A bulk child is created when dispatched, so a queued item's clock has not started.

When does the 90-minute deadline start for a bulk item?
On a run receipt, expires_at is the deadline after which Sume force-finalizes a non-terminal run as failed. The runs docs put it 90 minutes after the run's created_at, or earlier if the run is older than 25 minutes and has been silent for 10. When the run is terminal, expires_at is null.
A bulk queue does not create all its child runs at submit time. It dispatches them as concurrency slots free up, and each child is created through the same path as a single run when it is dispatched. A queued item has run_id: null and no receipt, so no run clock is ticking for it. That follows from the code and docs together; the queue docs do not state a deadline for a queued item.
What does that mean for a 100-item queue?
With concurrency 4 and runs that take 10 minutes each, the last items wait roughly 240 minutes before they start, longer than 90, and that is fine, because their own 90 minutes begin when they dispatch. The ceiling applies per run, not to the whole batch.
| Items | Concurrency | Assumed minutes per run | Rough queue wall time |
|---|---|---|---|
| 100 | 4 | 10 | 250 minutes |
| 100 | 16 | 10 | 70 minutes |
| 100 | 1 | 10 | 1,000 minutes |
What should my poller do?
Poll the queue, not just one run, and set your own timeout for the whole batch from the arithmetic above. Use each child's expires_at only as that run's ceiling, once it has a receipt. Do not invent a different per-run timeout.
Remember the earlier cutoff: a run silent for 10 minutes after passing the 25 minute mark can be finalized as failed before 90 minutes.
def queue_timeout_minutes(items, concurrency, minutes_per_run):
waves = -(-items // concurrency) # ceiling division
return waves * minutes_per_run
print(queue_timeout_minutes(100, 4, 10)) # 250
print(queue_timeout_minutes(100, 16, 10)) # 70
What if the numbers are off?
Treat the estimate as a floor and add slack. A queue is completed only when every item is terminal, and a completed queue can still have counts.failed above zero.
Sources
Related posts
More in Formats
- Sume schedule cron: why @weekly and 6-field cron are rejected
Sume schedules take only standard 5-field cron. Macros like @weekly and 6-field expressions with seconds are rejected, so convert them before you create one.
- Sume scheduled run across daylight saving: Monday 9am New York
A Sume schedule takes a 5-field cron and an IANA timezone. Across the 2026 clock changes a Monday 9am New York job fires once, and its UTC hour shifts by one.
- Wall of text or Video Hook: which Fastlane Format for a doorbuster?
Use sume-wall-of-text when the offer itself is the ad and sume-video-hook when the first seconds must stop the scroll. Both deliver a Blitz, not Seedance.
- Weekly content calendar as JSON: a Sume Format output schema
Bind a JSON Schema to a Sume Format run and get a seven-day content calendar back as validated JSON, with real dates, enums and media references.
Written by Sume