API review

lemlist API review

Multichannel outreach platform (email, LinkedIn, calls, SMS, WhatsApp) with a 650M+ lead database, credit-based waterfall enrichment, intent signal agents, a 211-endpoint REST API, an official OAuth MCP server and a CLI. Best for email + LinkedIn sequences with personalised images/liquid syntax built and launched by API.

Verified 25 Oct 2026 · 211 endpoints listed · Official MCP server

What a call costs

The actions you pay for, as lemlist prices them.

ActionCostPer
Lead data enrichment add-on$20/mo ($16 annual)2,000 credits/mo = 400 emails or 100 phones
Buying intent signals add-on$29/mo ($21 annual)100 signals/mo
Email / phone finder (waterfall)$1 in credits20 emails or 5 phone numbers (~5 credits/email, ~20 credits/phone, derived); charged only on success
SMS send6 creditsper SMS (API docs: one SMS credit per message segment)
Contact sourcing (buying-committee) run1 creditper successful run; reused runs free (API docs)
Extra email sender$9/moper email sender
Phone number (calls/SMS)$15/moper number; own number free; 400 free calling min/mo on Multichannel, 800 on Enterprise
WhatsApp add-on$20/moper user

Pricing, plan by plan

US dollars, as lemlist's pricing page shows them on 25 Oct 2026. Monthly and annual billing are shown apart.

Free tier 14-day trial of Multichannel features (no in-app calls) with 200 free credits (pricing FAQ). The same page also carries a conditional 'extended 30 day free trial' referral banner; treat 14 days as the standard trial.

Email

$69/mo

billed monthly

$55/mo

billed annually

unlimited users and email senders; priced by monthly email volume, entry tier 50,000 emails/mo; 650M+ leads database, email & phone finder (credits), lemlist MCP & CLI, CRM integrations & API; quarterly billing $62/mo

API included
Plan details

move up a volume tier (monthly / quarterly / yearly per month): 100k $89/$80/$71; 200k $159/$143/$127; 500k $359/$323/$287; 1M $659/$593/$527; custom via sales

Multichannel

$109/mo

billed monthly

$87/mo

billed annually

per user; quarterly billing $99/user/mo; 5 senders per user; unlimited emails & messages; LinkedIn automation, SMS (needs a $15/mo number, 6 credits per SMS), built-in dialer with 400 free calling min/mo; WhatsApp is an add-on

API included
Plan details

extra email sender $9/email/mo; WhatsApp add-on $20/user/mo; phone number $15/mo

Enterprise

Custom quote

custom; >=5 senders per user, use lemlist from your CRM, custom roles & permissions, SSO/SAML, dedicated account manager, priority support, 800 free calling min/mo

API included

Rate limits

20 requests per 2 seconds on all routes, per API key.

all plans

Per 2 Seconds
20
More on limitsLess

Responses carry Retry-After, X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset (a human-readable date string, not epoch).

How to get an API key

lemlist uses Basic auth. The steps below follow lemlist's own docs.

  1. Create a lemlist account. API access starts on the Email plan.
  2. app.lemlist.com -> Settings -> Integrations (Team > Integrations) -> Generate a new API key (shown once). One key = one account; agencies hold one key per client account.
  3. Send it with every request: header (Authorization: Basic base64); empty username, key as password.
  4. Make a first call: Delete Activity Recording & Transcript, Deletes the call recording and transcript associated with an activity. Keep the key in an environment variable, never in the command.
    curl -X DELETE "https://api.lemlist.com/api/activities/{activityId}/recording-transcript" \
      -u ":$LEMLIST_API_KEY"

Where the docs live

WhatWhere
Documentationdeveloper.lemlist.com/api-reference/getting-started/overview
API referencedeveloper.lemlist.com/llms.txt
OpenAPI specdeveloper.lemlist.com/api-reference/openapi/v2.json
llms.txtdeveloper.lemlist.com/llms.txt
Base URLhttps://api.lemlist.com/api
MCP serverhttps://app.lemlist.com/mcp
SDKs@lemlist-official/cli (npm, official; OAuth or API key, named profiles), lemlist agent skill / Claude Code /lemlist-agent command

Strengths and limits

Where it fits

  • Email + LinkedIn sequences with personalised images/liquid syntax built and launched by API
  • Agencies: one key per account, CLI named profiles per client team
  • Agent-driven outreach through the official MCP (OAuth, Claude/ChatGPT/Grok/Cursor)
  • Pulling leads from its own people/company database and enriching them inside the same tool

Where it falls short

  • Clients needing a clean single version: some endpoints still default to deprecated v1 unless version=v2
  • Teams needing per-action credit prices in the API docs (they appear only as pricing-page tooltips: $1 = 20 emails or 5 phones, 6 credits per SMS)
  • Very high-volume cold email on a budget (Email plan fixes volume per tier)

Worth knowing

  • Auth is HTTP BASIC with an EMPTY username: base64(':'+key). Bearer does not work.
  • v1 is deprecated but still the DEFAULT on some endpoints (e.g. Get Many Campaigns); pass version=v2 explicitly.
  • X-RateLimit-Reset is a human-readable date string, not a Unix timestamp.
  • Create Lead in Campaign never updates: an existing lead returns 400 LEAD_ALREADY_IN_CAMPAIGN; deduplicate=true gives 409 LEAD_ALREADY_IN_OTHER_CAMPAIGN (the campaign 'remove duplicates' setting does not drive this).
  • Any extra body key on lead create becomes a custom variable ({{var}}); characters other than letters, digits, _, -, space, # are replaced by _.
5 moreShow fewer
  • Company fields sent with a lead overwrite the SHARED company record every other lead reads; default updateStrategy=overwrite, and an empty value clears a stored field.
  • Webhook cap is 200 per workspace INCLUDING auto-disabled ones, and a URL can be registered only once.
  • When naming the MCP server for OAuth, don't include 'lemlist' in the name; lemlist refuses to register such client apps.
  • Credits are charged only on successful results and roll over while subscribed. Per-action credit costs are not in the API docs (the Credits object page is an image only); the pricing page tooltips give them: $1 in credits = 20 emails or 5 phones, 6 credits per SMS.
  • A request with no API key returns 400 'no api key provided', not 401.

Who should use it

Use lemlist for
Email + LinkedIn sequences with personalised images/liquid syntax built and launched by API
Look elsewhere for
Clients needing a clean single version: some endpoints still default to deprecated v1 unless version=v2

If lemlist is not the answer

Other Email sending tools in this directory, each with its own review.

Before you build

Four things to settle first, each read off lemlist's own pages.

  • Confirm the API is on your planAPI access starts on the Email plan. Free tier: 14-day trial of Multichannel features (no in-app calls) with 200 free credits (pricing FAQ).
  • Keep the key out of your codeBasic auth. It is sent as: header (Authorization: Basic base64); empty username, key as password.
  • Design around the rate limit20 requests per 2 seconds on all routes, per API key.
  • Know the catch before you scaleAuth is HTTP BASIC with an EMPTY username: base64(':'+key). Bearer does not work.

Want us to build it for you?

Tell us what you want lemlist to do in your stack. We will show you how we would wire it into your data, outbound or CRM, and what we would check first.

Read from lemlist.com/pricing, developer.lemlist.com/llms.txt and developer.lemlist.com/api-reference/getting-started/rate-. Verified 25 Oct 2026.

All 211 endpointsFor developers: method, path, what it does and what it costs.

Base URL: api.lemlist.com/api

Bulk and async: POST /v2/enrichments/bulk; all enrichment is async (poll GET /enrich/{enrichId} or use the enrichmentDone webhook); campaign/contact/database exports.

Webhooks: Events: contacted, hooked, attracted, warmed, interested, notInterested, emailsSent, emailsOpened, emailsClicked, emailsReplied, emailsBounced, emailsFailed and 67 more. max 200 webhooks per workspace (disabled ones count); a targetUrl can be registered only once regardless of type; webhooks auto-disable (not delete) on 404/410/DNS failure; needs 'Edit integrations' permission

211 endpoints
MethodPathWhat it doesCost
DELETE/activities/{activityId}/recording-transcriptDelete Activity Recording & Transcript, Deletes the call recording and transcript associated with an activity.Not stated
GET/activitiesGet Many Activities, Retrieves the history of all campaign activities and steps performed (optionally filtered by activity type and campaign).Not stated
POST/campaigns/{campaignId}/triggers/watch-listsAdd Signal Agent Trigger, Links a Signal Agent to a campaign as its signal trigger.Not stated
POST/campaignsCreate Campaign, Creates a new campaign with auto-generated sequence and schedule.Not stated
POST/campaigns/{campaignId}/duplicateDuplicate Campaign, Duplicates an existing campaign with all its sequences, schedules, and templates.Not stated
GET/v2/campaigns/{campaignId}/export/leadsExport Campaign Leads, Exports leads from a campaign with flexible filtering and format options.Not stated
GET/campaigns/{campaignId}/export/leadsExport Campaign Leads (legacy), Exports leads from a campaign with flexible filtering and format options.Not stated
POST/v2/campaigns/stats/batchGet Batch Campaign Stats, Retrieves performance statistics for multiple campaigns in a single request.Not stated
GETasync/campaigns/{campaignId}/export/{exportId}/statusGet Campaign Export Status, Checks the status of an asynchronous campaign export.Not stated
GET/campaigns/reportsGet Campaign Reports, Retrieves aggregated reports and statistics for one or multiple campaigns.Not stated
GET/v2/campaigns/{campaignId}/statsGet Campaign Stats, Retrieves performance statistics for a specific campaign.Not stated
GET/campaigns/{campaignId}/statutesGet Campaign Statutes, Retrieves validation statutes for a campaign, including errors that block launching and warnings about daily limits, DNS issues, etc.Not stated
GET/campaigns/{campaignId}Get Campaign, Retrieves detailed information about a specific campaign by ID.Not stated
GET/campaignsGet Many Campaigns, Retrieves a paginated list of all campaigns in your team.Not stated
POST/campaigns/{campaignId}/pausePause Campaign, Pauses a running campaign without affecting scheduled leads.Not stated
DELETE/campaigns/{campaignId}/triggers/watch-lists/{watchListId}Remove Signal Agent Trigger, Detaches a Signal Agent from a campaign's signal triggers.Not stated
PUT/campaigns/{campaignId}/export/{exportId}/email/{email}Set Email for Campaign Export Notification, Configures email notification delivery when a campaign export completes.Not stated
POST/campaigns/{campaignId}/steps/{stepId}/skipSkip Step for Everyone, Skips one step of a running campaign for every lead.Not stated
POST/campaigns/{campaignId}/steps/{stepId}/skip-for-leadsSkip Step for Leads, Skips one step of a running campaign for a list of leads.Not stated
GETasync/campaigns/{campaignId}/export/startStart Campaign Stats Export, Initiates an asynchronous export of campaign statistics to a CSV file.Not stated
POST/campaigns/{campaignId}/startStart Campaign, Starts or resumes a paused campaign.Not stated
PATCH/campaigns/{campaignId}Update Campaign, Updates the settings and configuration of an existing campaign.Not stated
POST/companies/crm/createCreate Companies in the CRM, Pushes companies to your connected CRM, linking each one to the CRM record found and creating it there when none matches.Not stated
POST/companies/listsCreate Company List, Creates a new static company list.Not stated
POST/companies/{companyId}/notesCreate Company Note, Creates a new note attached to a specific company.Not stated
DELETE/companies/{companyId}Delete Company, Deletes a lemlist company. Use `force=true` to detach attached contacts before deletion.Not stated
GET/companies/listsGet Company Lists, Retrieves all company lists for the team, with optional name filtering.Not stated
GET/companies/{companyId}/notesGet Company Notes, Retrieves all notes associated with a specific company.Not stated
GET/companies/{companyId}Get Company, Retrieves one company by its lemlist id (`cpn_xxx`), as a bare object. Answers 404 when no company of your team carries this id.Not stated
GET/companiesGet Many Companies, Retrieves companies from your CRM. Use `idsOrDomains` to fetch specific companies by ID or domain in a single request (max 100), `crmIds` to find them from their record id in your connected CRM, or omNot stated
POST/companies/lists/{listId}/entitiesAdd or Remove Companies in a List, Add companies to a static company list, or remove them with ?action=remove.Not stated
POST/companies/mergeMerge Companies, Merges up to 10 lemlist companies into one survivor, moving everything attached to the deleted companies onto it.Not stated
POST/companies/crm/search-and-connectSearch & Connect Companies in the CRM, Searches your connected CRM for companies and links each one to the CRM record found, without creating any CRM record.Not stated
POST/companiesAdd and update company, Creates a new company or updates an existing one based on domain or LinkedIn URL.Not stated
POST/contact-sourcing/contactsAdd a Sourced Contact, Turns one contact-sourcing recommendation into a lemlist contact.findEmail=true spends enrichment credits (off by default)
GETasync/contact-sourcingGet Contact Sourcing Run, Reads a contact-sourcing run by ID, or the latest run of an account.Not stated
POSTasync/contact-sourcingRun Contact Sourcing, Starts an AI contact-sourcing run for one or more accounts.1 credit per run, charged when the run succeeds; a reused run (status 'reused') is free
POST/contacts/listsCreate Contact List, Creates a new static contact list.Not stated
POST/contacts/{idOrEmail}/notesCreate Contact Note, Writes a note on a specific contact, as a note written in the lemlist app, pushed to your connected CRM.Not stated
POST/contacts/crm/createCreate Contacts in the CRM, Pushes contacts to your connected CRM, linking each one to the CRM record found and creating it there when none matches.Not stated