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
422rather 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.
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.