Skip to main content
This endpoint changes how a batch’s remaining work is dispatched, without cancelling and re-submitting it. Read Dispatch pacing first for the model: what a lane is, why priority is a within-lane boost rather than a lane override, and why a paced release never bursts to catch up. Access is the one rule worth stating up front: any organization API key may call this — there is no admin role requirement. A priority boost only re-orders how your own account’s provider budget is spent, and a pacing policy only ever slows your own batch down, so neither can affect another account or take capacity from another lane. A batch ID belonging to another organization returns 404, never 403.

Request body

Every field is optional. Send only what you are changing; an empty body {} leaves the batch untouched and returns it unchanged, without advancing updated_at. An explicit JSON null is rejected with 422 rather than treated as a removal — omit a field to leave it unchanged. That is why remove_pacing exists: {"pacing": null} is ambiguous between “unchanged” and “remove it”, so removal gets its own unambiguous flag. Sending pacing and remove_pacing: true together is refused for the same reason — it states two intentions at once.

Pacing policy fields

Delivery window fields

Semantics worth getting right

Three behaviours account for most surprises:
  • A priority change applies only to work not yet claimed. The rewrite targets this batch’s still-queued dispatch work; anything already claimed or already sent is untouched, because a call that has left cannot be re-ordered. On a batch whose work is nearly all dispatched, a boost may therefore change very little — that is correct, not a failure. Boosted work stays in its lane, so it still merges with that lane’s other work.
  • A pacing change applies from the next release tick, with no burst. Slowing a batch down never recalls records already released. Speeding one up never releases a backlog all at once to make up the difference — the new rate simply takes effect going forward. The same holds for remove_pacing: the batch reverts to full budget rate from that point, not with a catch-up surge.
  • A policy must be strictly slower than the rate already available. A pacing policy is a throttle, so one at or above the batch’s effective rate is refused with 422 rather than quietly clamped — the message names both the rate you asked for and the rate already available. Clamping would leave your stated policy and the system’s actual behaviour permanently out of step with no signal. The comparison uses the budget after your Domain’s safety margin, never the provider’s raw cap.
Both knobs are echoed on every batch read, so a GET /flows/batches/{batch_id} confirms what is actually in force. priority reads null on a batch that never asked for a boost and pacing reads null on an unpaced batch.

Raise a batch’s priority

Moves this batch ahead of the rest of its lane’s queued work.

Pace a batch inside a delivery window

Releases at most 5,000 records every 15 minutes, and only between 09:00 and 17:00 Mountain time on weekdays. Records still queued when the window closes resume at 09:00 the next weekday — never rushed, never dropped.

Stop pacing a batch

The batch returns to delivering as fast as its provider budget allows, from that moment forward.

Response

200 returns the full batch record, including both scheduling knobs:

Errors

The standard {"detail": "..."} envelope.

Next steps

Dispatch pacing

Lane order, the starvation floor, coalescing, and the paced-release model.

Pause & resume API

Hold dispatch entirely instead of re-pacing it.

Batches, jobs, and executions

Every status a batch moves through, including which ones are terminal.

Platform tenancy

The Domain record whose rate buckets and margins set the rate a policy must beat.