MCP is live.Set upAsk the community
OmniDimension
Bulk calls

Bulk call results

Per-contact results for a campaign: what happened on each call, the variables you sent with that contact, and a pointer to the recording.

GET/calls/bulk_call//lines
Path parameters
bulk_call_idrequired
Query parameters
user_idinteger

Reseller keys only: act as one of your clients by its user id. Omit it to act on your own account. [How acting for a client works](/docs/reseller/your-clients/acting-as-clients).

cursorstring

The next_cursor from your previous response. Omit it on the first request. Opaque: pass it back unchanged.

pagesizeinteger

Rows per page. Above 150 the request is refused.

call_statusstring · enum

Return only contacts in this state.

interaction_statusstring

Return only contacts with this interaction outcome.

searchstring

An exact phone number, matched against the contact's number and the number that called it. Not a substring search.

include_totalboolean

Add total_records to the response. It costs a count over the whole filtered campaign, so it is off unless you ask. Ask for it once to fill a header, not on every page of a walk.

curl -X GET 'https://omnidim.io/api/v1/calls/bulk_call/{bulk_call_id}/lines?pagesize=30&include_total=false' \
  -H 'Authorization: Bearer YOUR_API_KEY'
Example response
{
  "status": "success",
  "bulk_call_id": 314,
  "records": [
    {
      "id": 156,
      "to_number": "+15551234567",
      "from_number": "+15559876543",
      "call_status": "completed",
      "interaction_status": "",
      "failed_reason": null,
      "dispatched_at": "2026-08-26 14:46:02",
      "custom_variables": {
        "contact_name": "Ravi Kumar",
        "company_name": "Acme Corp"
      },
      "metadata": {},
      "retry_attempt": 1,
      "retry_scheduled": false,
      "retry_scheduled_datetime": null,
      "reschedule_requested": false,
      "reschedule_datetime": null,
      "reschedule_status": "pending",
      "call": {
        "recording_id": 50585,
        "time_of_call": "2026-08-26 14:46:21",
        "duration_seconds": 9,
        "duration_minutes": 0,
        "recording_url": "https://backend.omnidim.io/api/v1/recording/50585?token=9d35be29",
        "call_status": "completed",
        "sentiment_score": "",
        "extracted_variables": {},
        "is_voicemail": false,
        "answering_machine_detected": false
      }
    }
  ],
  "pagesize": 150,
  "has_more": true,
  "next_cursor": "MTU2"
}

Authorization

BearerAuth
headerAuthorizationBearer <token>

Bearer token authentication. Obtain your API key from the OmniDimension dashboard.

Path Parameters

bulk_call_id*integer

Id of the bulk call campaign.

Query Parameters

user_id?integer

Reseller keys only: act as one of your clients by its user id. Omit it to act on your own account. How acting for a client works.

cursor?string

The next_cursor from your previous response. Omit it on the first request. Opaque: pass it back unchanged.

pagesize?integer

Rows per page. Above 150 the request is refused.

Rangevalue <= 150
Default30
call_status?string

Return only contacts in this state.

Value in"Pending""In Progress""completed""voicemail_detected""no-answer""busy""Failed""Skipped""retry_scheduled""cancelled"
interaction_status?string

Return only contacts with this interaction outcome.

search?string

An exact phone number, matched against the contact's number and the number that called it. Not a substring search.

include_total?boolean

Add total_records to the response. It costs a count over the whole filtered campaign, so it is off unless you ask. Ask for it once to fill a header, not on every page of a walk.

Defaultfalse

Response body

application/json

Response Body

One page of results. next_cursor is null on the last page.

application/json
status?string
bulk_call_id?integer
records?
pagesize?integer
has_more?boolean
next_cursor?string

Pass back as cursor. null means you are done.

total_records?integer

Only present when include_total is true.

Was this page helpful?