curl --request PATCH \
--url https://api.getdialed.ai/v1/flows/batches/{batch_id} \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"pacing": {
"period_minutes": 15,
"records_per_period": 5000
},
"priority": "high"
}
'import requests
url = "https://api.getdialed.ai/v1/flows/batches/{batch_id}"
payload = {
"pacing": {
"period_minutes": 15,
"records_per_period": 5000
},
"priority": "high"
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({pacing: {period_minutes: 15, records_per_period: 5000}, priority: 'high'})
};
fetch('https://api.getdialed.ai/v1/flows/batches/{batch_id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.getdialed.ai/v1/flows/batches/{batch_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'pacing' => [
'period_minutes' => 15,
'records_per_period' => 5000
],
'priority' => 'high'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.getdialed.ai/v1/flows/batches/{batch_id}"
payload := strings.NewReader("{\n \"pacing\": {\n \"period_minutes\": 15,\n \"records_per_period\": 5000\n },\n \"priority\": \"high\"\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.patch("https://api.getdialed.ai/v1/flows/batches/{batch_id}")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"pacing\": {\n \"period_minutes\": 15,\n \"records_per_period\": 5000\n },\n \"priority\": \"high\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.getdialed.ai/v1/flows/batches/{batch_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"pacing\": {\n \"period_minutes\": 15,\n \"records_per_period\": 5000\n },\n \"priority\": \"high\"\n}"
response = http.request(request)
puts response.read_body{
"completed_at": "2026-07-09T18:00:05Z",
"created_at": "2026-07-09T17:59:59Z",
"definition_id": "def_a1b2c3d4",
"id": "batch_55667788",
"metadata": {
"campaign": "spring-2026"
},
"org_id": "org_a1b2c3d4",
"record_count": 2,
"started_at": "2026-07-09T18:00:00Z",
"status": "completed",
"trigger_id": "trigger_44556677",
"trigger_type": "api_call",
"updated_at": "2026-07-09T18:00:05Z"
}{
"detail": "Authentication required"
}{
"detail": "Batch not found"
}{
"detail": "Cannot change a completed, failed, or cancelled batch — a terminal batch has nothing left to re-order or re-pace."
}{
"detail": "pacing may not be null — omit it to leave it unchanged."
}{
"detail": "Rate limit exceeded: 100 per 1 minute"
}Change a batch's priority or pacing
Re-order or re-pace a batch that is still queued or in flight. Both fields are optional — send only what you are changing, and an empty body leaves the batch untouched.
priorityre-orders the batch’s REMAINING work within its own dispatch lane. Work already claimed or sent is never re-ordered, and the boost cannot take capacity from another lane — it only changes the order in which your own account’s budget is spent, which is why no elevated role is required.pacingsets or replaces the release policy and applies from the next release tick: slowing a batch down never recalls work already released, and speeding one up never produces a burst to catch up. A policy that is not strictly slower than the rate your provider budget already allows is rejected rather than quietly clamped, so the policy you set is always the policy in force. Sendremove_pacing: trueto stop pacing a batch entirely.
Explicit JSON null is rejected — omit a field to leave it unchanged. A completed, failed, or cancelled batch cannot be changed (409). Cross-tenant access returns 404, never 403.
curl --request PATCH \
--url https://api.getdialed.ai/v1/flows/batches/{batch_id} \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"pacing": {
"period_minutes": 15,
"records_per_period": 5000
},
"priority": "high"
}
'import requests
url = "https://api.getdialed.ai/v1/flows/batches/{batch_id}"
payload = {
"pacing": {
"period_minutes": 15,
"records_per_period": 5000
},
"priority": "high"
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({pacing: {period_minutes: 15, records_per_period: 5000}, priority: 'high'})
};
fetch('https://api.getdialed.ai/v1/flows/batches/{batch_id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.getdialed.ai/v1/flows/batches/{batch_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'pacing' => [
'period_minutes' => 15,
'records_per_period' => 5000
],
'priority' => 'high'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.getdialed.ai/v1/flows/batches/{batch_id}"
payload := strings.NewReader("{\n \"pacing\": {\n \"period_minutes\": 15,\n \"records_per_period\": 5000\n },\n \"priority\": \"high\"\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.patch("https://api.getdialed.ai/v1/flows/batches/{batch_id}")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"pacing\": {\n \"period_minutes\": 15,\n \"records_per_period\": 5000\n },\n \"priority\": \"high\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.getdialed.ai/v1/flows/batches/{batch_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"pacing\": {\n \"period_minutes\": 15,\n \"records_per_period\": 5000\n },\n \"priority\": \"high\"\n}"
response = http.request(request)
puts response.read_body{
"completed_at": "2026-07-09T18:00:05Z",
"created_at": "2026-07-09T17:59:59Z",
"definition_id": "def_a1b2c3d4",
"id": "batch_55667788",
"metadata": {
"campaign": "spring-2026"
},
"org_id": "org_a1b2c3d4",
"record_count": 2,
"started_at": "2026-07-09T18:00:00Z",
"status": "completed",
"trigger_id": "trigger_44556677",
"trigger_type": "api_call",
"updated_at": "2026-07-09T18:00:05Z"
}{
"detail": "Authentication required"
}{
"detail": "Batch not found"
}{
"detail": "Cannot change a completed, failed, or cancelled batch — a terminal batch has nothing left to re-order or re-pace."
}{
"detail": "pacing may not be null — omit it to leave it unchanged."
}{
"detail": "Rate limit exceeded: 100 per 1 minute"
}Authorizations
Path Parameters
Body
Change a batch that is still queued or in flight.
priority re-orders the batch's remaining work within its own dispatch
lane; work already sent is untouched. pacing sets or replaces the release
policy and applies from the next release tick — slowing a batch down never
recalls work already released, and speeding one up never produces a burst
to make up the difference. To stop pacing a batch entirely send
remove_pacing: true rather than a null pacing.
Every field is optional; send only what you are changing.
normal, high A ceiling on how fast a batch is released: N records every M minutes.
The rate is a hard ceiling over any interval — there is no catch-up burst. After a pause, an exhausted provider quota or a closed delivery window, delivery resumes at the configured rate from that moment and the lost time is not made up.
period_minutes is a whole number of minutes; pacing finer than a minute
cannot be expressed. Add a window to confine delivery to particular local
hours. Released records are ordinary queue work: they may still be merged
with other batches' work bound for the same destination, but this batch
never delivers faster than its policy allows.
Show child attributes
Show child attributes
{
"period_minutes": 15,
"records_per_period": 5000,
"window": {
"days": [
"monday",
"tuesday",
"wednesday",
"thursday",
"friday"
],
"end_minute_of_day": 1020,
"start_minute_of_day": 540,
"timezone": "America/Denver"
}
}
Response
Successful Response
pending, queued, scheduled, running, paused, completed, completed_with_errors, partially_failed, failed, cancelled normal, high A ceiling on how fast a batch may be released: N records every M minutes.
The rate is a hard ceiling over any interval — there is no catch-up burst. After a pause, an exhausted provider quota or a closed delivery window, delivery resumes at the configured rate from that moment; the time lost is not made up.
period_minutes is measured in whole minutes: pacing finer than a minute
cannot be expressed. Add a window to confine delivery to particular local
hours.
Show child attributes
Show child attributes