# Sales Sequencer API > API docs for Sales Sequencer: run every campaign, mailbox and inbox action over HTTP. - [Introduction](https://docs.salessequencer.com/index.md): Run every campaign, lead, mailbox and inbox action over HTTP. - [Quickstart](https://docs.salessequencer.com/quickstart.md): Sign up, create a key and make your first request. - [Authentication](https://docs.salessequencer.com/authentication.md): Send your API key in the X-API-Key header. - [Use it with AI agents](https://docs.salessequencer.com/ai-agents.md): Let Claude, ChatGPT, n8n or your own agent run your campaigns and inbox. - [Workspaces and roles](https://docs.salessequencer.com/concepts/workspaces-and-roles.md): What a key can see and do, and how x-min-role and x-destructive work. - [Responses](https://docs.salessequencer.com/concepts/responses.md): How reads and actions answer, and how to tell success from refusal. - [Errors](https://docs.salessequencer.com/errors.md): Status codes the API returns and what to do about them. - [Limits](https://docs.salessequencer.com/limits.md): Caps on list sizes and bulk calls. - [Analytics for a date range](https://docs.salessequencer.com/api-reference/analytics/analytics-for-a-date-range.md): Daily and hourly sends/replies plus breakdowns by campaign, mailbox and domain. Dates are IST days. 'from' and 'to' take effect only when BOTH are given, otherwise the range preset applies (default 14d). The range is capped at 365 days and the end at today. A bad date returns 400 {error}. Cached abo… - [Dashboard summary](https://docs.salessequencer.com/api-reference/analytics/dashboard-summary.md): Workspace totals, today vs yesterday, mailbox fleet, unread counts, stage counts, 14-day series, latest positive replies and up to 6 campaigns. Days are IST. Cached about 20 seconds. Returns {empty: true} when the user has no workspace. - [List campaigns with stats](https://docs.salessequencer.com/api-reference/campaigns/list-campaigns-with-stats.md): All campaigns in the workspace, archived ones included (status "archived"), pinned first then newest first, with per-campaign counts and rates. Replies exclude automated/out-of-office. bounce_rate = bounced / reached (distinct leads sent to), the same number the web app shows; it counts real recipie… - [Create a campaign](https://docs.salessequencer.com/api-reference/campaigns/create-a-campaign.md): Creates a draft campaign in the current workspace. Sends nothing. Refuses an empty name (flash 'Campaign name is required', no campaign created). A non-numeric or negative min_gap_minutes silently falls back to 15. - [Archive a campaign](https://docs.salessequencer.com/api-reference/campaigns/archive-a-campaign.md): Sets status to archived: it never sends, cannot be launched, and the campaigns page lists it under Archived only. Leads, sends and replies are kept. Works from any status. - [Exempt a campaign from the bounce back-off](https://docs.salessequencer.com/api-reference/campaigns/exempt-a-campaign-from-the-bounce-back-off.md): Sets exempt_from_backoff. When true, this campaign's contacts are left out of the warm-up bounce back-off (the 6-hourly check that rewinds a warming mailbox's ramp when its 14-day bounce rate is 5% or more over at least 10 sends): its bounces and its sends count in neither the rate nor the sample. S… - [Clone a campaign](https://docs.salessequencer.com/api-reference/campaigns/clone-a-campaign.md): Creates a draft copy named ' (copy)' with the same sequence, schedule, cc/bcc and mailbox assignment. Leads are NOT copied. Sends nothing. - [Get one campaign in full](https://docs.salessequencer.com/api-reference/campaigns/get-one-campaign-in-full.md): Settings, sequence, stats, 30-day series, stage counts and assigned mailboxes. Cached up to 60 seconds per workspace (cache is dropped after campaign writes). 404 JSON if not in the workspace. - [Launch a campaign](https://docs.salessequencer.com/api-reference/campaigns/launch-a-campaign.md): Sets status to active so the scheduler starts sending real email to the campaign's pending contacts. Refuses with flash 'Cannot launch: no pending contacts. Upload leads first.' when there are none (status unchanged). - [Assign mailboxes to a campaign](https://docs.salessequencer.com/api-reference/campaigns/assign-mailboxes-to-a-campaign.md): Assigns the given mailboxes to the campaign. Ids from other workspaces and already-assigned ids are ignored. With no valid ids it flashes 'No mailboxes selected'. Note: a campaign with no assigned mailboxes sends from every active mailbox in the workspace, so assigning narrows the sender pool. - [Unassign a mailbox from a campaign](https://docs.salessequencer.com/api-reference/campaigns/unassign-a-mailbox-from-a-campaign.md): Removes one mailbox from the campaign's assignment (the mailbox itself is kept). If it was the last assigned mailbox the campaign falls back to all active workspace mailboxes. A missing or non-numeric mailbox_id does nothing. - [Pause a campaign](https://docs.salessequencer.com/api-reference/campaigns/pause-a-campaign.md): Sets status to paused so no further emails are sent. Works from any status. Nothing is deleted. - [Pin or unpin a campaign](https://docs.salessequencer.com/api-reference/campaigns/pin-or-unpin-a-campaign.md): Sets pinned. Pinned campaigns are listed first on the campaigns page and in GET /campaigns/list (newest first within pinned, then everything else newest first). The pin is workspace-wide, not per user. Omitting the field or sending false unpins. Nothing else about the campaign changes. 404 if the ca… - [Save sending schedule](https://docs.salessequencer.com/api-reference/campaigns/save-sending-schedule.md): Overwrites the campaign's sending schedule. Fields not sent are CLEARED, not kept: send_hour_start/end and send_tz_offset become null, send_days becomes every day, max_gap_minutes becomes null, cc and bcc become null. Only min_gap_minutes is kept when omitted or negative. The hour window is both-or-… - [Unarchive a campaign](https://docs.salessequencer.com/api-reference/campaigns/unarchive-a-campaign.md): Moves an archived campaign back to paused (it never resumes sending by itself; launch it to send again). No change if it is not archived. - [Add leads from a CSV file](https://docs.salessequencer.com/api-reference/leads/add-leads-from-a-csv-file.md): Bulk-adds leads to a campaign from a CSV: a multipart 'file' field, or raw CSV bytes as the body. The email column is found by its header (email, email_address or e-mail). Every other column becomes a personalization variable, header slugified, so a "Company Name" column becomes {{company_name}}. No… - [List a campaign's leads](https://docs.salessequencer.com/api-reference/leads/list-a-campaigns-leads.md): Paged, filterable lead list for one campaign. 404 JSON if the campaign is not in the workspace. (Prefixed with /list because POST /campaigns//leads already exists.) - [Re-queue leads blocked on our side](https://docs.salessequencer.com/api-reference/leads/re-queue-leads-blocked-on-our-side.md): Every lead in the campaign with status sender_blocked (a failed delivery caused by our sending side: the provider refused to send, our SPF/DKIM/DMARC failed, or our IP/domain reputation was blocked) goes back to pending: one sequence step back so the failed step is sent again, due now, bounce fields… - [Preview what a lead would receive next](https://docs.salessequencer.com/api-reference/leads/preview-what-a-lead-would-receive-next.md): Returns JSON (not HTML). Renders the lead's next email (personalization, then spintax) for its current sequence step. A/B variants and spintax are chosen randomly, so repeat calls can differ. Read only. 404 if the campaign or lead is not in the workspace. - [Send a one-off test email for a lead](https://docs.salessequencer.com/api-reference/leads/send-a-one-off-test-email-for-a-lead.md): Sends the exact subject/body supplied to the given address from the chosen mailbox. Sends REAL email. Writes no SendLog row, does not touch mailbox counters or the lead's status. Errors (JSON): 400 missing/invalid mailbox_id or recipient, 404 mailbox not in workspace, 502 send failed or mailbox auth… - [Get one lead](https://docs.salessequencer.com/api-reference/leads/get-one-lead.md): Full detail of one lead: custom fields, send history and linked inbox thread. 404 JSON if not in the workspace. - [Save the email sequence](https://docs.salessequencer.com/api-reference/sequence/save-the-email-sequence.md): Replaces the whole multi-step sequence (every step, each with A/B variants). Preferred input is sequence_json; if it is missing or not a JSON list, the flat repeatable subject/body/wait fields are used instead (one variant per step). A positive wait on step 2+ becomes a wait step of that many days;… - [Get the reply pipeline board](https://docs.salessequencer.com/api-reference/pipeline/get-the-reply-pipeline-board.md): Kanban of replied leads, one column per stage, max 60 cards per column (count is the true total). Cached about 20 seconds. - [Move a lead to a pipeline stage](https://docs.salessequencer.com/api-reference/pipeline/move-a-lead-to-a-pipeline-stage.md): Sets a contact's lead stage (board column). 400 (no flash) if the stage is not valid or contact_id is missing/zero; 404 if the contact is not in the workspace. - [Domain health overview](https://docs.salessequencer.com/api-reference/domains/domain-health-overview.md): Per-domain rollup of mailboxes, sending, DNS score, warmup health, blacklist and redirect state. Cached about 20 seconds. - [Refresh domain checks now](https://docs.salessequencer.com/api-reference/domains/refresh-domain-checks-now.md): Starts the blacklist and redirect checks in a background thread (about 15 seconds). Any logged-in user may call it (no role check beyond login). Results appear in GET /domains/list. - [Mark a reminder done](https://docs.salessequencer.com/api-reference/inbox/mark-a-reminder-done.md): Marks the reminder done. 404 if not in the workspace. - [List reply stages](https://docs.salessequencer.com/api-reference/inbox/list-reply-stages.md): Every lead_stage key, in the order the CRM board shows them, with its label and whether it counts as positive. - [Get one thread with messages](https://docs.salessequencer.com/api-reference/inbox/get-one-thread-with-messages.md): Full thread by id passed as a query parameter (SMTP thread ids contain special characters). SIDE EFFECT: opening a thread marks it read. 404 JSON if the id is blank or unknown. - [Save a reply draft](https://docs.salessequencer.com/api-reference/inbox/save-a-reply-draft.md): Stores (or overwrites) the single draft reply body for the thread. Sends nothing. - [Forward a thread's latest message](https://docs.salessequencer.com/api-reference/inbox/forward-a-threads-latest-message.md): Sends a REAL email (new thread, subject 'Fwd: ...') containing the optional note plus the latest message body, from the thread's mailbox. Refuses when to is empty or the mailbox cannot send. 404 if the thread is not in the workspace. - [Set a follow-up reminder on a thread](https://docs.salessequencer.com/api-reference/inbox/set-a-follow-up-reminder-on-a-thread.md): Adds a reminder. remind_at is parsed with ISO 8601; a blank or unparseable value is stored as no date (no error). - [Reply to a thread](https://docs.salessequencer.com/api-reference/inbox/reply-to-a-thread.md): Sends a REAL email from the thread's mailbox (Gmail API or SMTP), logs it as an outbound message, marks the thread read and deletes the saved draft. If cc or bcc is set, the prior thread messages are quoted below the body. Refuses (flash 'Could not send: ...') when to or body is empty, the thread ha… - [Set a thread's reply stage](https://docs.salessequencer.com/api-reference/inbox/set-a-threads-reply-stage.md): Manually sets the matched contact's reply stage. Always allowed (overrides the classifier). Does not fire the campaign_reply webhook. Refuses with flash when the stage is invalid or the thread is not matched to a campaign contact. - [Tag a thread](https://docs.salessequencer.com/api-reference/inbox/tag-a-thread.md): Adds a tag (max 64 chars) to the thread. Duplicate or empty tags do nothing. - [Remove a tag from a thread](https://docs.salessequencer.com/api-reference/inbox/remove-a-tag-from-a-thread.md): Removes the exact tag from the thread. A tag that is not there does nothing. - [List inbox threads](https://docs.salessequencer.com/api-reference/inbox/list-inbox-threads.md): Conversation list, newest first, capped at 500 (truncated flag). Defaults show positive replies from campaigns with automated replies hidden. Boolean flags are true only when the value is exactly '1'. Counts are computed before the stage filter. - [Get a thread's messages](https://docs.salessequencer.com/api-reference/inbox/get-a-threads-messages.md): Every message in one reply thread, oldest first. 404 if the thread isn't in the workspace. - [Apply one action to many mailboxes](https://docs.salessequencer.com/api-reference/mailboxes/apply-one-action-to-many-mailboxes.md): Applies action to the listed mailbox ids (ids outside the workspace are silently ignored). Actions: enable_sending, disable_sending, add_tag (needs tag), remove_tag (needs tag), set_name (needs first_name and/or last_name), remove (DELETES the mailboxes), enable_warmup, disable_warmup, warmup_links_… - [Connect Outlook mailboxes of a whole Microsoft tenant](https://docs.salessequencer.com/api-reference/mailboxes/connect-outlook-mailboxes-of-a-whole-microsoft-tenant.md): Connects Outlook / Microsoft 365 mailboxes without a per-mailbox sign-in. The tenant's admin must first approve the Up app's application permissions (Mail.Send, Mail.ReadWrite, User.Read.All) once, via https://login.microsoftonline.com//v2.0/adminconsent?client_id=&scope=https://grap… - [Connect a mailbox over SMTP](https://docs.salessequencer.com/api-reference/mailboxes/connect-a-mailbox-over-smtp.md): Logs in to the SMTP server first (no email is sent) and only saves the mailbox if the login works. If the email already exists in the workspace it is overwritten with the new credentials and set active; otherwise a new SMTP mailbox is created with warmup pool off. Refuses: invalid email, missing hos… - [List mailboxes (filtered, paged)](https://docs.salessequencer.com/api-reference/mailboxes/list-mailboxes-filtered-paged.md): All mailboxes in the workspace with today's send count, filters and facets. Facets are computed before filters. - [Try to reconnect every broken mailbox](https://docs.salessequencer.com/api-reference/mailboxes/try-to-reconnect-every-broken-mailbox.md): Runs the bulk reconnect over all needs_reconnect mailboxes in the current workspace. - [Get one mailbox in full](https://docs.salessequencer.com/api-reference/mailboxes/get-one-mailbox-in-full.md): Mailbox row plus 14-day send series, recent sends, recent errors, campaigns using it, recent replies, DNS check. 404 JSON if not in the workspace. - [Delete a mailbox](https://docs.salessequencer.com/api-reference/mailboxes/delete-a-mailbox.md): Permanently removes the mailbox. Contacts that referenced it as sender are detached (mailbox_id set to null) first. Unknown id flashes 'Mailbox not found.'; a mailbox in another workspace is 404. - [Queue a DNS recheck](https://docs.salessequencer.com/api-reference/mailboxes/queue-a-dns-recheck.md): Clears the mailbox's last DNS check time so the background job re-checks its DNS soon. Nothing is returned synchronously. - [Try to reconnect a mailbox](https://docs.salessequencer.com/api-reference/mailboxes/try-to-reconnect-a-mailbox.md): Re-tests the stored token (Google) or SMTP login. Outcomes: reconnected (status back to active), dead, or temporary error. For a dead Google mailbox it redirects to /mailboxes/connect, which is a browser-only OAuth consent flow and cannot be completed through the API. A dead SMTP mailbox flashes the… - [Get a mailbox's editable settings](https://docs.salessequencer.com/api-reference/mailboxes/get-a-mailboxs-editable-settings.md): The fields POST /mailboxes//settings edits, plus warmup toggles and SMTP details (no password). 404 JSON if not in the workspace. - [Update mailbox settings](https://docs.salessequencer.com/api-reference/mailboxes/update-mailbox-settings.md): Updates limits, sender identity, burst rate and fast bounce polling. Every field is optional: an omitted field is left as it is. A daily_limit that is not a whole number refuses the call (flash 'Daily limit must be a whole number.') and saves NOTHING; negative becomes 0. sends_per_tick (1-50, defaul… - [Add or remove a tag on a mailbox](https://docs.salessequencer.com/api-reference/mailboxes/add-or-remove-a-tag-on-a-mailbox.md): Adds or removes one tag. Tags are cleaned (quotes and backslashes dropped, max 40 chars, max 20 tags per mailbox). An empty tag after cleaning does nothing. - [Turn campaign sending on or off for a mailbox](https://docs.salessequencer.com/api-reference/mailboxes/turn-campaign-sending-on-or-off-for-a-mailbox.md): Sets or flips Mailbox.enabled (whether campaigns may send from it). Unrecognised or missing value flips the current state. 404 JSON if not found. - [Turn warmup on or off for a mailbox](https://docs.salessequencer.com/api-reference/warmup/turn-warmup-on-or-off-for-a-mailbox.md): Sets or flips warmup_pool_enabled (joins or leaves the workspace warmup pool, which sends warmup emails between pool mailboxes). First enable stamps the pool start date. Unrecognised or missing value flips the state. - [Turn link warmup on or off for a mailbox](https://docs.salessequencer.com/api-reference/warmup/turn-link-warmup-on-or-off-for-a-mailbox.md): Sets or flips warmup_links_enabled (warmup emails include links from the warmup link library). Unrecognised or missing value flips the state. - [List warmup links](https://docs.salessequencer.com/api-reference/warmup/list-warmup-links.md): The workspace's warmup link library. - [Add a warmup link](https://docs.salessequencer.com/api-reference/warmup/add-a-warmup-link.md): Adds an active link to the workspace's warmup link library. Refuses (flash 'Enter a valid http(s) link.') unless url starts with http:// or https:// and is at most 2000 chars. - [Remove a warmup link](https://docs.salessequencer.com/api-reference/warmup/remove-a-warmup-link.md): Deletes the link from the workspace library. An id that does not exist or belongs to another workspace does nothing (no error). - [Who am I](https://docs.salessequencer.com/api-reference/account/who-am-i.md): Current user, active workspace, role and capability flags. Side effect: creates the session CSRF token if missing. - [Inbox placement: seeds, recent tests, mailboxes](https://docs.salessequencer.com/api-reference/testing/inbox-placement:-seeds-recent-tests-mailboxes.md): The workspace's seed inboxes, the last 20 placement tests with per-seed results (landed_in: inbox, promotions, updates, other_tab, spam, other, missing, pending, send_failed, error; spf/dkim/dmarc verdicts) and a summary (inbox_pct counts inbox plus Gmail tabs over judged seeds), plus active mailbox… - [Run an inbox placement test](https://docs.salessequencer.com/api-reference/testing/run-an-inbox-placement-test.md): For each mailbox in mailbox_ids, sends ONE real email to every enabled seed (never to itself), spun from the Testing template unless subject/body are given, with a reference code on the last line. Seeds are read every 30s; anything not found after 15 minutes is missing. Test sends are not campaign s… - [Add a seed inbox](https://docs.salessequencer.com/api-reference/testing/add-a-seed-inbox.md): kind=imap adds a standalone seed (IMAP login is verified before saving; use an app password for Gmail/Yahoo/Outlook personal accounts). kind=mailbox makes a connected mailbox a seed (Gmail API, or its IMAP for SMTP mailboxes). provider is a free label; guessed from the domain when omitted. - [Remove a seed inbox](https://docs.salessequencer.com/api-reference/testing/remove-a-seed-inbox.md): Stops using this seed in new tests. Past results stay. - [Get the test-send page data](https://docs.salessequencer.com/api-reference/testing/get-the-test-send-page-data.md): Saved test template, active mailboxes, relay options and the 60 most recent test sends. Creates the default template if none exists. - [Send test emails](https://docs.salessequencer.com/api-reference/testing/send-test-emails.md): Saves the workspace test template (sender name, subject, body, recipients, mailbox), then sends REAL emails from the chosen active mailbox via Gmail. Spintax {a|b} is applied per recipient and {{sender_name}} is replaced with the From name. Recipients are split on comma, semicolon, whitespace, de-du… - [Upload my profile picture](https://docs.salessequencer.com/api-reference/profile/upload-my-profile-picture.md): Center-crops the image to a 256px square PNG and replaces the user's avatar. Accepts .jpg, .jpeg, .png, .webp, .gif, max 6000x6000 pixels (and the app's upload size cap). Refuses with a flash on no file, wrong type, empty file, oversize dimensions or unreadable image. - [Change my display name](https://docs.salessequencer.com/api-reference/profile/change-my-display-name.md): Sets the logged-in user's display name. A blank value clears it. - [Change my password](https://docs.salessequencer.com/api-reference/profile/change-my-password.md): Changes the logged-in user's password. Refuses (flash): new password under 6 characters, new and confirm differ, current password wrong or none set. - [Workspace settings: members, API keys, webhooks](https://docs.salessequencer.com/api-reference/team-&-workspaces/workspace-settings:-members-api-keys-webhooks.md): Lists the current workspace's members with roles, its API keys (label, prefix, created, last used; never the key itself) and its webhooks with their last delivery status. Admins only; others get allowed: false. - [List accessible workspaces](https://docs.salessequencer.com/api-reference/team-&-workspaces/list-accessible-workspaces.md): Every workspace the user can reach (super-admin sees all) with counts. - [Create a workspace](https://docs.salessequencer.com/api-reference/team-&-workspaces/create-a-workspace.md): Creates a workspace with a unique slug derived from the name and a default test template. Super-admin only. Empty name refuses with a flash. The creator is not added as a member by this code. - [List a workspace's members](https://docs.salessequencer.com/api-reference/team-&-workspaces/list-a-workspaces-members.md): Members with the membership ids the write routes need. Admin of THAT workspace or super-admin, else 403 JSON. 404 if the workspace does not exist. - [Add or update a team member](https://docs.salessequencer.com/api-reference/team-&-workspaces/add-or-update-a-team-member.md): Adds a member by email. If no user with that email exists, one is created with the given password (required then); if the user exists, the password is ignored. If already a member, their role is changed. Admin of THAT workspace or super-admin (403 otherwise). Refuses with flash: invalid email, inval… - [Remove a member from a workspace](https://docs.salessequencer.com/api-reference/team-&-workspaces/remove-a-member-from-a-workspace.md): Deletes the membership (the user account stays). Refuses to remove the only admin (flash). 400 if membership_id is missing, 404 if not in this workspace. Admin of that workspace or super-admin. - [Change a member's role](https://docs.salessequencer.com/api-reference/team-&-workspaces/change-a-members-role.md): Sets a membership's role. Refuses to demote the only admin (flash). 400 if membership_id is missing or not a number, 404 if the membership is not in this workspace. Admin of that workspace or super-admin. - [Create a webhook](https://docs.salessequencer.com/api-reference/webhooks/create-a-webhook.md): Subscribes a URL to the campaign_reply event (the only event; fixed in code). New campaign replies are POSTed to it from now on. Refuses (flash) unless url starts with http:// or https://. - [Delete a webhook](https://docs.salessequencer.com/api-reference/webhooks/delete-a-webhook.md): Permanently deletes the subscription. 404 if not in the current workspace. - [Enable or disable a webhook](https://docs.salessequencer.com/api-reference/webhooks/enable-or-disable-a-webhook.md): Flips the webhook's enabled flag (no way to set an explicit state). 404 if not in the current workspace. - [Create an API key](https://docs.salessequencer.com/api-reference/api-keys/create-an-api-key.md): Mints a workspace API key (sk_...). Only its hash is stored. The raw key appears exactly once, inside the flash message text; it cannot be recovered later. Admin of that workspace or super-admin. 404 if the workspace does not exist. - [Revoke an API key](https://docs.salessequencer.com/api-reference/api-keys/revoke-an-api-key.md): Marks the key revoked (it stops working immediately; not undoable). 404 if the key is not in this workspace. Admin of that workspace or super-admin. ## OpenAPI Specs - [openapi](/openapi.json) This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.