Skip to content
nitrodialerDocs
Browse the docs

Docs / Developers

API reference

Every NitroDialer API endpoint with parameters, request and response examples.

Base URL https://nitrodialer.com/api/v1. Authenticate with Authorization: Bearer nd_live_…. Errors, pagination and rate limits are explained in the API overview. Download the OpenAPI 3.1 document to generate a client.

Workspace

GET/api/v1/meread scope

Get the workspace for this API key

Use this to check that a key works and which CRM the workspace is connected to.

Example request

Shell
curl "https://nitrodialer.com/api/v1/me" \
  -H "Authorization: Bearer $NITRODIALER_API_KEY"

Response · 200

JSON
{
  "object": "workspace",
  "id": "6b1f…",
  "name": "Polaron Comfort",
  "crm_provider": "hubspot",
  "plan": "growth",
  "status": "active",
  "timezone": "America/New_York",
  "created_at": "2026-09-01T12:00:00.000Z",
  "api_key": {
    "id": "a1b2…",
    "scopes": [
      "read",
      "write"
    ]
  }
}

Responses

200The workspace.
401Missing, malformed, unknown or revoked API key.
403The key lacks the required scope, or the workspace is suspended.
429Rate limit exceeded (120 requests per minute per key).

Campaigns

GET/api/v1/campaignsread scope

List campaigns

Newest first. Archived campaigns are excluded unless you filter by status=archived.

Parameters

NameInDescription
limitqueryItems per page, 1–100. Default 25.
starting_afterqueryCursor: the `next_cursor` from the previous page.
statusquerydraft, active, paused or archived.

Example request

Shell
curl "https://nitrodialer.com/api/v1/campaigns" \
  -H "Authorization: Bearer $NITRODIALER_API_KEY"

Response · 200

JSON
{
  "object": "list",
  "data": [
    {
      "id": "8f0b5c2e-6c1a-4f43-9d7e-2b8c1f0a9e11",
      "object": "campaign",
      "name": "Heat pump rebate — web leads",
      "status": "active",
      "mode": "power",
      "call_type": "b2c",
      "assignment": "shared",
      "source": {
        "type": "crm_list",
        "provider": "hubspot",
        "object": "contacts",
        "list_name": "Rebate form — last 30 days"
      },
      "caller_id": "+14165550100",
      "last_synced_at": "2026-10-27T13:30:00.000Z",
      "created_at": "2026-10-20T15:02:11.000Z"
    }
  ],
  "has_more": false,
  "next_cursor": null
}

Responses

200A page of campaigns.
401Missing, malformed, unknown or revoked API key.
403The key lacks the required scope, or the workspace is suspended.
422The request failed validation.
429Rate limit exceeded (120 requests per minute per key).
GET/api/v1/campaigns/{id}read scope

Get a campaign with queue counts

Parameters

NameInDescription
id requiredpathCampaign id (UUID).

Example request

Shell
curl "https://nitrodialer.com/api/v1/campaigns/ID" \
  -H "Authorization: Bearer $NITRODIALER_API_KEY"

Response · 200

JSON
{
  "id": "8f0b5c2e-6c1a-4f43-9d7e-2b8c1f0a9e11",
  "object": "campaign",
  "name": "Heat pump rebate — web leads",
  "status": "active",
  "mode": "power",
  "call_type": "b2c",
  "assignment": "shared",
  "source": {
    "type": "crm_list",
    "provider": "hubspot",
    "object": "contacts",
    "list_name": "Rebate form — last 30 days"
  },
  "caller_id": "+14165550100",
  "last_synced_at": "2026-10-27T13:30:00.000Z",
  "created_at": "2026-10-20T15:02:11.000Z",
  "queue": {
    "ready": 214,
    "in_call": 3,
    "callback": 18,
    "done": 96,
    "exhausted": 41,
    "dnc": 4,
    "removed": 2,
    "total": 378
  }
}

Responses

200The campaign.
401Missing, malformed, unknown or revoked API key.
403The key lacks the required scope, or the workspace is suspended.
404No such object in this workspace.
429Rate limit exceeded (120 requests per minute per key).
PATCH/api/v1/campaigns/{id}write scope

Activate or pause a campaign

Pausing stops agents from receiving new leads from this campaign; calls in progress finish normally.

Parameters

NameInDescription
id requiredpathCampaign id (UUID).

Request body

JSON
{
  "status": "paused"
}

Example request

Shell
curl -X PATCH "https://nitrodialer.com/api/v1/campaigns/ID" \
  -H "Authorization: Bearer $NITRODIALER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"status":"paused"}'

Response · 200

JSON
{
  "id": "8f0b5c2e-6c1a-4f43-9d7e-2b8c1f0a9e11",
  "object": "campaign",
  "name": "Heat pump rebate — web leads",
  "status": "paused",
  "mode": "power",
  "call_type": "b2c",
  "assignment": "shared",
  "source": {
    "type": "crm_list",
    "provider": "hubspot",
    "object": "contacts",
    "list_name": "Rebate form — last 30 days"
  },
  "caller_id": "+14165550100",
  "last_synced_at": "2026-10-27T13:30:00.000Z",
  "created_at": "2026-10-20T15:02:11.000Z",
  "queue": {
    "ready": 214,
    "in_call": 3,
    "callback": 18,
    "done": 96,
    "exhausted": 41,
    "dnc": 4,
    "removed": 2,
    "total": 378
  }
}

Responses

200The updated campaign.
401Missing, malformed, unknown or revoked API key.
403The key lacks the required scope, or the workspace is suspended.
404No such object in this workspace.
422The request failed validation.
429Rate limit exceeded (120 requests per minute per key).

Leads

GET/api/v1/campaigns/{id}/leadsread scope

List a campaign's leads

Parameters

NameInDescription
id requiredpathCampaign id (UUID).
limitqueryItems per page, 1–100. Default 25.
starting_afterqueryCursor: the `next_cursor` from the previous page.
statusqueryFilter by queue status.

Example request

Shell
curl "https://nitrodialer.com/api/v1/campaigns/ID/leads" \
  -H "Authorization: Bearer $NITRODIALER_API_KEY"

Response · 200

JSON
{
  "object": "list",
  "data": [
    {
      "id": "2b7e4f55-0d3c-4a11-8a2f-9c6d5e4b3a21",
      "object": "lead",
      "campaign_id": "8f0b5c2e-6c1a-4f43-9d7e-2b8c1f0a9e11",
      "status": "ready",
      "priority": 100,
      "first_name": "Daniel",
      "last_name": "Okafor",
      "company": null,
      "email": "d.okafor@example.com",
      "phones": [
        {
          "e164": "+15125550142",
          "type": "mobile"
        }
      ],
      "city": "Austin",
      "region": "TX",
      "postal_code": "78701",
      "timezone": "America/Chicago",
      "crm_object": "contacts",
      "crm_record_id": "51234",
      "express_consent": true,
      "attempts": 0,
      "last_attempt_at": null,
      "next_eligible_at": "2026-10-27T14:00:00.000Z",
      "callback_at": null,
      "last_disposition": null,
      "created_at": "2026-10-27T14:00:00.000Z"
    }
  ],
  "has_more": true,
  "next_cursor": "2b7e4f55-0d3c-4a11-8a2f-9c6d5e4b3a21"
}

Responses

200A page of leads.
401Missing, malformed, unknown or revoked API key.
403The key lacks the required scope, or the workspace is suspended.
404No such object in this workspace.
422The request failed validation.
429Rate limit exceeded (120 requests per minute per key).
POST/api/v1/campaigns/{id}/leadswrite scope

Add leads to a campaign

Send one lead as the body, or up to 500 as `{ "leads": [...] }`. Leads with a `crm_record_id` already in the campaign are updated, not duplicated, so retries are safe. Each new lead fires a `lead.created` webhook. Returns 201 when at least one lead was inserted.

Parameters

NameInDescription
id requiredpathCampaign id (UUID).

Request body

JSON
{
  "first_name": "Daniel",
  "last_name": "Okafor",
  "mobile": "512-555-0142",
  "region": "TX",
  "crm_object": "contacts",
  "crm_record_id": "51234",
  "express_consent": true,
  "priority": 100
}

Example request

Shell
curl -X POST "https://nitrodialer.com/api/v1/campaigns/ID/leads" \
  -H "Authorization: Bearer $NITRODIALER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"first_name":"Daniel","last_name":"Okafor","mobile":"512-555-0142","region":"TX","crm_object":"contacts","crm_record_id":"51234","express_consent":true,"priority":100}'

Responses

200Nothing new inserted (all updates or skips).
201Leads inserted.
401Missing, malformed, unknown or revoked API key.
403The key lacks the required scope, or the workspace is suspended.
404No such object in this workspace.
409The campaign is archived.
422The request failed validation.
429Rate limit exceeded (120 requests per minute per key).
GET/api/v1/leads/{id}read scope

Get a lead

Parameters

NameInDescription
id requiredpathLead id (UUID).

Example request

Shell
curl "https://nitrodialer.com/api/v1/leads/ID" \
  -H "Authorization: Bearer $NITRODIALER_API_KEY"

Response · 200

JSON
{
  "id": "2b7e4f55-0d3c-4a11-8a2f-9c6d5e4b3a21",
  "object": "lead",
  "campaign_id": "8f0b5c2e-6c1a-4f43-9d7e-2b8c1f0a9e11",
  "status": "ready",
  "priority": 100,
  "first_name": "Daniel",
  "last_name": "Okafor",
  "company": null,
  "email": "d.okafor@example.com",
  "phones": [
    {
      "e164": "+15125550142",
      "type": "mobile"
    }
  ],
  "city": "Austin",
  "region": "TX",
  "postal_code": "78701",
  "timezone": "America/Chicago",
  "crm_object": "contacts",
  "crm_record_id": "51234",
  "express_consent": true,
  "attempts": 0,
  "last_attempt_at": null,
  "next_eligible_at": "2026-10-27T14:00:00.000Z",
  "callback_at": null,
  "last_disposition": null,
  "created_at": "2026-10-27T14:00:00.000Z"
}

Responses

200The lead.
401Missing, malformed, unknown or revoked API key.
403The key lacks the required scope, or the workspace is suspended.
404No such object in this workspace.
429Rate limit exceeded (120 requests per minute per key).
DELETE/api/v1/leads/{id}write scope

Remove a lead from its campaign

Sets the lead's status to `removed` so it is never dialed again. Call history is kept. Safe to repeat.

Parameters

NameInDescription
id requiredpathLead id (UUID).

Example request

Shell
curl -X DELETE "https://nitrodialer.com/api/v1/leads/ID" \
  -H "Authorization: Bearer $NITRODIALER_API_KEY"

Response · 200

JSON
{
  "id": "2b7e4f55-0d3c-4a11-8a2f-9c6d5e4b3a21",
  "object": "lead",
  "deleted": true
}

Responses

200Removed.
401Missing, malformed, unknown or revoked API key.
403The key lacks the required scope, or the workspace is suspended.
404No such object in this workspace.
409The lead is on a call right now.
429Rate limit exceeded (120 requests per minute per key).

Calls

GET/api/v1/callsread scope

List calls

Newest first, by the time the call was placed.

Parameters

NameInDescription
limitqueryItems per page, 1–100. Default 25.
starting_afterqueryCursor: the `next_cursor` from the previous page.
campaign_idqueryOnly calls from this campaign.
agent_idqueryOnly calls made by this agent.
dispositionqueryDisposition key, e.g. appointment.
sincequeryPlaced at or after (ISO 8601).
untilqueryPlaced before (ISO 8601).

Example request

Shell
curl "https://nitrodialer.com/api/v1/calls" \
  -H "Authorization: Bearer $NITRODIALER_API_KEY"

Response · 200

JSON
{
  "object": "list",
  "data": [
    {
      "id": "c41d9a6e-7b2f-4e8a-9f10-3d2c1b0a9f88",
      "object": "call",
      "campaign": {
        "id": "8f0b5c2e-6c1a-4f43-9d7e-2b8c1f0a9e11",
        "name": "Heat pump rebate — web leads"
      },
      "lead": {
        "id": "2b7e4f55-0d3c-4a11-8a2f-9c6d5e4b3a21",
        "first_name": "Daniel",
        "last_name": "Okafor",
        "company": null,
        "crm_object": "contacts",
        "crm_record_id": "51234"
      },
      "agent": {
        "id": "0e6f7a8b-1c2d-4e3f-8a9b-0c1d2e3f4a5b",
        "name": "Priya Raman"
      },
      "phone": "+15125550142",
      "started_at": "2026-10-27T14:03:12.000Z",
      "connected_at": "2026-10-27T14:03:30.000Z",
      "ended_at": "2026-10-27T14:14:12.000Z",
      "talk_seconds": 642,
      "disposition": {
        "key": "appointment",
        "label": "Appointment set",
        "category": "contact_positive"
      },
      "notes": "Gas furnace, 19 years old. Booked Thursday 10am.",
      "ai_summary": "Homeowner wants to replace an aging furnace; in-home assessment booked.",
      "recording_url": "https://dialpad.com/r/abc123"
    }
  ],
  "has_more": false,
  "next_cursor": null
}

Responses

200A page of calls.
401Missing, malformed, unknown or revoked API key.
403The key lacks the required scope, or the workspace is suspended.
422The request failed validation.
429Rate limit exceeded (120 requests per minute per key).
GET/api/v1/calls/{id}read scope

Get a call

Parameters

NameInDescription
id requiredpathCall id (UUID).

Example request

Shell
curl "https://nitrodialer.com/api/v1/calls/ID" \
  -H "Authorization: Bearer $NITRODIALER_API_KEY"

Response · 200

JSON
{
  "id": "c41d9a6e-7b2f-4e8a-9f10-3d2c1b0a9f88",
  "object": "call",
  "campaign": {
    "id": "8f0b5c2e-6c1a-4f43-9d7e-2b8c1f0a9e11",
    "name": "Heat pump rebate — web leads"
  },
  "lead": {
    "id": "2b7e4f55-0d3c-4a11-8a2f-9c6d5e4b3a21",
    "first_name": "Daniel",
    "last_name": "Okafor",
    "company": null,
    "crm_object": "contacts",
    "crm_record_id": "51234"
  },
  "agent": {
    "id": "0e6f7a8b-1c2d-4e3f-8a9b-0c1d2e3f4a5b",
    "name": "Priya Raman"
  },
  "phone": "+15125550142",
  "started_at": "2026-10-27T14:03:12.000Z",
  "connected_at": "2026-10-27T14:03:30.000Z",
  "ended_at": "2026-10-27T14:14:12.000Z",
  "talk_seconds": 642,
  "disposition": {
    "key": "appointment",
    "label": "Appointment set",
    "category": "contact_positive"
  },
  "notes": "Gas furnace, 19 years old. Booked Thursday 10am.",
  "ai_summary": "Homeowner wants to replace an aging furnace; in-home assessment booked.",
  "recording_url": "https://dialpad.com/r/abc123"
}

Responses

200The call.
401Missing, malformed, unknown or revoked API key.
403The key lacks the required scope, or the workspace is suspended.
404No such object in this workspace.
429Rate limit exceeded (120 requests per minute per key).

Stats

GET/api/v1/stats/agentsread scope

Per-agent coaching stats

The same numbers as the Coaching screen. Default window is the last 7 days; maximum 366 days.

Parameters

NameInDescription
fromqueryWindow start (ISO 8601). Default: 7 days before `to`.
toqueryWindow end (ISO 8601). Default: now.
campaign_idqueryLimit to one campaign.

Example request

Shell
curl "https://nitrodialer.com/api/v1/stats/agents" \
  -H "Authorization: Bearer $NITRODIALER_API_KEY"

Response · 200

JSON
{
  "object": "list",
  "from": "2026-10-20T00:00:00.000Z",
  "to": "2026-10-27T00:00:00.000Z",
  "campaign_id": null,
  "data": [
    {
      "object": "agent_stats",
      "agent": {
        "id": "0e6f…",
        "name": "Priya Raman"
      },
      "dials": 412,
      "connects": 318,
      "contacts": 118,
      "conversations": 61,
      "appointments": 19,
      "talk_seconds": 64200,
      "rates": {
        "pickup": 0.2864,
        "appointment": 0.161,
        "dials_per_hour": 13.2
      }
    }
  ]
}

Responses

200One row per agent with activity in the window.
401Missing, malformed, unknown or revoked API key.
403The key lacks the required scope, or the workspace is suspended.
422The request failed validation.
429Rate limit exceeded (120 requests per minute per key).

Do not call

GET/api/v1/dncread scope

List or look up do-not-call numbers

Without `phone`: your internal DNC list, newest first (paginate with `requested_before`), plus a count of national-list numbers. With `phone`: whether that number is blocked and why. National-list numbers are never listed — registry terms only allow compliance use.

Parameters

NameInDescription
phonequeryLook up one number.
limitquery1–100, default 50.
requested_beforequeryCursor: `next_requested_before` from the previous page.

Example request

Shell
curl "https://nitrodialer.com/api/v1/dnc" \
  -H "Authorization: Bearer $NITRODIALER_API_KEY"

Response · 200

JSON
{
  "object": "dnc_lookup",
  "phone": "+12125550142",
  "blocked": true,
  "internal": {
    "requested_at": "2026-10-27T14:20:00.000Z",
    "expires_at": "2031-10-27T14:20:00.000Z"
  },
  "national_dncl": false
}

Responses

200A page of internal DNC numbers, or a lookup result.
401Missing, malformed, unknown or revoked API key.
403The key lacks the required scope, or the workspace is suspended.
422The request failed validation.
429Rate limit exceeded (120 requests per minute per key).
POST/api/v1/dncwrite scope

Add a number to the internal DNC list

Blocked immediately and kept for the workspace's retention period (US preset 5 years, Canada 3 years + 14 days). Queued leads with that number stop immediately and fire `lead.dnc`.

Request body

JSON
{
  "phone": "+1 647 555 0142",
  "reason": "Asked by email"
}

Example request

Shell
curl -X POST "https://nitrodialer.com/api/v1/dnc" \
  -H "Authorization: Bearer $NITRODIALER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"phone":"+1 647 555 0142","reason":"Asked by email"}'

Response · 201

JSON
{
  "object": "dnc_number",
  "phone": "+15125550142",
  "requested_at": "2026-10-27T14:20:00.000Z",
  "expires_at": "2031-10-27T14:20:00.000Z",
  "leads_stopped": 1
}

Responses

201Added.
401Missing, malformed, unknown or revoked API key.
403The key lacks the required scope, or the workspace is suspended.
422The request failed validation.
429Rate limit exceeded (120 requests per minute per key).
DELETE/api/v1/dncwrite scope

Remove a number from the internal DNC list

Only do this when the person has since given express consent to be called.

Parameters

NameInDescription
phone requiredqueryThe number to remove.

Example request

Shell
curl -X DELETE "https://nitrodialer.com/api/v1/dnc?phone=%2B15125550142" \
  -H "Authorization: Bearer $NITRODIALER_API_KEY"

Response · 200

JSON
{
  "object": "dnc_number",
  "phone": "+15125550142",
  "deleted": true
}

Responses

200Removed.
401Missing, malformed, unknown or revoked API key.
403The key lacks the required scope, or the workspace is suspended.
422The request failed validation.
429Rate limit exceeded (120 requests per minute per key).

Dispositions

GET/api/v1/dispositionsread scope

List call outcomes

The outcomes agents pick after each call, with the CRM field updates each one applies.

Example request

Shell
curl "https://nitrodialer.com/api/v1/dispositions" \
  -H "Authorization: Bearer $NITRODIALER_API_KEY"

Response · 200

JSON
{
  "object": "list",
  "data": [
    {
      "object": "disposition",
      "key": "appointment",
      "label": "Appointment set",
      "category": "contact_positive",
      "is_appointment": true,
      "ends_lead": true,
      "add_to_dnc": false,
      "mark_number_bad": false,
      "requires_callback": false,
      "retry_after_minutes": null,
      "crm_field_updates": {
        "hs_lead_status": "OPEN_DEAL"
      },
      "active": true
    }
  ],
  "has_more": false
}

Responses

200All dispositions.
401Missing, malformed, unknown or revoked API key.
403The key lacks the required scope, or the workspace is suspended.
429Rate limit exceeded (120 requests per minute per key).

Objects

Campaign

FieldTypeNotes
object"campaign"
idstring
namestring
statusstring (draft, active, paused, archived)
modestring (power, preview)
call_typestring (b2c, b2b)
assignmentstring (shared, owner_only)
sourceobject
caller_idstring | null
last_synced_atstring | null
created_atstring
queueQueue

Lead

FieldTypeNotes
object"lead"
idstring
campaign_idstring
statusstring (ready, claimed, in_call, callback, done, exhausted, dnc, removed)
priorityinteger
first_namestring | null
last_namestring | null
companystring | null
emailstring | null
phonesarray of Phone
citystring | null
regionstring | null
postal_codestring | null
timezonestringIANA zone used for legal calling hours.
crm_objectstring | null
crm_record_idstring | null
express_consentboolean
attemptsinteger
last_attempt_atstring | null
next_eligible_atstring
callback_atstring | null
last_dispositionstring | null
created_atstring

LeadInput

At least one of phone, mobile or other_phone is required. Numbers are normalised to E.164 (North America by default). Rows without a valid number are skipped and counted.

FieldTypeNotes
first_namestring
last_namestring
companystring
emailstring
phonestring
mobilestring
other_phonestring
citystring
regionstringState or province; sets the lead's time zone.
postal_codestring
crm_objectstringe.g. contacts (HubSpot), Lead (Salesforce), Leads (Zoho), persons (Pipedrive).
crm_record_idstringLinks the lead to its CRM record so call notes are written back. Also the de-duplication key: re-sending the same record updates it instead of adding a duplicate.
express_consentbooleanThe person gave express consent to be called (skips the national do-not-call list).
consent_sourcestring
priorityintegerHigher dials first. Use 100 for brand-new inbound leads (speed-to-lead).

Call

FieldTypeNotes
object"call"
idstring
campaignobject
leadobject
agentobject
phonestring
started_atstring | null
connected_atstring | null
ended_atstring | null
talk_secondsinteger
dispositionobject | null
notesstring | null
ai_summarystring | null
recording_urlstring | null

AgentStats

Definitions: see /docs/coaching-metrics.

FieldTypeNotes
object"agent_stats"
agentobject
dialsinteger
connectsinteger
contactsinteger
conversationsinteger
appointmentsinteger
dnc_requestsinteger
bad_numbersinteger
missing_dispositionsinteger
talk_secondsinteger
avg_talk_secondsnumber | null
longest_talk_secondsinteger | null
avg_ring_secondsnumber | null
avg_wrapup_secondsnumber | null
timeobject
ratesobject

Disposition

FieldTypeNotes
object"disposition"
keystring
labelstring
categorystring
is_appointmentboolean
ends_leadboolean
add_to_dncboolean
mark_number_badboolean
requires_callbackboolean
retry_after_minutesinteger | null
crm_field_updatesobject
activeboolean

Error

FieldTypeNotes
codestring
messagestring