Get a campaign
Read one campaign.
Read one campaign.
A campaign belonging to another organisation answers 404, never 403 — /v2 never confirms that another tenant's ids exist.
Rate limit: 2000 requests per minute per organization, counted together with every endpoint that has no stricter limit of its own. Exceeding it returns 429 with Retry-After; the X-RateLimit-* response headers report your remaining allowance on every call.
v2/campaigns/{campaign_id}Authorization
AuthorizationRequiredBearer <token>
Your Graine API key. Create one in the dashboard under Developers, or via POST /v2/api-keys. Send it as Authorization: Bearer <key>.
In: header
Path Parameters
campaign_idRequiredCampaign Id
Campaign identifier.
Query Parameters
organization_idOrganization Id
Must match the organisation the API key belongs to.
Response Body
200
The campaign, its dialling policy and its stored counters.
batch_idBatch Id | null
The batch created from contacts on this request, if any were supplied. Null on every other read — a campaign can hold many batches; list them with GET /v2/campaigns/{campaign_id}/batches.
total_contactsTotal Contacts
Contacts across every batch.
0skipped_countSkipped Count | null
Contacts of that list that were left out — each names an agent_language the agent doesn't have. Null when every contact was added, and on every other read.
skipped_rowsSkipped Rows | null
The contacts left out, each with its CSV line (the header is line 1) or its position in contacts, and why: the first 100. Null when every contact was added, and on every other read.
campaign_idRequiredCampaign Id
Campaign identifier.
organization_idOrganization Id | null
The organisation this campaign belongs to. Always your own.
nameRequiredName | null
Human label for the campaign.
agent_idRequiredAgent Id | null
Agent that places every call.
phone_numbersPhone Numbers
Caller IDs this campaign dials from.
phone_number_strategyPhone Number Strategy
round_robin | random | least_loaded.
"round_robin"phone_number_indexPhone Number Index
Round-robin cursor: the position the next call starts from.
0timezoneTimezone
IANA timezone the working hours and the window are evaluated in.
"UTC"working_hours_enforcedWorking Hours Enforced
False dials around the clock, subject only to start_time/end_time.
falseworking_hoursWorking Hours
Per-day dialling windows, keyed by lowercase day name.
max_concurrent_callsMax Concurrent Calls | null
Ceiling on this campaign's SIMULTANEOUS calls. Omit for no campaign ceiling. It can only LOWER what the organisation's limit and the fair share across active campaigns already allow — raising it past the org limit has no effect.
retry_policyRequiredRetry Policy
What happens after a busy or a no-answer.
follow_up_policyRequiredFollow Up Policy
Callbacks after the first cycle ends.
transliterationRequiredTransliteration
Name-script rewriting inherited by every batch.
start_timeStart Time | null
ISO-8601 UTC. Nothing dials before this.
end_timeEnd Time | null
ISO-8601 UTC. Nothing dials after this; the campaign then expires.
default_call_variablesDefault Call Variables
Prompt variables applied to every call, overridable per contact.
default_call_contextDefault Call Context
Free-form context applied to every call.
statusRequiredStatus
created | active | paused | completed | cancelled | expired | archived. A campaign is born 'created' and becomes 'active' when its first batch dials. 'archived' is what DELETE leaves behind; 'cancelled' is what the cancel action does.
metadataMetadata
Whatever you stored on the campaign.
total_batchesTotal Batches
Batches created under this campaign.
0active_batchesActive Batches
Batches not yet finished.
0completed_contactsCompleted Contacts
Contacts that reached a completed call, counted ONCE regardless of how many attempts it took. Use this for progress, not completed_calls.
0completed_callsCompleted Calls
Calls that completed, retries included.
0failed_callsFailed Calls
Calls that failed.
0busy_callsBusy Calls
Calls that hit a busy line.
0no_answer_callsNo Answer Calls
Calls that rang out.
0voicemail_callsVoicemail Calls
Calls answered by a voicemail box. A SUBSET of no_answer_calls, never a peer of it — do not add it to the others to form a total.
0in_progress_callsIn Progress Calls
Calls live right now.
0follow_up_callsFollow Up Calls
Follow-up calls placed.
0follow_up_exhaustedFollow Up Exhausted
Contacts whose follow-up attempts ran out.
0created_atCreated At | null
ISO-8601 UTC.
updated_atUpdated At | null
ISO-8601 UTC.
started_byStarted By | null
Who started its latest run: {type: member | api_key | system, id, at}. A person is their member id. Null on a campaign that has not started.
approved_byApproved By | null
The workspace Admin who approved that start, when the workspace requires approval: {type: member, id, at, request_id}. Null when it started without needing one.
400
1000 — malformed or contradictory input: an unknown status filter or timezone, a start_time or end_time without a timezone offset, an end_time at or before start_time or more than 365 days ahead, or an empty patch body. 1002 — a required parameter is missing.
errorRequiredError
Stable integer code from the /v2 error table. Branch on this.
messageRequiredMessage
One human-readable sentence. Wording may change; the code will not.
401
1100 — missing, unknown or inactive API key. 1101 — a browser session token was presented.
errorRequiredError
Stable integer code from the /v2 error table. Branch on this.
messageRequiredMessage
One human-readable sentence. Wording may change; the code will not.
403
1102 — the key is valid but lacks the scope this endpoint requires, or names another organisation. GET /v2/scopes reports which scopes the key holds.
errorRequiredError
Stable integer code from the /v2 error table. Branch on this.
messageRequiredMessage
One human-readable sentence. Wording may change; the code will not.
404
1200 — no such campaign, or no such agent, in this organisation. A campaign belonging to another organisation answers 404, never 403, so ids cannot be probed.
errorRequiredError
Stable integer code from the /v2 error table. Branch on this.
messageRequiredMessage
One human-readable sentence. Wording may change; the code will not.
422
1001 — the body or query failed validation — an unknown field, a value out of range, or a working-hours time that is not 24-hour HH:MM. The message names the first offending field.
errorRequiredinteger
Stable integer code from the error table. Branch on this, not on the message.
messageRequiredstring
One human-readable sentence. Wording may change; the code will not.
429
1300 — per-organisation rate limit exceeded. Carries Retry-After.
errorRequiredError
Stable integer code from the /v2 error table. Branch on this.
messageRequiredMessage
One human-readable sentence. Wording may change; the code will not.
503
1501 — a service this endpoint depends on is unreachable or returned a 5xx.
errorRequiredError
Stable integer code from the /v2 error table. Branch on this.
messageRequiredMessage
One human-readable sentence. Wording may change; the code will not.
504
1502 — a service this endpoint depends on did not respond in time.
errorRequiredError
Stable integer code from the /v2 error table. Branch on this.
messageRequiredMessage
One human-readable sentence. Wording may change; the code will not.
The campaign, its dialling policy and its stored counters.

