API Reference · v1
Build on ColdReach
A REST API for everything in your workspace — leads, lead lists, campaigns and their sequences, pipelines, deals and analytics. Send JSON, get JSON, authenticate with one API key.
- 67
- Endpoints
- JSON
- Requests & responses
- 120/min
- Rate limit
Base URL
https://outreach.corammers.com/api/v1
{
"data": {
"id": 7,
"name": "Alex Morgan",
"email": "alex@yourcompany.com",
"api_key": {
"name": "CRM sync",
"scopes": [
"read",
"write"
],
"last_used_at": "2026-10-10T09:14:22+00:00",
"expires_at": null
},
"counts": {
"leads": 1840,
"lead_lists": 12,
"campaigns": 9,
"pipelines": 2,
"opportunities": 41,
"smtp_accounts": 4
},
"plan": {
"key": "growth",
"name": "Growth",
"contacts": {
"used": 1840,
"limit": 25000,
"remaining": 23160
},
"emails": {
"used": 5120,
"limit": 125000,
"remaining": 119880,
"period_started_at": "2026-11-01T00:00:00+00:00",
"renews_at": "2026-12-01T00:00:00+00:00"
},
"email_accounts": {
"used": 4,
"limit": null
}
}
}
}
Resources
Check which workspace a key belongs to and look up the IDs you need for other requests — email accounts for campaigns an...
Leads are the people you reach out to. Emails are unique per workspace (case-insensitive), so the API rejects duplicates...
Lists group leads so you can enroll them into campaigns together. A lead can belong to many lists; deleting a list never...
A campaign sends a multi-step email sequence to enrolled leads from your connected email accounts, within its schedule....
Each campaign has one sequence: an ordered list of email and wait steps. Email steps hold one or more A/B variants that...
Reusable subjects and bodies for sequence emails. Using a template copies its content into a variant; editing or deletin...
Enroll leads into a campaign's sequence and control each lead individually. Leads are referenced by their lead ID.
Pipelines track deals (opportunities) through ordered stages. Stages can be flagged as won or lost, which drives win-rat...
Opportunities are deals linked to a lead and placed in a pipeline stage. Every stage change is recorded in activity_log.
Email performance, lead and pipeline reporting — the same numbers as the dashboard. sent counts emails; every other metr...
Authentication
Every request needs an API key, sent as a Bearer token in the Authorization header. Keys are created per account in Settings → API and look like 12|crk_….
A key acts as your account: it can only see and change data in your own workspace. Requests without a valid key — missing, mistyped, expired or revoked — get a 401.
All requests must use HTTPS. Send Content-Type: application/json with request bodies; every response is JSON.
curl https://outreach.corammers.com/api/v1/me \
-H "Authorization: Bearer crk_••••••••••••••••"
{
"message": "Unauthenticated."
}
Scopes & API keys
When you create a key you choose its access level. Give each integration its own key with the least access it needs.
| Access | Scopes | Allows |
|---|---|---|
| Read only | read | All GET endpoints |
| Read & write | read write | Everything, including POST, PATCH, PUT and DELETE |
Keys can expire after 30, 90 or 365 days, or never. You can hold up to 25 keys and see when each one was last used. A read-only key calling a write endpoint gets a 403.
{
"message": "This API key is read-only. Create a key with read & write access to perform this action."
}
Errors
ColdReach uses conventional HTTP status codes. Every error body has a human-readable message; validation errors add an errors object keyed by field.
| 200 | OK | The request succeeded. |
| 201 | Created | A resource was created. |
| 401 | Unauthenticated | The API key is missing, invalid, expired or revoked. |
| 403 | Forbidden | The key lacks the scope for this endpoint. |
| 404 | Not found | The resource does not exist in your workspace. |
| 405 | Method not allowed | The HTTP verb is not supported on this path. |
| 409 | Conflict | The action does not fit the current state, e.g. pausing a draft campaign. |
| 422 | Unprocessable | Validation failed. See errors for details. |
| 429 | Too many requests | Rate limit exceeded. Retry after the Retry-After header. |
| 5xx | Server error | Something went wrong on our side. Safe to retry GET requests. |
{
"message": "The email field must be a valid email address. (and 1 more error)",
"errors": {
"email": [
"The email field must be a valid email address."
],
"status": [
"The selected status is invalid."
]
}
}
{
"message": "Lead not found."
}
Pagination
List endpoints are paginated. Use page (starting at 1) and per_page (1–100, default 25). Responses wrap results in data and include links to neighbouring pages and a meta object with total, current_page and last_page.
Most lists accept sort — a field name, prefixed with - for descending (e.g. -updated_at). For incremental syncs, combine updated_after on leads with sort=updated_at.
let page = 1;
let leads = [];
while (true) {
const res = await fetch(`https://outreach.corammers.com/api/v1/leads?per_page=100&page=${page}`, {
headers: { Authorization: `Bearer ${API_KEY}` },
});
const { data, meta } = await res.json();
leads.push(...data);
if (meta.current_page >= meta.last_page) break;
page++;
}
Rate limits
Each account can make 120 requests per minute across all of its keys. Every response carries X-RateLimit-Limit and X-RateLimit-Remaining. Over the limit you get a 429 with a Retry-After header in seconds.
Use the bulk endpoints to stay well within the limit: one call to POST /leads/bulk imports 500 leads, and enrolling a whole list into a campaign is a single request.
{
"message": "Too many requests. The API allows 120 requests per minute per account."
}
Quickstart: launch a campaign
From a list of contacts to emails going out in six requests. Replace the IDs with the ones returned by your previous calls.
-
1
Import your leads
Upsert up to 500 leads per call and drop them into a list.
POST /leads/bulkcurl -X POST https://outreach.corammers.com/api/v1/leads/bulk \ -H "Authorization: Bearer $COLDREACH_API_KEY" \ -H "Content-Type: application/json" \ -d '{"on_duplicate":"update","list_ids":[12],"leads":[{"email":"ava@northwind.io","first_name":"Ava","company":"Northwind"}]}' -
2
Create the campaign
Pick the sending accounts from GET /smtp-accounts and set the schedule.
POST /campaignscurl -X POST https://outreach.corammers.com/api/v1/campaigns \ -H "Authorization: Bearer $COLDREACH_API_KEY" \ -H "Content-Type: application/json" \ -d '{"name":"Q4 SaaS founders","smtp_account_ids":[3,4],"schedule":{"timezone":"America/New_York","send_window_start":"09:00","send_window_end":"17:00"}}' -
3
Write the sequence
Add an email step (with A/B variants if you like), then a wait and a follow-up.
POST /campaigns/31/sequence/stepscurl -X POST https://outreach.corammers.com/api/v1/campaigns/31/sequence/steps \ -H "Authorization: Bearer $COLDREACH_API_KEY" \ -H "Content-Type: application/json" \ -d '{"type":"email","subject":"Quick question, {{ first_name }}","body":"Hi {{ first_name }},\n\nWorth a chat about outbound at {{ company }}?"}' -
4
Enroll leads
Enroll individual leads or a whole list.
POST /campaigns/31/leadscurl -X POST https://outreach.corammers.com/api/v1/campaigns/31/leads \ -H "Authorization: Bearer $COLDREACH_API_KEY" \ -H "Content-Type: application/json" \ -d '{"lead_list_id":12}' -
5
Go live
Activation schedules every lead inside the sending window. Check
warningsin the response.POST /campaigns/31/activatecurl -X POST https://outreach.corammers.com/api/v1/campaigns/31/activate \ -H "Authorization: Bearer $COLDREACH_API_KEY" -
6
Track results
Poll analytics or the activity feed to react to replies.
GET /analytics/campaigns/31curl https://outreach.corammers.com/api/v1/analytics/campaigns/31 \ -H "Authorization: Bearer $COLDREACH_API_KEY"
Email variables
Subjects and bodies of sequence steps are personalised per lead when they are sent. Wrap a variable in double braces, e.g. {{ first_name }}. Add a fallback for empty values with {{ first_name | 'there' }}.
Custom lead fields are available as {{ custom.field_key }} — list keys with GET /custom-fields.
Lead
{{ first_name }}
{{ last_name }}
{{ full_name }}
{{ email }}
{{ company }}
{{ title }}
{{ website }}
{{ phone }}
{{ location }}
{{ industry }}
{{ company_domain }}
{{ linkedin_url }}
{{ twitter_url }}
{{ tags }}
{{ status }}
Custom fields
{{ custom.field_key }}
Sender
{{ sender_name }}
{{ sender_email }}
{{ smtp_name }}
{{ user_name }}
{{ user_email }}
3 endpoints
Account
Check which workspace a key belongs to and look up the IDs you need for other requests — email accounts for campaigns and custom field keys for leads.
/api/v1/me
Get the current account
Returns the account the API key belongs to, the key's scopes, a count of every resource and the account's plan with what is left of it. A null limit means unlimited. Check plan.contacts.remaining before importing: once a plan's contact limit is reached, creating leads returns 403 with code: contact_limit_reached, and bulk requests skip the rows that do not fit (skipped_plan_limit).
curl "https://outreach.corammers.com/api/v1/me" \
-H "Authorization: Bearer $COLDREACH_API_KEY"
{
"data": {
"id": 7,
"name": "Alex Morgan",
"email": "alex@yourcompany.com",
"api_key": {
"name": "CRM sync",
"scopes": [
"read",
"write"
],
"last_used_at": "2026-10-10T09:14:22+00:00",
"expires_at": null
},
"counts": {
"leads": 1840,
"lead_lists": 12,
"campaigns": 9,
"pipelines": 2,
"opportunities": 41,
"smtp_accounts": 4
},
"plan": {
"key": "growth",
"name": "Growth",
"contacts": {
"used": 1840,
"limit": 25000,
"remaining": 23160
},
"emails": {
"used": 5120,
"limit": 125000,
"remaining": 119880,
"period_started_at": "2026-11-01T00:00:00+00:00",
"renews_at": "2026-12-01T00:00:00+00:00"
},
"email_accounts": {
"used": 4,
"limit": null
}
}
}
}
/api/v1/smtp-accounts
List email accounts
Lists the sending (SMTP) accounts connected to the workspace. Pass their IDs as smtp_account_ids when creating or updating a campaign. Credentials are never returned.
curl "https://outreach.corammers.com/api/v1/smtp-accounts" \
-H "Authorization: Bearer $COLDREACH_API_KEY"
{
"data": [
{
"id": 3,
"display_name": "Alex — Sales",
"from_name": "Alex Morgan",
"from_email": "alex@yourcompany.com",
"status": "active",
"daily_limit": 50,
"emails_sent_today": 12
}
]
}
/api/v1/custom-fields
List custom lead fields
Lists the custom lead fields defined in the workspace. Use each field's key inside a lead's custom_data object and as {{ custom.key }} in email templates.
curl "https://outreach.corammers.com/api/v1/custom-fields" \
-H "Authorization: Bearer $COLDREACH_API_KEY"
{
"data": [
{
"id": 3,
"key": "funding_stage",
"name": "Funding Stage",
"type": "text"
},
{
"id": 4,
"key": "employee_count",
"name": "Employee Count",
"type": "number"
}
]
}
9 endpoints
Leads
Leads are the people you reach out to. Emails are unique per workspace (case-insensitive), so the API rejects duplicates and the bulk endpoint can skip or update them.
The lead object
-
idintegerUnique identifier.
-
emailstringEmail address. Unique within your workspace.
-
first_name / last_name / full_namestringName fields.
full_nameis read-only. -
title, company, website, phone, locationstring|nullProfile fields.
-
linkedin_url, facebook_url, instagram_url, twitter_urlstring|nullMain social profiles.
-
extra_contactsobject[]Any number of extra ways to reach the lead:
{type, value, label}withtypeone ofemail,phone,whatsapp,website,linkedin,facebook,instagram,twitter,youtube,tiktok,otherand an optionallabelsuch as "Mobile". Sending the field replaces the whole list. -
industry, company_domainstring|nullFirmographic fields.
-
email_provider, email_security_gatewaystring|nullFilled automatically by email validation.
-
statusenumnew,contacted,replied,interested,meeting_booked,qualified,customer,not_interested,unsubscribed,bounced,invalid. Moves forward automatically (first email →contacted, reply →replied, inbox labels, won deal →customer); set it yourself at any time. -
validation_statusenumpending,valid,invalid,catch_all,risky,unknown. -
scoreintegerLead score 0–100 from profile, email quality, opens, clicks, replies, recency, status and open deals. Read-only.
-
temperatureenumhot,warmorcold, from the score and your scoring thresholds. Read-only. -
score_breakdownobject[]The signals behind the score (
label,points). Read-only. -
last_activity_at / last_contacted_atdatetime|nullLast interaction of any kind, and the last email you sent them. Read-only.
-
sourcestringWhere the lead came from:
api,manual,csv_import. -
tagsstring[]Lowercase tags.
-
custom_dataobjectValues for your custom fields, keyed by field key.
-
listsobject[]Lead lists the lead belongs to (
id,name). -
campaignsobject[]Only on GET /leads/{id}: campaigns the lead is enrolled in with their sequence status.
/api/v1/leads
List leads
Returns a paginated list of leads, newest first. Combine filters to sync or segment your data.
Query parameters
-
searchstringMatches first name, last name, email, company or title.
-
emailstringExact email match (case-insensitive).
-
statusenumFilter by lead status.
-
temperatureenumhot,warmorcold. -
min_score / max_scoreintegerOnly leads with a score in this range (0–100).
-
validation_statusenumFilter by email validation status.
-
sourcestringFilter by source, e.g.
api. -
list_idintegerOnly leads in this lead list.
-
tagstringOnly leads with this tag.
-
created_afterdateISO 8601 date or datetime.
-
created_beforedateISO 8601 date or datetime.
-
updated_afterdateUseful for incremental syncs.
-
sortstringOne of
created_at,updated_at,email,first_name,last_name,company,status,score,last_activity_at,last_contacted_at. Prefix with-for descending (e.g.-scorefor hottest first). Default-created_at. -
pageintegerPage number, starting at 1.
-
per_pageintegerItems per page, 1–100. Default 25.
curl "https://outreach.corammers.com/api/v1/leads?status=new&tag=saas&per_page=50" \
-H "Authorization: Bearer $COLDREACH_API_KEY"
{
"data": [
{
"id": 1842,
"first_name": "Ava",
"last_name": "Chen",
"full_name": "Ava Chen",
"email": "ava@northwind.io",
"title": "Head of Growth",
"company": "Northwind",
"website": "https://northwind.io",
"phone": "+1 415 555 0134",
"location": "San Francisco, CA",
"linkedin_url": "https://linkedin.com/in/avachen",
"facebook_url": null,
"instagram_url": null,
"twitter_url": null,
"industry": "SaaS",
"company_domain": "northwind.io",
"email_provider": "google",
"email_security_gateway": null,
"status": "new",
"validation_status": "valid",
"validated_at": "2026-10-09T14:12:03+00:00",
"score": 64,
"temperature": "hot",
"score_breakdown": [
{
"label": "Job title on file",
"points": 4
},
{
"label": "Email verified as valid",
"points": 5
},
{
"label": "2 opens",
"points": 6
},
{
"label": "Replied",
"points": 25
},
{
"label": "Engaged in the last 7 days",
"points": 10
},
{
"label": "Status: Interested",
"points": 20
}
],
"last_activity_at": "2026-10-11T09:30:00+00:00",
"last_contacted_at": "2026-10-10T15:02:00+00:00",
"source": "api",
"tags": [
"saas",
"series-a"
],
"custom_data": {
"funding_stage": "Series A"
},
"lists": [
{
"id": 12,
"name": "Q4 SaaS founders"
}
],
"created_at": "2026-10-09T14:11:58+00:00",
"updated_at": "2026-10-09T14:12:03+00:00"
}
],
"links": {
"first": "https://outreach.corammers.com/api/v1/leads?page=1",
"last": "https://outreach.corammers.com/api/v1/leads?page=1",
"prev": null,
"next": null
},
"meta": {
"current_page": 1,
"from": 1,
"last_page": 1,
"links": [
{
"url": null,
"label": "« Previous",
"active": false
},
{
"url": "https://outreach.corammers.com/api/v1/leads?page=1",
"label": "1",
"active": true
},
{
"url": null,
"label": "Next »",
"active": false
}
],
"path": "https://outreach.corammers.com/api/v1/leads",
"per_page": 25,
"to": 1,
"total": 1
}
}
/api/v1/leads
Create a lead
Creates a single lead. Returns 422 if a lead with the same email already exists — use the bulk endpoint with on_duplicate=update for upserts. Returns 403 with code: contact_limit_reached (plus limit and used) when the account's plan has no room for another contact.
Body parameters
-
emailstring requiredEmail address.
-
first_namestringFirst name.
-
last_namestringLast name.
-
titlestringJob title.
-
companystringCompany name.
-
websitestringCompany website (up to 2,048 characters, like the social URLs).
-
phonestringPhone number.
-
locationstringCity, region or country.
-
linkedin_urlstringLinkedIn profile URL. Also
facebook_url,instagram_url,twitter_url. -
industrystringIndustry.
-
company_domainstringCompany domain, e.g.
northwind.io. -
statusenumnew(default),contacted,replied,interested,meeting_booked,qualified,customer,not_interested,unsubscribed,bounced,invalid. -
validation_statusenumpending(default),valid,invalid,catch_all,risky,unknown. -
tagsstring[]Tags as an array or a comma-separated string. Stored lowercase.
-
custom_dataobjectCustom field values keyed by field key (see GET /custom-fields). Unknown keys are rejected.
-
list_idsinteger[]Add the lead to these lead lists.
curl -X POST "https://outreach.corammers.com/api/v1/leads" \
-H "Authorization: Bearer $COLDREACH_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"email": "ava@northwind.io",
"first_name": "Ava",
"last_name": "Chen",
"company": "Northwind",
"title": "Head of Growth",
"website": "https://northwind.io",
"tags": [
"saas",
"series-a"
],
"custom_data": {
"funding_stage": "Series A"
},
"list_ids": [
12
]
}'
{
"data": {
"id": 1842,
"first_name": "Ava",
"last_name": "Chen",
"full_name": "Ava Chen",
"email": "ava@northwind.io",
"title": "Head of Growth",
"company": "Northwind",
"website": "https://northwind.io",
"phone": "+1 415 555 0134",
"location": "San Francisco, CA",
"linkedin_url": "https://linkedin.com/in/avachen",
"facebook_url": null,
"instagram_url": null,
"twitter_url": null,
"industry": "SaaS",
"company_domain": "northwind.io",
"email_provider": "google",
"email_security_gateway": null,
"status": "new",
"validation_status": "valid",
"validated_at": "2026-10-09T14:12:03+00:00",
"score": 64,
"temperature": "hot",
"score_breakdown": [
{
"label": "Job title on file",
"points": 4
},
{
"label": "Email verified as valid",
"points": 5
},
{
"label": "2 opens",
"points": 6
},
{
"label": "Replied",
"points": 25
},
{
"label": "Engaged in the last 7 days",
"points": 10
},
{
"label": "Status: Interested",
"points": 20
}
],
"last_activity_at": "2026-10-11T09:30:00+00:00",
"last_contacted_at": "2026-10-10T15:02:00+00:00",
"source": "api",
"tags": [
"saas",
"series-a"
],
"custom_data": {
"funding_stage": "Series A"
},
"lists": [
{
"id": 12,
"name": "Q4 SaaS founders"
}
],
"created_at": "2026-10-09T14:11:58+00:00",
"updated_at": "2026-10-09T14:12:03+00:00"
}
}
/api/v1/leads/{lead}
Retrieve a lead
Returns a lead with its lists and the campaigns it is enrolled in.
Path parameters
-
leadinteger requiredLead ID.
curl "https://outreach.corammers.com/api/v1/leads/1842" \
-H "Authorization: Bearer $COLDREACH_API_KEY"
{
"data": {
"id": 1842,
"first_name": "Ava",
"last_name": "Chen",
"full_name": "Ava Chen",
"email": "ava@northwind.io",
"title": "Head of Growth",
"company": "Northwind",
"website": "https://northwind.io",
"phone": "+1 415 555 0134",
"location": "San Francisco, CA",
"linkedin_url": "https://linkedin.com/in/avachen",
"facebook_url": null,
"instagram_url": null,
"twitter_url": null,
"industry": "SaaS",
"company_domain": "northwind.io",
"email_provider": "google",
"email_security_gateway": null,
"status": "new",
"validation_status": "valid",
"validated_at": "2026-10-09T14:12:03+00:00",
"score": 64,
"temperature": "hot",
"score_breakdown": [
{
"label": "Job title on file",
"points": 4
},
{
"label": "Email verified as valid",
"points": 5
},
{
"label": "2 opens",
"points": 6
},
{
"label": "Replied",
"points": 25
},
{
"label": "Engaged in the last 7 days",
"points": 10
},
{
"label": "Status: Interested",
"points": 20
}
],
"last_activity_at": "2026-10-11T09:30:00+00:00",
"last_contacted_at": "2026-10-10T15:02:00+00:00",
"source": "api",
"tags": [
"saas",
"series-a"
],
"custom_data": {
"funding_stage": "Series A"
},
"lists": [
{
"id": 12,
"name": "Q4 SaaS founders"
}
],
"created_at": "2026-10-09T14:11:58+00:00",
"updated_at": "2026-10-09T14:12:03+00:00",
"campaigns": [
{
"campaign_id": 31,
"campaign_name": "Q4 SaaS founders",
"status": "active",
"current_step": 2,
"next_send_at": "2026-10-12T14:05:00+00:00"
}
]
}
}
/api/v1/leads/{lead}/timeline
Get a lead’s timeline
Everything that happened to a lead, newest first: emails sent, opens, clicks, replies, bounces, unsubscribes and sequence changes, plus edits, status changes, list membership, deals and automatic replies. Each entry says who did it — a person, an API key, an import or the system.
Path parameters
-
leadinteger requiredLead ID.
Query parameters
-
categoryenumemail(sends and sequence changes),engagement(opens, clicks, replies, unsubscribes, auto-replies),crm(created, edits, lists) ordeals. -
campaign_idintegerOnly email activity from this campaign.
-
include_schedulingbooleanAlso return the “email scheduled” entries written each time a send is planned or moved.
-
pageintegerPage number, starting at 1.
-
per_pageintegerItems per page, 1–100. Default 25.
curl "https://outreach.corammers.com/api/v1/leads/1842/timeline?category=engagement" \
-H "Authorization: Bearer $COLDREACH_API_KEY"
{
"data": [
{
"id": "event-90211",
"source": "email",
"type": "replied",
"category": "engagement",
"title": "Replied",
"detail": "Step 1 · “Re: Quick question, Ava”",
"campaign": {
"id": 31,
"name": "Q4 SaaS founders"
},
"actor": null,
"occurred_at": "2026-10-10T10:48:03+00:00"
},
{
"id": "event-90188",
"source": "email",
"type": "clicked",
"category": "engagement",
"title": "Link clicked",
"detail": "Step 1 · https://northwind.io/pricing",
"campaign": {
"id": 31,
"name": "Q4 SaaS founders"
},
"actor": null,
"occurred_at": "2026-10-10T09:51:40+00:00"
},
{
"id": "activity-5120",
"source": "activity",
"type": "status_changed",
"category": "crm",
"title": "Status changed",
"detail": "Status changed from new to qualified",
"campaign": null,
"actor": {
"type": "api",
"name": "API key “CRM sync”"
},
"occurred_at": "2026-10-09T16:20:00+00:00"
}
],
"links": {
"first": "https://outreach.corammers.com/api/v1/leads/1842/timeline?page=1",
"last": "https://outreach.corammers.com/api/v1/leads/1842/timeline?page=1",
"prev": null,
"next": null
},
"meta": {
"current_page": 1,
"from": 1,
"last_page": 1,
"links": [
{
"url": null,
"label": "« Previous",
"active": false
},
{
"url": "https://outreach.corammers.com/api/v1/leads/1842/timeline?page=1",
"label": "1",
"active": true
},
{
"url": null,
"label": "Next »",
"active": false
}
],
"path": "https://outreach.corammers.com/api/v1/leads/1842/timeline",
"per_page": 25,
"to": 3,
"total": 3
}
}
/api/v1/leads/{lead}
Update a lead
Updates only the fields you send. tags replaces the tag list, custom_data is merged (send null for a key to clear it), and list_ids replaces the lead's list memberships. PUT is accepted as an alias.
Path parameters
-
leadinteger requiredLead ID.
Body parameters
-
emailstringNew email address.
-
first_namestringFirst name.
-
last_namestringLast name.
-
titlestringJob title.
-
companystringCompany name.
-
websitestringCompany website (up to 2,048 characters, like the social URLs).
-
phonestringPhone number.
-
locationstringCity, region or country.
-
linkedin_urlstringLinkedIn profile URL. Also
facebook_url,instagram_url,twitter_url. -
industrystringIndustry.
-
company_domainstringCompany domain, e.g.
northwind.io. -
statusenumnew(default),contacted,replied,interested,meeting_booked,qualified,customer,not_interested,unsubscribed,bounced,invalid. -
validation_statusenumpending(default),valid,invalid,catch_all,risky,unknown. -
tagsstring[]Tags as an array or a comma-separated string. Stored lowercase.
-
custom_dataobjectCustom field values keyed by field key (see GET /custom-fields). Unknown keys are rejected.
-
list_idsinteger[]Replaces the lead's list memberships. Send
[]to remove it from every list.
curl -X PATCH "https://outreach.corammers.com/api/v1/leads/1842" \
-H "Authorization: Bearer $COLDREACH_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"status": "qualified",
"title": "VP Growth",
"custom_data": {
"funding_stage": "Series B"
}
}'
{
"data": {
"id": 1842,
"first_name": "Ava",
"last_name": "Chen",
"full_name": "Ava Chen",
"email": "ava@northwind.io",
"title": "VP Growth",
"company": "Northwind",
"website": "https://northwind.io",
"phone": "+1 415 555 0134",
"location": "San Francisco, CA",
"linkedin_url": "https://linkedin.com/in/avachen",
"facebook_url": null,
"instagram_url": null,
"twitter_url": null,
"industry": "SaaS",
"company_domain": "northwind.io",
"email_provider": "google",
"email_security_gateway": null,
"status": "qualified",
"validation_status": "valid",
"validated_at": "2026-10-09T14:12:03+00:00",
"score": 64,
"temperature": "hot",
"score_breakdown": [
{
"label": "Job title on file",
"points": 4
},
{
"label": "Email verified as valid",
"points": 5
},
{
"label": "2 opens",
"points": 6
},
{
"label": "Replied",
"points": 25
},
{
"label": "Engaged in the last 7 days",
"points": 10
},
{
"label": "Status: Interested",
"points": 20
}
],
"last_activity_at": "2026-10-11T09:30:00+00:00",
"last_contacted_at": "2026-10-10T15:02:00+00:00",
"source": "api",
"tags": [
"saas",
"series-a"
],
"custom_data": {
"funding_stage": "Series B"
},
"lists": [
{
"id": 12,
"name": "Q4 SaaS founders"
}
],
"created_at": "2026-10-09T14:11:58+00:00",
"updated_at": "2026-10-09T14:12:03+00:00"
}
}
/api/v1/leads/{lead}
Delete a lead
Permanently deletes a lead, its list memberships, campaign enrollments and opportunities.
Path parameters
-
leadinteger requiredLead ID.
curl -X DELETE "https://outreach.corammers.com/api/v1/leads/1842" \
-H "Authorization: Bearer $COLDREACH_API_KEY"
{
"message": "Lead deleted.",
"id": 1842
}
/api/v1/leads/bulk
Create or upsert leads in bulk
Imports up to 500 leads in one request. Each lead accepts the same fields as Create a lead. Existing emails are skipped by default or updated with on_duplicate=update. Returns 201 when at least one lead was created. New leads beyond the plan's contact limit are not created: they come back with result: skipped_plan_limit and count under skipped.
Body parameters
-
leadsobject[] requiredUp to 500 lead objects. Each needs an
email. -
on_duplicateenumskip(default) orupdateexisting leads with the same email. -
tagsstring[]Tags added to every lead in the request.
-
list_idsinteger[]Add every lead in the request to these lists.
curl -X POST "https://outreach.corammers.com/api/v1/leads/bulk" \
-H "Authorization: Bearer $COLDREACH_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"on_duplicate": "update",
"tags": [
"webinar-oct"
],
"list_ids": [
12
],
"leads": [
{
"email": "ava@northwind.io",
"first_name": "Ava",
"company": "Northwind"
},
{
"email": "li@acme.dev",
"first_name": "Li",
"last_name": "Wei",
"company": "Acme"
}
]
}'
{
"data": {
"created": 1,
"updated": 1,
"skipped": 0,
"leads": [
{
"email": "ava@northwind.io",
"id": 1842,
"result": "updated"
},
{
"email": "li@acme.dev",
"id": 1907,
"result": "created"
}
]
}
}
/api/v1/leads/bulk-delete
Delete leads in bulk
Deletes up to 1,000 leads by ID. IDs that do not belong to your workspace are ignored.
Body parameters
-
idsinteger[] requiredLead IDs to delete.
curl -X POST "https://outreach.corammers.com/api/v1/leads/bulk-delete" \
-H "Authorization: Bearer $COLDREACH_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"ids": [
1842,
1907,
1911
]
}'
{
"message": "3 lead(s) deleted.",
"deleted": 3
}
/api/v1/leads/{lead}/validate-email
Validate a lead's email
Checks syntax, MX records, disposable domains and role addresses, then stores the result on the lead (validation_status, email_provider, email_security_gateway).
Path parameters
-
leadinteger requiredLead ID.
curl -X POST "https://outreach.corammers.com/api/v1/leads/1842/validate-email" \
-H "Authorization: Bearer $COLDREACH_API_KEY"
{
"data": {
"lead_id": 1842,
"email": "ava@northwind.io",
"validation_status": "valid",
"email_provider": "google",
"email_security_gateway": null,
"validated_at": "2026-10-10T09:20:41+00:00"
}
}
8 endpoints
Lead lists
Lists group leads so you can enroll them into campaigns together. A lead can belong to many lists; deleting a list never deletes its leads.
The lead list object
-
idintegerUnique identifier.
-
namestringList name.
-
descriptionstring|nullOptional description.
-
leads_countintegerNumber of leads in the list.
/api/v1/lead-lists
List lead lists
Returns your lead lists with their lead counts.
Query parameters
-
searchstringMatches the list name.
-
sortstringcreated_at,updated_atorname, prefix-for descending. -
pageintegerPage number, starting at 1.
-
per_pageintegerItems per page, 1–100. Default 25.
curl "https://outreach.corammers.com/api/v1/lead-lists" \
-H "Authorization: Bearer $COLDREACH_API_KEY"
{
"data": [
{
"id": 12,
"name": "Q4 SaaS founders",
"description": "Founders at Series A–B SaaS companies",
"leads_count": 248,
"created_at": "2026-09-02T10:00:00+00:00",
"updated_at": "2026-10-08T16:41:09+00:00"
}
],
"links": {
"first": "https://outreach.corammers.com/api/v1/lead-lists?page=1",
"last": "https://outreach.corammers.com/api/v1/lead-lists?page=1",
"prev": null,
"next": null
},
"meta": {
"current_page": 1,
"from": 1,
"last_page": 1,
"links": [
{
"url": null,
"label": "« Previous",
"active": false
},
{
"url": "https://outreach.corammers.com/api/v1/lead-lists?page=1",
"label": "1",
"active": true
},
{
"url": null,
"label": "Next »",
"active": false
}
],
"path": "https://outreach.corammers.com/api/v1/lead-lists",
"per_page": 25,
"to": 1,
"total": 1
}
}
/api/v1/lead-lists
Create a lead list
Creates a list and optionally fills it with existing leads.
Body parameters
-
namestring requiredList name.
-
descriptionstringOptional description.
-
lead_idsinteger[]Leads to add straight away.
curl -X POST "https://outreach.corammers.com/api/v1/lead-lists" \
-H "Authorization: Bearer $COLDREACH_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Q4 SaaS founders",
"description": "Founders at Series A–B SaaS companies",
"lead_ids": [
1842,
1907
]
}'
{
"data": {
"id": 12,
"name": "Q4 SaaS founders",
"description": "Founders at Series A–B SaaS companies",
"leads_count": 2,
"created_at": "2026-09-02T10:00:00+00:00",
"updated_at": "2026-10-08T16:41:09+00:00"
}
}
/api/v1/lead-lists/{list}
Retrieve a lead list
Returns a single list.
Path parameters
-
listinteger requiredLead list ID.
curl "https://outreach.corammers.com/api/v1/lead-lists/12" \
-H "Authorization: Bearer $COLDREACH_API_KEY"
{
"data": {
"id": 12,
"name": "Q4 SaaS founders",
"description": "Founders at Series A–B SaaS companies",
"leads_count": 248,
"created_at": "2026-09-02T10:00:00+00:00",
"updated_at": "2026-10-08T16:41:09+00:00"
}
}
/api/v1/lead-lists/{list}
Update a lead list
Renames a list or changes its description.
Path parameters
-
listinteger requiredLead list ID.
Body parameters
-
namestringNew name.
-
descriptionstring|nullNew description.
curl -X PATCH "https://outreach.corammers.com/api/v1/lead-lists/12" \
-H "Authorization: Bearer $COLDREACH_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Q4 SaaS founders — US"
}'
{
"data": {
"id": 12,
"name": "Q4 SaaS founders — US",
"description": "Founders at Series A–B SaaS companies",
"leads_count": 248,
"created_at": "2026-09-02T10:00:00+00:00",
"updated_at": "2026-10-08T16:41:09+00:00"
}
}
/api/v1/lead-lists/{list}
Delete a lead list
Deletes the list. The leads in it are kept.
Path parameters
-
listinteger requiredLead list ID.
curl -X DELETE "https://outreach.corammers.com/api/v1/lead-lists/12" \
-H "Authorization: Bearer $COLDREACH_API_KEY"
{
"message": "Lead list deleted. Leads in the list were kept.",
"id": 12
}
/api/v1/lead-lists/{list}/leads
List leads in a list
Returns the leads in a list, paginated.
Path parameters
-
listinteger requiredLead list ID.
Query parameters
-
pageintegerPage number, starting at 1.
-
per_pageintegerItems per page, 1–100. Default 25.
curl "https://outreach.corammers.com/api/v1/lead-lists/12/leads" \
-H "Authorization: Bearer $COLDREACH_API_KEY"
{
"data": [
{
"id": 1842,
"first_name": "Ava",
"last_name": "Chen",
"full_name": "Ava Chen",
"email": "ava@northwind.io",
"title": "Head of Growth",
"company": "Northwind",
"website": "https://northwind.io",
"phone": "+1 415 555 0134",
"location": "San Francisco, CA",
"linkedin_url": "https://linkedin.com/in/avachen",
"facebook_url": null,
"instagram_url": null,
"twitter_url": null,
"industry": "SaaS",
"company_domain": "northwind.io",
"email_provider": "google",
"email_security_gateway": null,
"status": "new",
"validation_status": "valid",
"validated_at": "2026-10-09T14:12:03+00:00",
"score": 64,
"temperature": "hot",
"score_breakdown": [
{
"label": "Job title on file",
"points": 4
},
{
"label": "Email verified as valid",
"points": 5
},
{
"label": "2 opens",
"points": 6
},
{
"label": "Replied",
"points": 25
},
{
"label": "Engaged in the last 7 days",
"points": 10
},
{
"label": "Status: Interested",
"points": 20
}
],
"last_activity_at": "2026-10-11T09:30:00+00:00",
"last_contacted_at": "2026-10-10T15:02:00+00:00",
"source": "api",
"tags": [
"saas",
"series-a"
],
"custom_data": {
"funding_stage": "Series A"
},
"lists": [
{
"id": 12,
"name": "Q4 SaaS founders"
}
],
"created_at": "2026-10-09T14:11:58+00:00",
"updated_at": "2026-10-09T14:12:03+00:00"
}
],
"links": {
"first": "https://outreach.corammers.com/api/v1/lead-lists/12/leads?page=1",
"last": "https://outreach.corammers.com/api/v1/lead-lists/12/leads?page=1",
"prev": null,
"next": null
},
"meta": {
"current_page": 1,
"from": 1,
"last_page": 1,
"links": [
{
"url": null,
"label": "« Previous",
"active": false
},
{
"url": "https://outreach.corammers.com/api/v1/lead-lists/12/leads?page=1",
"label": "1",
"active": true
},
{
"url": null,
"label": "Next »",
"active": false
}
],
"path": "https://outreach.corammers.com/api/v1/lead-lists/12/leads",
"per_page": 25,
"to": 1,
"total": 1
}
}
/api/v1/lead-lists/{list}/leads
Add leads to a list
Adds existing leads to the list. Leads already in the list are left as they are.
Path parameters
-
listinteger requiredLead list ID.
Body parameters
-
lead_idsinteger[] requiredUp to 10,000 lead IDs.
curl -X POST "https://outreach.corammers.com/api/v1/lead-lists/12/leads" \
-H "Authorization: Bearer $COLDREACH_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"lead_ids": [
1842,
1907,
1911
]
}'
{
"message": "2 lead(s) added to the list.",
"added": 2,
"already_in_list": 1,
"leads_count": 250
}
/api/v1/lead-lists/{list}/leads
Remove leads from a list
Removes leads from the list without deleting them.
Path parameters
-
listinteger requiredLead list ID.
Body parameters
-
lead_idsinteger[] requiredLead IDs to remove.
curl -X DELETE "https://outreach.corammers.com/api/v1/lead-lists/12/leads" \
-H "Authorization: Bearer $COLDREACH_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"lead_ids": [
1911
]
}'
{
"message": "1 lead(s) removed from the list.",
"removed": 1,
"leads_count": 249
}
7 endpoints
Campaigns
A campaign sends a multi-step email sequence to enrolled leads from your connected email accounts, within its schedule. New campaigns start as draft; activate them to start sending.
The campaign object
-
idintegerUnique identifier.
-
name, descriptionstringCampaign name and description.
-
statusenumdraft,active,paused,completed,archived. -
lead_list_idinteger|nullAttached lead list.
-
settingsobjectReply handling and tracking toggles.
-
scheduleobjectSending window, days, timezone and limits.
-
statsobjectLifetime counters and rates.
-
smtp_accountsobject[]Email accounts the campaign sends from.
-
stepsobject[]Sequence steps with A/B variants (see Sequences).
/api/v1/campaigns
List campaigns
Returns your campaigns, newest first.
Query parameters
-
statusenumFilter by status.
-
searchstringMatches the campaign name.
-
sortstringcreated_at,updated_at,nameorstatus, prefix-for descending. -
pageintegerPage number, starting at 1.
-
per_pageintegerItems per page, 1–100. Default 25.
curl "https://outreach.corammers.com/api/v1/campaigns?status=active" \
-H "Authorization: Bearer $COLDREACH_API_KEY"
{
"data": [
{
"id": 31,
"name": "Q4 SaaS founders",
"description": null,
"status": "active",
"tags": [
"q4"
],
"lead_list_id": 12,
"settings": {
"stop_on_reply": true,
"stop_company_on_reply": false,
"stop_on_auto_reply": true,
"open_tracking": true,
"click_tracking": true,
"unsubscribe_link": true
},
"schedule": {
"timezone": "America/New_York",
"send_window_start": "09:00",
"send_window_end": "17:00",
"active_days": [
1,
2,
3,
4,
5
],
"daily_send_limit": 150,
"time_gap_minutes": 5,
"start_date": null,
"end_date": null
},
"stats": {
"total_leads": 248,
"emails_sent": 1240,
"emails_opened": 712,
"clicks": 96,
"replies_received": 58,
"bounces": 11,
"unsubscribes": 4,
"open_rate": 57.4,
"reply_rate": 4.7,
"bounce_rate": 0.9
},
"smtp_accounts": [
{
"id": 3,
"display_name": "Alex — Sales",
"from_name": "Alex Morgan",
"from_email": "alex@yourcompany.com",
"status": "active",
"daily_limit": 50,
"emails_sent_today": 12
}
],
"steps": [
{
"id": 88,
"order": 1,
"type": "email",
"name": "Intro",
"wait_days": 0,
"subject": "Quick question, {{ first_name }}",
"body": "<p>Hi {{ first_name }},</p><p>Are you the right person to talk to about outbound at {{ company }}?</p><p>{{ sender_name }}</p>",
"stats": {
"sent": 1240,
"opened": 712,
"clicked": 96,
"replied": 58,
"bounced": 11,
"open_rate": 57.4,
"click_rate": 7.7,
"reply_rate": 4.7
},
"variants": [
{
"id": 201,
"name": "Short",
"subject": "Quick question, {{ first_name }}",
"body": "<p>Hi {{ first_name }},</p><p>Are you the right person to talk to about outbound at {{ company }}?</p><p>{{ sender_name }}</p>",
"weight": 50,
"is_active": true,
"sort_order": 1,
"stats": {
"sent": 620,
"opened": 371,
"clicked": 51,
"replied": 33,
"bounced": 5,
"open_rate": 59.8,
"click_rate": 8.2,
"reply_rate": 5.3
}
},
{
"id": 202,
"name": "Social proof",
"subject": "How Acme booked 40 demos",
"body": "<p>Hi {{ first_name }},</p><p>Acme booked 40 demos last month with ColdReach…</p>",
"weight": 50,
"is_active": true,
"sort_order": 2,
"stats": {
"sent": 620,
"opened": 341,
"clicked": 45,
"replied": 25,
"bounced": 6,
"open_rate": 55,
"click_rate": 7.3,
"reply_rate": 4
}
}
],
"created_at": "2026-10-01T12:00:00+00:00",
"updated_at": "2026-10-01T12:00:00+00:00"
}
],
"created_at": "2026-10-01T12:00:00+00:00",
"updated_at": "2026-10-10T08:00:00+00:00"
}
],
"links": {
"first": "https://outreach.corammers.com/api/v1/campaigns?page=1",
"last": "https://outreach.corammers.com/api/v1/campaigns?page=1",
"prev": null,
"next": null
},
"meta": {
"current_page": 1,
"from": 1,
"last_page": 1,
"links": [
{
"url": null,
"label": "« Previous",
"active": false
},
{
"url": "https://outreach.corammers.com/api/v1/campaigns?page=1",
"label": "1",
"active": true
},
{
"url": null,
"label": "Next »",
"active": false
}
],
"path": "https://outreach.corammers.com/api/v1/campaigns",
"per_page": 25,
"to": 1,
"total": 1
}
}
/api/v1/campaigns
Create a campaign
Creates a draft campaign with an empty sequence. Only name is required — everything else falls back to sensible defaults. Add steps with the Sequences endpoints, then activate.
Body parameters
-
namestring requiredCampaign name.
-
descriptionstringInternal description.
-
tagsstring[]Campaign tags.
-
lead_list_idinteger|nullLead list whose leads are enrolled when the campaign is activated.
-
smtp_account_idsinteger[]Email accounts to send from (rotated automatically). Replaces the current set.
-
settings.stop_on_replybooleanStop the sequence for a lead when they reply. Default
true. -
settings.stop_company_on_replybooleanStop every lead from the same company domain on a reply. Default
false. -
settings.stop_on_auto_replybooleanStop on out-of-office replies. Default
true. -
settings.open_trackingbooleanTrack opens. Default
true. -
settings.click_trackingbooleanTrack link clicks. Default
false. -
settings.unsubscribe_linkbooleanAdd a one-click unsubscribe header. Default
true. -
schedule.timezonestringIANA timezone, e.g.
America/New_York. DefaultUTC. -
schedule.send_window_startstringDaily start time
HH:MM. Default08:00. -
schedule.send_window_endstringDaily end time
HH:MM, later than the start. Default18:00. -
schedule.active_daysinteger[]ISO weekdays to send on, 1 = Monday … 7 = Sunday. Default
[1,2,3,4,5]. -
schedule.daily_send_limitintegerMax emails per day for the campaign. Default
200. -
schedule.time_gap_minutesintegerMinutes between sends. Default
5. -
schedule.start_datedate|nullOptional first sending day
YYYY-MM-DD. -
schedule.end_datedate|nullOptional last sending day
YYYY-MM-DD.
curl -X POST "https://outreach.corammers.com/api/v1/campaigns" \
-H "Authorization: Bearer $COLDREACH_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Q4 SaaS founders",
"lead_list_id": 12,
"smtp_account_ids": [
3,
4
],
"settings": {
"click_tracking": true
},
"schedule": {
"timezone": "America/New_York",
"send_window_start": "09:00",
"send_window_end": "17:00",
"active_days": [
1,
2,
3,
4,
5
],
"daily_send_limit": 150
}
}'
{
"data": {
"id": 31,
"name": "Q4 SaaS founders",
"description": null,
"status": "draft",
"tags": [
"q4"
],
"lead_list_id": 12,
"settings": {
"stop_on_reply": true,
"stop_company_on_reply": false,
"stop_on_auto_reply": true,
"open_tracking": true,
"click_tracking": true,
"unsubscribe_link": true
},
"schedule": {
"timezone": "America/New_York",
"send_window_start": "09:00",
"send_window_end": "17:00",
"active_days": [
1,
2,
3,
4,
5
],
"daily_send_limit": 150,
"time_gap_minutes": 5,
"start_date": null,
"end_date": null
},
"stats": {
"total_leads": 0,
"emails_sent": 0,
"emails_opened": 0,
"clicks": 0,
"replies_received": 0,
"bounces": 0,
"unsubscribes": 0,
"open_rate": 0,
"reply_rate": 0,
"bounce_rate": 0
},
"smtp_accounts": [
{
"id": 3,
"display_name": "Alex — Sales",
"from_name": "Alex Morgan",
"from_email": "alex@yourcompany.com",
"status": "active",
"daily_limit": 50,
"emails_sent_today": 12
}
],
"steps": [],
"created_at": "2026-10-01T12:00:00+00:00",
"updated_at": "2026-10-10T08:00:00+00:00"
}
}
/api/v1/campaigns/{campaign}
Retrieve a campaign
Returns a campaign with its settings, schedule, stats, email accounts and sequence steps.
Path parameters
-
campaigninteger requiredCampaign ID.
curl "https://outreach.corammers.com/api/v1/campaigns/31" \
-H "Authorization: Bearer $COLDREACH_API_KEY"
{
"data": {
"id": 31,
"name": "Q4 SaaS founders",
"description": null,
"status": "active",
"tags": [
"q4"
],
"lead_list_id": 12,
"settings": {
"stop_on_reply": true,
"stop_company_on_reply": false,
"stop_on_auto_reply": true,
"open_tracking": true,
"click_tracking": true,
"unsubscribe_link": true
},
"schedule": {
"timezone": "America/New_York",
"send_window_start": "09:00",
"send_window_end": "17:00",
"active_days": [
1,
2,
3,
4,
5
],
"daily_send_limit": 150,
"time_gap_minutes": 5,
"start_date": null,
"end_date": null
},
"stats": {
"total_leads": 248,
"emails_sent": 1240,
"emails_opened": 712,
"clicks": 96,
"replies_received": 58,
"bounces": 11,
"unsubscribes": 4,
"open_rate": 57.4,
"reply_rate": 4.7,
"bounce_rate": 0.9
},
"smtp_accounts": [
{
"id": 3,
"display_name": "Alex — Sales",
"from_name": "Alex Morgan",
"from_email": "alex@yourcompany.com",
"status": "active",
"daily_limit": 50,
"emails_sent_today": 12
}
],
"steps": [
{
"id": 88,
"order": 1,
"type": "email",
"name": "Intro",
"wait_days": 0,
"subject": "Quick question, {{ first_name }}",
"body": "<p>Hi {{ first_name }},</p><p>Are you the right person to talk to about outbound at {{ company }}?</p><p>{{ sender_name }}</p>",
"stats": {
"sent": 1240,
"opened": 712,
"clicked": 96,
"replied": 58,
"bounced": 11,
"open_rate": 57.4,
"click_rate": 7.7,
"reply_rate": 4.7
},
"variants": [
{
"id": 201,
"name": "Short",
"subject": "Quick question, {{ first_name }}",
"body": "<p>Hi {{ first_name }},</p><p>Are you the right person to talk to about outbound at {{ company }}?</p><p>{{ sender_name }}</p>",
"weight": 50,
"is_active": true,
"sort_order": 1,
"stats": {
"sent": 620,
"opened": 371,
"clicked": 51,
"replied": 33,
"bounced": 5,
"open_rate": 59.8,
"click_rate": 8.2,
"reply_rate": 5.3
}
},
{
"id": 202,
"name": "Social proof",
"subject": "How Acme booked 40 demos",
"body": "<p>Hi {{ first_name }},</p><p>Acme booked 40 demos last month with ColdReach…</p>",
"weight": 50,
"is_active": true,
"sort_order": 2,
"stats": {
"sent": 620,
"opened": 341,
"clicked": 45,
"replied": 25,
"bounced": 6,
"open_rate": 55,
"click_rate": 7.3,
"reply_rate": 4
}
}
],
"created_at": "2026-10-01T12:00:00+00:00",
"updated_at": "2026-10-01T12:00:00+00:00"
}
],
"created_at": "2026-10-01T12:00:00+00:00",
"updated_at": "2026-10-10T08:00:00+00:00"
}
}
/api/v1/campaigns/{campaign}
Update a campaign
Updates only the fields you send; nested settings and schedule objects are partial too. Schedule changes reschedule queued emails immediately.
Path parameters
-
campaigninteger requiredCampaign ID.
Body parameters
-
namestringCampaign name.
-
descriptionstringInternal description.
-
tagsstring[]Campaign tags.
-
lead_list_idinteger|nullLead list whose leads are enrolled when the campaign is activated.
-
smtp_account_idsinteger[]Email accounts to send from (rotated automatically). Replaces the current set.
-
settings.stop_on_replybooleanStop the sequence for a lead when they reply. Default
true. -
settings.stop_company_on_replybooleanStop every lead from the same company domain on a reply. Default
false. -
settings.stop_on_auto_replybooleanStop on out-of-office replies. Default
true. -
settings.open_trackingbooleanTrack opens. Default
true. -
settings.click_trackingbooleanTrack link clicks. Default
false. -
settings.unsubscribe_linkbooleanAdd a one-click unsubscribe header. Default
true. -
schedule.timezonestringIANA timezone, e.g.
America/New_York. DefaultUTC. -
schedule.send_window_startstringDaily start time
HH:MM. Default08:00. -
schedule.send_window_endstringDaily end time
HH:MM, later than the start. Default18:00. -
schedule.active_daysinteger[]ISO weekdays to send on, 1 = Monday … 7 = Sunday. Default
[1,2,3,4,5]. -
schedule.daily_send_limitintegerMax emails per day for the campaign. Default
200. -
schedule.time_gap_minutesintegerMinutes between sends. Default
5. -
schedule.start_datedate|nullOptional first sending day
YYYY-MM-DD. -
schedule.end_datedate|nullOptional last sending day
YYYY-MM-DD.
curl -X PATCH "https://outreach.corammers.com/api/v1/campaigns/31" \
-H "Authorization: Bearer $COLDREACH_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"schedule": {
"send_window_end": "16:30",
"daily_send_limit": 250
},
"settings": {
"stop_company_on_reply": true
}
}'
{
"data": {
"id": 31,
"name": "Q4 SaaS founders",
"description": null,
"status": "active",
"tags": [
"q4"
],
"lead_list_id": 12,
"settings": {
"stop_on_reply": true,
"stop_company_on_reply": false,
"stop_on_auto_reply": true,
"open_tracking": true,
"click_tracking": true,
"unsubscribe_link": true
},
"schedule": {
"timezone": "America/New_York",
"send_window_start": "09:00",
"send_window_end": "17:00",
"active_days": [
1,
2,
3,
4,
5
],
"daily_send_limit": 150,
"time_gap_minutes": 5,
"start_date": null,
"end_date": null
},
"stats": {
"total_leads": 248,
"emails_sent": 1240,
"emails_opened": 712,
"clicks": 96,
"replies_received": 58,
"bounces": 11,
"unsubscribes": 4,
"open_rate": 57.4,
"reply_rate": 4.7,
"bounce_rate": 0.9
},
"smtp_accounts": [
{
"id": 3,
"display_name": "Alex — Sales",
"from_name": "Alex Morgan",
"from_email": "alex@yourcompany.com",
"status": "active",
"daily_limit": 50,
"emails_sent_today": 12
}
],
"steps": [
{
"id": 88,
"order": 1,
"type": "email",
"name": "Intro",
"wait_days": 0,
"subject": "Quick question, {{ first_name }}",
"body": "<p>Hi {{ first_name }},</p><p>Are you the right person to talk to about outbound at {{ company }}?</p><p>{{ sender_name }}</p>",
"stats": {
"sent": 1240,
"opened": 712,
"clicked": 96,
"replied": 58,
"bounced": 11,
"open_rate": 57.4,
"click_rate": 7.7,
"reply_rate": 4.7
},
"variants": [
{
"id": 201,
"name": "Short",
"subject": "Quick question, {{ first_name }}",
"body": "<p>Hi {{ first_name }},</p><p>Are you the right person to talk to about outbound at {{ company }}?</p><p>{{ sender_name }}</p>",
"weight": 50,
"is_active": true,
"sort_order": 1,
"stats": {
"sent": 620,
"opened": 371,
"clicked": 51,
"replied": 33,
"bounced": 5,
"open_rate": 59.8,
"click_rate": 8.2,
"reply_rate": 5.3
}
},
{
"id": 202,
"name": "Social proof",
"subject": "How Acme booked 40 demos",
"body": "<p>Hi {{ first_name }},</p><p>Acme booked 40 demos last month with ColdReach…</p>",
"weight": 50,
"is_active": true,
"sort_order": 2,
"stats": {
"sent": 620,
"opened": 341,
"clicked": 45,
"replied": 25,
"bounced": 6,
"open_rate": 55,
"click_rate": 7.3,
"reply_rate": 4
}
}
],
"created_at": "2026-10-01T12:00:00+00:00",
"updated_at": "2026-10-01T12:00:00+00:00"
}
],
"created_at": "2026-10-01T12:00:00+00:00",
"updated_at": "2026-10-10T08:00:00+00:00"
}
}
/api/v1/campaigns/{campaign}
Delete a campaign
Permanently deletes the campaign, its sequence, enrollments and event history. Leads are kept.
Path parameters
-
campaigninteger requiredCampaign ID.
curl -X DELETE "https://outreach.corammers.com/api/v1/campaigns/31" \
-H "Authorization: Bearer $COLDREACH_API_KEY"
{
"message": "Campaign deleted.",
"id": 31
}
/api/v1/campaigns/{campaign}/activate
Activate a campaign
Starts (or resumes) sending. Leads from the attached lead list are enrolled and every active lead is scheduled within the sending window. The response includes warnings when something will prevent sending, such as no email accounts.
Path parameters
-
campaigninteger requiredCampaign ID.
curl -X POST "https://outreach.corammers.com/api/v1/campaigns/31/activate" \
-H "Authorization: Bearer $COLDREACH_API_KEY"
{
"data": {
"id": 31,
"name": "Q4 SaaS founders",
"description": null,
"status": "active",
"tags": [
"q4"
],
"lead_list_id": 12,
"settings": {
"stop_on_reply": true,
"stop_company_on_reply": false,
"stop_on_auto_reply": true,
"open_tracking": true,
"click_tracking": true,
"unsubscribe_link": true
},
"schedule": {
"timezone": "America/New_York",
"send_window_start": "09:00",
"send_window_end": "17:00",
"active_days": [
1,
2,
3,
4,
5
],
"daily_send_limit": 150,
"time_gap_minutes": 5,
"start_date": null,
"end_date": null
},
"stats": {
"total_leads": 248,
"emails_sent": 1240,
"emails_opened": 712,
"clicks": 96,
"replies_received": 58,
"bounces": 11,
"unsubscribes": 4,
"open_rate": 57.4,
"reply_rate": 4.7,
"bounce_rate": 0.9
},
"smtp_accounts": [
{
"id": 3,
"display_name": "Alex — Sales",
"from_name": "Alex Morgan",
"from_email": "alex@yourcompany.com",
"status": "active",
"daily_limit": 50,
"emails_sent_today": 12
}
],
"steps": [
{
"id": 88,
"order": 1,
"type": "email",
"name": "Intro",
"wait_days": 0,
"subject": "Quick question, {{ first_name }}",
"body": "<p>Hi {{ first_name }},</p><p>Are you the right person to talk to about outbound at {{ company }}?</p><p>{{ sender_name }}</p>",
"stats": {
"sent": 1240,
"opened": 712,
"clicked": 96,
"replied": 58,
"bounced": 11,
"open_rate": 57.4,
"click_rate": 7.7,
"reply_rate": 4.7
},
"variants": [
{
"id": 201,
"name": "Short",
"subject": "Quick question, {{ first_name }}",
"body": "<p>Hi {{ first_name }},</p><p>Are you the right person to talk to about outbound at {{ company }}?</p><p>{{ sender_name }}</p>",
"weight": 50,
"is_active": true,
"sort_order": 1,
"stats": {
"sent": 620,
"opened": 371,
"clicked": 51,
"replied": 33,
"bounced": 5,
"open_rate": 59.8,
"click_rate": 8.2,
"reply_rate": 5.3
}
},
{
"id": 202,
"name": "Social proof",
"subject": "How Acme booked 40 demos",
"body": "<p>Hi {{ first_name }},</p><p>Acme booked 40 demos last month with ColdReach…</p>",
"weight": 50,
"is_active": true,
"sort_order": 2,
"stats": {
"sent": 620,
"opened": 341,
"clicked": 45,
"replied": 25,
"bounced": 6,
"open_rate": 55,
"click_rate": 7.3,
"reply_rate": 4
}
}
],
"created_at": "2026-10-01T12:00:00+00:00",
"updated_at": "2026-10-01T12:00:00+00:00"
}
],
"created_at": "2026-10-01T12:00:00+00:00",
"updated_at": "2026-10-10T08:00:00+00:00"
},
"message": "Campaign activated.",
"warnings": []
}
/api/v1/campaigns/{campaign}/pause
Pause a campaign
Stops all sending for the campaign until it is activated again. Returns 409 if the campaign is not active.
Path parameters
-
campaigninteger requiredCampaign ID.
curl -X POST "https://outreach.corammers.com/api/v1/campaigns/31/pause" \
-H "Authorization: Bearer $COLDREACH_API_KEY"
{
"data": {
"id": 31,
"name": "Q4 SaaS founders",
"description": null,
"status": "paused",
"tags": [
"q4"
],
"lead_list_id": 12,
"settings": {
"stop_on_reply": true,
"stop_company_on_reply": false,
"stop_on_auto_reply": true,
"open_tracking": true,
"click_tracking": true,
"unsubscribe_link": true
},
"schedule": {
"timezone": "America/New_York",
"send_window_start": "09:00",
"send_window_end": "17:00",
"active_days": [
1,
2,
3,
4,
5
],
"daily_send_limit": 150,
"time_gap_minutes": 5,
"start_date": null,
"end_date": null
},
"stats": {
"total_leads": 248,
"emails_sent": 1240,
"emails_opened": 712,
"clicks": 96,
"replies_received": 58,
"bounces": 11,
"unsubscribes": 4,
"open_rate": 57.4,
"reply_rate": 4.7,
"bounce_rate": 0.9
},
"smtp_accounts": [
{
"id": 3,
"display_name": "Alex — Sales",
"from_name": "Alex Morgan",
"from_email": "alex@yourcompany.com",
"status": "active",
"daily_limit": 50,
"emails_sent_today": 12
}
],
"steps": [
{
"id": 88,
"order": 1,
"type": "email",
"name": "Intro",
"wait_days": 0,
"subject": "Quick question, {{ first_name }}",
"body": "<p>Hi {{ first_name }},</p><p>Are you the right person to talk to about outbound at {{ company }}?</p><p>{{ sender_name }}</p>",
"stats": {
"sent": 1240,
"opened": 712,
"clicked": 96,
"replied": 58,
"bounced": 11,
"open_rate": 57.4,
"click_rate": 7.7,
"reply_rate": 4.7
},
"variants": [
{
"id": 201,
"name": "Short",
"subject": "Quick question, {{ first_name }}",
"body": "<p>Hi {{ first_name }},</p><p>Are you the right person to talk to about outbound at {{ company }}?</p><p>{{ sender_name }}</p>",
"weight": 50,
"is_active": true,
"sort_order": 1,
"stats": {
"sent": 620,
"opened": 371,
"clicked": 51,
"replied": 33,
"bounced": 5,
"open_rate": 59.8,
"click_rate": 8.2,
"reply_rate": 5.3
}
},
{
"id": 202,
"name": "Social proof",
"subject": "How Acme booked 40 demos",
"body": "<p>Hi {{ first_name }},</p><p>Acme booked 40 demos last month with ColdReach…</p>",
"weight": 50,
"is_active": true,
"sort_order": 2,
"stats": {
"sent": 620,
"opened": 341,
"clicked": 45,
"replied": 25,
"bounced": 6,
"open_rate": 55,
"click_rate": 7.3,
"reply_rate": 4
}
}
],
"created_at": "2026-10-01T12:00:00+00:00",
"updated_at": "2026-10-01T12:00:00+00:00"
}
],
"created_at": "2026-10-01T12:00:00+00:00",
"updated_at": "2026-10-10T08:00:00+00:00"
},
"message": "Campaign paused. No emails will be sent until it is activated again."
}
8 endpoints
Sequences
Each campaign has one sequence: an ordered list of email and wait steps. Email steps hold one or more A/B variants that are picked by weight. Subjects and bodies support variables such as {{ first_name }}, {{ company }}, {{ custom.funding_stage }} and {{ sender_name }}. Bodies accept a safe HTML subset (p, br, strong, em, a, lists, headings) or plain text, whose line breaks are preserved. Leave the subject of a follow-up empty and it is sent as a reply in the same thread (“Re: …” with In-Reply-To/References), which keeps the conversation together in the lead’s inbox.
-
GET
/campaigns/{campaign}/sequence -
POST
/campaigns/{campaign}/sequence/steps -
GET
/campaigns/{campaign}/sequence/steps/{step} -
PATCH
/campaigns/{campaign}/sequence/steps/{step} -
DEL
/campaigns/{campaign}/sequence/steps/{step} -
POST
/campaigns/{campaign}/sequence/steps/{step}/variants -
PATCH
/campaigns/{campaign}/sequence/steps/{step}/variants/{variant} -
DEL
/campaigns/{campaign}/sequence/steps/{step}/variants/{variant}
The sequence object
-
idintegerStep ID.
-
orderintegerPosition in the sequence, starting at 1.
-
typeenumemailorwait. -
wait_daysintegerDays to wait after the previous step before this one runs.
-
subject, bodystring|nullContent of the first active variant (email steps).
-
variantsobject[]A/B variants with
weight,is_activeand per-variant stats. -
statsobjectLifetime sent, opened, clicked, replied, bounced and rates.
/api/v1/campaigns/{campaign}/sequence
Retrieve a sequence
Returns every step with its variants and stats, plus how many leads are in each sequence state.
Path parameters
-
campaigninteger requiredCampaign ID.
curl "https://outreach.corammers.com/api/v1/campaigns/31/sequence" \
-H "Authorization: Bearer $COLDREACH_API_KEY"
{
"data": {
"campaign_id": 31,
"sequence_id": 31,
"enrollments": {
"total": 248,
"by_status": {
"active": 201,
"replied": 19,
"completed": 22,
"bounced": 6
}
},
"steps": [
{
"id": 88,
"order": 1,
"type": "email",
"name": "Intro",
"wait_days": 0,
"subject": "Quick question, {{ first_name }}",
"body": "<p>Hi {{ first_name }},</p><p>Are you the right person to talk to about outbound at {{ company }}?</p><p>{{ sender_name }}</p>",
"stats": {
"sent": 1240,
"opened": 712,
"clicked": 96,
"replied": 58,
"bounced": 11,
"open_rate": 57.4,
"click_rate": 7.7,
"reply_rate": 4.7
},
"variants": [
{
"id": 201,
"name": "Short",
"subject": "Quick question, {{ first_name }}",
"body": "<p>Hi {{ first_name }},</p><p>Are you the right person to talk to about outbound at {{ company }}?</p><p>{{ sender_name }}</p>",
"weight": 50,
"is_active": true,
"sort_order": 1,
"stats": {
"sent": 620,
"opened": 371,
"clicked": 51,
"replied": 33,
"bounced": 5,
"open_rate": 59.8,
"click_rate": 8.2,
"reply_rate": 5.3
}
},
{
"id": 202,
"name": "Social proof",
"subject": "How Acme booked 40 demos",
"body": "<p>Hi {{ first_name }},</p><p>Acme booked 40 demos last month with ColdReach…</p>",
"weight": 50,
"is_active": true,
"sort_order": 2,
"stats": {
"sent": 620,
"opened": 341,
"clicked": 45,
"replied": 25,
"bounced": 6,
"open_rate": 55,
"click_rate": 7.3,
"reply_rate": 4
}
}
],
"created_at": "2026-10-01T12:00:00+00:00",
"updated_at": "2026-10-01T12:00:00+00:00"
},
{
"id": 89,
"order": 2,
"type": "wait",
"name": "Wait 3 days",
"wait_days": 3,
"subject": null,
"body": null,
"stats": {
"sent": 0,
"opened": 0,
"clicked": 0,
"replied": 0,
"bounced": 0,
"open_rate": 0,
"click_rate": 0,
"reply_rate": 0
},
"variants": [],
"created_at": "2026-10-01T12:00:00+00:00",
"updated_at": "2026-10-01T12:00:00+00:00"
}
]
}
}
/api/v1/campaigns/{campaign}/sequence/steps
Add a step
Appends a step to the end of the sequence. For an email step send subject and body, or a variants array for an A/B test. Adding the first step schedules leads that are already enrolled.
Path parameters
-
campaigninteger requiredCampaign ID.
Body parameters
-
typeenum requiredemailorwait. -
namestringOptional label.
-
wait_daysintegerDays after the previous step (0–365). Default
0. -
subjectstringRequired for the first email step. On follow-ups, leave it out to reply in the same thread.
-
bodystringHTML or plain text. Required for email steps without
variants. -
variantsobject[]Up to 26 variants, each with
subject,body, optionalname,weight(1–10000, default 100),is_activeandemail_template_id. -
email_template_idintegerBuild the email from one of your templates: its subject, body and design are copied in unless you send your own. Also accepted on each item of
variants. -
designobjectBranded layout for the email (same shape as a template's
design). Also accepted on each item ofvariants.
curl -X POST "https://outreach.corammers.com/api/v1/campaigns/31/sequence/steps" \
-H "Authorization: Bearer $COLDREACH_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"type": "email",
"name": "Intro",
"wait_days": 0,
"variants": [
{
"name": "Short",
"subject": "Quick question, {{ first_name }}",
"body": "Hi {{ first_name }},\n\nAre you the right person to talk to about outbound at {{ company }}?\n\n{{ sender_name }}",
"weight": 50
},
{
"name": "Social proof",
"subject": "How Acme booked 40 demos",
"body": "<p>Hi {{ first_name }},</p><p>Acme booked 40 demos last month with ColdReach…</p>",
"weight": 50
}
]
}'
{
"data": {
"id": 88,
"order": 1,
"type": "email",
"name": "Intro",
"wait_days": 0,
"subject": "Quick question, {{ first_name }}",
"body": "<p>Hi {{ first_name }},</p><p>Are you the right person to talk to about outbound at {{ company }}?</p><p>{{ sender_name }}</p>",
"stats": {
"sent": 1240,
"opened": 712,
"clicked": 96,
"replied": 58,
"bounced": 11,
"open_rate": 57.4,
"click_rate": 7.7,
"reply_rate": 4.7
},
"variants": [
{
"id": 201,
"name": "Short",
"subject": "Quick question, {{ first_name }}",
"body": "<p>Hi {{ first_name }},</p><p>Are you the right person to talk to about outbound at {{ company }}?</p><p>{{ sender_name }}</p>",
"weight": 50,
"is_active": true,
"sort_order": 1,
"stats": {
"sent": 620,
"opened": 371,
"clicked": 51,
"replied": 33,
"bounced": 5,
"open_rate": 59.8,
"click_rate": 8.2,
"reply_rate": 5.3
}
},
{
"id": 202,
"name": "Social proof",
"subject": "How Acme booked 40 demos",
"body": "<p>Hi {{ first_name }},</p><p>Acme booked 40 demos last month with ColdReach…</p>",
"weight": 50,
"is_active": true,
"sort_order": 2,
"stats": {
"sent": 620,
"opened": 341,
"clicked": 45,
"replied": 25,
"bounced": 6,
"open_rate": 55,
"click_rate": 7.3,
"reply_rate": 4
}
}
],
"created_at": "2026-10-01T12:00:00+00:00",
"updated_at": "2026-10-01T12:00:00+00:00"
}
}
/api/v1/campaigns/{campaign}/sequence/steps/{step}
Retrieve a step
Returns one step with its variants.
Path parameters
-
campaigninteger requiredCampaign ID.
-
stepinteger requiredStep ID.
curl "https://outreach.corammers.com/api/v1/campaigns/31/sequence/steps/88" \
-H "Authorization: Bearer $COLDREACH_API_KEY"
{
"data": {
"id": 88,
"order": 1,
"type": "email",
"name": "Intro",
"wait_days": 0,
"subject": "Quick question, {{ first_name }}",
"body": "<p>Hi {{ first_name }},</p><p>Are you the right person to talk to about outbound at {{ company }}?</p><p>{{ sender_name }}</p>",
"stats": {
"sent": 1240,
"opened": 712,
"clicked": 96,
"replied": 58,
"bounced": 11,
"open_rate": 57.4,
"click_rate": 7.7,
"reply_rate": 4.7
},
"variants": [
{
"id": 201,
"name": "Short",
"subject": "Quick question, {{ first_name }}",
"body": "<p>Hi {{ first_name }},</p><p>Are you the right person to talk to about outbound at {{ company }}?</p><p>{{ sender_name }}</p>",
"weight": 50,
"is_active": true,
"sort_order": 1,
"stats": {
"sent": 620,
"opened": 371,
"clicked": 51,
"replied": 33,
"bounced": 5,
"open_rate": 59.8,
"click_rate": 8.2,
"reply_rate": 5.3
}
},
{
"id": 202,
"name": "Social proof",
"subject": "How Acme booked 40 demos",
"body": "<p>Hi {{ first_name }},</p><p>Acme booked 40 demos last month with ColdReach…</p>",
"weight": 50,
"is_active": true,
"sort_order": 2,
"stats": {
"sent": 620,
"opened": 341,
"clicked": 45,
"replied": 25,
"bounced": 6,
"open_rate": 55,
"click_rate": 7.3,
"reply_rate": 4
}
}
],
"created_at": "2026-10-01T12:00:00+00:00",
"updated_at": "2026-10-01T12:00:00+00:00"
}
}
/api/v1/campaigns/{campaign}/sequence/steps/{step}
Update a step
Updates the name, delay or — for email steps with a single variant — the subject and body. Steps with several variants are edited through the variant endpoints.
Path parameters
-
campaigninteger requiredCampaign ID.
-
stepinteger requiredStep ID.
Body parameters
-
namestring|nullLabel.
-
wait_daysintegerDays after the previous step.
-
subjectstringNew subject (single-variant email steps).
-
bodystringNew body (single-variant email steps).
curl -X PATCH "https://outreach.corammers.com/api/v1/campaigns/31/sequence/steps/88" \
-H "Authorization: Bearer $COLDREACH_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"wait_days": 2,
"body": "Hi {{ first_name }}, bumping this to the top of your inbox."
}'
{
"data": {
"id": 88,
"order": 1,
"type": "email",
"name": "Intro",
"wait_days": 0,
"subject": "Quick question, {{ first_name }}",
"body": "<p>Hi {{ first_name }},</p><p>Are you the right person to talk to about outbound at {{ company }}?</p><p>{{ sender_name }}</p>",
"stats": {
"sent": 1240,
"opened": 712,
"clicked": 96,
"replied": 58,
"bounced": 11,
"open_rate": 57.4,
"click_rate": 7.7,
"reply_rate": 4.7
},
"variants": [
{
"id": 201,
"name": "Short",
"subject": "Quick question, {{ first_name }}",
"body": "<p>Hi {{ first_name }},</p><p>Are you the right person to talk to about outbound at {{ company }}?</p><p>{{ sender_name }}</p>",
"weight": 50,
"is_active": true,
"sort_order": 1,
"stats": {
"sent": 620,
"opened": 371,
"clicked": 51,
"replied": 33,
"bounced": 5,
"open_rate": 59.8,
"click_rate": 8.2,
"reply_rate": 5.3
}
},
{
"id": 202,
"name": "Social proof",
"subject": "How Acme booked 40 demos",
"body": "<p>Hi {{ first_name }},</p><p>Acme booked 40 demos last month with ColdReach…</p>",
"weight": 50,
"is_active": true,
"sort_order": 2,
"stats": {
"sent": 620,
"opened": 341,
"clicked": 45,
"replied": 25,
"bounced": 6,
"open_rate": 55,
"click_rate": 7.3,
"reply_rate": 4
}
}
],
"created_at": "2026-10-01T12:00:00+00:00",
"updated_at": "2026-10-01T12:00:00+00:00"
}
}
/api/v1/campaigns/{campaign}/sequence/steps/{step}
Delete a step
Removes a step and its variants from the sequence.
Path parameters
-
campaigninteger requiredCampaign ID.
-
stepinteger requiredStep ID.
curl -X DELETE "https://outreach.corammers.com/api/v1/campaigns/31/sequence/steps/88" \
-H "Authorization: Bearer $COLDREACH_API_KEY"
{
"message": "Step deleted.",
"id": 88
}
/api/v1/campaigns/{campaign}/sequence/steps/{step}/variants
Add an A/B variant
Adds a variant to an email step. Variants are chosen per lead in proportion to their weight.
Path parameters
-
campaigninteger requiredCampaign ID.
-
stepinteger requiredStep ID.
Body parameters
-
subjectstringSubject line. Required on the first email step; empty on a follow-up means “reply in thread”.
-
bodystringHTML or plain text. Required unless
email_template_idis given. -
email_template_idintegerCopy the subject and body from one of your templates (fields you send win).
-
namestringLabel. Defaults to the next letter, e.g. "Variant C".
-
weightinteger1–10000. Default
100. -
is_activebooleanDefault
true.
curl -X POST "https://outreach.corammers.com/api/v1/campaigns/31/sequence/steps/88/variants" \
-H "Authorization: Bearer $COLDREACH_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Question hook",
"subject": "{{ first_name }}, worth a look?",
"body": "Hi {{ first_name }}, one idea for {{ company }}…",
"weight": 34
}'
{
"data": {
"id": 203,
"name": "Question hook",
"subject": "{{ first_name }}, worth a look?",
"body": "<p>Hi {{ first_name }}, one idea for {{ company }}…</p>",
"weight": 34,
"is_active": true,
"sort_order": 3,
"stats": {
"sent": 0,
"opened": 0,
"clicked": 0,
"replied": 0,
"bounced": 0,
"open_rate": 0,
"click_rate": 0,
"reply_rate": 0
}
}
}
/api/v1/campaigns/{campaign}/sequence/steps/{step}/variants/{variant}
Update a variant
Edits a variant or turns it on/off. An email step always keeps at least one active variant.
Path parameters
-
campaigninteger requiredCampaign ID.
-
stepinteger requiredStep ID.
-
variantinteger requiredVariant ID.
Body parameters
-
namestringLabel.
-
subjectstringSubject line.
-
bodystringHTML or plain text.
-
weightinteger1–10000.
-
is_activebooleanEnable or disable the variant.
curl -X PATCH "https://outreach.corammers.com/api/v1/campaigns/31/sequence/steps/88/variants/203" \
-H "Authorization: Bearer $COLDREACH_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"is_active": false
}'
{
"data": {
"id": 203,
"name": "Question hook",
"subject": "{{ first_name }}, worth a look?",
"body": "<p>Hi {{ first_name }}, one idea for {{ company }}…</p>",
"weight": 34,
"is_active": false,
"sort_order": 3,
"stats": {
"sent": 0,
"opened": 0,
"clicked": 0,
"replied": 0,
"bounced": 0,
"open_rate": 0,
"click_rate": 0,
"reply_rate": 0
}
}
}
/api/v1/campaigns/{campaign}/sequence/steps/{step}/variants/{variant}
Delete a variant
Deletes a variant. Returns 409 if it is the step's only variant or its last active one.
Path parameters
-
campaigninteger requiredCampaign ID.
-
stepinteger requiredStep ID.
-
variantinteger requiredVariant ID.
curl -X DELETE "https://outreach.corammers.com/api/v1/campaigns/31/sequence/steps/88/variants/203" \
-H "Authorization: Bearer $COLDREACH_API_KEY"
{
"message": "Variant deleted.",
"id": 203
}
5 endpoints
Email templates
Reusable subjects and bodies for sequence emails. Using a template copies its content into a variant; editing or deleting the template later never changes variants that already exist.
The email template object
-
idintegerUnique identifier.
-
namestringTemplate name.
-
categoryenumintro,follow_up,social_proof,meeting,breakuporother. -
descriptionstring|nullWhen to use it.
-
subjectstringSubject line. Empty means a follow-up that replies in the same thread.
-
bodystringHTML body with {{ variables }}.
-
is_starterbooleanOne of the templates every account starts with.
-
used_in_variantsintegerHow many sequence variants were built from it.
/api/v1/email-templates
List templates
Returns your email templates.
Query parameters
-
categoryenumOnly templates of this category.
-
searchstringMatches the template name.
-
sortstringcreated_at,updated_at,nameorcategory, prefix-for descending. -
pageintegerPage number, starting at 1.
-
per_pageintegerItems per page, 1–100. Default 25.
curl "https://outreach.corammers.com/api/v1/email-templates" \
-H "Authorization: Bearer $COLDREACH_API_KEY"
{
"data": [
{
"id": 14,
"name": "Quick question",
"category": "intro",
"description": "Short first email that opens with a question.",
"subject": "Quick question, {{ first_name | 'there' }}",
"body": "<p>Hi {{ first_name | 'there' }},</p><p>Who looks after bringing in new customers at {{ company | 'your company' }}?</p><p>{{ sender_name }}</p>",
"is_starter": true,
"used_in_variants": 3,
"created_at": "2026-10-16T09:00:00+00:00",
"updated_at": "2026-10-16T09:00:00+00:00"
}
],
"links": {
"first": "https://outreach.corammers.com/api/v1/email-templates?page=1",
"last": "https://outreach.corammers.com/api/v1/email-templates?page=1",
"prev": null,
"next": null
},
"meta": {
"current_page": 1,
"from": 1,
"last_page": 1,
"links": [
{
"url": null,
"label": "« Previous",
"active": false
},
{
"url": "https://outreach.corammers.com/api/v1/email-templates?page=1",
"label": "1",
"active": true
},
{
"url": null,
"label": "Next »",
"active": false
}
],
"path": "https://outreach.corammers.com/api/v1/email-templates",
"per_page": 25,
"to": 1,
"total": 1
}
}
/api/v1/email-templates/{template}
Retrieve a template
Returns one template.
Path parameters
-
templateinteger requiredTemplate ID.
curl "https://outreach.corammers.com/api/v1/email-templates/14" \
-H "Authorization: Bearer $COLDREACH_API_KEY"
{
"data": {
"id": 14,
"name": "Quick question",
"category": "intro",
"description": "Short first email that opens with a question.",
"subject": "Quick question, {{ first_name | 'there' }}",
"body": "<p>Hi {{ first_name | 'there' }},</p><p>Who looks after bringing in new customers at {{ company | 'your company' }}?</p><p>{{ sender_name }}</p>",
"is_starter": true,
"used_in_variants": 3,
"created_at": "2026-10-16T09:00:00+00:00",
"updated_at": "2026-10-16T09:00:00+00:00"
}
}
/api/v1/email-templates
Create a template
Saves a reusable email.
Body parameters
-
namestring requiredTemplate name.
-
bodystring requiredHTML or plain text with {{ variables }}.
-
subjectstringSubject line. Leave empty for a follow-up that replies in the thread.
-
categoryenumDefault
other. -
descriptionstringWhen to use it.
-
designobjectOptional branded layout wrapped around the body when sent:
layout(letter, spotlight, showcase, invite),accent(#hex),brand_name,logo_url,tagline,headline,subheadline,button_text,button_url,highlights(up to 3 ofvalue/label),footer_address,website_url,linkedin_url.nullfor a plain email.
curl -X POST "https://outreach.corammers.com/api/v1/email-templates" \
-H "Authorization: Bearer $COLDREACH_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Quick question",
"category": "intro",
"subject": "Quick question, {{ first_name | '\''there'\'' }}",
"body": "<p>Hi {{ first_name | '\''there'\'' }},</p><p>Who looks after bringing in new customers at {{ company | '\''your company'\'' }}?</p>"
}'
{
"data": {
"id": 14,
"name": "Quick question",
"category": "intro",
"description": "Short first email that opens with a question.",
"subject": "Quick question, {{ first_name | 'there' }}",
"body": "<p>Hi {{ first_name | 'there' }},</p><p>Who looks after bringing in new customers at {{ company | 'your company' }}?</p><p>{{ sender_name }}</p>",
"is_starter": false,
"used_in_variants": 0,
"created_at": "2026-10-16T09:00:00+00:00",
"updated_at": "2026-10-16T09:00:00+00:00"
}
}
/api/v1/email-templates/{template}
Update a template
Changes a template. Variants already built from it are not changed.
Path parameters
-
templateinteger requiredTemplate ID.
Body parameters
-
namestringNew name.
-
subjectstring|nullNew subject.
-
bodystringNew body.
-
categoryenumNew category.
-
descriptionstring|nullNew description.
curl -X PATCH "https://outreach.corammers.com/api/v1/email-templates/14" \
-H "Authorization: Bearer $COLDREACH_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"subject": "{{ first_name | '\''Hi'\'' }}, a quick question"
}'
{
"data": {
"id": 14,
"name": "Quick question",
"category": "intro",
"description": "Short first email that opens with a question.",
"subject": "Quick question, {{ first_name | 'there' }}",
"body": "<p>Hi {{ first_name | 'there' }},</p><p>Who looks after bringing in new customers at {{ company | 'your company' }}?</p><p>{{ sender_name }}</p>",
"is_starter": true,
"used_in_variants": 3,
"created_at": "2026-10-16T09:00:00+00:00",
"updated_at": "2026-10-16T09:00:00+00:00"
}
}
/api/v1/email-templates/{template}
Delete a template
Deletes the template. Variants built from it keep their content.
Path parameters
-
templateinteger requiredTemplate ID.
curl -X DELETE "https://outreach.corammers.com/api/v1/email-templates/14" \
-H "Authorization: Bearer $COLDREACH_API_KEY"
{
"message": "Template deleted. Variants built from it keep their content.",
"id": 14
}
6 endpoints
Campaign leads
Enroll leads into a campaign's sequence and control each lead individually. Leads are referenced by their lead ID.
The campaign lead object
-
enrollment_idintegerEnrollment ID.
-
statusenumactive,paused,completed,replied,bounced,unsubscribed,removed. -
current_stepintegerOrder of the step the lead is on.
-
next_send_atdatetime|nullWhen the next email is scheduled (UTC).
-
assigned_smtpobject|nullEmail account the lead is sent from.
/api/v1/campaigns/{campaign}/leads
List campaign leads
Returns the leads enrolled in a campaign with their sequence progress.
Path parameters
-
campaigninteger requiredCampaign ID.
Query parameters
-
statusenumFilter by enrollment status.
-
stepintegerOnly leads currently on this step.
-
searchstringMatches the lead's email, name or company.
-
sortstringenrolled_at,next_send_atorcreated_at, prefix-for descending. -
pageintegerPage number, starting at 1.
-
per_pageintegerItems per page, 1–100. Default 25.
curl "https://outreach.corammers.com/api/v1/campaigns/31/leads?status=active" \
-H "Authorization: Bearer $COLDREACH_API_KEY"
{
"data": [
{
"enrollment_id": 5521,
"campaign_id": 31,
"status": "active",
"current_step": 1,
"enrolled_at": "2026-10-10T09:30:12+00:00",
"next_send_at": "2026-10-10T13:05:00+00:00",
"last_step_sent_at": null,
"last_error": null,
"lead": {
"id": 1842,
"email": "ava@northwind.io",
"first_name": "Ava",
"last_name": "Chen",
"company": "Northwind"
},
"assigned_smtp": {
"id": 3,
"from_email": "alex@yourcompany.com"
}
}
],
"links": {
"first": "https://outreach.corammers.com/api/v1/campaigns/31/leads?page=1",
"last": "https://outreach.corammers.com/api/v1/campaigns/31/leads?page=1",
"prev": null,
"next": null
},
"meta": {
"current_page": 1,
"from": 1,
"last_page": 1,
"links": [
{
"url": null,
"label": "« Previous",
"active": false
},
{
"url": "https://outreach.corammers.com/api/v1/campaigns/31/leads?page=1",
"label": "1",
"active": true
},
{
"url": null,
"label": "Next »",
"active": false
}
],
"path": "https://outreach.corammers.com/api/v1/campaigns/31/leads",
"per_page": 25,
"to": 1,
"total": 1
}
}
/api/v1/campaigns/{campaign}/leads
Enroll leads
Enrolls leads by ID and/or every lead of a list. Leads already in the campaign, unsubscribed, bounced or on the suppression list are skipped. If the campaign is active they are scheduled right away.
Path parameters
-
campaigninteger requiredCampaign ID.
Body parameters
-
lead_idsinteger[]Lead IDs. Required without
lead_list_id. -
lead_list_idintegerEnroll every lead in this list. Required without
lead_ids.
curl -X POST "https://outreach.corammers.com/api/v1/campaigns/31/leads" \
-H "Authorization: Bearer $COLDREACH_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"lead_ids": [
1842,
1907
]
}'
{
"message": "2 lead(s) enrolled.",
"enrolled": 2,
"skipped": 0,
"skipped_reason": "Leads already in this campaign, unsubscribed, bounced or suppressed are skipped.",
"data": [
{
"enrollment_id": 5521,
"campaign_id": 31,
"status": "active",
"current_step": 1,
"enrolled_at": "2026-10-10T09:30:12+00:00",
"next_send_at": "2026-10-10T13:05:00+00:00",
"last_step_sent_at": null,
"last_error": null,
"lead": {
"id": 1842,
"email": "ava@northwind.io",
"first_name": "Ava",
"last_name": "Chen",
"company": "Northwind"
},
"assigned_smtp": {
"id": 3,
"from_email": "alex@yourcompany.com"
}
}
]
}
/api/v1/campaigns/{campaign}/leads/{lead}
Remove a lead
Stops the sequence for a lead permanently. The enrollment is kept with status removed for reporting.
Path parameters
-
campaigninteger requiredCampaign ID.
-
leadinteger requiredLead ID.
curl -X DELETE "https://outreach.corammers.com/api/v1/campaigns/31/leads/1842" \
-H "Authorization: Bearer $COLDREACH_API_KEY"
{
"message": "Lead removed from the campaign. No further emails will be sent to it.",
"data": {
"enrollment_id": 5521,
"campaign_id": 31,
"status": "removed",
"current_step": 1,
"enrolled_at": "2026-10-10T09:30:12+00:00",
"next_send_at": null,
"last_step_sent_at": null,
"last_error": null,
"lead": {
"id": 1842,
"email": "ava@northwind.io",
"first_name": "Ava",
"last_name": "Chen",
"company": "Northwind"
},
"assigned_smtp": {
"id": 3,
"from_email": "alex@yourcompany.com"
}
}
}
/api/v1/campaigns/{campaign}/leads/{lead}/pause
Pause a lead
Pauses an active lead. Returns 409 if the lead is not active.
Path parameters
-
campaigninteger requiredCampaign ID.
-
leadinteger requiredLead ID.
curl -X POST "https://outreach.corammers.com/api/v1/campaigns/31/leads/1842/pause" \
-H "Authorization: Bearer $COLDREACH_API_KEY"
{
"message": "Lead paused in the sequence.",
"data": {
"enrollment_id": 5521,
"campaign_id": 31,
"status": "paused",
"current_step": 1,
"enrolled_at": "2026-10-10T09:30:12+00:00",
"next_send_at": "2026-10-10T13:05:00+00:00",
"last_step_sent_at": null,
"last_error": null,
"lead": {
"id": 1842,
"email": "ava@northwind.io",
"first_name": "Ava",
"last_name": "Chen",
"company": "Northwind"
},
"assigned_smtp": {
"id": 3,
"from_email": "alex@yourcompany.com"
}
}
}
/api/v1/campaigns/{campaign}/leads/{lead}/resume
Resume a lead
Resumes a paused lead and reschedules its current step inside the sending window.
Path parameters
-
campaigninteger requiredCampaign ID.
-
leadinteger requiredLead ID.
curl -X POST "https://outreach.corammers.com/api/v1/campaigns/31/leads/1842/resume" \
-H "Authorization: Bearer $COLDREACH_API_KEY"
{
"message": "Lead resumed in the sequence.",
"data": {
"enrollment_id": 5521,
"campaign_id": 31,
"status": "active",
"current_step": 1,
"enrolled_at": "2026-10-10T09:30:12+00:00",
"next_send_at": "2026-10-10T13:05:00+00:00",
"last_step_sent_at": null,
"last_error": null,
"lead": {
"id": 1842,
"email": "ava@northwind.io",
"first_name": "Ava",
"last_name": "Chen",
"company": "Northwind"
},
"assigned_smtp": {
"id": 3,
"from_email": "alex@yourcompany.com"
}
}
}
/api/v1/campaigns/{campaign}/leads/{lead}/skip
Skip to the next step
Moves the lead to the next step. On the last step the lead is marked completed.
Path parameters
-
campaigninteger requiredCampaign ID.
-
leadinteger requiredLead ID.
curl -X POST "https://outreach.corammers.com/api/v1/campaigns/31/leads/1842/skip" \
-H "Authorization: Bearer $COLDREACH_API_KEY"
{
"message": "Lead advanced to the next step.",
"data": {
"enrollment_id": 5521,
"campaign_id": 31,
"status": "active",
"current_step": 3,
"enrolled_at": "2026-10-10T09:30:12+00:00",
"next_send_at": "2026-10-13T13:05:00+00:00",
"last_step_sent_at": null,
"last_error": null,
"lead": {
"id": 1842,
"email": "ava@northwind.io",
"first_name": "Ava",
"last_name": "Chen",
"company": "Northwind"
},
"assigned_smtp": {
"id": 3,
"from_email": "alex@yourcompany.com"
}
}
}
9 endpoints
Pipelines
Pipelines track deals (opportunities) through ordered stages. Stages can be flagged as won or lost, which drives win-rate analytics. Link campaigns to a pipeline with campaign_ids and every lead that replies to them is added as an opportunity in the first stage automatically.
The pipeline object
-
idintegerPipeline ID.
-
namestringPipeline name.
-
is_defaultbooleanThe default pipeline is listed first. Only one pipeline is default.
-
campaign_idsinteger[]Campaigns feeding the pipeline: replies become opportunities.
-
stagesobject[]Ordered stages with
color,is_won,is_lost,opportunities_countandopportunities_value.
/api/v1/pipelines
List pipelines
Returns every pipeline with its stages and deal counts. Not paginated.
curl "https://outreach.corammers.com/api/v1/pipelines" \
-H "Authorization: Bearer $COLDREACH_API_KEY"
{
"data": [
{
"id": 5,
"name": "Sales pipeline",
"is_default": true,
"campaign_ids": [
31
],
"opportunities_count": 41,
"stages": [
{
"id": 36,
"pipeline_id": 5,
"name": "New Lead",
"color": "#6366f1",
"order": 0,
"is_won": false,
"is_lost": false,
"opportunities_count": 12,
"opportunities_value": 140000
},
{
"id": 37,
"pipeline_id": 5,
"name": "Contacted",
"color": "#3b82f6",
"order": 1,
"is_won": false,
"is_lost": false,
"opportunities_count": 6,
"opportunities_value": 72000
},
{
"id": 38,
"pipeline_id": 5,
"name": "Opened",
"color": "#8b5cf6",
"order": 2,
"is_won": false,
"is_lost": false,
"opportunities_count": 3,
"opportunities_value": 30000
},
{
"id": 39,
"pipeline_id": 5,
"name": "Responded",
"color": "#f59e0b",
"order": 3,
"is_won": false,
"is_lost": false,
"opportunities_count": 3,
"opportunities_value": 54000
},
{
"id": 40,
"pipeline_id": 5,
"name": "Qualified",
"color": "#10b981",
"order": 4,
"is_won": false,
"is_lost": false,
"opportunities_count": 3,
"opportunities_value": 66000
},
{
"id": 41,
"pipeline_id": 5,
"name": "Meeting Booked",
"color": "#06b6d4",
"order": 5,
"is_won": false,
"is_lost": false,
"opportunities_count": 2,
"opportunities_value": 50000
},
{
"id": 42,
"pipeline_id": 5,
"name": "Won",
"color": "#22c55e",
"order": 6,
"is_won": true,
"is_lost": false,
"opportunities_count": 8,
"opportunities_value": 96000
},
{
"id": 43,
"pipeline_id": 5,
"name": "Lost",
"color": "#ef4444",
"order": 7,
"is_won": false,
"is_lost": true,
"opportunities_count": 4,
"opportunities_value": 40000
}
],
"created_at": "2026-08-20T09:00:00+00:00",
"updated_at": "2026-10-02T15:30:00+00:00"
}
]
}
/api/v1/pipelines
Create a pipeline
Creates a pipeline. Without stages, the default eight stages are created (New Lead → Won/Lost). Your first pipeline becomes the default.
Body parameters
-
namestring requiredPipeline name.
-
is_defaultbooleanMake this the default pipeline.
-
campaign_idsinteger[]Campaigns whose replies are added to this pipeline as opportunities.
-
stagesobject[]Custom stages in order, each with
name, optionalcolor(#RRGGBB),is_won,is_lost.
curl -X POST "https://outreach.corammers.com/api/v1/pipelines" \
-H "Authorization: Bearer $COLDREACH_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Agency deals",
"campaign_ids": [
31
],
"stages": [
{
"name": "Discovery",
"color": "#9fbbe0"
},
{
"name": "Proposal sent",
"color": "#c0a8dd"
},
{
"name": "Won",
"color": "#9fc9a2",
"is_won": true
},
{
"name": "Lost",
"color": "#dfa88f",
"is_lost": true
}
]
}'
{
"data": {
"id": 5,
"name": "Sales pipeline",
"is_default": true,
"campaign_ids": [
31
],
"opportunities_count": 41,
"stages": [
{
"id": 36,
"pipeline_id": 5,
"name": "New Lead",
"color": "#6366f1",
"order": 0,
"is_won": false,
"is_lost": false,
"opportunities_count": 12,
"opportunities_value": 140000
},
{
"id": 37,
"pipeline_id": 5,
"name": "Contacted",
"color": "#3b82f6",
"order": 1,
"is_won": false,
"is_lost": false,
"opportunities_count": 6,
"opportunities_value": 72000
},
{
"id": 38,
"pipeline_id": 5,
"name": "Opened",
"color": "#8b5cf6",
"order": 2,
"is_won": false,
"is_lost": false,
"opportunities_count": 3,
"opportunities_value": 30000
},
{
"id": 39,
"pipeline_id": 5,
"name": "Responded",
"color": "#f59e0b",
"order": 3,
"is_won": false,
"is_lost": false,
"opportunities_count": 3,
"opportunities_value": 54000
},
{
"id": 40,
"pipeline_id": 5,
"name": "Qualified",
"color": "#10b981",
"order": 4,
"is_won": false,
"is_lost": false,
"opportunities_count": 3,
"opportunities_value": 66000
},
{
"id": 41,
"pipeline_id": 5,
"name": "Meeting Booked",
"color": "#06b6d4",
"order": 5,
"is_won": false,
"is_lost": false,
"opportunities_count": 2,
"opportunities_value": 50000
},
{
"id": 42,
"pipeline_id": 5,
"name": "Won",
"color": "#22c55e",
"order": 6,
"is_won": true,
"is_lost": false,
"opportunities_count": 8,
"opportunities_value": 96000
},
{
"id": 43,
"pipeline_id": 5,
"name": "Lost",
"color": "#ef4444",
"order": 7,
"is_won": false,
"is_lost": true,
"opportunities_count": 4,
"opportunities_value": 40000
}
],
"created_at": "2026-08-20T09:00:00+00:00",
"updated_at": "2026-10-02T15:30:00+00:00"
}
}
/api/v1/pipelines/{pipeline}
Retrieve a pipeline
Returns a pipeline with its stages and deal counts.
Path parameters
-
pipelineinteger requiredPipeline ID.
curl "https://outreach.corammers.com/api/v1/pipelines/5" \
-H "Authorization: Bearer $COLDREACH_API_KEY"
{
"data": {
"id": 5,
"name": "Sales pipeline",
"is_default": true,
"campaign_ids": [
31
],
"opportunities_count": 41,
"stages": [
{
"id": 36,
"pipeline_id": 5,
"name": "New Lead",
"color": "#6366f1",
"order": 0,
"is_won": false,
"is_lost": false,
"opportunities_count": 12,
"opportunities_value": 140000
},
{
"id": 37,
"pipeline_id": 5,
"name": "Contacted",
"color": "#3b82f6",
"order": 1,
"is_won": false,
"is_lost": false,
"opportunities_count": 6,
"opportunities_value": 72000
},
{
"id": 38,
"pipeline_id": 5,
"name": "Opened",
"color": "#8b5cf6",
"order": 2,
"is_won": false,
"is_lost": false,
"opportunities_count": 3,
"opportunities_value": 30000
},
{
"id": 39,
"pipeline_id": 5,
"name": "Responded",
"color": "#f59e0b",
"order": 3,
"is_won": false,
"is_lost": false,
"opportunities_count": 3,
"opportunities_value": 54000
},
{
"id": 40,
"pipeline_id": 5,
"name": "Qualified",
"color": "#10b981",
"order": 4,
"is_won": false,
"is_lost": false,
"opportunities_count": 3,
"opportunities_value": 66000
},
{
"id": 41,
"pipeline_id": 5,
"name": "Meeting Booked",
"color": "#06b6d4",
"order": 5,
"is_won": false,
"is_lost": false,
"opportunities_count": 2,
"opportunities_value": 50000
},
{
"id": 42,
"pipeline_id": 5,
"name": "Won",
"color": "#22c55e",
"order": 6,
"is_won": true,
"is_lost": false,
"opportunities_count": 8,
"opportunities_value": 96000
},
{
"id": 43,
"pipeline_id": 5,
"name": "Lost",
"color": "#ef4444",
"order": 7,
"is_won": false,
"is_lost": true,
"opportunities_count": 4,
"opportunities_value": 40000
}
],
"created_at": "2026-08-20T09:00:00+00:00",
"updated_at": "2026-10-02T15:30:00+00:00"
}
}
/api/v1/pipelines/{pipeline}
Update a pipeline
Renames a pipeline or makes it the default.
Path parameters
-
pipelineinteger requiredPipeline ID.
Body parameters
-
namestringNew name.
-
is_defaultbooleanMake this the default pipeline.
-
campaign_idsinteger[]Replaces the linked campaigns. Send
[]to unlink all.
curl -X PATCH "https://outreach.corammers.com/api/v1/pipelines/5" \
-H "Authorization: Bearer $COLDREACH_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Agency deals 2026",
"is_default": true,
"campaign_ids": [
31
]
}'
{
"data": {
"id": 5,
"name": "Agency deals 2026",
"is_default": true,
"campaign_ids": [
31
],
"opportunities_count": 41,
"stages": [
{
"id": 36,
"pipeline_id": 5,
"name": "New Lead",
"color": "#6366f1",
"order": 0,
"is_won": false,
"is_lost": false,
"opportunities_count": 12,
"opportunities_value": 140000
},
{
"id": 37,
"pipeline_id": 5,
"name": "Contacted",
"color": "#3b82f6",
"order": 1,
"is_won": false,
"is_lost": false,
"opportunities_count": 6,
"opportunities_value": 72000
},
{
"id": 38,
"pipeline_id": 5,
"name": "Opened",
"color": "#8b5cf6",
"order": 2,
"is_won": false,
"is_lost": false,
"opportunities_count": 3,
"opportunities_value": 30000
},
{
"id": 39,
"pipeline_id": 5,
"name": "Responded",
"color": "#f59e0b",
"order": 3,
"is_won": false,
"is_lost": false,
"opportunities_count": 3,
"opportunities_value": 54000
},
{
"id": 40,
"pipeline_id": 5,
"name": "Qualified",
"color": "#10b981",
"order": 4,
"is_won": false,
"is_lost": false,
"opportunities_count": 3,
"opportunities_value": 66000
},
{
"id": 41,
"pipeline_id": 5,
"name": "Meeting Booked",
"color": "#06b6d4",
"order": 5,
"is_won": false,
"is_lost": false,
"opportunities_count": 2,
"opportunities_value": 50000
},
{
"id": 42,
"pipeline_id": 5,
"name": "Won",
"color": "#22c55e",
"order": 6,
"is_won": true,
"is_lost": false,
"opportunities_count": 8,
"opportunities_value": 96000
},
{
"id": 43,
"pipeline_id": 5,
"name": "Lost",
"color": "#ef4444",
"order": 7,
"is_won": false,
"is_lost": true,
"opportunities_count": 4,
"opportunities_value": 40000
}
],
"created_at": "2026-08-20T09:00:00+00:00",
"updated_at": "2026-10-02T15:30:00+00:00"
}
}
/api/v1/pipelines/{pipeline}
Delete a pipeline
Deletes a pipeline and its stages. If it still has opportunities the request returns 409 unless you pass ?force=true, which deletes them too.
Path parameters
-
pipelineinteger requiredPipeline ID.
Query parameters
-
forcebooleanAlso delete the pipeline's opportunities.
curl -X DELETE "https://outreach.corammers.com/api/v1/pipelines/5" \
-H "Authorization: Bearer $COLDREACH_API_KEY"
{
"message": "Pipeline deleted.",
"id": 5,
"opportunities_deleted": 0
}
/api/v1/pipelines/{pipeline}/stages
Add a stage
Adds a stage at the end of the pipeline.
Path parameters
-
pipelineinteger requiredPipeline ID.
Body parameters
-
namestring requiredStage name.
-
colorstringHex color
#RRGGBB. Default#6366f1. -
is_wonbooleanDeals here count as won.
-
is_lostbooleanDeals here count as lost.
curl -X POST "https://outreach.corammers.com/api/v1/pipelines/5/stages" \
-H "Authorization: Bearer $COLDREACH_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Negotiation",
"color": "#c08532"
}'
{
"data": {
"id": 44,
"pipeline_id": 5,
"name": "Negotiation",
"color": "#c08532",
"order": 8,
"is_won": false,
"is_lost": false
}
}
/api/v1/pipelines/{pipeline}/stages/{stage}
Update a stage
Renames, recolors or re-flags a stage.
Path parameters
-
pipelineinteger requiredPipeline ID.
-
stageinteger requiredStage ID.
Body parameters
-
namestringStage name.
-
colorstringHex color
#RRGGBB. -
is_wonbooleanDeals here count as won.
-
is_lostbooleanDeals here count as lost.
curl -X PATCH "https://outreach.corammers.com/api/v1/pipelines/5/stages/40" \
-H "Authorization: Bearer $COLDREACH_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Qualified (SQL)"
}'
{
"data": {
"id": 40,
"pipeline_id": 5,
"name": "Qualified (SQL)",
"color": "#10b981",
"order": 4,
"is_won": false,
"is_lost": false,
"opportunities_count": 3,
"opportunities_value": 66000
}
}
/api/v1/pipelines/{pipeline}/stages/{stage}
Delete a stage
Deletes a stage. If it holds opportunities, pass move_to_stage_id (a stage of the same pipeline) to move them first; otherwise the request returns 409.
Path parameters
-
pipelineinteger requiredPipeline ID.
-
stageinteger requiredStage ID.
Query parameters
-
move_to_stage_idintegerStage to move existing opportunities into.
curl -X DELETE "https://outreach.corammers.com/api/v1/pipelines/5/stages/40?move_to_stage_id=41" \
-H "Authorization: Bearer $COLDREACH_API_KEY"
{
"message": "Stage deleted.",
"id": 40,
"opportunities_moved": 3
}
/api/v1/pipelines/{pipeline}/stages/reorder
Reorder stages
Sets the stage order. stage_ids must contain every stage of the pipeline exactly once.
Path parameters
-
pipelineinteger requiredPipeline ID.
Body parameters
-
stage_idsinteger[] requiredAll stage IDs in the new order.
curl -X POST "https://outreach.corammers.com/api/v1/pipelines/5/stages/reorder" \
-H "Authorization: Bearer $COLDREACH_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"stage_ids": [
36,
37,
39,
38,
40,
41,
42,
43
]
}'
{
"data": {
"id": 5,
"name": "Sales pipeline",
"is_default": true,
"campaign_ids": [
31
],
"opportunities_count": 41,
"stages": [
{
"id": 36,
"pipeline_id": 5,
"name": "New Lead",
"color": "#6366f1",
"order": 0,
"is_won": false,
"is_lost": false,
"opportunities_count": 12,
"opportunities_value": 140000
},
{
"id": 37,
"pipeline_id": 5,
"name": "Contacted",
"color": "#3b82f6",
"order": 1,
"is_won": false,
"is_lost": false,
"opportunities_count": 6,
"opportunities_value": 72000
},
{
"id": 38,
"pipeline_id": 5,
"name": "Opened",
"color": "#8b5cf6",
"order": 2,
"is_won": false,
"is_lost": false,
"opportunities_count": 3,
"opportunities_value": 30000
},
{
"id": 39,
"pipeline_id": 5,
"name": "Responded",
"color": "#f59e0b",
"order": 3,
"is_won": false,
"is_lost": false,
"opportunities_count": 3,
"opportunities_value": 54000
},
{
"id": 40,
"pipeline_id": 5,
"name": "Qualified",
"color": "#10b981",
"order": 4,
"is_won": false,
"is_lost": false,
"opportunities_count": 3,
"opportunities_value": 66000
},
{
"id": 41,
"pipeline_id": 5,
"name": "Meeting Booked",
"color": "#06b6d4",
"order": 5,
"is_won": false,
"is_lost": false,
"opportunities_count": 2,
"opportunities_value": 50000
},
{
"id": 42,
"pipeline_id": 5,
"name": "Won",
"color": "#22c55e",
"order": 6,
"is_won": true,
"is_lost": false,
"opportunities_count": 8,
"opportunities_value": 96000
},
{
"id": 43,
"pipeline_id": 5,
"name": "Lost",
"color": "#ef4444",
"order": 7,
"is_won": false,
"is_lost": true,
"opportunities_count": 4,
"opportunities_value": 40000
}
],
"created_at": "2026-08-20T09:00:00+00:00",
"updated_at": "2026-10-02T15:30:00+00:00"
}
}
6 endpoints
Opportunities
Opportunities are deals linked to a lead and placed in a pipeline stage. Every stage change is recorded in activity_log.
The opportunity object
-
idintegerOpportunity ID.
-
namestringDeal name.
-
value, currencynumber|null, stringDeal value and ISO 4217 currency.
-
close_datedate|nullExpected close date.
-
pipeline_id, pipeline_stage_idintegerWhere the deal sits.
-
lead_id, campaign_idinteger|nullRelated lead and source campaign.
-
activity_logobject[]History of creation and stage changes.
/api/v1/opportunities
List opportunities
Returns opportunities, newest first.
Query parameters
-
pipeline_idintegerFilter by pipeline.
-
pipeline_stage_idintegerFilter by stage.
-
lead_idintegerFilter by lead.
-
campaign_idintegerFilter by source campaign.
-
statusenumopen,wonorlost(based on the stage flags). -
searchstringMatches the opportunity name.
-
sortstringcreated_at,updated_at,name,valueorclose_date, prefix-for descending. -
pageintegerPage number, starting at 1.
-
per_pageintegerItems per page, 1–100. Default 25.
curl "https://outreach.corammers.com/api/v1/opportunities?pipeline_id=5&status=open" \
-H "Authorization: Bearer $COLDREACH_API_KEY"
{
"data": [
{
"id": 77,
"name": "Northwind — annual plan",
"value": 18000,
"currency": "USD",
"close_date": "2026-11-30",
"notes": null,
"pipeline_id": 5,
"pipeline_stage_id": 40,
"campaign_id": 31,
"lead_id": 1842,
"stage": {
"id": 40,
"name": "Qualified",
"is_won": false,
"is_lost": false
},
"lead": {
"id": 1842,
"email": "ava@northwind.io",
"full_name": "Ava Chen",
"company": "Northwind"
},
"activity_log": [
{
"action": "created",
"stage_id": 40,
"via": "api",
"at": "2026-10-10T10:58:12+00:00"
}
],
"created_at": "2026-10-10T10:58:12+00:00",
"updated_at": "2026-10-10T10:58:12+00:00"
}
],
"links": {
"first": "https://outreach.corammers.com/api/v1/opportunities?page=1",
"last": "https://outreach.corammers.com/api/v1/opportunities?page=1",
"prev": null,
"next": null
},
"meta": {
"current_page": 1,
"from": 1,
"last_page": 1,
"links": [
{
"url": null,
"label": "« Previous",
"active": false
},
{
"url": "https://outreach.corammers.com/api/v1/opportunities?page=1",
"label": "1",
"active": true
},
{
"url": null,
"label": "Next »",
"active": false
}
],
"path": "https://outreach.corammers.com/api/v1/opportunities",
"per_page": 25,
"to": 1,
"total": 1
}
}
/api/v1/opportunities
Create an opportunity
Creates a deal for a lead. Without pipeline_stage_id the deal starts in the pipeline's first stage.
Body parameters
-
namestring requiredDeal name.
-
lead_idinteger requiredLead the deal belongs to.
-
pipeline_idinteger requiredPipeline.
-
pipeline_stage_idintegerStage within the pipeline.
-
campaign_idintegerCampaign that sourced the deal.
-
valuenumberDeal value.
-
currencystringISO 4217 code. Default
USD. -
close_datedateExpected close date
YYYY-MM-DD. -
notesstringFree-form notes.
curl -X POST "https://outreach.corammers.com/api/v1/opportunities" \
-H "Authorization: Bearer $COLDREACH_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Northwind — annual plan",
"lead_id": 1842,
"pipeline_id": 5,
"campaign_id": 31,
"value": 18000,
"currency": "USD",
"close_date": "2026-11-30"
}'
{
"data": {
"id": 77,
"name": "Northwind — annual plan",
"value": 18000,
"currency": "USD",
"close_date": "2026-11-30",
"notes": null,
"pipeline_id": 5,
"pipeline_stage_id": 40,
"campaign_id": 31,
"lead_id": 1842,
"stage": {
"id": 40,
"name": "Qualified",
"is_won": false,
"is_lost": false
},
"lead": {
"id": 1842,
"email": "ava@northwind.io",
"full_name": "Ava Chen",
"company": "Northwind"
},
"activity_log": [
{
"action": "created",
"stage_id": 40,
"via": "api",
"at": "2026-10-10T10:58:12+00:00"
}
],
"created_at": "2026-10-10T10:58:12+00:00",
"updated_at": "2026-10-10T10:58:12+00:00"
}
}
/api/v1/opportunities/{opportunity}
Retrieve an opportunity
Returns one opportunity with its stage and lead.
Path parameters
-
opportunityinteger requiredOpportunity ID.
curl "https://outreach.corammers.com/api/v1/opportunities/77" \
-H "Authorization: Bearer $COLDREACH_API_KEY"
{
"data": {
"id": 77,
"name": "Northwind — annual plan",
"value": 18000,
"currency": "USD",
"close_date": "2026-11-30",
"notes": null,
"pipeline_id": 5,
"pipeline_stage_id": 40,
"campaign_id": 31,
"lead_id": 1842,
"stage": {
"id": 40,
"name": "Qualified",
"is_won": false,
"is_lost": false
},
"lead": {
"id": 1842,
"email": "ava@northwind.io",
"full_name": "Ava Chen",
"company": "Northwind"
},
"activity_log": [
{
"action": "created",
"stage_id": 40,
"via": "api",
"at": "2026-10-10T10:58:12+00:00"
}
],
"created_at": "2026-10-10T10:58:12+00:00",
"updated_at": "2026-10-10T10:58:12+00:00"
}
}
/api/v1/opportunities/{opportunity}
Update an opportunity
Updates the fields you send. Changing pipeline_id without a stage moves the deal to the new pipeline's first stage.
Path parameters
-
opportunityinteger requiredOpportunity ID.
Body parameters
-
namestringDeal name.
-
lead_idintegerLead.
-
pipeline_idintegerPipeline.
-
pipeline_stage_idintegerStage within the pipeline.
-
campaign_idinteger|nullSource campaign.
-
valuenumber|nullDeal value.
-
currencystringISO 4217 code.
-
close_datedate|nullExpected close date.
-
notesstring|nullNotes.
curl -X PATCH "https://outreach.corammers.com/api/v1/opportunities/77" \
-H "Authorization: Bearer $COLDREACH_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"value": 24000,
"notes": "Added the onboarding package."
}'
{
"data": {
"id": 77,
"name": "Northwind — annual plan",
"value": 24000,
"currency": "USD",
"close_date": "2026-11-30",
"notes": "Added the onboarding package.",
"pipeline_id": 5,
"pipeline_stage_id": 40,
"campaign_id": 31,
"lead_id": 1842,
"stage": {
"id": 40,
"name": "Qualified",
"is_won": false,
"is_lost": false
},
"lead": {
"id": 1842,
"email": "ava@northwind.io",
"full_name": "Ava Chen",
"company": "Northwind"
},
"activity_log": [
{
"action": "created",
"stage_id": 40,
"via": "api",
"at": "2026-10-10T10:58:12+00:00"
}
],
"created_at": "2026-10-10T10:58:12+00:00",
"updated_at": "2026-10-10T10:58:12+00:00"
}
}
/api/v1/opportunities/{opportunity}/move
Move to another stage
Moves a deal to another stage of its pipeline and records the change in activity_log.
Path parameters
-
opportunityinteger requiredOpportunity ID.
Body parameters
-
pipeline_stage_idinteger requiredTarget stage in the same pipeline.
curl -X POST "https://outreach.corammers.com/api/v1/opportunities/77/move" \
-H "Authorization: Bearer $COLDREACH_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"pipeline_stage_id": 42
}'
{
"data": {
"id": 77,
"name": "Northwind — annual plan",
"value": 18000,
"currency": "USD",
"close_date": "2026-11-30",
"notes": null,
"pipeline_id": 5,
"pipeline_stage_id": 42,
"campaign_id": 31,
"lead_id": 1842,
"stage": {
"id": 42,
"name": "Won",
"is_won": true,
"is_lost": false
},
"lead": {
"id": 1842,
"email": "ava@northwind.io",
"full_name": "Ava Chen",
"company": "Northwind"
},
"activity_log": [
{
"action": "created",
"stage_id": 40,
"via": "api",
"at": "2026-10-10T10:58:12+00:00"
},
{
"action": "stage_changed",
"from": 40,
"to": 42,
"via": "api",
"at": "2026-10-10T11:02:44+00:00"
}
],
"created_at": "2026-10-10T10:58:12+00:00",
"updated_at": "2026-10-10T10:58:12+00:00"
}
}
/api/v1/opportunities/{opportunity}
Delete an opportunity
Permanently deletes a deal.
Path parameters
-
opportunityinteger requiredOpportunity ID.
curl -X DELETE "https://outreach.corammers.com/api/v1/opportunities/77" \
-H "Authorization: Bearer $COLDREACH_API_KEY"
{
"message": "Opportunity deleted.",
"id": 77
}
6 endpoints
Analytics
Email performance, lead and pipeline reporting — the same numbers as the dashboard. sent counts emails; every other metric counts people, so a lead who opens six times is one opener. A click or a reply also counts as an open, because mail clients often block the open pixel, while opens and clicks fired by mail security scanners (within seconds of delivery, or from known scanner agents) are ignored. Only activity of steps that still exist is counted. Rates are percentages of sent. All dates are UTC.
/api/v1/analytics/overview
Workspace overview
Email performance across all campaigns plus campaign, lead and pipeline totals.
Query parameters
-
fromdateStart date
YYYY-MM-DD(UTC). Omit for all time. -
todateEnd date
YYYY-MM-DD, inclusive.
curl "https://outreach.corammers.com/api/v1/analytics/overview?from=2026-09-11&to=2026-10-10" \
-H "Authorization: Bearer $COLDREACH_API_KEY"
{
"data": {
"range": {
"from": "2026-09-11",
"to": "2026-10-10",
"timezone": "UTC"
},
"email": {
"sent": 1240,
"opened": 712,
"clicked": 96,
"replied": 58,
"bounced": 11,
"open_rate": 57.4,
"click_rate": 7.7,
"reply_rate": 4.7,
"bounce_rate": 0.9,
"unsubscribed": 4
},
"campaigns": {
"total": 9,
"by_status": {
"active": 3,
"paused": 1,
"draft": 5
}
},
"leads": {
"total": 1840,
"created_in_range": 420,
"by_status": {
"new": 1402,
"contacted": 360,
"replied": 58,
"unsubscribed": 9,
"bounced": 11
},
"by_validation_status": {
"valid": 1510,
"risky": 88,
"pending": 242
}
},
"pipeline": {
"opportunities": 41,
"open_count": 29,
"open_value": 412000,
"won_count": 8,
"won_value": 96000,
"lost_count": 4,
"win_rate": 66.7
}
}
}
/api/v1/analytics/campaigns
Campaign comparison
Performance for every campaign side by side, paginated.
Query parameters
-
fromdateStart date
YYYY-MM-DD(UTC). Omit for all time. -
todateEnd date
YYYY-MM-DD, inclusive. -
statusenumOnly campaigns with this status.
-
pageintegerPage number, starting at 1.
-
per_pageintegerItems per page, 1–100. Default 25.
curl "https://outreach.corammers.com/api/v1/analytics/campaigns?status=active" \
-H "Authorization: Bearer $COLDREACH_API_KEY"
{
"data": [
{
"campaign_id": 31,
"name": "Q4 SaaS founders",
"status": "active",
"leads_enrolled": 248,
"metrics": {
"sent": 1240,
"opened": 712,
"clicked": 96,
"replied": 58,
"bounced": 11,
"open_rate": 57.4,
"click_rate": 7.7,
"reply_rate": 4.7,
"bounce_rate": 0.9
}
}
],
"links": {
"first": "https://outreach.corammers.com/api/v1/analytics/campaigns?page=1",
"last": "https://outreach.corammers.com/api/v1/analytics/campaigns?page=1",
"prev": null,
"next": null
},
"meta": {
"current_page": 1,
"from": 1,
"last_page": 1,
"links": [
{
"url": null,
"label": "« Previous",
"active": false
},
{
"url": "https://outreach.corammers.com/api/v1/analytics/campaigns?page=1",
"label": "1",
"active": true
},
{
"url": null,
"label": "Next »",
"active": false
}
],
"path": "https://outreach.corammers.com/api/v1/analytics/campaigns",
"per_page": 25,
"to": 1,
"total": 1
},
"range": {
"from": null,
"to": null,
"timezone": "UTC"
}
}
/api/v1/analytics/campaigns/{campaign}
Campaign report
Deep dive into one campaign: totals, enrollment states, metrics per step and per A/B variant, and a daily series (last 30 days unless a range is given).
Path parameters
-
campaigninteger requiredCampaign ID.
Query parameters
-
fromdateStart date
YYYY-MM-DD(UTC). Omit for all time. -
todateEnd date
YYYY-MM-DD, inclusive.
curl "https://outreach.corammers.com/api/v1/analytics/campaigns/31" \
-H "Authorization: Bearer $COLDREACH_API_KEY"
{
"data": {
"campaign_id": 31,
"name": "Q4 SaaS founders",
"status": "active",
"range": {
"from": null,
"to": null,
"timezone": "UTC"
},
"metrics": {
"sent": 1240,
"opened": 712,
"clicked": 96,
"replied": 58,
"bounced": 11,
"open_rate": 57.4,
"click_rate": 7.7,
"reply_rate": 4.7,
"bounce_rate": 0.9,
"unsubscribed": 2
},
"enrollments": {
"total": 248,
"by_status": {
"active": 201,
"replied": 19,
"completed": 22,
"bounced": 6
}
},
"steps": [
{
"step_id": 88,
"order": 1,
"type": "email",
"name": "Intro",
"metrics": {
"sent": 1240,
"opened": 712,
"clicked": 96,
"replied": 58,
"bounced": 11,
"open_rate": 57.4,
"click_rate": 7.7,
"reply_rate": 4.7,
"bounce_rate": 0.9
},
"variants": [
{
"variant_id": 201,
"name": "Short",
"is_active": true,
"weight": 50,
"metrics": {
"sent": 620,
"opened": 371,
"clicked": 51,
"replied": 33,
"bounced": 5,
"open_rate": 59.8,
"click_rate": 8.2,
"reply_rate": 5.3,
"bounce_rate": 0.8
}
},
{
"variant_id": 202,
"name": "Social proof",
"is_active": true,
"weight": 50,
"metrics": {
"sent": 620,
"opened": 341,
"clicked": 45,
"replied": 25,
"bounced": 6,
"open_rate": 55,
"click_rate": 7.3,
"reply_rate": 4,
"bounce_rate": 1
}
}
]
}
],
"timeseries": [
{
"date": "2026-10-09",
"sent": 142,
"opened": 80,
"clicked": 11,
"replied": 6,
"bounced": 1
},
{
"date": "2026-10-10",
"sent": 150,
"opened": 64,
"clicked": 9,
"replied": 4,
"bounced": 0
}
]
}
}
/api/v1/analytics/timeseries
Daily timeseries
Day-by-day email activity for charts. Defaults to the last 30 days; ranges can span up to 366 days. Days without activity are returned as zeros.
Query parameters
-
fromdateStart date
YYYY-MM-DD(UTC). Omit for all time. -
todateEnd date
YYYY-MM-DD, inclusive. -
campaign_idintegerLimit to one campaign.
curl "https://outreach.corammers.com/api/v1/analytics/timeseries?from=2026-10-08&to=2026-10-10&campaign_id=31" \
-H "Authorization: Bearer $COLDREACH_API_KEY"
{
"data": {
"range": {
"from": "2026-10-08",
"to": "2026-10-10",
"timezone": "UTC"
},
"interval": "day",
"campaign_id": 31,
"series": [
{
"date": "2026-10-08",
"sent": 0,
"opened": 0,
"clicked": 0,
"replied": 0,
"bounced": 0
},
{
"date": "2026-10-09",
"sent": 142,
"opened": 80,
"clicked": 11,
"replied": 6,
"bounced": 1
},
{
"date": "2026-10-10",
"sent": 150,
"opened": 64,
"clicked": 9,
"replied": 4,
"bounced": 0
}
]
}
}
/api/v1/analytics/events
Activity feed
Raw sequence events, newest first: enrolled, scheduled, sent, opened, clicked, replied, bounced, paused, resumed, skipped, completed and removed. Poll it to react to replies or opens in your own tools.
Query parameters
-
fromdateStart date
YYYY-MM-DD(UTC). Omit for all time. -
todateEnd date
YYYY-MM-DD, inclusive. -
event_typeenumOnly this event type.
-
campaign_idintegerOnly this campaign.
-
lead_idintegerOnly this lead.
-
pageintegerPage number, starting at 1.
-
per_pageintegerItems per page, 1–100. Default 25.
curl "https://outreach.corammers.com/api/v1/analytics/events?event_type=replied" \
-H "Authorization: Bearer $COLDREACH_API_KEY"
{
"data": [
{
"id": 90211,
"event_type": "replied",
"occurred_at": "2026-10-10T10:48:03+00:00",
"campaign_id": 31,
"step": 1,
"step_id": 88,
"variant": {
"id": 201,
"name": "Short"
},
"lead": {
"id": 1842,
"email": "ava@northwind.io",
"full_name": "Ava Chen"
},
"smtp_account": {
"id": 3,
"from_email": "alex@yourcompany.com"
},
"metadata": {
"reason": "reply_detected"
}
}
],
"links": {
"first": "https://outreach.corammers.com/api/v1/analytics/events?page=1",
"last": "https://outreach.corammers.com/api/v1/analytics/events?page=1",
"prev": null,
"next": null
},
"meta": {
"current_page": 1,
"from": 1,
"last_page": 1,
"links": [
{
"url": null,
"label": "« Previous",
"active": false
},
{
"url": "https://outreach.corammers.com/api/v1/analytics/events?page=1",
"label": "1",
"active": true
},
{
"url": null,
"label": "Next »",
"active": false
}
],
"path": "https://outreach.corammers.com/api/v1/analytics/events",
"per_page": 25,
"to": 1,
"total": 1
}
}
/api/v1/analytics/pipelines
Pipeline report
Deal counts and values per stage, open/won/lost totals and win rate for each pipeline.
Query parameters
-
pipeline_idintegerOnly this pipeline.
curl "https://outreach.corammers.com/api/v1/analytics/pipelines" \
-H "Authorization: Bearer $COLDREACH_API_KEY"
{
"data": [
{
"pipeline_id": 5,
"name": "Sales pipeline",
"is_default": true,
"totals": {
"opportunities": 41,
"value": 548000,
"open_count": 29,
"open_value": 412000,
"won_count": 8,
"won_value": 96000,
"lost_count": 4,
"win_rate": 66.7
},
"stages": [
{
"stage_id": 36,
"name": "New Lead",
"order": 0,
"is_won": false,
"is_lost": false,
"opportunities": 12,
"value": 140000
},
{
"stage_id": 42,
"name": "Won",
"order": 6,
"is_won": true,
"is_lost": false,
"opportunities": 8,
"value": 96000
}
]
}
]
}