ColdReach
Get API key

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
GET /api/v1/me 200
{
    "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
            }
        }
    }
}

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.

Keep keys secret. Call the API from your server, never from browser or mobile code. If a key leaks, revoke it in Settings → API and create a new one.

All requests must use HTTPS. Send Content-Type: application/json with request bodies; every response is JSON.

Authenticated request
curl https://outreach.corammers.com/api/v1/me \
  -H "Authorization: Bearer crk_••••••••••••••••"
Missing or invalid key 401
{
    "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.

AccessScopesAllows
Read onlyreadAll GET endpoints
Read & writeread writeEverything, 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.

Read-only key on a write endpoint 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.
Validation error 422
{
    "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."
        ]
    }
}
Not found 404
{
    "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.

Fetch every lead
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.

Rate limited 429
{
    "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. 1

    Import your leads

    Upsert up to 500 leads per call and drop them into a list.

    POST /leads/bulk
    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","list_ids":[12],"leads":[{"email":"ava@northwind.io","first_name":"Ava","company":"Northwind"}]}'
  2. 2

    Create the campaign

    Pick the sending accounts from GET /smtp-accounts and set the schedule.

    POST /campaigns
    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","smtp_account_ids":[3,4],"schedule":{"timezone":"America/New_York","send_window_start":"09:00","send_window_end":"17:00"}}'
  3. 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/steps
    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","subject":"Quick question, {{ first_name }}","body":"Hi {{ first_name }},\n\nWorth a chat about outbound at {{ company }}?"}'
  4. 4

    Enroll leads

    Enroll individual leads or a whole list.

    POST /campaigns/31/leads
    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_list_id":12}'
  5. 5

    Go live

    Activation schedules every lead inside the sending window. Check warnings in the response.

    POST /campaigns/31/activate
    curl -X POST https://outreach.corammers.com/api/v1/campaigns/31/activate \
      -H "Authorization: Bearer $COLDREACH_API_KEY"
  6. 6

    Track results

    Poll analytics or the activity feed to react to replies.

    GET /analytics/campaigns/31
    curl 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.

GET /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).

Scope: read Returns 200
curl "https://outreach.corammers.com/api/v1/me" \
  -H "Authorization: Bearer $COLDREACH_API_KEY"
Response 200
{
    "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
            }
        }
    }
}
GET /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.

Scope: read Returns 200
curl "https://outreach.corammers.com/api/v1/smtp-accounts" \
  -H "Authorization: Bearer $COLDREACH_API_KEY"
Response 200
{
    "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
        }
    ]
}
GET /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.

Scope: read Returns 200
curl "https://outreach.corammers.com/api/v1/custom-fields" \
  -H "Authorization: Bearer $COLDREACH_API_KEY"
Response 200
{
    "data": [
        {
            "id": 3,
            "key": "funding_stage",
            "name": "Funding Stage",
            "type": "text"
        },
        {
            "id": 4,
            "key": "employee_count",
            "name": "Employee Count",
            "type": "number"
        }
    ]
}

The lead object

  • id integer

    Unique identifier.

  • email string

    Email address. Unique within your workspace.

  • first_name / last_name / full_name string

    Name fields. full_name is read-only.

  • title, company, website, phone, location string|null

    Profile fields.

  • linkedin_url, facebook_url, instagram_url, twitter_url string|null

    Main social profiles.

  • extra_contacts object[]

    Any number of extra ways to reach the lead: {type, value, label} with type one of email, phone, whatsapp, website, linkedin, facebook, instagram, twitter, youtube, tiktok, other and an optional label such as "Mobile". Sending the field replaces the whole list.

  • industry, company_domain string|null

    Firmographic fields.

  • email_provider, email_security_gateway string|null

    Filled automatically by email validation.

  • status enum

    new, 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_status enum

    pending, valid, invalid, catch_all, risky, unknown.

  • score integer

    Lead score 0–100 from profile, email quality, opens, clicks, replies, recency, status and open deals. Read-only.

  • temperature enum

    hot, warm or cold, from the score and your scoring thresholds. Read-only.

  • score_breakdown object[]

    The signals behind the score (label, points). Read-only.

  • last_activity_at / last_contacted_at datetime|null

    Last interaction of any kind, and the last email you sent them. Read-only.

  • source string

    Where the lead came from: api, manual, csv_import.

  • tags string[]

    Lowercase tags.

  • custom_data object

    Values for your custom fields, keyed by field key.

  • lists object[]

    Lead lists the lead belongs to (id, name).

  • campaigns object[]

    Only on GET /leads/{id}: campaigns the lead is enrolled in with their sequence status.

GET /api/v1/leads

List leads

Returns a paginated list of leads, newest first. Combine filters to sync or segment your data.

Scope: read Returns 200

Query parameters

  • search string

    Matches first name, last name, email, company or title.

  • email string

    Exact email match (case-insensitive).

  • status enum

    Filter by lead status.

  • temperature enum

    hot, warm or cold.

  • min_score / max_score integer

    Only leads with a score in this range (0–100).

  • validation_status enum

    Filter by email validation status.

  • source string

    Filter by source, e.g. api.

  • list_id integer

    Only leads in this lead list.

  • tag string

    Only leads with this tag.

  • created_after date

    ISO 8601 date or datetime.

  • created_before date

    ISO 8601 date or datetime.

  • updated_after date

    Useful for incremental syncs.

  • sort string

    One 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. -score for hottest first). Default -created_at.

  • page integer

    Page number, starting at 1.

  • per_page integer

    Items 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"
Response 200
{
    "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
    }
}
POST /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.

Scope: write Returns 201

Body parameters

  • email string required

    Email address.

  • first_name string

    First name.

  • last_name string

    Last name.

  • title string

    Job title.

  • company string

    Company name.

  • website string

    Company website (up to 2,048 characters, like the social URLs).

  • phone string

    Phone number.

  • location string

    City, region or country.

  • linkedin_url string

    LinkedIn profile URL. Also facebook_url, instagram_url, twitter_url.

  • industry string

    Industry.

  • company_domain string

    Company domain, e.g. northwind.io.

  • status enum

    new (default), contacted, replied, interested, meeting_booked, qualified, customer, not_interested, unsubscribed, bounced, invalid.

  • validation_status enum

    pending (default), valid, invalid, catch_all, risky, unknown.

  • tags string[]

    Tags as an array or a comma-separated string. Stored lowercase.

  • custom_data object

    Custom field values keyed by field key (see GET /custom-fields). Unknown keys are rejected.

  • list_ids integer[]

    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
    ]
}'
Response 201
{
    "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"
    }
}
GET /api/v1/leads/{lead}

Retrieve a lead

Returns a lead with its lists and the campaigns it is enrolled in.

Scope: read Returns 200

Path parameters

  • lead integer required

    Lead ID.

curl "https://outreach.corammers.com/api/v1/leads/1842" \
  -H "Authorization: Bearer $COLDREACH_API_KEY"
Response 200
{
    "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"
            }
        ]
    }
}
GET /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.

Scope: read Returns 200

Path parameters

  • lead integer required

    Lead ID.

Query parameters

  • category enum

    email (sends and sequence changes), engagement (opens, clicks, replies, unsubscribes, auto-replies), crm (created, edits, lists) or deals.

  • campaign_id integer

    Only email activity from this campaign.

  • include_scheduling boolean

    Also return the “email scheduled” entries written each time a send is planned or moved.

  • page integer

    Page number, starting at 1.

  • per_page integer

    Items per page, 1–100. Default 25.

curl "https://outreach.corammers.com/api/v1/leads/1842/timeline?category=engagement" \
  -H "Authorization: Bearer $COLDREACH_API_KEY"
Response 200
{
    "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
    }
}
PATCH /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.

Scope: write Returns 200

Path parameters

  • lead integer required

    Lead ID.

Body parameters

  • email string

    New email address.

  • first_name string

    First name.

  • last_name string

    Last name.

  • title string

    Job title.

  • company string

    Company name.

  • website string

    Company website (up to 2,048 characters, like the social URLs).

  • phone string

    Phone number.

  • location string

    City, region or country.

  • linkedin_url string

    LinkedIn profile URL. Also facebook_url, instagram_url, twitter_url.

  • industry string

    Industry.

  • company_domain string

    Company domain, e.g. northwind.io.

  • status enum

    new (default), contacted, replied, interested, meeting_booked, qualified, customer, not_interested, unsubscribed, bounced, invalid.

  • validation_status enum

    pending (default), valid, invalid, catch_all, risky, unknown.

  • tags string[]

    Tags as an array or a comma-separated string. Stored lowercase.

  • custom_data object

    Custom field values keyed by field key (see GET /custom-fields). Unknown keys are rejected.

  • list_ids integer[]

    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"
    }
}'
Response 200
{
    "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"
    }
}
DELETE /api/v1/leads/{lead}

Delete a lead

Permanently deletes a lead, its list memberships, campaign enrollments and opportunities.

Scope: write Returns 200

Path parameters

  • lead integer required

    Lead ID.

curl -X DELETE "https://outreach.corammers.com/api/v1/leads/1842" \
  -H "Authorization: Bearer $COLDREACH_API_KEY"
Response 200
{
    "message": "Lead deleted.",
    "id": 1842
}
POST /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.

Scope: write Returns 201

Body parameters

  • leads object[] required

    Up to 500 lead objects. Each needs an email.

  • on_duplicate enum

    skip (default) or update existing leads with the same email.

  • tags string[]

    Tags added to every lead in the request.

  • list_ids integer[]

    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"
        }
    ]
}'
Response 201
{
    "data": {
        "created": 1,
        "updated": 1,
        "skipped": 0,
        "leads": [
            {
                "email": "ava@northwind.io",
                "id": 1842,
                "result": "updated"
            },
            {
                "email": "li@acme.dev",
                "id": 1907,
                "result": "created"
            }
        ]
    }
}
POST /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.

Scope: write Returns 200

Body parameters

  • ids integer[] required

    Lead 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
    ]
}'
Response 200
{
    "message": "3 lead(s) deleted.",
    "deleted": 3
}
POST /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).

Scope: write Returns 200

Path parameters

  • lead integer required

    Lead ID.

curl -X POST "https://outreach.corammers.com/api/v1/leads/1842/validate-email" \
  -H "Authorization: Bearer $COLDREACH_API_KEY"
Response 200
{
    "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"
    }
}

The lead list object

  • id integer

    Unique identifier.

  • name string

    List name.

  • description string|null

    Optional description.

  • leads_count integer

    Number of leads in the list.

GET /api/v1/lead-lists

List lead lists

Returns your lead lists with their lead counts.

Scope: read Returns 200

Query parameters

  • search string

    Matches the list name.

  • sort string

    created_at, updated_at or name, prefix - for descending.

  • page integer

    Page number, starting at 1.

  • per_page integer

    Items per page, 1–100. Default 25.

curl "https://outreach.corammers.com/api/v1/lead-lists" \
  -H "Authorization: Bearer $COLDREACH_API_KEY"
Response 200
{
    "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
    }
}
POST /api/v1/lead-lists

Create a lead list

Creates a list and optionally fills it with existing leads.

Scope: write Returns 201

Body parameters

  • name string required

    List name.

  • description string

    Optional description.

  • lead_ids integer[]

    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
    ]
}'
Response 201
{
    "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"
    }
}
GET /api/v1/lead-lists/{list}

Retrieve a lead list

Returns a single list.

Scope: read Returns 200

Path parameters

  • list integer required

    Lead list ID.

curl "https://outreach.corammers.com/api/v1/lead-lists/12" \
  -H "Authorization: Bearer $COLDREACH_API_KEY"
Response 200
{
    "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"
    }
}
PATCH /api/v1/lead-lists/{list}

Update a lead list

Renames a list or changes its description.

Scope: write Returns 200

Path parameters

  • list integer required

    Lead list ID.

Body parameters

  • name string

    New name.

  • description string|null

    New 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"
}'
Response 200
{
    "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"
    }
}
DELETE /api/v1/lead-lists/{list}

Delete a lead list

Deletes the list. The leads in it are kept.

Scope: write Returns 200

Path parameters

  • list integer required

    Lead list ID.

curl -X DELETE "https://outreach.corammers.com/api/v1/lead-lists/12" \
  -H "Authorization: Bearer $COLDREACH_API_KEY"
Response 200
{
    "message": "Lead list deleted. Leads in the list were kept.",
    "id": 12
}
GET /api/v1/lead-lists/{list}/leads

List leads in a list

Returns the leads in a list, paginated.

Scope: read Returns 200

Path parameters

  • list integer required

    Lead list ID.

Query parameters

  • page integer

    Page number, starting at 1.

  • per_page integer

    Items per page, 1–100. Default 25.

curl "https://outreach.corammers.com/api/v1/lead-lists/12/leads" \
  -H "Authorization: Bearer $COLDREACH_API_KEY"
Response 200
{
    "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
    }
}
POST /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.

Scope: write Returns 200

Path parameters

  • list integer required

    Lead list ID.

Body parameters

  • lead_ids integer[] required

    Up 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
    ]
}'
Response 200
{
    "message": "2 lead(s) added to the list.",
    "added": 2,
    "already_in_list": 1,
    "leads_count": 250
}
DELETE /api/v1/lead-lists/{list}/leads

Remove leads from a list

Removes leads from the list without deleting them.

Scope: write Returns 200

Path parameters

  • list integer required

    Lead list ID.

Body parameters

  • lead_ids integer[] required

    Lead 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
    ]
}'
Response 200
{
    "message": "1 lead(s) removed from the list.",
    "removed": 1,
    "leads_count": 249
}

The campaign object

  • id integer

    Unique identifier.

  • name, description string

    Campaign name and description.

  • status enum

    draft, active, paused, completed, archived.

  • lead_list_id integer|null

    Attached lead list.

  • settings object

    Reply handling and tracking toggles.

  • schedule object

    Sending window, days, timezone and limits.

  • stats object

    Lifetime counters and rates.

  • smtp_accounts object[]

    Email accounts the campaign sends from.

  • steps object[]

    Sequence steps with A/B variants (see Sequences).

GET /api/v1/campaigns

List campaigns

Returns your campaigns, newest first.

Scope: read Returns 200

Query parameters

  • status enum

    Filter by status.

  • search string

    Matches the campaign name.

  • sort string

    created_at, updated_at, name or status, prefix - for descending.

  • page integer

    Page number, starting at 1.

  • per_page integer

    Items per page, 1–100. Default 25.

curl "https://outreach.corammers.com/api/v1/campaigns?status=active" \
  -H "Authorization: Bearer $COLDREACH_API_KEY"
Response 200
{
    "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": "&laquo; Previous",
                "active": false
            },
            {
                "url": "https://outreach.corammers.com/api/v1/campaigns?page=1",
                "label": "1",
                "active": true
            },
            {
                "url": null,
                "label": "Next &raquo;",
                "active": false
            }
        ],
        "path": "https://outreach.corammers.com/api/v1/campaigns",
        "per_page": 25,
        "to": 1,
        "total": 1
    }
}
POST /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.

Scope: write Returns 201

Body parameters

  • name string required

    Campaign name.

  • description string

    Internal description.

  • tags string[]

    Campaign tags.

  • lead_list_id integer|null

    Lead list whose leads are enrolled when the campaign is activated.

  • smtp_account_ids integer[]

    Email accounts to send from (rotated automatically). Replaces the current set.

  • settings.stop_on_reply boolean

    Stop the sequence for a lead when they reply. Default true.

  • settings.stop_company_on_reply boolean

    Stop every lead from the same company domain on a reply. Default false.

  • settings.stop_on_auto_reply boolean

    Stop on out-of-office replies. Default true.

  • settings.open_tracking boolean

    Track opens. Default true.

  • settings.click_tracking boolean

    Track link clicks. Default false.

  • settings.unsubscribe_link boolean

    Add a one-click unsubscribe header. Default true.

  • schedule.timezone string

    IANA timezone, e.g. America/New_York. Default UTC.

  • schedule.send_window_start string

    Daily start time HH:MM. Default 08:00.

  • schedule.send_window_end string

    Daily end time HH:MM, later than the start. Default 18:00.

  • schedule.active_days integer[]

    ISO weekdays to send on, 1 = Monday … 7 = Sunday. Default [1,2,3,4,5].

  • schedule.daily_send_limit integer

    Max emails per day for the campaign. Default 200.

  • schedule.time_gap_minutes integer

    Minutes between sends. Default 5.

  • schedule.start_date date|null

    Optional first sending day YYYY-MM-DD.

  • schedule.end_date date|null

    Optional 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
    }
}'
Response 201
{
    "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"
    }
}
GET /api/v1/campaigns/{campaign}

Retrieve a campaign

Returns a campaign with its settings, schedule, stats, email accounts and sequence steps.

Scope: read Returns 200

Path parameters

  • campaign integer required

    Campaign ID.

curl "https://outreach.corammers.com/api/v1/campaigns/31" \
  -H "Authorization: Bearer $COLDREACH_API_KEY"
Response 200
{
    "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"
    }
}
PATCH /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.

Scope: write Returns 200

Path parameters

  • campaign integer required

    Campaign ID.

Body parameters

  • name string

    Campaign name.

  • description string

    Internal description.

  • tags string[]

    Campaign tags.

  • lead_list_id integer|null

    Lead list whose leads are enrolled when the campaign is activated.

  • smtp_account_ids integer[]

    Email accounts to send from (rotated automatically). Replaces the current set.

  • settings.stop_on_reply boolean

    Stop the sequence for a lead when they reply. Default true.

  • settings.stop_company_on_reply boolean

    Stop every lead from the same company domain on a reply. Default false.

  • settings.stop_on_auto_reply boolean

    Stop on out-of-office replies. Default true.

  • settings.open_tracking boolean

    Track opens. Default true.

  • settings.click_tracking boolean

    Track link clicks. Default false.

  • settings.unsubscribe_link boolean

    Add a one-click unsubscribe header. Default true.

  • schedule.timezone string

    IANA timezone, e.g. America/New_York. Default UTC.

  • schedule.send_window_start string

    Daily start time HH:MM. Default 08:00.

  • schedule.send_window_end string

    Daily end time HH:MM, later than the start. Default 18:00.

  • schedule.active_days integer[]

    ISO weekdays to send on, 1 = Monday … 7 = Sunday. Default [1,2,3,4,5].

  • schedule.daily_send_limit integer

    Max emails per day for the campaign. Default 200.

  • schedule.time_gap_minutes integer

    Minutes between sends. Default 5.

  • schedule.start_date date|null

    Optional first sending day YYYY-MM-DD.

  • schedule.end_date date|null

    Optional 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
    }
}'
Response 200
{
    "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"
    }
}
DELETE /api/v1/campaigns/{campaign}

Delete a campaign

Permanently deletes the campaign, its sequence, enrollments and event history. Leads are kept.

Scope: write Returns 200

Path parameters

  • campaign integer required

    Campaign ID.

curl -X DELETE "https://outreach.corammers.com/api/v1/campaigns/31" \
  -H "Authorization: Bearer $COLDREACH_API_KEY"
Response 200
{
    "message": "Campaign deleted.",
    "id": 31
}
POST /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.

Scope: write Returns 200

Path parameters

  • campaign integer required

    Campaign ID.

curl -X POST "https://outreach.corammers.com/api/v1/campaigns/31/activate" \
  -H "Authorization: Bearer $COLDREACH_API_KEY"
Response 200
{
    "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": []
}
POST /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.

Scope: write Returns 200

Path parameters

  • campaign integer required

    Campaign ID.

curl -X POST "https://outreach.corammers.com/api/v1/campaigns/31/pause" \
  -H "Authorization: Bearer $COLDREACH_API_KEY"
Response 200
{
    "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.

The sequence object

  • id integer

    Step ID.

  • order integer

    Position in the sequence, starting at 1.

  • type enum

    email or wait.

  • wait_days integer

    Days to wait after the previous step before this one runs.

  • subject, body string|null

    Content of the first active variant (email steps).

  • variants object[]

    A/B variants with weight, is_active and per-variant stats.

  • stats object

    Lifetime sent, opened, clicked, replied, bounced and rates.

GET /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.

Scope: read Returns 200

Path parameters

  • campaign integer required

    Campaign ID.

curl "https://outreach.corammers.com/api/v1/campaigns/31/sequence" \
  -H "Authorization: Bearer $COLDREACH_API_KEY"
Response 200
{
    "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"
            }
        ]
    }
}
POST /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.

Scope: write Returns 201

Path parameters

  • campaign integer required

    Campaign ID.

Body parameters

  • type enum required

    email or wait.

  • name string

    Optional label.

  • wait_days integer

    Days after the previous step (0–365). Default 0.

  • subject string

    Required for the first email step. On follow-ups, leave it out to reply in the same thread.

  • body string

    HTML or plain text. Required for email steps without variants.

  • variants object[]

    Up to 26 variants, each with subject, body, optional name, weight (1–10000, default 100), is_active and email_template_id.

  • email_template_id integer

    Build 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.

  • design object

    Branded layout for the email (same shape as a template's design). Also accepted on each item of variants.

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
        }
    ]
}'
Response 201
{
    "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"
    }
}
GET /api/v1/campaigns/{campaign}/sequence/steps/{step}

Retrieve a step

Returns one step with its variants.

Scope: read Returns 200

Path parameters

  • campaign integer required

    Campaign ID.

  • step integer required

    Step ID.

curl "https://outreach.corammers.com/api/v1/campaigns/31/sequence/steps/88" \
  -H "Authorization: Bearer $COLDREACH_API_KEY"
Response 200
{
    "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"
    }
}
PATCH /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.

Scope: write Returns 200

Path parameters

  • campaign integer required

    Campaign ID.

  • step integer required

    Step ID.

Body parameters

  • name string|null

    Label.

  • wait_days integer

    Days after the previous step.

  • subject string

    New subject (single-variant email steps).

  • body string

    New 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."
}'
Response 200
{
    "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"
    }
}
DELETE /api/v1/campaigns/{campaign}/sequence/steps/{step}

Delete a step

Removes a step and its variants from the sequence.

Scope: write Returns 200

Path parameters

  • campaign integer required

    Campaign ID.

  • step integer required

    Step ID.

curl -X DELETE "https://outreach.corammers.com/api/v1/campaigns/31/sequence/steps/88" \
  -H "Authorization: Bearer $COLDREACH_API_KEY"
Response 200
{
    "message": "Step deleted.",
    "id": 88
}
POST /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.

Scope: write Returns 201

Path parameters

  • campaign integer required

    Campaign ID.

  • step integer required

    Step ID.

Body parameters

  • subject string

    Subject line. Required on the first email step; empty on a follow-up means “reply in thread”.

  • body string

    HTML or plain text. Required unless email_template_id is given.

  • email_template_id integer

    Copy the subject and body from one of your templates (fields you send win).

  • name string

    Label. Defaults to the next letter, e.g. "Variant C".

  • weight integer

    1–10000. Default 100.

  • is_active boolean

    Default 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
}'
Response 201
{
    "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
        }
    }
}
PATCH /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.

Scope: write Returns 200

Path parameters

  • campaign integer required

    Campaign ID.

  • step integer required

    Step ID.

  • variant integer required

    Variant ID.

Body parameters

  • name string

    Label.

  • subject string

    Subject line.

  • body string

    HTML or plain text.

  • weight integer

    1–10000.

  • is_active boolean

    Enable 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
}'
Response 200
{
    "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
        }
    }
}
DELETE /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.

Scope: write Returns 200

Path parameters

  • campaign integer required

    Campaign ID.

  • step integer required

    Step ID.

  • variant integer required

    Variant ID.

curl -X DELETE "https://outreach.corammers.com/api/v1/campaigns/31/sequence/steps/88/variants/203" \
  -H "Authorization: Bearer $COLDREACH_API_KEY"
Response 200
{
    "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

  • id integer

    Unique identifier.

  • name string

    Template name.

  • category enum

    intro, follow_up, social_proof, meeting, breakup or other.

  • description string|null

    When to use it.

  • subject string

    Subject line. Empty means a follow-up that replies in the same thread.

  • body string

    HTML body with {{ variables }}.

  • is_starter boolean

    One of the templates every account starts with.

  • used_in_variants integer

    How many sequence variants were built from it.

GET /api/v1/email-templates

List templates

Returns your email templates.

Scope: read Returns 200

Query parameters

  • category enum

    Only templates of this category.

  • search string

    Matches the template name.

  • sort string

    created_at, updated_at, name or category, prefix - for descending.

  • page integer

    Page number, starting at 1.

  • per_page integer

    Items per page, 1–100. Default 25.

curl "https://outreach.corammers.com/api/v1/email-templates" \
  -H "Authorization: Bearer $COLDREACH_API_KEY"
Response 200
{
    "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": "&laquo; Previous",
                "active": false
            },
            {
                "url": "https://outreach.corammers.com/api/v1/email-templates?page=1",
                "label": "1",
                "active": true
            },
            {
                "url": null,
                "label": "Next &raquo;",
                "active": false
            }
        ],
        "path": "https://outreach.corammers.com/api/v1/email-templates",
        "per_page": 25,
        "to": 1,
        "total": 1
    }
}
GET /api/v1/email-templates/{template}

Retrieve a template

Returns one template.

Scope: read Returns 200

Path parameters

  • template integer required

    Template ID.

curl "https://outreach.corammers.com/api/v1/email-templates/14" \
  -H "Authorization: Bearer $COLDREACH_API_KEY"
Response 200
{
    "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"
    }
}
POST /api/v1/email-templates

Create a template

Saves a reusable email.

Scope: write Returns 201

Body parameters

  • name string required

    Template name.

  • body string required

    HTML or plain text with {{ variables }}.

  • subject string

    Subject line. Leave empty for a follow-up that replies in the thread.

  • category enum

    Default other.

  • description string

    When to use it.

  • design object

    Optional 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 of value/label), footer_address, website_url, linkedin_url. null for 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>"
}'
Response 201
{
    "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"
    }
}
PATCH /api/v1/email-templates/{template}

Update a template

Changes a template. Variants already built from it are not changed.

Scope: write Returns 200

Path parameters

  • template integer required

    Template ID.

Body parameters

  • name string

    New name.

  • subject string|null

    New subject.

  • body string

    New body.

  • category enum

    New category.

  • description string|null

    New 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"
}'
Response 200
{
    "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"
    }
}
DELETE /api/v1/email-templates/{template}

Delete a template

Deletes the template. Variants built from it keep their content.

Scope: write Returns 200

Path parameters

  • template integer required

    Template ID.

curl -X DELETE "https://outreach.corammers.com/api/v1/email-templates/14" \
  -H "Authorization: Bearer $COLDREACH_API_KEY"
Response 200
{
    "message": "Template deleted. Variants built from it keep their content.",
    "id": 14
}

The campaign lead object

  • enrollment_id integer

    Enrollment ID.

  • status enum

    active, paused, completed, replied, bounced, unsubscribed, removed.

  • current_step integer

    Order of the step the lead is on.

  • next_send_at datetime|null

    When the next email is scheduled (UTC).

  • assigned_smtp object|null

    Email account the lead is sent from.

GET /api/v1/campaigns/{campaign}/leads

List campaign leads

Returns the leads enrolled in a campaign with their sequence progress.

Scope: read Returns 200

Path parameters

  • campaign integer required

    Campaign ID.

Query parameters

  • status enum

    Filter by enrollment status.

  • step integer

    Only leads currently on this step.

  • search string

    Matches the lead's email, name or company.

  • sort string

    enrolled_at, next_send_at or created_at, prefix - for descending.

  • page integer

    Page number, starting at 1.

  • per_page integer

    Items per page, 1–100. Default 25.

curl "https://outreach.corammers.com/api/v1/campaigns/31/leads?status=active" \
  -H "Authorization: Bearer $COLDREACH_API_KEY"
Response 200
{
    "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": "&laquo; Previous",
                "active": false
            },
            {
                "url": "https://outreach.corammers.com/api/v1/campaigns/31/leads?page=1",
                "label": "1",
                "active": true
            },
            {
                "url": null,
                "label": "Next &raquo;",
                "active": false
            }
        ],
        "path": "https://outreach.corammers.com/api/v1/campaigns/31/leads",
        "per_page": 25,
        "to": 1,
        "total": 1
    }
}
POST /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.

Scope: write Returns 201

Path parameters

  • campaign integer required

    Campaign ID.

Body parameters

  • lead_ids integer[]

    Lead IDs. Required without lead_list_id.

  • lead_list_id integer

    Enroll 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
    ]
}'
Response 201
{
    "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"
            }
        }
    ]
}
DELETE /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.

Scope: write Returns 200

Path parameters

  • campaign integer required

    Campaign ID.

  • lead integer required

    Lead ID.

curl -X DELETE "https://outreach.corammers.com/api/v1/campaigns/31/leads/1842" \
  -H "Authorization: Bearer $COLDREACH_API_KEY"
Response 200
{
    "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"
        }
    }
}
POST /api/v1/campaigns/{campaign}/leads/{lead}/pause

Pause a lead

Pauses an active lead. Returns 409 if the lead is not active.

Scope: write Returns 200

Path parameters

  • campaign integer required

    Campaign ID.

  • lead integer required

    Lead ID.

curl -X POST "https://outreach.corammers.com/api/v1/campaigns/31/leads/1842/pause" \
  -H "Authorization: Bearer $COLDREACH_API_KEY"
Response 200
{
    "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"
        }
    }
}
POST /api/v1/campaigns/{campaign}/leads/{lead}/resume

Resume a lead

Resumes a paused lead and reschedules its current step inside the sending window.

Scope: write Returns 200

Path parameters

  • campaign integer required

    Campaign ID.

  • lead integer required

    Lead ID.

curl -X POST "https://outreach.corammers.com/api/v1/campaigns/31/leads/1842/resume" \
  -H "Authorization: Bearer $COLDREACH_API_KEY"
Response 200
{
    "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"
        }
    }
}
POST /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.

Scope: write Returns 200

Path parameters

  • campaign integer required

    Campaign ID.

  • lead integer required

    Lead ID.

curl -X POST "https://outreach.corammers.com/api/v1/campaigns/31/leads/1842/skip" \
  -H "Authorization: Bearer $COLDREACH_API_KEY"
Response 200
{
    "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

  • id integer

    Pipeline ID.

  • name string

    Pipeline name.

  • is_default boolean

    The default pipeline is listed first. Only one pipeline is default.

  • campaign_ids integer[]

    Campaigns feeding the pipeline: replies become opportunities.

  • stages object[]

    Ordered stages with color, is_won, is_lost, opportunities_count and opportunities_value.

GET /api/v1/pipelines

List pipelines

Returns every pipeline with its stages and deal counts. Not paginated.

Scope: read Returns 200
curl "https://outreach.corammers.com/api/v1/pipelines" \
  -H "Authorization: Bearer $COLDREACH_API_KEY"
Response 200
{
    "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"
        }
    ]
}
POST /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.

Scope: write Returns 201

Body parameters

  • name string required

    Pipeline name.

  • is_default boolean

    Make this the default pipeline.

  • campaign_ids integer[]

    Campaigns whose replies are added to this pipeline as opportunities.

  • stages object[]

    Custom stages in order, each with name, optional color (#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
        }
    ]
}'
Response 201
{
    "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"
    }
}
GET /api/v1/pipelines/{pipeline}

Retrieve a pipeline

Returns a pipeline with its stages and deal counts.

Scope: read Returns 200

Path parameters

  • pipeline integer required

    Pipeline ID.

curl "https://outreach.corammers.com/api/v1/pipelines/5" \
  -H "Authorization: Bearer $COLDREACH_API_KEY"
Response 200
{
    "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"
    }
}
PATCH /api/v1/pipelines/{pipeline}

Update a pipeline

Renames a pipeline or makes it the default.

Scope: write Returns 200

Path parameters

  • pipeline integer required

    Pipeline ID.

Body parameters

  • name string

    New name.

  • is_default boolean

    Make this the default pipeline.

  • campaign_ids integer[]

    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
    ]
}'
Response 200
{
    "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"
    }
}
DELETE /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.

Scope: write Returns 200

Path parameters

  • pipeline integer required

    Pipeline ID.

Query parameters

  • force boolean

    Also delete the pipeline's opportunities.

curl -X DELETE "https://outreach.corammers.com/api/v1/pipelines/5" \
  -H "Authorization: Bearer $COLDREACH_API_KEY"
Response 200
{
    "message": "Pipeline deleted.",
    "id": 5,
    "opportunities_deleted": 0
}
POST /api/v1/pipelines/{pipeline}/stages

Add a stage

Adds a stage at the end of the pipeline.

Scope: write Returns 201

Path parameters

  • pipeline integer required

    Pipeline ID.

Body parameters

  • name string required

    Stage name.

  • color string

    Hex color #RRGGBB. Default #6366f1.

  • is_won boolean

    Deals here count as won.

  • is_lost boolean

    Deals 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"
}'
Response 201
{
    "data": {
        "id": 44,
        "pipeline_id": 5,
        "name": "Negotiation",
        "color": "#c08532",
        "order": 8,
        "is_won": false,
        "is_lost": false
    }
}
PATCH /api/v1/pipelines/{pipeline}/stages/{stage}

Update a stage

Renames, recolors or re-flags a stage.

Scope: write Returns 200

Path parameters

  • pipeline integer required

    Pipeline ID.

  • stage integer required

    Stage ID.

Body parameters

  • name string

    Stage name.

  • color string

    Hex color #RRGGBB.

  • is_won boolean

    Deals here count as won.

  • is_lost boolean

    Deals 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)"
}'
Response 200
{
    "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
    }
}
DELETE /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.

Scope: write Returns 200

Path parameters

  • pipeline integer required

    Pipeline ID.

  • stage integer required

    Stage ID.

Query parameters

  • move_to_stage_id integer

    Stage 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"
Response 200
{
    "message": "Stage deleted.",
    "id": 40,
    "opportunities_moved": 3
}
POST /api/v1/pipelines/{pipeline}/stages/reorder

Reorder stages

Sets the stage order. stage_ids must contain every stage of the pipeline exactly once.

Scope: write Returns 200

Path parameters

  • pipeline integer required

    Pipeline ID.

Body parameters

  • stage_ids integer[] required

    All 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
    ]
}'
Response 200
{
    "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"
    }
}

The opportunity object

  • id integer

    Opportunity ID.

  • name string

    Deal name.

  • value, currency number|null, string

    Deal value and ISO 4217 currency.

  • close_date date|null

    Expected close date.

  • pipeline_id, pipeline_stage_id integer

    Where the deal sits.

  • lead_id, campaign_id integer|null

    Related lead and source campaign.

  • activity_log object[]

    History of creation and stage changes.

GET /api/v1/opportunities

List opportunities

Returns opportunities, newest first.

Scope: read Returns 200

Query parameters

  • pipeline_id integer

    Filter by pipeline.

  • pipeline_stage_id integer

    Filter by stage.

  • lead_id integer

    Filter by lead.

  • campaign_id integer

    Filter by source campaign.

  • status enum

    open, won or lost (based on the stage flags).

  • search string

    Matches the opportunity name.

  • sort string

    created_at, updated_at, name, value or close_date, prefix - for descending.

  • page integer

    Page number, starting at 1.

  • per_page integer

    Items 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"
Response 200
{
    "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": "&laquo; Previous",
                "active": false
            },
            {
                "url": "https://outreach.corammers.com/api/v1/opportunities?page=1",
                "label": "1",
                "active": true
            },
            {
                "url": null,
                "label": "Next &raquo;",
                "active": false
            }
        ],
        "path": "https://outreach.corammers.com/api/v1/opportunities",
        "per_page": 25,
        "to": 1,
        "total": 1
    }
}
POST /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.

Scope: write Returns 201

Body parameters

  • name string required

    Deal name.

  • lead_id integer required

    Lead the deal belongs to.

  • pipeline_id integer required

    Pipeline.

  • pipeline_stage_id integer

    Stage within the pipeline.

  • campaign_id integer

    Campaign that sourced the deal.

  • value number

    Deal value.

  • currency string

    ISO 4217 code. Default USD.

  • close_date date

    Expected close date YYYY-MM-DD.

  • notes string

    Free-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"
}'
Response 201
{
    "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"
    }
}
GET /api/v1/opportunities/{opportunity}

Retrieve an opportunity

Returns one opportunity with its stage and lead.

Scope: read Returns 200

Path parameters

  • opportunity integer required

    Opportunity ID.

curl "https://outreach.corammers.com/api/v1/opportunities/77" \
  -H "Authorization: Bearer $COLDREACH_API_KEY"
Response 200
{
    "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"
    }
}
PATCH /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.

Scope: write Returns 200

Path parameters

  • opportunity integer required

    Opportunity ID.

Body parameters

  • name string

    Deal name.

  • lead_id integer

    Lead.

  • pipeline_id integer

    Pipeline.

  • pipeline_stage_id integer

    Stage within the pipeline.

  • campaign_id integer|null

    Source campaign.

  • value number|null

    Deal value.

  • currency string

    ISO 4217 code.

  • close_date date|null

    Expected close date.

  • notes string|null

    Notes.

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."
}'
Response 200
{
    "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"
    }
}
POST /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.

Scope: write Returns 200

Path parameters

  • opportunity integer required

    Opportunity ID.

Body parameters

  • pipeline_stage_id integer required

    Target 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
}'
Response 200
{
    "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"
    }
}
DELETE /api/v1/opportunities/{opportunity}

Delete an opportunity

Permanently deletes a deal.

Scope: write Returns 200

Path parameters

  • opportunity integer required

    Opportunity ID.

curl -X DELETE "https://outreach.corammers.com/api/v1/opportunities/77" \
  -H "Authorization: Bearer $COLDREACH_API_KEY"
Response 200
{
    "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.

GET /api/v1/analytics/overview

Workspace overview

Email performance across all campaigns plus campaign, lead and pipeline totals.

Scope: read Returns 200

Query parameters

  • from date

    Start date YYYY-MM-DD (UTC). Omit for all time.

  • to date

    End 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"
Response 200
{
    "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
        }
    }
}
GET /api/v1/analytics/campaigns

Campaign comparison

Performance for every campaign side by side, paginated.

Scope: read Returns 200

Query parameters

  • from date

    Start date YYYY-MM-DD (UTC). Omit for all time.

  • to date

    End date YYYY-MM-DD, inclusive.

  • status enum

    Only campaigns with this status.

  • page integer

    Page number, starting at 1.

  • per_page integer

    Items per page, 1–100. Default 25.

curl "https://outreach.corammers.com/api/v1/analytics/campaigns?status=active" \
  -H "Authorization: Bearer $COLDREACH_API_KEY"
Response 200
{
    "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": "&laquo; Previous",
                "active": false
            },
            {
                "url": "https://outreach.corammers.com/api/v1/analytics/campaigns?page=1",
                "label": "1",
                "active": true
            },
            {
                "url": null,
                "label": "Next &raquo;",
                "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"
    }
}
GET /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).

Scope: read Returns 200

Path parameters

  • campaign integer required

    Campaign ID.

Query parameters

  • from date

    Start date YYYY-MM-DD (UTC). Omit for all time.

  • to date

    End date YYYY-MM-DD, inclusive.

curl "https://outreach.corammers.com/api/v1/analytics/campaigns/31" \
  -H "Authorization: Bearer $COLDREACH_API_KEY"
Response 200
{
    "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
            }
        ]
    }
}
GET /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.

Scope: read Returns 200

Query parameters

  • from date

    Start date YYYY-MM-DD (UTC). Omit for all time.

  • to date

    End date YYYY-MM-DD, inclusive.

  • campaign_id integer

    Limit 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"
Response 200
{
    "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
            }
        ]
    }
}
GET /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.

Scope: read Returns 200

Query parameters

  • from date

    Start date YYYY-MM-DD (UTC). Omit for all time.

  • to date

    End date YYYY-MM-DD, inclusive.

  • event_type enum

    Only this event type.

  • campaign_id integer

    Only this campaign.

  • lead_id integer

    Only this lead.

  • page integer

    Page number, starting at 1.

  • per_page integer

    Items per page, 1–100. Default 25.

curl "https://outreach.corammers.com/api/v1/analytics/events?event_type=replied" \
  -H "Authorization: Bearer $COLDREACH_API_KEY"
Response 200
{
    "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": "&laquo; Previous",
                "active": false
            },
            {
                "url": "https://outreach.corammers.com/api/v1/analytics/events?page=1",
                "label": "1",
                "active": true
            },
            {
                "url": null,
                "label": "Next &raquo;",
                "active": false
            }
        ],
        "path": "https://outreach.corammers.com/api/v1/analytics/events",
        "per_page": 25,
        "to": 1,
        "total": 1
    }
}
GET /api/v1/analytics/pipelines

Pipeline report

Deal counts and values per stage, open/won/lost totals and win rate for each pipeline.

Scope: read Returns 200

Query parameters

  • pipeline_id integer

    Only this pipeline.

curl "https://outreach.corammers.com/api/v1/analytics/pipelines" \
  -H "Authorization: Bearer $COLDREACH_API_KEY"
Response 200
{
    "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
                }
            ]
        }
    ]
}

Requests run against your live workspace. POST, PATCH and DELETE really change data.

Kept only in this browser tab and sent only to outreach.corammers.com.