BUSINESS · CRM & SUPPORT
Campaigns, leads, and the unified inbox under that person’s own access.
Each user connects their own account. Every call carries both identities — the agent and the person it is acting for — so the agent can never reach past what that individual can already do.
Tokens live in the vault and attach server-side at call time. The agent holds a session, not a secret, and revoking access does not mean rotating a key.
Who asked, which agent acted, which action ran, and the verdict that let it through — one audit trail across every integration, not one per vendor.
Each action is granted on its own. An agent allowed to read is not thereby allowed to write, and the scope beside each row is what the acting user must have connected for it to run at all.
lemlist_delete_activities_by_activityid_recording_transcriptWRITEDelete Activity Recording & Transcript via DELETE /activities/{activityId}/recording-transcript
lemlist_delete_campaigns_by_campaignid_leads_by_emailWRITEUnsubscribe Lead from Campaign via DELETE /campaigns/{campaignId}/leads/{email}
lemlist_delete_campaigns_by_campaignid_leads_by_leadidWRITEDelete or Unsubscribe Lead via DELETE /campaigns/{campaignId}/leads/{leadId}
lemlist_delete_companies_by_companyidWRITEDeletes a lemlist company. Refuses by default when contacts are still attached — pass `force=true` to detach them (the `companyId` field is unset on each contact) before deleting the company. **No CRM-side propagation:** only the lemlist record is removed. Designed for the contact-to-company remapping workflow: after reassigning the contacts of a duplicate company to the canonical one (via `POST /contacts/{idOrEmail}`), call this endpoint to drop the now-empty duplicate. via DELETE /companies/{companyId}
lemlist_delete_contacts_by_idoremailWRITEDeletes a lemlist contact resolved by its id (`ctc_xxx`) or email. Cascades to the contact's leads, opportunities, list associations, inbox conversations and activities. **No CRM-side propagation** — only the lemlist record is removed. Fails with `409 CONTACT_DELETE_BLOCKED` when the contact cannot be deleted right now — for example while an enrichment is still running (retry once it finishes); the response `error.message` states the specific reason. via DELETE /contacts/{idOrEmail}
lemlist_delete_database_personas_by_personaidWRITEPermanently deletes one of your team's personas. There is no undo. An unknown id, a persona belonging to another team, and the persona lemlist auto-generates from your AI business context all answer the same `404`: they are indistinguishable by design. This endpoint is in closed beta and answers `403` unless the beta is enabled for your team. via DELETE /database/personas/{personaId}
lemlist_delete_deliverability_alerts_by_alertidWRITEDelete Deliverability Alert via DELETE /deliverability/alerts/{alertId}
lemlist_delete_hooks_by_hookidWRITEDelete Webhook via DELETE /hooks/{hookId}
lemlist_delete_inbox_by_contactid_drafts_by_draftidWRITESoft-deletes a draft by setting its deletedAt timestamp. via DELETE /inbox/{contactId}/drafts/{draftId}
lemlist_delete_inbox_conversations_labels_by_contactidWRITERemoves one or more labels from one conversation. via DELETE /inbox/conversations/labels/{contactId}
lemlist_delete_leads_by_leadid_variablesWRITEErases the values of custom variables on a lead. via DELETE /leads/{leadId}/variables
lemlist_delete_schedules_by_scheduleidWRITEDelete Schedule via DELETE /schedules/{scheduleId}
lemlist_delete_sequences_by_sequenceid_steps_by_stepidWRITEDelete Sequence Step via DELETE /sequences/{sequenceId}/steps/{stepId}
lemlist_delete_sequences_by_sequenceid_steps_by_stepid_ab_testWRITEDeletes a variant of the A/B test and ends the test. Deleting `B` (default) drops variant B; deleting `A` promotes variant B to A. Requires the Email Pro plan. via DELETE /sequences/{sequenceId}/steps/{stepId}/ab-test
lemlist_delete_sequences_by_sequenceid_steps_by_stepid_branches_by_branchsequenceidWRITERemoves a branch and the whole sub-tree behind it - the branch's own sub-sequence, and every sequence only reachable through it. `removedSequenceIds` lists what was deleted alongside the branch entry; a sequence another step still points at is left alone. A step keeps at least one branch besides Else, and the Else branch itself is never removable. Removal is refused once leads have entered the campaign, and again while any lead sits anywhere inside the sub-tree. via DELETE /sequences/{sequenceId}/steps/{stepId}/branches/{branchSequenceId}
lemlist_delete_unsubscribes_by_emailWRITE(deprecated) Delete Unsubscribe Email via DELETE /unsubscribes/{email}
lemlist_delete_user_email_accounts_by_emailaccountidWRITEDisconnect Email Account via DELETE /user/email-accounts/{emailAccountId}
lemlist_delete_v2_unsubscribes_contacts_by_contactidWRITERemoves the unsubscribed (do-not-contact) flag from a contact. via DELETE /v2/unsubscribes/contacts/{contactId}
lemlist_delete_v2_unsubscribes_variables_by_valueWRITERemoves a variable from the unsubscribe list. Variables with a protected source (LEAD or ABUSE) cannot be re-subscribed. via DELETE /v2/unsubscribes/variables/{value}
lemlist_delete_watchlistWRITEDelete Signal Agent via DELETE /watchlist
lemlist_get_activitiesREADGet Many Activities via GET /activities
lemlist_get_campaignsREADGet Many Campaigns via GET /campaigns
lemlist_get_campaigns_by_campaignidREADGet Campaign via GET /campaigns/{campaignId}
lemlist_get_campaigns_by_campaignid_export_by_exportid_statusREADCheck the status of an asynchronous campaign export. via GET /campaigns/{campaignId}/export/{exportId}/status
lemlist_get_campaigns_by_campaignid_export_leadsREAD(deprecated) Export leads from a campaign with filtering options. Returns leads in CSV or JSON format based on their state (e.g., contacted, interested, replied, etc.). via GET /campaigns/{campaignId}/export/leads
lemlist_get_campaigns_by_campaignid_export_startREADStart an asynchronous export of all campaign statistics. The final export result is a CSV file. via GET /campaigns/{campaignId}/export/start
lemlist_get_campaigns_by_campaignid_leadsREADGet Campaign Leads via GET /campaigns/{campaignId}/leads
lemlist_get_campaigns_by_campaignid_schedulesREADGet Campaign Schedules via GET /campaigns/{campaignId}/schedules
lemlist_get_campaigns_by_campaignid_sequencesREADGet Campaign Sequences via GET /campaigns/{campaignId}/sequences
lemlist_get_campaigns_by_campaignid_statutesREADRetrieves validation statutes for a campaign, including errors that block launching and warnings about daily limits, DNS issues, etc. Uses the same validation engine as the lemlist UI. via GET /campaigns/{campaignId}/statutes
lemlist_get_campaigns_reportsREADRetrieve reports for one or multiple campaigns. Returns aggregated statistics and export status for the specified campaigns. via GET /campaigns/reports
lemlist_get_companiesREADGet Many Companies via GET /companies
lemlist_get_companies_by_companyid_notesREADGet Company Notes via GET /companies/{companyId}/notes
lemlist_get_contact_sourcingREADReads one contact-sourcing run — by its own id, or the latest run of an account. The HTTP status carries the run state: `200` the run completed and `contacts` is filled, `202` the run is still queued or going (poll again), `400` the run failed and `error` says why, `404` no such run. Exactly one of `runId` or `companyId` is required. via GET /contact-sourcing
lemlist_get_contactsREADRetrieves contacts by IDs/emails, or searches/lists contacts by name, email, contact list, campaign membership, or company link. When using `idsOrEmails`, returns an array of matching contacts directly. When using `search`, `email`, `listId`, `notInAnyCampaign`, any of the `company*` filters, or no filter at all, returns a paginated response with `data`, `total`, `limit`, and `offset` fields. You can combine filters together to narrow results (e.g. `listId` with `search`, or `notInAnyCampaign` with `companyId`). Calling the endpoint without any filter returns all contacts of the team, paginated. The `company*` filters (`companyId`, `companyDomain`, `companyLinkedinUrl`, `companySalesnavUrl`) are mutually exclusive — use only one at a time. `companyDomain` / `companyLinkedinUrl` / `companySalesnavUrl` are resolved to a `companyId` through the Companies collection; if no matching company exists, the endpoint returns an empty list with `total: 0` (not an error), which keeps automation flows simple. via GET /contacts
lemlist_get_contacts_by_idoremailREADGet Contact via GET /contacts/{idOrEmail}
lemlist_get_contacts_exportREADExports contacts or companies from a CRM list as a CSV file. The response is streamed as `text/csv` with a `Content-Disposition: attachment` header. The exported columns depend on the `entity` type: - **contact**: firstName, lastName, email, linkedinUrl, companyName, jobTitle, phone, status, owner, campaigns, contactLists, and more. - **company**: name, domain, linkedinUrl, industry, website, status, size, owner, numberOfContacts, companyLists, and more. Custom fields are included as additional columns. via GET /contacts/export
lemlist_get_contacts_listsREADRetrieves all static and dynamic contact lists for the team. Optionally filter by name. via GET /contacts/lists
lemlist_get_crm_filtersREADGet CRM Filters via GET /crm/filters
lemlist_get_database_filtersREADGet Database Filters via GET /database/filters
lemlist_get_database_personasREADLists the personas saved by your team. A persona is a named, reusable set of People Database filters; its id can then be referenced elsewhere in the API, for example through the `persona` filter of a Signal Agent. Personas are team-shared: every member sees the same list. Results are sorted by creation date, most recent first, and capped at 200. The auto-generated persona lemlist derives from your AI business context is never returned; only the personas your team created are. This endpoint is in closed beta and answers `403` unless the beta is enabled for your team. via GET /database/personas
lemlist_get_deliverability_alertsREADList Deliverability Alerts via GET /deliverability/alerts
lemlist_get_deliverability_alerts_by_alertidREADGet Deliverability Alert via GET /deliverability/alerts/{alertId}
lemlist_get_enrich_by_enrichidREADGet Enrichment Result via GET /enrich/{enrichId}
lemlist_get_fieldsREADList Fields via GET /fields
lemlist_get_hooksREADGet Many Webhooks via GET /hooks
lemlist_get_inboxREADGet Many Inboxes via GET /inbox
lemlist_get_inbox_by_contactidREADGet Contact Messages via GET /inbox/{contactId}
lemlist_get_inbox_by_contactid_draftsREADLists all non-deleted drafts for a specific contact. via GET /inbox/{contactId}/drafts
lemlist_get_inbox_by_contactid_drafts_by_draftidREADRetrieves a single draft with its full content, including attachments. via GET /inbox/{contactId}/drafts/{draftId}
lemlist_get_inbox_labelsREADList all labels available to your team. via GET /inbox/labels
lemlist_get_inbox_labels_by_labelidREADGet info of a specific label. via GET /inbox/labels/{labelId}
lemlist_get_leadsREADRetrieve a lead using either their email address or lead ID via GET /leads
lemlist_get_leads_by_emailREADGet Lead by Email via GET /leads/{email}
lemlist_get_lemwarm_by_usermailboxid_settingsREADGet lemwarm Settings via GET /lemwarm/{userMailboxId}/settings
lemlist_get_schedulesREADGet Many Schedules via GET /schedules
lemlist_get_schedules_by_scheduleidREADGet Schedule via GET /schedules/{scheduleId}
lemlist_get_sequences_by_sequenceid_steps_by_stepid_ab_testREADReturns variant B (subject, message, config) of the A/B test on a step. Requires the Email Pro plan. via GET /sequences/{sequenceId}/steps/{stepId}/ab-test
lemlist_get_sequences_by_sequenceid_steps_by_stepid_branchesREADEvery branch of a condition step, in execution order, with the Else branch last. A condition step holds an ordered list of branches, each owning the sub-sequence the leads it matches walk into. Array order is execution priority: the first branch whose test matches takes the lead, and the Else branch at the end catches everyone no branch matched. A branch is addressed by its `sequenceId`, never by position - a reorder moves positions, the sub-sequence id is what the runtime routes leads to. Reading branches is not gated; only the writes are in closed beta. via GET /sequences/{sequenceId}/steps/{stepId}/branches
lemlist_get_tasksREADRetrieve tasks with optional filtering and pagination. Tasks marked as `done` are excluded from results. via GET /tasks
lemlist_get_teamREADGet Team via GET /team
lemlist_get_team_creditsREADGet Team Credits via GET /team/credits
lemlist_get_team_crmusersREADGet Team CRM Users via GET /team/crmUsers
lemlist_get_team_sendersREADGet Team Senders via GET /team/senders
lemlist_get_unsubs_exportREAD(deprecated) Export Unsubscribes via GET /unsubs/export
lemlist_get_unsubscribesREAD(deprecated) Get Many Unsubscribes via GET /unsubscribes
lemlist_get_unsubscribes_by_emailREAD(deprecated) Get Unsubscribe by Email via GET /unsubscribes/{email}
lemlist_get_user_channelsREADGet User Channels via GET /user/channels
lemlist_get_users_by_useridREADGet User via GET /users/{userId}
lemlist_get_v2_campaigns_by_campaignid_export_leadsREADExport leads from a campaign with filtering options. Returns leads in CSV or JSON format based on their state (e.g., contacted, interested, replied, etc.). via GET /v2/campaigns/{campaignId}/export/leads
lemlist_get_v2_campaigns_by_campaignid_statsREADRetrieve detailed statistics for a specific campaign, with filtering options by date, user, A/B testing, and communication channels. via GET /v2/campaigns/{campaignId}/stats
lemlist_get_v2_unsubscribes_contacts_by_contactidREADChecks whether a contact is unsubscribed (do-not-contact). via GET /v2/unsubscribes/contacts/{contactId}
lemlist_get_v2_unsubscribes_exports_contactsREADExports all contacts with their subscription status to a CSV file. via GET /v2/unsubscribes/exports/contacts
lemlist_get_v2_unsubscribes_exports_variablesREADExports all unsubscribed variables to a CSV file. via GET /v2/unsubscribes/exports/variables
lemlist_get_v2_unsubscribes_variablesREADRetrieves a paginated list of all unsubscribed variables (emails, domains, LinkedIn URLs, phone numbers). via GET /v2/unsubscribes/variables
lemlist_get_v2_unsubscribes_variables_by_valueREADRetrieves a specific unsubscribed variable by its value. via GET /v2/unsubscribes/variables/{value}
lemlist_get_watchlistREADList Signal Agents via GET /watchlist
lemlist_get_watchlist_filter_valuesREADAutocomplete filter values via GET /watchlist/filter-values
lemlist_get_watchlist_filtersREADList allowed filters per signal type via GET /watchlist/filters
lemlist_get_watchlist_historyREADGet Signal Agent configuration history via GET /watchlist/history
lemlist_get_watchlist_libraryREADList available signal types via GET /watchlist/library
lemlist_get_watchlist_signalsREADGet Signal Agent signals via GET /watchlist/signals
lemlist_patch_campaigns_by_campaignidWRITEUpdate Campaign via PATCH /campaigns/{campaignId}
lemlist_patch_campaigns_by_campaignid_leads_by_leadidWRITEUpdate Lead in a Campaign via PATCH /campaigns/{campaignId}/leads/{leadId}
lemlist_patch_deliverability_alerts_by_alertidWRITEUpdate Deliverability Alert via PATCH /deliverability/alerts/{alertId}
lemlist_patch_inbox_by_contactid_drafts_by_draftidWRITEPartially updates an existing draft. Only the provided fields will be updated. via PATCH /inbox/{contactId}/drafts/{draftId}
lemlist_patch_leads_by_leadid_variablesWRITEUpdate values of custom variables for a lead. via PATCH /leads/{leadId}/variables
lemlist_patch_lemwarm_by_usermailboxid_settingsWRITEUpdate lemwarm Settings via PATCH /lemwarm/{userMailboxId}/settings
lemlist_patch_schedules_by_scheduleidWRITEUpdate Schedule via PATCH /schedules/{scheduleId}
lemlist_patch_sequences_by_sequenceid_steps_by_stepidWRITEUpdate Sequence Step via PATCH /sequences/{sequenceId}/steps/{stepId}
lemlist_patch_sequences_by_sequenceid_steps_by_stepid_ab_testWRITEEdits variant B content/config of the A/B test on a step. Only the provided fields are updated; unknown fields are rejected. Allowed while the campaign is running. Requires the Email Pro plan. via PATCH /sequences/{sequenceId}/steps/{stepId}/ab-test
lemlist_patch_sequences_by_sequenceid_steps_by_stepid_branchesWRITERewrites the execution priority of a condition step's branches. Order is priority: the first branch whose test matches takes the lead. `order` must list every non-fallback branch of the step exactly once. The Else branch is not orderable and always stays last, so it is left out of the list. Sending the order the step already has is a no-op that still returns the branches. via PATCH /sequences/{sequenceId}/steps/{stepId}/branches
lemlist_patch_sequences_by_sequenceid_steps_by_stepid_branches_by_branchsequenceidWRITERenames a branch and/or changes what it tests. Send only the halves you want to change. The two halves are gated differently once leads have entered the campaign: a rename still goes through, while re-selecting what the branch tests is refused with `409`. A body that does both on a running campaign is refused whole - the request is atomic, so the rename does not land either. Send the rename on its own if that is what you need. `conditionKey` is refused: every branch of a step shares the step's condition. The Else branch is neither renamable nor editable. via PATCH /sequences/{sequenceId}/steps/{stepId}/branches/{branchSequenceId}
lemlist_patch_tasksWRITEUpdate task details such as assignment, due date, title, message, priority, or completion status. via PATCH /tasks
lemlist_patch_watchlistWRITEUpdate Signal Agent via PATCH /watchlist
lemlist_post_campaignsWRITECreate Campaign via POST /campaigns
lemlist_post_campaigns_by_campaignid_duplicateWRITEDuplicate Campaign via POST /campaigns/{campaignId}/duplicate
lemlist_post_campaigns_by_campaignid_leadsWRITECreate Lead in Campaign via POST /campaigns/{campaignId}/leads
lemlist_post_campaigns_by_campaignid_leads_by_leadidoremail_interestedWRITEMark Lead as Interested in Campaign via POST /campaigns/{campaignId}/leads/{leadIdOrEmail}/interested
lemlist_post_campaigns_by_campaignid_leads_by_leadidoremail_notinterestedWRITEMark Lead as Not Interested in Campaign via POST /campaigns/{campaignId}/leads/{leadIdOrEmail}/notinterested
lemlist_post_campaigns_by_campaignid_leads_by_leadidoremail_steps_by_stepid_skipWRITESkip one step of a running campaign for a single lead. Cannot be undone. via POST /campaigns/{campaignId}/leads/{leadIdOrEmail}/steps/{stepId}/skip
lemlist_post_campaigns_by_campaignid_leads_importWRITEImport Leads from CRM via POST /campaigns/{campaignId}/leads/import
lemlist_post_campaigns_by_campaignid_pauseWRITEPause Campaign via POST /campaigns/{campaignId}/pause
lemlist_post_campaigns_by_campaignid_schedules_by_scheduleidWRITEAssociate Schedule with Campaign via POST /campaigns/{campaignId}/schedules/{scheduleId}
lemlist_post_campaigns_by_campaignid_startWRITEStart Campaign via POST /campaigns/{campaignId}/start
lemlist_post_campaigns_by_campaignid_steps_by_stepid_skipWRITESkip one step of a running campaign for every lead. Cannot be undone. via POST /campaigns/{campaignId}/steps/{stepId}/skip
lemlist_post_companiesWRITECreates a new company or updates an existing one (upsert). If a company with the same domain, LinkedIn URL, or Sales Navigator URL already exists, it will be updated with the provided non-empty fields. Null or empty values are ignored during updates to preserve existing data. You can target an existing company directly by providing `companyId`, bypassing domain/LinkedIn matching — in that case `name` and `domain` become optional. via POST /companies
lemlist_post_companies_by_companyid_notesWRITECreate Company Note via POST /companies/{companyId}/notes
lemlist_post_companies_mergeWRITEMerges up to 10 lemlist companies into one. The survivor (`primaryId`) keeps its id and every value it holds; its empty fields are filled from the other companies, which are then deleted. Everything attached to a deleted company (contacts, activities, tasks, list memberships) is moved to the survivor. When a CRM is connected, the survivor keeps its CRM link (or adopts the first linked record's when it has none) and receives the merged values there; lemlist never merges or deletes anything in the CRM itself, so the other records' CRM entries stay in the CRM, unlinked from lemlist — merge them CRM-side too, or a CRM import may recreate the duplicate. The companies are folded into the survivor one at a time and the run **stops at the first failure**: `mergedIds` lists what went through, `remainingIds` what still exists. A first-fold failure returns an error instead — nothing was written. **No undo:** deleted companies are gone. via POST /companies/merge
lemlist_post_contact_sourcingWRITEStarts an AI contact-sourcing run for one or more accounts: sources each company's employees from the People Database and classifies them into a buying committee (decision maker / user / influencer) with an ICP fit score. One account or two hundred, same call — pass a list of one. Runs are asynchronous: the response carries a `runId` per account. Poll `GET /contact-sourcing` or subscribe to the `contactSourcingDone` webhook for the result. The call answers `200` even when some accounts could not be started — one unrunnable account among 200 is not a reason to fail the rest. Read both `results` and `errors`. By default an account that already has a committee is not re-run: its previous run comes back with `status: "reused"` and nothing is charged. `overwrite: true` forces a fresh run, but never stacks a second one on a run still going — that one is returned as `reused` instead, so retrying a timed-out request cannot charge you twice. Takes lemlist company ids only. To start from a domain or LinkedIn URL, resolve it first with `GET /companies?idsOrDomains=`. via POST /contact-sourcing
lemlist_post_contact_sourcing_contactsWRITETurns one contact-sourcing recommendation into a lemlist contact. `leadId` comes from a run's `contacts[].leadId` — a People-Database id, not a contact id. `companyId` is required and verified: if the person's profile now puts them at a different company, the contact is not filed under the account asked for and the call answers 409. via POST /contact-sourcing/contacts
lemlist_post_contactsWRITECreates a new contact or updates an existing one (upsert). If a contact with the same email, LinkedIn URL, or Sales Navigator URL already exists, it will be updated with the provided non-empty fields. Null or empty values are ignored during updates to preserve existing data. You can target an existing contact directly by providing `contactId`, bypassing email/LinkedIn matching. You can optionally link the contact to a company by providing `companyId`, `companyDomain`, or `companyLinkedinUrl`. via POST /contacts
lemlist_post_contacts_listsWRITECreates a new static contact list. After creating the list, use `POST /contacts/lists/{listId}/entities` to add contacts to it. via POST /contacts/lists
lemlist_post_contacts_lists_by_listid_entitiesWRITEAdds existing CRM contacts to a static contact list, or removes them when `?action=remove` is set. - **Add** (default): send a `POST` with a `contactIds` body. Contacts already in the list are silently skipped (no duplicates) and reported in `alreadyInList`. - **Remove**: send a `POST` with `?action=remove` and a `contactIds` body. Contacts that are not in the list are silently skipped; `removedCount` reflects the associations actually removed. This only affects list membership, the contacts are not deleted from your CRM. The list must be a **static** contact list (`clt_xxx`). Dynamic lists (auto-populated by filter rules) and company lists are rejected. **Removal uses `POST ?action=remove` on purpose:** a `DELETE` request body is dropped by our stack, so `DELETE` on this path is **not supported** and returns `405 Method Not Allowed`. via POST /contacts/lists/{listId}/entities
lemlist_post_contacts_mergeWRITEMerges up to 10 lemlist contacts into one. The survivor (`primaryId`) keeps its id and every value it holds; its empty fields are filled from the other contacts, which are then deleted. Everything attached to a deleted contact (leads in campaigns, activities, tasks, list memberships, inbox conversations) is moved to the survivor. When a CRM is connected, the survivor keeps its CRM link (or adopts the first linked record's when it has none) and receives the merged values there; lemlist never merges or deletes anything in the CRM itself, so the other records' CRM entries stay in the CRM, unlinked from lemlist — merge them CRM-side too, or a CRM import may recreate the duplicate. The contacts are folded into the survivor one at a time and the run **stops at the first failure**: `mergedIds` lists what went through, `remainingIds` what still exists. A first-fold failure returns an error instead — nothing was written. **Email addresses:** the survivor keeps its own; a loser's addresses are dropped, unless the survivor has none (then it takes the first loser's). **No undo:** deleted contacts are gone. via POST /contacts/merge
lemlist_post_database_companiesWRITESearch the lemlist Companies database using structured filters with pagination support. Returns comprehensive company data including technologies used, location, employee count, and other business intelligence. via POST /database/companies
lemlist_post_database_peopleWRITEThis endpoint allows you to query our People database. To do so, you may use the following parameters: filters (required), page (optional), size (optional), and excludes (optional). Each filter should have the following properties: filterId (filter identifier), in (list of the values you want to include), and out (list of the values you want to exclude). To know which filters you are able to use, refer to the GET Filters section. The `department` filter accepts the following values: `Sales`, `Customer service`, `Engineering`, `Marketing`, `Operations`, `Human Resources`, `Finance / Legal / Admin`, `Other`. via POST /database/people
lemlist_post_database_personasWRITECreates a persona for your team from a name and a set of People Database filters. Use [Get Database Filters](/api-reference/endpoints/people-database/get-database-filters) to discover the valid `filterId` values. Filters carry no `type` property: it is derived from `filterId` server-side. Filters that require a plan your team does not have are dropped silently, so the persona is stored with the subset your plan allows. Only the created id is returned. The stored `name` and `filters` are sanitized and plan-gated server-side, so echoing the request payload back would misreport what was persisted; call [List Personas](/api-reference/endpoints/people-database/list-personas) to read the stored persona. This endpoint is in closed beta and answers `403` unless the beta is enabled for your team. via POST /database/personas
lemlist_post_deliverability_alertsWRITECreate Deliverability Alert via POST /deliverability/alerts
lemlist_post_enrichWRITEEnrich Data via POST /enrich
lemlist_post_hooksWRITEAdd Webhook via POST /hooks
lemlist_post_inbox_by_contactid_draftsWRITECreates a new draft for a specific contact. The source is automatically set to "api". via POST /inbox/{contactId}/drafts
lemlist_post_inbox_conversations_labels_by_contactidWRITEAttaches one or more labels to one or more conversations. via POST /inbox/conversations/labels/{contactId}
lemlist_post_inbox_emailWRITESend Email via POST /inbox/email
lemlist_post_inbox_labelsWRITECreates a new label available to the team. via POST /inbox/labels
lemlist_post_inbox_linkedinWRITESend LinkedIn Message via POST /inbox/linkedin
lemlist_post_inbox_smsWRITESends an SMS to a contact through the lemlist inbox. The message is sent to the contact's phone number (`phone` field, or the first entry of `phones`). Sending consumes SMS credits, one per message segment. via POST /inbox/sms
lemlist_post_inbox_whatsappWRITESend WhatsApp Message via POST /inbox/whatsapp
lemlist_post_leads_by_leadid_enrichWRITEEnrich Lead via POST /leads/{leadId}/enrich
lemlist_post_leads_by_leadid_variablesWRITEAdd custom variables to a lead and sets values for that specific lead. via POST /leads/{leadId}/variables
lemlist_post_leads_interested_by_leadidoremailWRITEMark a lead as interested across all campaigns via POST /leads/interested/{leadIdOrEmail}
lemlist_post_leads_notinterested_by_leadidoremailWRITEMark a lead as not interested across all campaigns via POST /leads/notinterested/{leadIdOrEmail}
lemlist_post_leads_pause_by_leadidWRITEPause Lead via POST /leads/pause/{leadId}
lemlist_post_leads_review_by_leadidWRITEUse this endpoint to launch a lead that is waiting for review, without having to enable campaign-wide auto-review. You're auto launching this specific lead, while still enforcing every other launch guard: the campaign must have no step errors, any AI variables required by the campaign must be valid for the lead, and a sender must be available. No need to enable autolaunch in the campaign. This endpoint requires an `emailPro` plan or higher. via POST /leads/review/{leadId}
lemlist_post_leads_start_by_leadidWRITEResume Paused Lead via POST /leads/start/{leadId}
lemlist_post_lemwarm_by_usermailboxid_pauseWRITEPause lemwarm via POST /lemwarm/{userMailboxId}/pause
lemlist_post_lemwarm_by_usermailboxid_startWRITEStart lemwarm via POST /lemwarm/{userMailboxId}/start
lemlist_post_schedulesWRITECreate Schedule via POST /schedules
lemlist_post_sequences_by_sequenceid_stepsWRITEAdd Step to Sequence via POST /sequences/{sequenceId}/steps
lemlist_post_sequences_by_sequenceid_steps_by_stepid_ab_testWRITECreates variant B of an A/B test on a step, prefilled from variant A, and starts the test (leads are split between A and B). Supported on `email`, `linkedinInvite`, and `linkedinSend` steps. Requires the Email Pro plan. via POST /sequences/{sequenceId}/steps/{stepId}/ab-test
lemlist_post_sequences_by_sequenceid_steps_by_stepid_ab_test_winnerWRITESelects the winning variant of the A/B test. The winning template is then sent to all remaining leads going through the campaign. Requires the Email Pro plan. via POST /sequences/{sequenceId}/steps/{stepId}/ab-test/winner
lemlist_post_sequences_by_sequenceid_steps_by_stepid_branchesWRITEAdds a branch to a condition step, just before the Else branch, and mints the empty sub-sequence it routes to. Add steps to that branch by calling `POST /sequences/{sequenceId}/steps` with the returned `sequenceId`. A branch carries the value it tests from the moment it is created - there are no blank branches - so the body must say what this one matches. The step's condition is shared by every branch and is never sent here: `conditionKey` in the body is refused. Only four conditions host several branches: `customLeadInfo`, `hasScore`, `hasEmailAddress` and `aircallDone`. Each needs its own tested value in the body, except `hasScore`, whose new branch inherits a complete `>= 80` band and can be added from an empty body. via POST /sequences/{sequenceId}/steps/{stepId}/branches
lemlist_post_tasksWRITECreate a manual task (opportunity) associated with a contact/company or lead. via POST /tasks
lemlist_post_tasks_ignoreWRITEIgnore Tasks via POST /tasks/ignore
lemlist_post_unsubscribes_by_emailWRITE(deprecated) Add Unsubscribe Email or Domain via POST /unsubscribes/{email}
lemlist_post_user_email_accountsWRITEConnect Email Account via POST /user/email-accounts
lemlist_post_user_email_accounts_by_emailaccountid_testWRITETest Email Account via POST /user/email-accounts/{emailAccountId}/test
lemlist_post_v2_campaigns_stats_batchWRITERetrieve detailed statistics for multiple campaigns in a single request, with filtering options by date, user, A/B testing, and communication channels. Processes up to 100 campaigns per request. via POST /v2/campaigns/stats/batch
lemlist_post_v2_enrichments_bulkWRITESend a batch of enrichment requests for multiple entities. Maximum 500 enrichment requests per call. via POST /v2/enrichments/bulk
lemlist_post_v2_unsubscribes_contacts_by_contactidWRITEMarks a contact as unsubscribed (do-not-contact). via POST /v2/unsubscribes/contacts/{contactId}
lemlist_post_v2_unsubscribes_variablesWRITEUnsubscribes up to 10,000 variables in a single request. via POST /v2/unsubscribes/variables
lemlist_post_v2_unsubscribes_variables_by_valueWRITEUnsubscribes a single variable. This operation is idempotent — if the variable is already unsubscribed, the existing record is returned. via POST /v2/unsubscribes/variables/{value}
lemlist_post_watchlistWRITECreate Signal Agent via POST /watchlist
lemlist_post_watchlist_by_watchlistid_external_signalsWRITEPush external signals via POST /watchlist/{watchListId}/external-signals
lemlist_put_campaigns_by_campaignid_export_by_exportid_email_by_emailWRITESet an email address for a given export. When the export is done, an email with the download URL will be sent to the address provided. via PUT /campaigns/{campaignId}/export/{exportId}/email/{email}
Put lemlist behind one governed endpoint.
Same permissions, same audit trail, whatever else you connect next.