Claude Code routine limit of 30 fires an hour: use a bulk run

Run now and API fires share 30 an hour per routine. For 40 videos, fire the routine once and let one Sume bulk run of up to 100 items do the fan-out.

5 min readSume
All posts

Claude Code routines count Run now, API fires and one-off re-runs together at 30 an hour per routine, and the action fails until the window resets. If your plan is to fire a routine once per video, the 31st video in an hour is the one that fails. Fire the routine once instead, and let that one run start a single Sume bulk run: one POST queues up to 100 Format runs with a concurrency window of 1 to 16.

The limits are from the routines page, read on 2026-10-03; the bulk-run contract is Sume's Format bulk runs page.

What are the routine limits?

Anthropic documents separate hourly limits by how a run starts, and says none of them has overage.

Routine hourly limits (read 2026-10-03)
ActionLimitCounted for
Scheduled runs, including one-off100 per hourYour account
Run now, API fires, one-off re-run30 per hourEach routine, one shared count
Run now and one-off re-run100 per hourYour account
API fires100 per hourYour account, counted apart from Run now

How does a bulk run fit?

A Sume bulk run takes concurrency (an integer from 1 to 16) and items, 1 to 100 entries, each the same body as a single Format run. Every item can carry its own generation_spend_cap_usd, and the create call returns 202 with a queue you poll at GET /v1/format-run-queues/{id}. A bad item fails the whole create with 400 and details.index before any queue exists.

Workspace generation concurrency still applies to the children: Free 1, Pro 4, Startup 8, Scale 20. Extra accepted jobs wait as queued until a slot opens, and a full queue returns 429 queue_full, so a bulk run of 100 on a small plan is paced, not rejected.

What does the routine's single call look like?

This script builds the body for a 40-item batch and prints the envelope. It runs offline, so you can check the shape before the routine sends it with an Idempotency-Key minted for the batch.

import json, uuid
products = [f'sku-{n:03d}' for n in range(1, 41)]
body = {
    'concurrency': 4,
    'items': [
        {
            'instruction': f'Make the promo video for {sku}.',
            'input': {'sku': sku},
            'generation_spend_cap_usd': 5,
        }
        for sku in products
    ],
}
assert 1 <= len(body['items']) <= 100
print(json.dumps({k: body[k] for k in ('concurrency',)}))
print(len(body['items']), 'items, header:', str(uuid.uuid4()))

What should the routine do after it queues the batch?

Before you size a batch, remember that a bulk run create fails whole with a 400 and details.index if any item is invalid, so validate items in your own code first. The queue's completed state means every item is terminal, not that every item succeeded; read each item's status before reporting. Use a fresh Idempotency-Key for each batch, and the same key only when you are retrying the identical batch.

  • Read counts on the queue: completed means every item is terminal, not that every item succeeded, so branch on counts.failed.
  • Put communication.webhook_url on each item; the queue itself has no webhook.
  • Mint a fresh Idempotency-Key per batch, because replaying a spent key returns the old queue.
  • Keep the routine's own prompt short: one fire, one batch, one summary.

Sources

Related posts

More in Developers

All Developers posts

Written by Sume