# SalesShift Documentation > SalesShift is a sales and marketing platform: CRM, prospecting, sequences, > deliverability, contracts, quotes and invoicing, calendar, messaging and > calls, behind one REST API. Paid plans run on VxCloud's own sending > infrastructure, prospect data and models; the free Self-Hosted plan runs the > same application on the tenant's own node, mailboxes and model key. Base paths: /api/v1/salesshift (322 operations) and /api/v1/messaging (57 operations). Auth: `Authorization: Bearer ` or `X-API-Key: xc__...`. A JWT comes from POST /api/v1/auth/login. There is no OpenAPI document: the service runs with openapi_url=None, so /openapi.json and /docs are 404. Plan gating: a workspace with no subscription resolves to the free Self-Hosted plan, not to a lock-out. Operations that would spend something the plan does not include answer HTTP 402 with a detail string written to be shown to the user — GET /api/v1/salesshift/billing/entitlements says what this workspace may do before you call anything. Two paths refuse inside a 200 body instead of raising, because both run in loops over many rows: POST /api/v1/salesshift/email/send answers 200 with status "failed" and provider "refused" (the reason in "error"), and POST /api/v1/salesshift/ai/write-email answers 200 with source "template" and the reason in "reason". Check those fields, not the status code. The free Self-Hosted plan's allowances are flat workspace totals, not per seat: 5,000 prospect reveals a month, unlimited stored contacts, 2 users, 2 sending identities (published but not enforced on connect). allowance.emails and allowance.ai are 0 on that plan and that is not a limit — it means the mail leaves the tenant's own mailbox and the model call bills to the tenant's own key, so there is nothing for us to meter. managed.sending and managed.ai being false is the field that says so. Paid-plan allowances are per seat and pooled across the workspace. Every route below carries a realness marker: live-call called against a running server while these docs were written session-verified verified working in the session that produced the inventory code-only read in source, not executed — undemonstrated, not broken known-unproven one of the two items listed under Known unproven ## Start here - [Overview](https://localhost:3021/docs): What SalesShift is, how bring-your-own-keys works, and a five-minute quickstart you can paste into a terminal. ## Reference - [REST API](https://localhost:3021/docs/api): Every operation on the SalesShift and messaging APIs, grouped by domain. - [vxcli](https://localhost:3021/docs/cli): The vxcli salesshift command group, flag by flag. - [SDKs](https://localhost:3021/docs/sdks): The Python, TypeScript, Go, C++ and Java clients, and exactly which endpoints each one covers. ## Guides - [All guides](https://localhost:3021/docs/guides): Task-shaped walkthroughs that use more than one endpoint. - [Prospect to sequence](https://localhost:3021/docs/guides/prospect-to-sequence): The whole loop end to end — search, reveal, convert, sequence, read the funnel — in vxcli, Python, Go and TypeScript. - [Sending email](https://localhost:3021/docs/guides/sending-email): Connect a mailbox, send a tracked message, and read opens, clicks and replies back. - [Deliverability](https://localhost:3021/docs/guides/deliverability): The sending pool, per-inbox caps, SPF/DKIM/DMARC checks, seed lists and placement tests. - [Sequences](https://localhost:3021/docs/guides/sequences): Multi-step outreach: steps, variants, enrollment and the reply-stops-the-sequence rule. - [Leads and enrichment](https://localhost:3021/docs/guides/leads-and-enrichment): Search the prospect pool, reveal contact details against quota, enrich and convert to CRM. - [Contracts and e-sign](https://localhost:3021/docs/guides/contracts-and-esign): Create a contract, send it for signature, and pull the executed PDF and audit trail. - [Quotes and invoicing](https://localhost:3021/docs/guides/quotes-and-invoicing): Products, quotes, invoices, the public payment page and subscriptions. - [Calendar and meetings](https://localhost:3021/docs/guides/calendar-and-meetings): Events, ICS invitations that land in a real calendar, and RSVP handling. - [Webhooks and events](https://localhost:3021/docs/guides/webhooks-and-events): Provider callbacks, the tracking pixel and the events SalesShift emits. - [Plans and self-hosting](https://localhost:3021/docs/guides/plans-and-self-hosting): What each of the four plans entitles you to, why a refusal is a 402, and how the free Self-Hosted tier registers your own node. ## Known unproven ### oauth-mailbox-connect OAuth mailbox connect is fully built — PKCE, Vault-stored tokens, XOAUTH2 and refresh — and a real send completes AUTH XOAUTH2 -> 250 queued. No Microsoft or Google mailbox has ever consented here, so the final SMTP hop to a real provider is UNPROVEN. Observed instead: GET /webmail/oauth/providers returned 200 with configured=true and missing=[] for both microsoft and google, and one account in this org carries auth_method=oauth / oauth_provider=microsoft with oauth_connected_at set. That is client configuration and a local proof account, not consent from a real provider mailbox. Applies to: GET /api/v1/salesshift/webmail/oauth/providers POST /api/v1/salesshift/webmail/oauth/{provider}/connect POST /api/v1/salesshift/webmail/accounts/{account_id}/reconnect GET /api/v1/salesshift/webmail/oauth/callback ### call-transcription-summary Call transcription and summary have never run with real data. No org has an AI provider key, so every recording ends at status='unavailable'. Observed instead: GET /settings/integrations for the test org returned three integrations, all integration_type='email' (imap, smtp, smtp). There is no integration_type='ai' row, which is the condition that leaves transcription unavailable. Applies to: POST /api/v1/messaging/calls/{call_id}/recording/chunks POST /api/v1/messaging/calls/{call_id}/recording/finalize GET /api/v1/messaging/calls/{call_id}/intelligence GET /api/v1/messaging/calls/{call_id}/recordings/{recording_id}/file POST /api/v1/messaging/calls/{call_id}/transcribe ## API endpoints 379 operations across 302 paths. Full entry for any row is the URL after it. Machine-readable index: https://localhost:3021/docs/api/endpoints.json ### CRM Contacts, companies, static lists, tasks and the per-contact conversation view. Reference page: https://localhost:3021/docs/api/crm - GET /api/v1/salesshift/companies — Paged, searchable list of company records, each with its contact count. [live-call] (https://localhost:3021/docs/api/crm#get-api-v1-salesshift-companies) - POST /api/v1/salesshift/companies — Create a company record owned by the calling user. [code-only] (https://localhost:3021/docs/api/crm#post-api-v1-salesshift-companies) - PUT /api/v1/salesshift/companies/{company_id} — Update a company record from a partial payload. [code-only] (https://localhost:3021/docs/api/crm#put-api-v1-salesshift-companies-company-id) - DELETE /api/v1/salesshift/companies/{company_id} — Delete a company record. [code-only] (https://localhost:3021/docs/api/crm#delete-api-v1-salesshift-companies-company-id) - GET /api/v1/salesshift/contacts — Paged, filterable list of the organization's contacts. [live-call] (https://localhost:3021/docs/api/crm#get-api-v1-salesshift-contacts) - POST /api/v1/salesshift/contacts — Create a contact; an existing contact with the same email in the org is returned instead of a duplicate. [code-only] (https://localhost:3021/docs/api/crm#post-api-v1-salesshift-contacts) - GET /api/v1/salesshift/contacts/{contact_id} — One contact by id, scoped to the caller's organization. [live-call] (https://localhost:3021/docs/api/crm#get-api-v1-salesshift-contacts-contact-id) - PUT /api/v1/salesshift/contacts/{contact_id} — Update a contact from a partial payload (unset fields are left alone). [code-only] (https://localhost:3021/docs/api/crm#put-api-v1-salesshift-contacts-contact-id) - DELETE /api/v1/salesshift/contacts/{contact_id} — Delete a contact and its dependent bookings, deals, email-tracking and form-submission rows. [code-only] (https://localhost:3021/docs/api/crm#delete-api-v1-salesshift-contacts-contact-id) - GET /api/v1/salesshift/contacts/{contact_id}/activities — The 100 most recent activity rows recorded against a contact. [live-call] (https://localhost:3021/docs/api/crm#get-api-v1-salesshift-contacts-contact-id-activities) - GET /api/v1/salesshift/contacts/{contact_id}/enrollments — Sequences this contact is (or was) enrolled in — powers the Sequences tab on the contact profile. [live-call] (https://localhost:3021/docs/api/crm#get-api-v1-salesshift-contacts-contact-id-enrollments) - GET /api/v1/salesshift/contacts/{contact_id}/lists — The lists this contact actually belongs to — the profile used to print the organization's list count in that row, which is a different number. [live-call] (https://localhost:3021/docs/api/crm#get-api-v1-salesshift-contacts-contact-id-lists) - POST /api/v1/salesshift/contacts/{contact_id}/notes — Append a note activity to a contact's timeline. [code-only] (https://localhost:3021/docs/api/crm#post-api-v1-salesshift-contacts-contact-id-notes) - POST /api/v1/salesshift/contacts/{contact_id}/rescore — Recompute and persist a contact's fit/engagement scores. [code-only] (https://localhost:3021/docs/api/crm#post-api-v1-salesshift-contacts-contact-id-rescore) - POST /api/v1/salesshift/contacts/{contact_id}/send-email — One-off tracked email to a single contact (the plan's walking skeleton, task 1.9): BYOK/platform send + pixel + unsubscribe link. [code-only] (https://localhost:3021/docs/api/crm#post-api-v1-salesshift-contacts-contact-id-send-email) - POST /api/v1/salesshift/contacts/bulk — CSV import (plan 1.7): rows already column-mapped by the frontend wizard. [code-only] (https://localhost:3021/docs/api/crm#post-api-v1-salesshift-contacts-bulk) - POST /api/v1/salesshift/contacts/enrich — Waterfall enrichment MVP (plan 5.8): Hunter.io via BYOK key when configured, else deterministic email-pattern inference. [code-only] (https://localhost:3021/docs/api/crm#post-api-v1-salesshift-contacts-enrich) - GET /api/v1/salesshift/conversations — Contacts with email history, newest activity first. [live-call] (https://localhost:3021/docs/api/crm#get-api-v1-salesshift-conversations) - GET /api/v1/salesshift/conversations/{contact_id} — Full email thread with one contact: every tracked send + captured reply. [live-call] (https://localhost:3021/docs/api/crm#get-api-v1-salesshift-conversations-contact-id) - POST /api/v1/salesshift/email/send — Direct tracked send — the vxcli / vxsdk surface. [code-only] (https://localhost:3021/docs/api/crm#post-api-v1-salesshift-email-send) - GET /api/v1/salesshift/lists — The organization's static contact lists with member counts. [live-call] (https://localhost:3021/docs/api/crm#get-api-v1-salesshift-lists) - POST /api/v1/salesshift/lists — Create a static contact list. [live-call] (https://localhost:3021/docs/api/crm#post-api-v1-salesshift-lists) - DELETE /api/v1/salesshift/lists/{list_id} — Delete a static contact list. [live-call] (https://localhost:3021/docs/api/crm#delete-api-v1-salesshift-lists-list-id) - GET /api/v1/salesshift/lists/{list_id}/members — The contacts belonging to one static list. [live-call] (https://localhost:3021/docs/api/crm#get-api-v1-salesshift-lists-list-id-members) - POST /api/v1/salesshift/lists/{list_id}/members — Add contacts to a static list; ids outside the org are ignored. [code-only] (https://localhost:3021/docs/api/crm#post-api-v1-salesshift-lists-list-id-members) - DELETE /api/v1/salesshift/lists/{list_id}/members/{contact_id} — Take one contact out of a list. [code-only] (https://localhost:3021/docs/api/crm#delete-api-v1-salesshift-lists-list-id-members-contact-id) - GET /api/v1/salesshift/tasks — The organization's CRM tasks, filterable by status, type, priority and free text. [live-call] (https://localhost:3021/docs/api/crm#get-api-v1-salesshift-tasks) - POST /api/v1/salesshift/tasks — Create a CRM task assigned to the calling user. [code-only] (https://localhost:3021/docs/api/crm#post-api-v1-salesshift-tasks) - PUT /api/v1/salesshift/tasks/{task_id} — Update a CRM task from a partial payload. [code-only] (https://localhost:3021/docs/api/crm#put-api-v1-salesshift-tasks-task-id) - DELETE /api/v1/salesshift/tasks/{task_id} — Hard-delete a task. [code-only] (https://localhost:3021/docs/api/crm#delete-api-v1-salesshift-tasks-task-id) ### Leads and enrichment The global prospect pool, metered reveals, saved leads and conversion to contacts. Reference page: https://localhost:3021/docs/api/leads - GET /api/v1/salesshift/lead-searches — The organization's saved lead searches. [live-call] (https://localhost:3021/docs/api/leads#get-api-v1-salesshift-lead-searches) - POST /api/v1/salesshift/lead-searches — Save a named set of pool filters as a reusable search. [code-only] (https://localhost:3021/docs/api/leads#post-api-v1-salesshift-lead-searches) - GET /api/v1/salesshift/leads — The organization's saved leads, optionally filtered by status. [live-call] (https://localhost:3021/docs/api/leads#get-api-v1-salesshift-leads) - GET /api/v1/salesshift/leads/{lead_id} — One saved lead, plus the live pool record behind it. [code-only] (https://localhost:3021/docs/api/leads#get-api-v1-salesshift-leads-lead-id) - PATCH /api/v1/salesshift/leads/{lead_id} — Update a saved lead's status, score, notes, disqualify reason, owner or tags. [code-only] (https://localhost:3021/docs/api/leads#patch-api-v1-salesshift-leads-lead-id) - POST /api/v1/salesshift/leads/{lead_id}/convert — Lead → Contact. [code-only] (https://localhost:3021/docs/api/leads#post-api-v1-salesshift-leads-lead-id-convert) - POST /api/v1/salesshift/leads/bulk-convert — Convert many saved leads to contacts in one call, reporting every id's outcome. [code-only] (https://localhost:3021/docs/api/leads#post-api-v1-salesshift-leads-bulk-convert) - GET /api/v1/salesshift/leads/company/{company_id} — A company in the pool, with the people behind it split by what this org already owns. [code-only] (https://localhost:3021/docs/api/leads#get-api-v1-salesshift-leads-company-company-id) - POST /api/v1/salesshift/leads/convert-from-pool — Pool → Contact in one action: save, reveal if needed, convert. [code-only] (https://localhost:3021/docs/api/leads#post-api-v1-salesshift-leads-convert-from-pool) - POST /api/v1/salesshift/leads/enrich — Crawl a company's own site and fold what is found back into the pool. [code-only] (https://localhost:3021/docs/api/leads#post-api-v1-salesshift-leads-enrich) - POST /api/v1/salesshift/leads/erasure — Erase a person from the pool and flag every tenant's saved copy. [code-only] (https://localhost:3021/docs/api/leads#post-api-v1-salesshift-leads-erasure) - POST /api/v1/salesshift/leads/facets — Counts beside each filter. [live-call] (https://localhost:3021/docs/api/leads#post-api-v1-salesshift-leads-facets) - GET /api/v1/salesshift/leads/pool/{pool_id} — Everything the pool knows about one person, plus this org's relationship to them (revealed? [code-only] (https://localhost:3021/docs/api/leads#get-api-v1-salesshift-leads-pool-pool-id) - GET /api/v1/salesshift/leads/quota — The organization's reveal meter: used, allowance and remaining for the period. [live-call] (https://localhost:3021/docs/api/leads#get-api-v1-salesshift-leads-quota) - POST /api/v1/salesshift/leads/reveal — Un-mask one pool person's contact details; spends one metered reveal. [live-call] (https://localhost:3021/docs/api/leads#post-api-v1-salesshift-leads-reveal) - POST /api/v1/salesshift/leads/save — Copy pool rows into the tenant's own list. [code-only] (https://localhost:3021/docs/api/leads#post-api-v1-salesshift-leads-save) - POST /api/v1/salesshift/leads/search — Search the global pool. [live-call] (https://localhost:3021/docs/api/leads#post-api-v1-salesshift-leads-search) ### Sequences Multi-step outreach sequences, their steps and variants, and contact enrollments. Reference page: https://localhost:3021/docs/api/sequences - GET /api/v1/salesshift/sequences — Sequence list with real rollups — steps, enrollment breakdown and the send/open/reply funnel measured against ss_email_tracking. [live-call] (https://localhost:3021/docs/api/sequences#get-api-v1-salesshift-sequences) - POST /api/v1/salesshift/sequences — Create an outreach sequence, optionally with its steps. [session-verified] (https://localhost:3021/docs/api/sequences#post-api-v1-salesshift-sequences) - GET /api/v1/salesshift/sequences/{sequence_id} — One sequence with its steps, variants and rollup counters. [live-call] (https://localhost:3021/docs/api/sequences#get-api-v1-salesshift-sequences-sequence-id) - PUT /api/v1/salesshift/sequences/{sequence_id} — Update a sequence and, when supplied, replace its step list. [session-verified] (https://localhost:3021/docs/api/sequences#put-api-v1-salesshift-sequences-sequence-id) - DELETE /api/v1/salesshift/sequences/{sequence_id} — Delete a sequence. [session-verified] (https://localhost:3021/docs/api/sequences#delete-api-v1-salesshift-sequences-sequence-id) - POST /api/v1/salesshift/sequences/{sequence_id}/activate — Set a sequence's status to active so the dispatcher will send its steps. [session-verified] (https://localhost:3021/docs/api/sequences#post-api-v1-salesshift-sequences-sequence-id-activate) - GET /api/v1/salesshift/sequences/{sequence_id}/analytics — Per-step funnel measured against ss_email_tracking — nothing estimated. [session-verified] (https://localhost:3021/docs/api/sequences#get-api-v1-salesshift-sequences-sequence-id-analytics) - POST /api/v1/salesshift/sequences/{sequence_id}/archive — Set a sequence's status to archived. [session-verified] (https://localhost:3021/docs/api/sequences#post-api-v1-salesshift-sequences-sequence-id-archive) - POST /api/v1/salesshift/sequences/{sequence_id}/duplicate — Deep copy: settings + every step + every A/B variant. [session-verified] (https://localhost:3021/docs/api/sequences#post-api-v1-salesshift-sequences-sequence-id-duplicate) - POST /api/v1/salesshift/sequences/{sequence_id}/enroll — Enroll contacts by id, by list, or by saved contact filter. [session-verified] (https://localhost:3021/docs/api/sequences#post-api-v1-salesshift-sequences-sequence-id-enroll) - GET /api/v1/salesshift/sequences/{sequence_id}/enrollments — Paged enrollments for one sequence, joined to the enrolled contact. [session-verified] (https://localhost:3021/docs/api/sequences#get-api-v1-salesshift-sequences-sequence-id-enrollments) - DELETE /api/v1/salesshift/sequences/{sequence_id}/enrollments/{enrollment_id} — Remove a contact's enrollment and decrement the sequence's enrolled counter. [session-verified] (https://localhost:3021/docs/api/sequences#delete-api-v1-salesshift-sequences-sequence-id-enrollments-enrollment-id) - POST /api/v1/salesshift/sequences/{sequence_id}/enrollments/{enrollment_id}/pause — Pause one contact's enrollment in a sequence. [session-verified] (https://localhost:3021/docs/api/sequences#post-api-v1-salesshift-sequences-sequence-id-enrollments-enrollment-id-pause) - POST /api/v1/salesshift/sequences/{sequence_id}/enrollments/{enrollment_id}/resume — Resume a paused or failed enrollment. [session-verified] (https://localhost:3021/docs/api/sequences#post-api-v1-salesshift-sequences-sequence-id-enrollments-enrollment-id-resume) - POST /api/v1/salesshift/sequences/{sequence_id}/pause — Set a sequence's status to paused. [session-verified] (https://localhost:3021/docs/api/sequences#post-api-v1-salesshift-sequences-sequence-id-pause) - POST /api/v1/salesshift/sequences/{sequence_id}/preview — Render one step's merge fields against a real contact, or against a clearly-flagged sample when no contact is supplied. [session-verified] (https://localhost:3021/docs/api/sequences#post-api-v1-salesshift-sequences-sequence-id-preview) - POST /api/v1/salesshift/sequences/{sequence_id}/steps — Append a step, or insert at `step_number` (1-based) pushing the rest down. [session-verified] (https://localhost:3021/docs/api/sequences#post-api-v1-salesshift-sequences-sequence-id-steps) - POST /api/v1/salesshift/sequences/{sequence_id}/steps/reorder — Renumber the timeline atomically. [session-verified] (https://localhost:3021/docs/api/sequences#post-api-v1-salesshift-sequences-sequence-id-steps-reorder) - POST /api/v1/salesshift/sequences/dispatch-now — Manually run one dispatch tick for the caller's org (the background loop runs the same engine every minute). [session-verified] (https://localhost:3021/docs/api/sequences#post-api-v1-salesshift-sequences-dispatch-now) - PUT /api/v1/salesshift/steps/{step_id} — Update one sequence step, validating step type, condition config and delay. [session-verified] (https://localhost:3021/docs/api/sequences#put-api-v1-salesshift-steps-step-id) - DELETE /api/v1/salesshift/steps/{step_id} — Delete a step (its A/B variants cascade) and close the numbering gap. [session-verified] (https://localhost:3021/docs/api/sequences#delete-api-v1-salesshift-steps-step-id) - POST /api/v1/salesshift/steps/{step_id}/variants — Add an A/B variant to an email step. [session-verified] (https://localhost:3021/docs/api/sequences#post-api-v1-salesshift-steps-step-id-variants) - DELETE /api/v1/salesshift/variants/{variant_id} — Delete an A/B variant of a step (use DELETE /steps/{step_id} for a step itself). [session-verified] (https://localhost:3021/docs/api/sequences#delete-api-v1-salesshift-variants-variant-id) ### Campaigns One-off email campaigns, templates, audience resolution, test sends and sending. Reference page: https://localhost:3021/docs/api/campaigns - GET /api/v1/salesshift/campaigns — The organization's campaigns with their tracking rollups. [live-call] (https://localhost:3021/docs/api/campaigns#get-api-v1-salesshift-campaigns) - POST /api/v1/salesshift/campaigns — Create a campaign after validating the sender and resolving the audience. [code-only] (https://localhost:3021/docs/api/campaigns#post-api-v1-salesshift-campaigns) - GET /api/v1/salesshift/campaigns/{campaign_id} — One campaign with its stats and per-recipient tracking rows. [live-call] (https://localhost:3021/docs/api/campaigns#get-api-v1-salesshift-campaigns-campaign-id) - PATCH /api/v1/salesshift/campaigns/{campaign_id} — Edit a campaign; only drafts and scheduled campaigns can be edited. [code-only] (https://localhost:3021/docs/api/campaigns#patch-api-v1-salesshift-campaigns-campaign-id) - DELETE /api/v1/salesshift/campaigns/{campaign_id} — Delete a campaign. [code-only] (https://localhost:3021/docs/api/campaigns#delete-api-v1-salesshift-campaigns-campaign-id) - POST /api/v1/salesshift/campaigns/{campaign_id}/send — Send or schedule a campaign to its resolved audience. [code-only] (https://localhost:3021/docs/api/campaigns#post-api-v1-salesshift-campaigns-campaign-id-send) - POST /api/v1/salesshift/campaigns/{campaign_id}/test-send — Send one preview copy to a chosen address using a transient probe contact. [code-only] (https://localhost:3021/docs/api/campaigns#post-api-v1-salesshift-campaigns-campaign-id-test-send) - POST /api/v1/salesshift/campaigns/{campaign_id}/unschedule — Put a scheduled campaign back into draft. [code-only] (https://localhost:3021/docs/api/campaigns#post-api-v1-salesshift-campaigns-campaign-id-unschedule) - POST /api/v1/salesshift/campaigns/audience-preview — Resolve lists and contact ids to a sendable audience, reporting what was dropped and the cap. [live-call] (https://localhost:3021/docs/api/campaigns#post-api-v1-salesshift-campaigns-audience-preview) - GET /api/v1/salesshift/campaigns/senders — Available sending servers: every active BYOK email integration (multi-SMTP: one entry per configured server, default first) + every active connected mailbox (each one a full SMTP identity). [live-call] (https://localhost:3021/docs/api/campaigns#get-api-v1-salesshift-campaigns-senders) - GET /api/v1/salesshift/campaigns/templates — Built-in email templates plus the organization's saved ones. [live-call] (https://localhost:3021/docs/api/campaigns#get-api-v1-salesshift-campaigns-templates) - POST /api/v1/salesshift/campaigns/templates — Save a custom email template. [code-only] (https://localhost:3021/docs/api/campaigns#post-api-v1-salesshift-campaigns-templates) - PUT /api/v1/salesshift/campaigns/templates/{template_id} — Update a saved email template. [code-only] (https://localhost:3021/docs/api/campaigns#put-api-v1-salesshift-campaigns-templates-template-id) - DELETE /api/v1/salesshift/campaigns/templates/{template_id} — Delete a saved email template. [code-only] (https://localhost:3021/docs/api/campaigns#delete-api-v1-salesshift-campaigns-templates-template-id) - POST /api/v1/salesshift/campaigns/templates/seed — Drop the starter 1:1 sales library into this org. [code-only] (https://localhost:3021/docs/api/campaigns#post-api-v1-salesshift-campaigns-templates-seed) ### Deliverability Sending pool, per-inbox caps and health, domain auth checks, seed list and placement tests. Reference page: https://localhost:3021/docs/api/deliverability - GET /api/v1/salesshift/deliverability/domain/{domain} — SPF / DKIM / DMARC / MX / blocklist for one domain. [session-verified] (https://localhost:3021/docs/api/deliverability#get-api-v1-salesshift-deliverability-domain-domain) - GET /api/v1/salesshift/deliverability/domains — Every sending domain the org's mailboxes use, with the last DNS answer for each. [live-call] (https://localhost:3021/docs/api/deliverability#get-api-v1-salesshift-deliverability-domains) - GET /api/v1/salesshift/deliverability/inboxes — The sending pool: every connected mailbox with its cap, ramp position, health, and — when it is not sending — the reason. [live-call] (https://localhost:3021/docs/api/deliverability#get-api-v1-salesshift-deliverability-inboxes) - PATCH /api/v1/salesshift/deliverability/inboxes/{inbox_id} — Change one mailbox's pool policy. [session-verified] (https://localhost:3021/docs/api/deliverability#patch-api-v1-salesshift-deliverability-inboxes-inbox-id) - POST /api/v1/salesshift/deliverability/inboxes/{inbox_id}/pause — Pause one mailbox in the sending pool with a recorded reason. [session-verified] (https://localhost:3021/docs/api/deliverability#post-api-v1-salesshift-deliverability-inboxes-inbox-id-pause) - POST /api/v1/salesshift/deliverability/inboxes/{inbox_id}/resume — Put a mailbox back in the rotation. [session-verified] (https://localhost:3021/docs/api/deliverability#post-api-v1-salesshift-deliverability-inboxes-inbox-id-resume) - POST /api/v1/salesshift/deliverability/placement-test — Send a probe to the org's seed list and report where it landed. [session-verified] (https://localhost:3021/docs/api/deliverability#post-api-v1-salesshift-deliverability-placement-test) - GET /api/v1/salesshift/deliverability/placement-tests — Recent inbox-placement tests and their per-seed results. [live-call] (https://localhost:3021/docs/api/deliverability#get-api-v1-salesshift-deliverability-placement-tests) - GET /api/v1/salesshift/deliverability/seed-list — The organization's seed addresses, joined to any connected webmail account. [live-call] (https://localhost:3021/docs/api/deliverability#get-api-v1-salesshift-deliverability-seed-list) - POST /api/v1/salesshift/deliverability/seed-list — Add a seed address used by placement tests. [session-verified] (https://localhost:3021/docs/api/deliverability#post-api-v1-salesshift-deliverability-seed-list) - DELETE /api/v1/salesshift/deliverability/seed-list/{seed_id} — Remove a seed address. [session-verified] (https://localhost:3021/docs/api/deliverability#delete-api-v1-salesshift-deliverability-seed-list-seed-id) - GET /api/v1/salesshift/deliverability/settings — Sending-pool settings: rotation flag, health window and the platform defaults. [live-call] (https://localhost:3021/docs/api/deliverability#get-api-v1-salesshift-deliverability-settings) - PATCH /api/v1/salesshift/deliverability/settings — Org-level pool switches. [session-verified] (https://localhost:3021/docs/api/deliverability#patch-api-v1-salesshift-deliverability-settings) ### Webmail IMAP/SMTP mailboxes, OAuth mailbox connect, message read and send, and AI assists. Reference page: https://localhost:3021/docs/api/webmail - GET /api/v1/salesshift/webmail/accounts — Mailboxes visible to the caller (shared, unowned, or their own). [live-call] (https://localhost:3021/docs/api/webmail#get-api-v1-salesshift-webmail-accounts) - POST /api/v1/salesshift/webmail/accounts — Add a custom IMAP/SMTP mailbox; the credentials are proven before the row is saved. [code-only] (https://localhost:3021/docs/api/webmail#post-api-v1-salesshift-webmail-accounts) - PATCH /api/v1/salesshift/webmail/accounts/{account_id} — Update a mailbox's settings. [code-only] (https://localhost:3021/docs/api/webmail#patch-api-v1-salesshift-webmail-accounts-account-id) - DELETE /api/v1/salesshift/webmail/accounts/{account_id} — Remove a mailbox, optionally deleting the underlying provisioned mailbox. [code-only] (https://localhost:3021/docs/api/webmail#delete-api-v1-salesshift-webmail-accounts-account-id) - POST /api/v1/salesshift/webmail/accounts/{account_id}/action — Bulk message action (read, flag, move, delete, folder operations). [code-only] (https://localhost:3021/docs/api/webmail#post-api-v1-salesshift-webmail-accounts-account-id-action) - GET /api/v1/salesshift/webmail/accounts/{account_id}/attachment — Download one attachment from a message by index. [code-only] (https://localhost:3021/docs/api/webmail#get-api-v1-salesshift-webmail-accounts-account-id-attachment) - GET /api/v1/salesshift/webmail/accounts/{account_id}/folders — List the IMAP folders on a mailbox. [code-only] (https://localhost:3021/docs/api/webmail#get-api-v1-salesshift-webmail-accounts-account-id-folders) - GET /api/v1/salesshift/webmail/accounts/{account_id}/message — One full message by UID, optionally marking it seen. [code-only] (https://localhost:3021/docs/api/webmail#get-api-v1-salesshift-webmail-accounts-account-id-message) - GET /api/v1/salesshift/webmail/accounts/{account_id}/messages — Paged message overviews from one IMAP folder, with search and filter. [code-only] (https://localhost:3021/docs/api/webmail#get-api-v1-salesshift-webmail-accounts-account-id-messages) - POST /api/v1/salesshift/webmail/accounts/{account_id}/password — Self-service mailbox password change. [code-only] (https://localhost:3021/docs/api/webmail#post-api-v1-salesshift-webmail-accounts-account-id-password) - GET /api/v1/salesshift/webmail/accounts/{account_id}/raw — The original RFC 822 source — "show original" / view-source. [code-only] (https://localhost:3021/docs/api/webmail#get-api-v1-salesshift-webmail-accounts-account-id-raw) - POST /api/v1/salesshift/webmail/accounts/{account_id}/reconnect — Re-consent an OAuth mailbox whose refresh token was revoked or expired. [known-unproven] (https://localhost:3021/docs/api/webmail#post-api-v1-salesshift-webmail-accounts-account-id-reconnect) - GET /api/v1/salesshift/webmail/accounts/{account_id}/reply-context — Everything a composer needs to answer a message: recipients worked out the way Gmail works them out, the ``Re:``/``Fwd:`` subject, the quoted original, and the threading headers. [code-only] (https://localhost:3021/docs/api/webmail#get-api-v1-salesshift-webmail-accounts-account-id-reply-context) - GET /api/v1/salesshift/webmail/accounts/{account_id}/search — IMAP SEARCH across several folders at once, merged newest-first. [code-only] (https://localhost:3021/docs/api/webmail#get-api-v1-salesshift-webmail-accounts-account-id-search) - POST /api/v1/salesshift/webmail/accounts/{account_id}/send — Send or save-as-draft a message from a mailbox. [code-only] (https://localhost:3021/docs/api/webmail#post-api-v1-salesshift-webmail-accounts-account-id-send) - GET /api/v1/salesshift/webmail/accounts/{account_id}/thread — Full conversation for a message — the email/reply/email trail, Gmail-style. [code-only] (https://localhost:3021/docs/api/webmail#get-api-v1-salesshift-webmail-accounts-account-id-thread) - POST /api/v1/salesshift/webmail/accounts/provision — Create a REAL mailbox on the platform mail stack (mailcow + relay spool + inbound sync job) and connect it — the user never touches SOGo. [code-only] (https://localhost:3021/docs/api/webmail#post-api-v1-salesshift-webmail-accounts-provision) - POST /api/v1/salesshift/webmail/ai/improve — Rewrite a draft body with the org's AI provider at a chosen tone, language and length. [code-only] (https://localhost:3021/docs/api/webmail#post-api-v1-salesshift-webmail-ai-improve) - POST /api/v1/salesshift/webmail/ai/summarize-unread — Summarise up to 15 unread messages with the org's AI provider. [code-only] (https://localhost:3021/docs/api/webmail#post-api-v1-salesshift-webmail-ai-summarize-unread) - GET /api/v1/salesshift/webmail/categories — The organization's webmail categories, seeding the defaults on first use. [live-call] (https://localhost:3021/docs/api/webmail#get-api-v1-salesshift-webmail-categories) - POST /api/v1/salesshift/webmail/categories — Create a webmail category. [code-only] (https://localhost:3021/docs/api/webmail#post-api-v1-salesshift-webmail-categories) - DELETE /api/v1/salesshift/webmail/categories/{category_id} — Delete a webmail category. [code-only] (https://localhost:3021/docs/api/webmail#delete-api-v1-salesshift-webmail-categories-category-id) - POST /api/v1/salesshift/webmail/oauth/{provider}/connect — Start connecting a mailbox — returns the URL to send the user to. [known-unproven] (https://localhost:3021/docs/api/webmail#post-api-v1-salesshift-webmail-oauth-provider-connect) - GET /api/v1/salesshift/webmail/oauth/callback — Where the provider sends the browser back. [known-unproven] (https://localhost:3021/docs/api/webmail#get-api-v1-salesshift-webmail-oauth-callback) - GET /api/v1/salesshift/webmail/oauth/providers — Which mailbox providers this deployment can actually connect. [known-unproven] (https://localhost:3021/docs/api/webmail#get-api-v1-salesshift-webmail-oauth-providers) ### Deals and opportunities Pipelines, deals and the forecast, plus the shared opportunity board. Reference page: https://localhost:3021/docs/api/deals - GET /api/v1/salesshift/deals — Deals, optionally filtered by pipeline and status. [live-call] (https://localhost:3021/docs/api/deals#get-api-v1-salesshift-deals) - POST /api/v1/salesshift/deals — Create a deal, defaulting to the org's first pipeline and stage when none is given. [code-only] (https://localhost:3021/docs/api/deals#post-api-v1-salesshift-deals) - PUT /api/v1/salesshift/deals/{deal_id} — Update a deal from a partial payload. [code-only] (https://localhost:3021/docs/api/deals#put-api-v1-salesshift-deals-deal-id) - DELETE /api/v1/salesshift/deals/{deal_id} — Delete a deal. [code-only] (https://localhost:3021/docs/api/deals#delete-api-v1-salesshift-deals-deal-id) - PUT /api/v1/salesshift/deals/{deal_id}/move — Powers drag-and-drop Kanban. [code-only] (https://localhost:3021/docs/api/deals#put-api-v1-salesshift-deals-deal-id-move) - GET /api/v1/salesshift/deals/forecast — Weighted pipeline forecast: sum(amount * stage.win_probability). [live-call] (https://localhost:3021/docs/api/deals#get-api-v1-salesshift-deals-forecast) - GET /api/v1/salesshift/opportunities — Open, user-posted opportunities; retired platform seed rows are excluded. [live-call] (https://localhost:3021/docs/api/deals#get-api-v1-salesshift-opportunities) - POST /api/v1/salesshift/opportunities — Post an opportunity to the shared board. [code-only] (https://localhost:3021/docs/api/deals#post-api-v1-salesshift-opportunities) - POST /api/v1/salesshift/opportunities/{opportunity_id}/apply — Apply to an open opportunity. [code-only] (https://localhost:3021/docs/api/deals#post-api-v1-salesshift-opportunities-opportunity-id-apply) - POST /api/v1/salesshift/opportunities/{opportunity_id}/convert — Opportunity → lead (contact) → contract (deal) in the default pipeline. [code-only] (https://localhost:3021/docs/api/deals#post-api-v1-salesshift-opportunities-opportunity-id-convert) - GET /api/v1/salesshift/pipelines — The organization's deal pipelines and their stages, seeding a default pipeline on first use. [live-call] (https://localhost:3021/docs/api/deals#get-api-v1-salesshift-pipelines) ### Quotes and products Product catalogue, quotes, line items, the approval chain and quote sending. Reference page: https://localhost:3021/docs/api/quotes - GET /api/v1/salesshift/products — The organization's product catalogue, searchable and active-filtered. [live-call] (https://localhost:3021/docs/api/quotes#get-api-v1-salesshift-products) - POST /api/v1/salesshift/products — Create a catalogue product; recurring products require a billing interval. [session-verified] (https://localhost:3021/docs/api/quotes#post-api-v1-salesshift-products) - PATCH /api/v1/salesshift/products/{product_id} — Update a catalogue product from a partial payload. [session-verified] (https://localhost:3021/docs/api/quotes#patch-api-v1-salesshift-products-product-id) - DELETE /api/v1/salesshift/products/{product_id} — Soft delete. [session-verified] (https://localhost:3021/docs/api/quotes#delete-api-v1-salesshift-products-product-id) - GET /api/v1/salesshift/quotes — Quotes, optionally filtered by status and deal. [live-call] (https://localhost:3021/docs/api/quotes#get-api-v1-salesshift-quotes) - POST /api/v1/salesshift/quotes — Create a quote with its line items and a generated document number. [session-verified] (https://localhost:3021/docs/api/quotes#post-api-v1-salesshift-quotes) - GET /api/v1/salesshift/quotes/{quote_id} — One quote with its lines and approval history. [live-call] (https://localhost:3021/docs/api/quotes#get-api-v1-salesshift-quotes-quote-id) - PATCH /api/v1/salesshift/quotes/{quote_id} — Edit a quote; sent, accepted and voided quotes are locked. [session-verified] (https://localhost:3021/docs/api/quotes#patch-api-v1-salesshift-quotes-quote-id) - DELETE /api/v1/salesshift/quotes/{quote_id} — Void a quote; an accepted quote cannot be voided. [session-verified] (https://localhost:3021/docs/api/quotes#delete-api-v1-salesshift-quotes-quote-id) - POST /api/v1/salesshift/quotes/{quote_id}/approve — Approve a quote that is awaiting approval. [session-verified] (https://localhost:3021/docs/api/quotes#post-api-v1-salesshift-quotes-quote-id-approve) - POST /api/v1/salesshift/quotes/{quote_id}/decline-approval — Decline the pending approval on a quote. [session-verified] (https://localhost:3021/docs/api/quotes#post-api-v1-salesshift-quotes-quote-id-decline-approval) - PUT /api/v1/salesshift/quotes/{quote_id}/lines — Bulk replace — the editor sends the whole grid and the server re-prices it. [session-verified] (https://localhost:3021/docs/api/quotes#put-api-v1-salesshift-quotes-quote-id-lines) - POST /api/v1/salesshift/quotes/{quote_id}/send — Freeze the quote into a contract document, email it, and hand it to the e-sign flow. [session-verified] (https://localhost:3021/docs/api/quotes#post-api-v1-salesshift-quotes-quote-id-send) - POST /api/v1/salesshift/quotes/{quote_id}/submit-for-approval — Submit a quote for approval, or approve it outright when no rule is triggered. [session-verified] (https://localhost:3021/docs/api/quotes#post-api-v1-salesshift-quotes-quote-id-submit-for-approval) - GET /api/v1/salesshift/quotes/public/{token} — Unauthenticated read for the recipient's link. [session-verified] (https://localhost:3021/docs/api/quotes#get-api-v1-salesshift-quotes-public-token) - GET /api/v1/salesshift/settings/quotes — Quote settings for the organization (numbering, tax, approval thresholds). [live-call] (https://localhost:3021/docs/api/quotes#get-api-v1-salesshift-settings-quotes) - PUT /api/v1/salesshift/settings/quotes — Set approval thresholds / reporting currency. [session-verified] (https://localhost:3021/docs/api/quotes#put-api-v1-salesshift-settings-quotes) ### Invoicing and payments The customer's own quote-to-cash: invoices, public invoice pages and PDFs, Stripe checkout, manual payments, subscriptions and the MRR rollup. Not the workspace's own SalesShift bill — that is Plans and your subscription. Reference page: https://localhost:3021/docs/api/payments - GET /api/v1/salesshift/invoices — Invoices, optionally filtered by status. [live-call] (https://localhost:3021/docs/api/payments#get-api-v1-salesshift-invoices) - POST /api/v1/salesshift/invoices — Create a draft invoice with no quote behind it. [session-verified] (https://localhost:3021/docs/api/payments#post-api-v1-salesshift-invoices) - GET /api/v1/salesshift/invoices/{invoice_id} — One invoice with its line items. [live-call] (https://localhost:3021/docs/api/payments#get-api-v1-salesshift-invoices-invoice-id) - PATCH /api/v1/salesshift/invoices/{invoice_id} — Edit the header. [session-verified] (https://localhost:3021/docs/api/payments#patch-api-v1-salesshift-invoices-invoice-id) - POST /api/v1/salesshift/invoices/{invoice_id}/checkout — Create a Stripe Checkout Session for the amount still outstanding. [session-verified] (https://localhost:3021/docs/api/payments#post-api-v1-salesshift-invoices-invoice-id-checkout) - POST /api/v1/salesshift/invoices/{invoice_id}/issue — Draft → open: stamp the issue date, derive the due date from the payment term and freeze the bill-to snapshot. [session-verified] (https://localhost:3021/docs/api/payments#post-api-v1-salesshift-invoices-invoice-id-issue) - PUT /api/v1/salesshift/invoices/{invoice_id}/lines — Bulk replace, same contract as the quote editor: the client sends the whole grid and the server re-prices it, so a failed call can never leave the document half-updated. [session-verified] (https://localhost:3021/docs/api/payments#put-api-v1-salesshift-invoices-invoice-id-lines) - GET /api/v1/salesshift/invoices/{invoice_id}/pdf — Render and return the invoice PDF inline. [session-verified] (https://localhost:3021/docs/api/payments#get-api-v1-salesshift-invoices-invoice-id-pdf) - POST /api/v1/salesshift/invoices/{invoice_id}/record-payment — Bank transfer / cheque / cash. [session-verified] (https://localhost:3021/docs/api/payments#post-api-v1-salesshift-invoices-invoice-id-record-payment) - POST /api/v1/salesshift/invoices/{invoice_id}/send — Email the invoice with the PDF attached, from the tenant's own mailbox. [session-verified] (https://localhost:3021/docs/api/payments#post-api-v1-salesshift-invoices-invoice-id-send) - POST /api/v1/salesshift/invoices/{invoice_id}/void — Cancel an invoice that was never paid. [session-verified] (https://localhost:3021/docs/api/payments#post-api-v1-salesshift-invoices-invoice-id-void) - POST /api/v1/salesshift/invoices/from-quote/{quote_id} — Create an invoice from an accepted quote. [session-verified] (https://localhost:3021/docs/api/payments#post-api-v1-salesshift-invoices-from-quote-quote-id) - GET /api/v1/salesshift/invoices/public/{token} — Public invoice view addressed by its share token. [session-verified] (https://localhost:3021/docs/api/payments#get-api-v1-salesshift-invoices-public-token) - GET /api/v1/salesshift/invoices/public/{token}/pdf — The customer's own copy. [session-verified] (https://localhost:3021/docs/api/payments#get-api-v1-salesshift-invoices-public-token-pdf) - GET /api/v1/salesshift/subscriptions — The organization's subscriptions, optionally filtered by status. [live-call] (https://localhost:3021/docs/api/payments#get-api-v1-salesshift-subscriptions) - POST /api/v1/salesshift/subscriptions — Create a recurring subscription for a contact or company. [code-only] (https://localhost:3021/docs/api/payments#post-api-v1-salesshift-subscriptions) - GET /api/v1/salesshift/subscriptions/{subscription_id} — One subscription by id. [live-call] (https://localhost:3021/docs/api/payments#get-api-v1-salesshift-subscriptions-subscription-id) - PATCH /api/v1/salesshift/subscriptions/{subscription_id} — Change the plan value. [code-only] (https://localhost:3021/docs/api/payments#patch-api-v1-salesshift-subscriptions-subscription-id) - POST /api/v1/salesshift/subscriptions/{subscription_id}/cancel — Cancel a subscription, immediately or at period end. [code-only] (https://localhost:3021/docs/api/payments#post-api-v1-salesshift-subscriptions-subscription-id-cancel) - POST /api/v1/salesshift/subscriptions/{subscription_id}/reactivate — Reactivate a cancelled subscription. [code-only] (https://localhost:3021/docs/api/payments#post-api-v1-salesshift-subscriptions-subscription-id-reactivate) - GET /api/v1/salesshift/subscriptions/mrr — The MRR waterfall — what the ledger exists for. [live-call] (https://localhost:3021/docs/api/payments#get-api-v1-salesshift-subscriptions-mrr) - POST /api/v1/salesshift/webhooks/stripe/{integration_id} — Stripe webhook receiver for one payment integration. [session-verified] (https://localhost:3021/docs/api/payments#post-api-v1-salesshift-webhooks-stripe-integration-id) ### Contracts and e-sign Contract documents, public token signing, audit trail and executed PDFs. Reference page: https://localhost:3021/docs/api/contracts - GET /api/v1/salesshift/contracts — The organization's contract documents, optionally filtered by deal. [live-call] (https://localhost:3021/docs/api/contracts#get-api-v1-salesshift-contracts) - POST /api/v1/salesshift/contracts — Create a contract document with its signing parties. [session-verified] (https://localhost:3021/docs/api/contracts#post-api-v1-salesshift-contracts) - PATCH /api/v1/salesshift/contracts/{contract_id} — Edit a contract. [session-verified] (https://localhost:3021/docs/api/contracts#patch-api-v1-salesshift-contracts-contract-id) - DELETE /api/v1/salesshift/contracts/{contract_id} — Void a contract document. [session-verified] (https://localhost:3021/docs/api/contracts#delete-api-v1-salesshift-contracts-contract-id) - GET /api/v1/salesshift/contracts/{contract_id}/audit — The audit trail behind the Certificate of Completion, for the sender's own dashboard — the same rows the certificate page prints. [live-call] (https://localhost:3021/docs/api/contracts#get-api-v1-salesshift-contracts-contract-id-audit) - GET /api/v1/salesshift/contracts/{contract_id}/pdf — The sender's own copy. [session-verified] (https://localhost:3021/docs/api/contracts#get-api-v1-salesshift-contracts-contract-id-pdf) - POST /api/v1/salesshift/contracts/{contract_id}/send — Deliver signing links by real email — and, on a re-send, chase only the party who still owes a signature. [session-verified] (https://localhost:3021/docs/api/contracts#post-api-v1-salesshift-contracts-contract-id-send) - GET /api/v1/salesshift/contracts/sign/{token} — Public signing view for a token; records the first open per party as a 'viewed' audit event. [session-verified] (https://localhost:3021/docs/api/contracts#get-api-v1-salesshift-contracts-sign-token) - POST /api/v1/salesshift/contracts/sign/{token} — Public signature submit; row-locked so two simultaneous posts cannot both sign. [session-verified] (https://localhost:3021/docs/api/contracts#post-api-v1-salesshift-contracts-sign-token) - POST /api/v1/salesshift/contracts/sign/{token}/decline — Decline to sign. [session-verified] (https://localhost:3021/docs/api/contracts#post-api-v1-salesshift-contracts-sign-token-decline) - GET /api/v1/salesshift/contracts/sign/{token}/pdf — Executed-contract PDF, rendered by the tenant node's Go e-sign engine (document + signature frames + certificate of completion + audit trail). [session-verified] (https://localhost:3021/docs/api/contracts#get-api-v1-salesshift-contracts-sign-token-pdf) - POST /api/v1/salesshift/contracts/upload — Bring-your-own contract: upload PDF / DOCX / TXT / MD / HTML — the content is extracted into an editable document that rides the full e-sign flow (edit → send → dual signatures → Go-rendered PDF). [session-verified] (https://localhost:3021/docs/api/contracts#post-api-v1-salesshift-contracts-upload) ### Calendar Calendars, events, agenda, ICS export, event invitations and the public RSVP flow. Reference page: https://localhost:3021/docs/api/calendar - GET /api/v1/salesshift/calendar/agenda — Flat, sorted list of what is coming up — events and bookings together. [live-call] (https://localhost:3021/docs/api/calendar#get-api-v1-salesshift-calendar-agenda) - GET /api/v1/salesshift/calendar/events — Everything overlapping [start, end): recurring series expanded into occurrences, detached overrides applied, plus guest bookings. [live-call] (https://localhost:3021/docs/api/calendar#get-api-v1-salesshift-calendar-events) - POST /api/v1/salesshift/calendar/events — Create a calendar event, defaulting to the org's default calendar. [session-verified] (https://localhost:3021/docs/api/calendar#post-api-v1-salesshift-calendar-events) - GET /api/v1/salesshift/calendar/events/{event_id} — One event plus the shape of the series it belongs to. [session-verified] (https://localhost:3021/docs/api/calendar#get-api-v1-salesshift-calendar-events-event-id) - PATCH /api/v1/salesshift/calendar/events/{event_id} — Partial update with Google's recurring-edit scopes. [session-verified] (https://localhost:3021/docs/api/calendar#patch-api-v1-salesshift-calendar-events-event-id) - DELETE /api/v1/salesshift/calendar/events/{event_id} — Delete with the same three scopes as the update path. [session-verified] (https://localhost:3021/docs/api/calendar#delete-api-v1-salesshift-calendar-events-event-id) - POST /api/v1/salesshift/calendar/events/{event_id}/duplicate — Copy at the same time with a ' (copy)' suffix. [session-verified] (https://localhost:3021/docs/api/calendar#post-api-v1-salesshift-calendar-events-event-id-duplicate) - POST /api/v1/salesshift/calendar/events/{event_id}/invite — Send or re-send the invitation. [session-verified] (https://localhost:3021/docs/api/calendar#post-api-v1-salesshift-calendar-events-event-id-invite) - GET /api/v1/salesshift/calendar/events/{event_id}/invites — Who was invited, what they answered, and the two deep links that let the organiser put the same event in their own external calendar. [session-verified] (https://localhost:3021/docs/api/calendar#get-api-v1-salesshift-calendar-events-event-id-invites) - POST /api/v1/salesshift/calendar/events/{event_id}/invites — Send or re-send the invitation. [session-verified] (https://localhost:3021/docs/api/calendar#post-api-v1-salesshift-calendar-events-event-id-invites) - GET /api/v1/salesshift/calendar/export.ics — RFC-5545 calendar file. [session-verified] (https://localhost:3021/docs/api/calendar#get-api-v1-salesshift-calendar-export-ics) - GET /api/v1/salesshift/calendar/rsvp/{token} — The page an attendee lands on from the invitation. [session-verified] (https://localhost:3021/docs/api/calendar#get-api-v1-salesshift-calendar-rsvp-token) - POST /api/v1/salesshift/calendar/rsvp/{token} — Record the reply. [session-verified] (https://localhost:3021/docs/api/calendar#post-api-v1-salesshift-calendar-rsvp-token) - GET /api/v1/salesshift/calendars — The organization's calendars, seeding a default one when none exist. [live-call] (https://localhost:3021/docs/api/calendar#get-api-v1-salesshift-calendars) - POST /api/v1/salesshift/calendars — Create a calendar; the org's first calendar is always its default. [session-verified] (https://localhost:3021/docs/api/calendar#post-api-v1-salesshift-calendars) - PATCH /api/v1/salesshift/calendars/{calendar_id} — Update a calendar's fields. [session-verified] (https://localhost:3021/docs/api/calendar#patch-api-v1-salesshift-calendars-calendar-id) - DELETE /api/v1/salesshift/calendars/{calendar_id} — Events survive — ss_calendar_events.calendar_id is ON DELETE SET NULL. [session-verified] (https://localhost:3021/docs/api/calendar#delete-api-v1-salesshift-calendars-calendar-id) ### Messaging and calls Rooms, messages, attachments, polls, scheduled messages, guest invitations, and call recording and intelligence. Reference page: https://localhost:3021/docs/api/messaging - GET /api/v1/messaging/attachments/{attachment_id}/file — Download a message attachment, if the caller is a member of its room. [session-verified] (https://localhost:3021/docs/api/messaging#get-api-v1-messaging-attachments-attachment-id-file) - GET /api/v1/messaging/bookmarks — The caller's saved messages. [live-call] (https://localhost:3021/docs/api/messaging#get-api-v1-messaging-bookmarks) - GET /api/v1/messaging/calls/{call_id}/intelligence — One read for the whole post-call record. [known-unproven] (https://localhost:3021/docs/api/messaging#get-api-v1-messaging-calls-call-id-intelligence) - POST /api/v1/messaging/calls/{call_id}/recording/chunks — Append one MediaRecorder blob to the in-progress upload. [known-unproven] (https://localhost:3021/docs/api/messaging#post-api-v1-messaging-calls-call-id-recording-chunks) - POST /api/v1/messaging/calls/{call_id}/recording/finalize — Seal the upload into a recording row — IF it was ever announced. [known-unproven] (https://localhost:3021/docs/api/messaging#post-api-v1-messaging-calls-call-id-recording-finalize) - GET /api/v1/messaging/calls/{call_id}/recordings/{recording_id}/file — Membership-checked stream. [known-unproven] (https://localhost:3021/docs/api/messaging#get-api-v1-messaging-calls-call-id-recordings-recording-id-file) - POST /api/v1/messaging/calls/{call_id}/transcribe — For the common case: the recording landed before anyone configured a key. [known-unproven] (https://localhost:3021/docs/api/messaging#post-api-v1-messaging-calls-call-id-transcribe) - GET /api/v1/messaging/calls/active — Drives the rooms-rail 'live' pills on first paint, before the lobby socket is up. [live-call] (https://localhost:3021/docs/api/messaging#get-api-v1-messaging-calls-active) - GET /api/v1/messaging/chat-invitations/{token} — Public lookup of a guest invitation by token. [session-verified] (https://localhost:3021/docs/api/messaging#get-api-v1-messaging-chat-invitations-token) - POST /api/v1/messaging/chat-invitations/{token}/accept — Public accept of a guest invitation; provisions the guest user and room membership. [session-verified] (https://localhost:3021/docs/api/messaging#post-api-v1-messaging-chat-invitations-token-accept) - POST /api/v1/messaging/chat-invitations/{token}/decline — Public decline of a guest invitation. [session-verified] (https://localhost:3021/docs/api/messaging#post-api-v1-messaging-chat-invitations-token-decline) - DELETE /api/v1/messaging/guest-invitations/{invitation_id} — Revoke a guest's access. [session-verified] (https://localhost:3021/docs/api/messaging#delete-api-v1-messaging-guest-invitations-invitation-id) - GET /api/v1/messaging/health — Live health for the messaging plane. [live-call] (https://localhost:3021/docs/api/messaging#get-api-v1-messaging-health) - POST /api/v1/messaging/hooks/{token} — Post a message into a room from an incoming webhook; the token is the only credential. [session-verified] (https://localhost:3021/docs/api/messaging#post-api-v1-messaging-hooks-token) - GET /api/v1/messaging/invitations — The caller's pending room invitations. [live-call] (https://localhost:3021/docs/api/messaging#get-api-v1-messaging-invitations) - POST /api/v1/messaging/invitations/{invitation_id}/respond — Accept or decline a room invitation. [session-verified] (https://localhost:3021/docs/api/messaging#post-api-v1-messaging-invitations-invitation-id-respond) - GET /api/v1/messaging/mentions — The caller's mention inbox. [live-call] (https://localhost:3021/docs/api/messaging#get-api-v1-messaging-mentions) - POST /api/v1/messaging/mentions/read — Mark a set of mentions read. [session-verified] (https://localhost:3021/docs/api/messaging#post-api-v1-messaging-mentions-read) - POST /api/v1/messaging/messages/{message_id}/ack — Acknowledge a priority message. [session-verified] (https://localhost:3021/docs/api/messaging#post-api-v1-messaging-messages-message-id-ack) - GET /api/v1/messaging/messages/{message_id}/acks — Who has acknowledged a message. [session-verified] (https://localhost:3021/docs/api/messaging#get-api-v1-messaging-messages-message-id-acks) - POST /api/v1/messaging/messages/{message_id}/bookmark — Save a message to the caller's bookmarks. [session-verified] (https://localhost:3021/docs/api/messaging#post-api-v1-messaging-messages-message-id-bookmark) - DELETE /api/v1/messaging/messages/{message_id}/bookmark — Remove a message from the caller's bookmarks. [session-verified] (https://localhost:3021/docs/api/messaging#delete-api-v1-messaging-messages-message-id-bookmark) - POST /api/v1/messaging/polls/{poll_id}/vote — Vote on a poll. [session-verified] (https://localhost:3021/docs/api/messaging#post-api-v1-messaging-polls-poll-id-vote) - GET /api/v1/messaging/rooms — Rooms the caller belongs to; guests see only their own rooms. [live-call] (https://localhost:3021/docs/api/messaging#get-api-v1-messaging-rooms) - POST /api/v1/messaging/rooms — Create a chat room; cross-organization rooms are superuser-only and guests may not create rooms. [session-verified] (https://localhost:3021/docs/api/messaging#post-api-v1-messaging-rooms) - GET /api/v1/messaging/rooms/{room_id} — One room, if the caller is a member. [session-verified] (https://localhost:3021/docs/api/messaging#get-api-v1-messaging-rooms-room-id) - POST /api/v1/messaging/rooms/{room_id}/ai — `mode='ask'`: posts the question, then VxAI's answer, into the room. [code-only] (https://localhost:3021/docs/api/messaging#post-api-v1-messaging-rooms-room-id-ai) - POST /api/v1/messaging/rooms/{room_id}/attachments — Upload an attachment and create a chat message that references it. [session-verified] (https://localhost:3021/docs/api/messaging#post-api-v1-messaging-rooms-room-id-attachments) - GET /api/v1/messaging/rooms/{room_id}/call — The live call in a room, if there is one. [session-verified] (https://localhost:3021/docs/api/messaging#get-api-v1-messaging-rooms-room-id-call) - GET /api/v1/messaging/rooms/{room_id}/calls — Past calls in a room. [session-verified] (https://localhost:3021/docs/api/messaging#get-api-v1-messaging-rooms-room-id-calls) - GET /api/v1/messaging/rooms/{room_id}/guest-invitations — Guest invitations issued for a room. [session-verified] (https://localhost:3021/docs/api/messaging#get-api-v1-messaging-rooms-room-id-guest-invitations) - POST /api/v1/messaging/rooms/{room_id}/guest-invitations — Invite an external CRM contact into one room as a guest; guests may not invite guests. [session-verified] (https://localhost:3021/docs/api/messaging#post-api-v1-messaging-rooms-room-id-guest-invitations) - POST /api/v1/messaging/rooms/{room_id}/invitations — Invite a platform user to a room. [session-verified] (https://localhost:3021/docs/api/messaging#post-api-v1-messaging-rooms-room-id-invitations) - POST /api/v1/messaging/rooms/{room_id}/join — Join a room. [session-verified] (https://localhost:3021/docs/api/messaging#post-api-v1-messaging-rooms-room-id-join) - POST /api/v1/messaging/rooms/{room_id}/leave — Leave a room. [session-verified] (https://localhost:3021/docs/api/messaging#post-api-v1-messaging-rooms-room-id-leave) - GET /api/v1/messaging/rooms/{room_id}/messages — Message history for a room, paged backwards from a timestamp. [session-verified] (https://localhost:3021/docs/api/messaging#get-api-v1-messaging-rooms-room-id-messages) - POST /api/v1/messaging/rooms/{room_id}/messages — Send a message via REST API (fallback when WebSocket is not available) [session-verified] (https://localhost:3021/docs/api/messaging#post-api-v1-messaging-rooms-room-id-messages) - PUT /api/v1/messaging/rooms/{room_id}/messages/{message_id} — Edit your own message. [session-verified] (https://localhost:3021/docs/api/messaging#put-api-v1-messaging-rooms-room-id-messages-message-id) - DELETE /api/v1/messaging/rooms/{room_id}/messages/{message_id} — Soft-delete a single message ("delete for everyone"). [session-verified] (https://localhost:3021/docs/api/messaging#delete-api-v1-messaging-rooms-room-id-messages-message-id) - POST /api/v1/messaging/rooms/{room_id}/messages/{message_id}/forward — Forward to up to 5 rooms the caller belongs to (WhatsApp's anti-spam cap). [session-verified] (https://localhost:3021/docs/api/messaging#post-api-v1-messaging-rooms-room-id-messages-message-id-forward) - POST /api/v1/messaging/rooms/{room_id}/messages/{message_id}/pin — Pin or unpin a message in a room. [session-verified] (https://localhost:3021/docs/api/messaging#post-api-v1-messaging-rooms-room-id-messages-message-id-pin) - GET /api/v1/messaging/rooms/{room_id}/messages/{root_id}/thread — Root message + its replies, oldest first. [session-verified] (https://localhost:3021/docs/api/messaging#get-api-v1-messaging-rooms-room-id-messages-root-id-thread) - GET /api/v1/messaging/rooms/{room_id}/messages/search — Server-side search over the FULL room history. [session-verified] (https://localhost:3021/docs/api/messaging#get-api-v1-messaging-rooms-room-id-messages-search) - GET /api/v1/messaging/rooms/{room_id}/pins — Pinned messages in a room. [session-verified] (https://localhost:3021/docs/api/messaging#get-api-v1-messaging-rooms-room-id-pins) - GET /api/v1/messaging/rooms/{room_id}/polls — Poll snapshots for a room. [session-verified] (https://localhost:3021/docs/api/messaging#get-api-v1-messaging-rooms-room-id-polls) - POST /api/v1/messaging/rooms/{room_id}/polls — Create a poll in a room (question plus 2-12 options). [session-verified] (https://localhost:3021/docs/api/messaging#post-api-v1-messaging-rooms-room-id-polls) - POST /api/v1/messaging/rooms/{room_id}/read — Record read receipts for every message from other senders in this room that the caller hasn't read yet, and broadcast so senders' ticks update. [session-verified] (https://localhost:3021/docs/api/messaging#post-api-v1-messaging-rooms-room-id-read) - POST /api/v1/messaging/rooms/{room_id}/scheduled — Schedule a message to be posted to a room later. [session-verified] (https://localhost:3021/docs/api/messaging#post-api-v1-messaging-rooms-room-id-scheduled) - GET /api/v1/messaging/rooms/{room_id}/settings — Return the caller's per-room flags (mute/favorite/blocked/etc.). [session-verified] (https://localhost:3021/docs/api/messaging#get-api-v1-messaging-rooms-room-id-settings) - PUT /api/v1/messaging/rooms/{room_id}/settings — Persist the caller's per-room flags. [session-verified] (https://localhost:3021/docs/api/messaging#put-api-v1-messaging-rooms-room-id-settings) - GET /api/v1/messaging/rooms/{room_id}/users — Room participants with their presence state. [session-verified] (https://localhost:3021/docs/api/messaging#get-api-v1-messaging-rooms-room-id-users) - POST /api/v1/messaging/rooms/{room_id}/webhook — Returns a tokenized URL that external systems (CI, Grafana, vxalerts) can POST {"text": "..."} to. [session-verified] (https://localhost:3021/docs/api/messaging#post-api-v1-messaging-rooms-room-id-webhook) - GET /api/v1/messaging/rooms/discover — List joinable rooms the caller isn't in yet — for the Browse Channels / Browse Groups UI. [live-call] (https://localhost:3021/docs/api/messaging#get-api-v1-messaging-rooms-discover) - GET /api/v1/messaging/rtc/ice — STUN/TURN config + the mesh caps the server will actually enforce. [live-call] (https://localhost:3021/docs/api/messaging#get-api-v1-messaging-rtc-ice) - GET /api/v1/messaging/scheduled — The caller's scheduled messages. [live-call] (https://localhost:3021/docs/api/messaging#get-api-v1-messaging-scheduled) - DELETE /api/v1/messaging/scheduled/{scheduled_id} — Cancel one of the caller's scheduled messages. [session-verified] (https://localhost:3021/docs/api/messaging#delete-api-v1-messaging-scheduled-scheduled-id) - GET /api/v1/messaging/users — List active users available to start a direct message with. [live-call] (https://localhost:3021/docs/api/messaging#get-api-v1-messaging-users) ### Marketing Lead-capture forms, landing pages, booking links, automation rules and their public pages. Reference page: https://localhost:3021/docs/api/marketing - GET /api/v1/salesshift/automations — The organization's automation rules. [live-call] (https://localhost:3021/docs/api/marketing#get-api-v1-salesshift-automations) - POST /api/v1/salesshift/automations — Create an automation rule from a known trigger and action pair. [code-only] (https://localhost:3021/docs/api/marketing#post-api-v1-salesshift-automations) - PUT /api/v1/salesshift/automations/{rule_id} — Update an automation rule. [code-only] (https://localhost:3021/docs/api/marketing#put-api-v1-salesshift-automations-rule-id) - DELETE /api/v1/salesshift/automations/{rule_id} — Delete an automation rule. [code-only] (https://localhost:3021/docs/api/marketing#delete-api-v1-salesshift-automations-rule-id) - GET /api/v1/salesshift/booking-links — The organization's booking links and their booking counts. [live-call] (https://localhost:3021/docs/api/marketing#get-api-v1-salesshift-booking-links) - POST /api/v1/salesshift/booking-links — Create a booking link owned by the calling user. [code-only] (https://localhost:3021/docs/api/marketing#post-api-v1-salesshift-booking-links) - GET /api/v1/salesshift/forms — The organization's lead-capture forms. [live-call] (https://localhost:3021/docs/api/marketing#get-api-v1-salesshift-forms) - POST /api/v1/salesshift/forms — Create a lead-capture form; the field set must include an email field. [code-only] (https://localhost:3021/docs/api/marketing#post-api-v1-salesshift-forms) - DELETE /api/v1/salesshift/forms/{form_id} — Delete a form. [code-only] (https://localhost:3021/docs/api/marketing#delete-api-v1-salesshift-forms-form-id) - GET /api/v1/salesshift/pages — The organization's landing pages. [live-call] (https://localhost:3021/docs/api/marketing#get-api-v1-salesshift-pages) - POST /api/v1/salesshift/pages — Create a landing page with a slug derived from its name. [code-only] (https://localhost:3021/docs/api/marketing#post-api-v1-salesshift-pages) - DELETE /api/v1/salesshift/pages/{page_id} — Delete a landing page. [code-only] (https://localhost:3021/docs/api/marketing#delete-api-v1-salesshift-pages-page-id) - GET /api/v1/salesshift/public/book/{slug} — Public HTML booking page for an active link. [code-only] (https://localhost:3021/docs/api/marketing#get-api-v1-salesshift-public-book-slug) - POST /api/v1/salesshift/public/book/{slug} — Public booking submit; records the booking and returns an HTML confirmation. [code-only] (https://localhost:3021/docs/api/marketing#post-api-v1-salesshift-public-book-slug) - GET /api/v1/salesshift/public/forms/{form_id} — Public HTML render of an active form. [live-call] (https://localhost:3021/docs/api/marketing#get-api-v1-salesshift-public-forms-form-id) - POST /api/v1/salesshift/public/forms/{form_id}/submit — Public form submit; creates a submission and an HTML confirmation. [code-only] (https://localhost:3021/docs/api/marketing#post-api-v1-salesshift-public-forms-form-id-submit) - GET /api/v1/salesshift/public/p/{slug} — Public HTML render of a published landing page by slug. [code-only] (https://localhost:3021/docs/api/marketing#get-api-v1-salesshift-public-p-slug) ### SEO Tracked sites, keyword rank checks, site audits and the SEO overview. Reference page: https://localhost:3021/docs/api/seo - POST /api/v1/salesshift/seo/audit — Crawl + analyse a site on the tenant node, store the result, notify. [code-only] (https://localhost:3021/docs/api/seo#post-api-v1-salesshift-seo-audit) - GET /api/v1/salesshift/seo/audits — Audit history — summary rows only unless ``?full=1``. [live-call] (https://localhost:3021/docs/api/seo#get-api-v1-salesshift-seo-audits) - GET /api/v1/salesshift/seo/audits/{audit_id} — One SEO audit with its full findings. [live-call] (https://localhost:3021/docs/api/seo#get-api-v1-salesshift-seo-audits-audit-id) - GET /api/v1/salesshift/seo/keywords — Tracked keywords, optionally narrowed to one site. [live-call] (https://localhost:3021/docs/api/seo#get-api-v1-salesshift-seo-keywords) - POST /api/v1/salesshift/seo/keywords — Bulk-add tracked keywords (deduped against what's already tracked). [code-only] (https://localhost:3021/docs/api/seo#post-api-v1-salesshift-seo-keywords) - DELETE /api/v1/salesshift/seo/keywords/{keyword_id} — Stop tracking a keyword. [code-only] (https://localhost:3021/docs/api/seo#delete-api-v1-salesshift-seo-keywords-keyword-id) - POST /api/v1/salesshift/seo/keywords/{keyword_id}/check — Real SERP position check through the node engine, then persist it. [code-only] (https://localhost:3021/docs/api/seo#post-api-v1-salesshift-seo-keywords-keyword-id-check) - POST /api/v1/salesshift/seo/keywords/check-all — Sequentially re-check up to 25 tracked keywords (small delay between SERP fetches). [code-only] (https://localhost:3021/docs/api/seo#post-api-v1-salesshift-seo-keywords-check-all) - GET /api/v1/salesshift/seo/overview — Rollup across the org's sites, keywords and audits. [live-call] (https://localhost:3021/docs/api/seo#get-api-v1-salesshift-seo-overview) - GET /api/v1/salesshift/seo/sites — The organization's tracked sites with their keyword counts. [live-call] (https://localhost:3021/docs/api/seo#get-api-v1-salesshift-seo-sites) - POST /api/v1/salesshift/seo/sites — Add a site to track, normalising and validating the domain. [code-only] (https://localhost:3021/docs/api/seo#post-api-v1-salesshift-seo-sites) - DELETE /api/v1/salesshift/seo/sites/{site_id} — Removes the site and — via ON DELETE CASCADE — its keywords, rank history and audit history. [code-only] (https://localhost:3021/docs/api/seo#delete-api-v1-salesshift-seo-sites-site-id) - POST /api/v1/salesshift/seo/suggest — Real Google autocomplete suggestions via the node — no invented ideas. [code-only] (https://localhost:3021/docs/api/seo#post-api-v1-salesshift-seo-suggest) ### Workflows Visual workflows, their nodes and edges, validation, test runs and run history. Reference page: https://localhost:3021/docs/api/workflows - GET /api/v1/salesshift/workflow-runs/{run_id} — One workflow run with its per-node step log. [code-only] (https://localhost:3021/docs/api/workflows#get-api-v1-salesshift-workflow-runs-run-id) - GET /api/v1/salesshift/workflows — The organization's workflows, optionally filtered by status. [live-call] (https://localhost:3021/docs/api/workflows#get-api-v1-salesshift-workflows) - POST /api/v1/salesshift/workflows — Create a workflow with a validated status and trigger type. [code-only] (https://localhost:3021/docs/api/workflows#post-api-v1-salesshift-workflows) - GET /api/v1/salesshift/workflows/{workflow_id} — One workflow with its run count. [live-call] (https://localhost:3021/docs/api/workflows#get-api-v1-salesshift-workflows-workflow-id) - PUT /api/v1/salesshift/workflows/{workflow_id} — Update a workflow from a partial payload. [code-only] (https://localhost:3021/docs/api/workflows#put-api-v1-salesshift-workflows-workflow-id) - DELETE /api/v1/salesshift/workflows/{workflow_id} — Delete a workflow. [code-only] (https://localhost:3021/docs/api/workflows#delete-api-v1-salesshift-workflows-workflow-id) - POST /api/v1/salesshift/workflows/{workflow_id}/activate — Activate — but only a graph the engine says is valid goes live. [code-only] (https://localhost:3021/docs/api/workflows#post-api-v1-salesshift-workflows-workflow-id-activate) - POST /api/v1/salesshift/workflows/{workflow_id}/duplicate — Copy a workflow, its nodes and its edges into a new draft. [code-only] (https://localhost:3021/docs/api/workflows#post-api-v1-salesshift-workflows-workflow-id-duplicate) - POST /api/v1/salesshift/workflows/{workflow_id}/enroll — One run per contact. [code-only] (https://localhost:3021/docs/api/workflows#post-api-v1-salesshift-workflows-workflow-id-enroll) - POST /api/v1/salesshift/workflows/{workflow_id}/pause — Set a workflow's status to paused. [code-only] (https://localhost:3021/docs/api/workflows#post-api-v1-salesshift-workflows-workflow-id-pause) - GET /api/v1/salesshift/workflows/{workflow_id}/runs — Recent runs of one workflow. [code-only] (https://localhost:3021/docs/api/workflows#get-api-v1-salesshift-workflows-workflow-id-runs) - POST /api/v1/salesshift/workflows/{workflow_id}/test-run — Run the graph once and hand back the full trace for the canvas. [code-only] (https://localhost:3021/docs/api/workflows#post-api-v1-salesshift-workflows-workflow-id-test-run) - POST /api/v1/salesshift/workflows/{workflow_id}/validate — Proxy the node's graph linter. [code-only] (https://localhost:3021/docs/api/workflows#post-api-v1-salesshift-workflows-workflow-id-validate) - POST /api/v1/salesshift/workflows/internal/action — Perform one side-effecting node on behalf of the Go engine. [code-only] (https://localhost:3021/docs/api/workflows#post-api-v1-salesshift-workflows-internal-action) ### Reports and analytics Report datasets, ad-hoc and saved reports, dashboards, schedules, attribution, goals and forecast, plus sales, email and funnel analytics. Reference page: https://localhost:3021/docs/api/reports - GET /api/v1/salesshift/analytics/activity/health — Is the projection actually keeping up, and what is it missing? [code-only] (https://localhost:3021/docs/api/reports#get-api-v1-salesshift-analytics-activity-health) - GET /api/v1/salesshift/analytics/activity/timeline — Ordered event history for a contact, a workflow, a run, or the whole org. [code-only] (https://localhost:3021/docs/api/reports#get-api-v1-salesshift-analytics-activity-timeline) - GET /api/v1/salesshift/analytics/attribution — Credit won-deal revenue across the touches that preceded it. [live-call] (https://localhost:3021/docs/api/reports#get-api-v1-salesshift-analytics-attribution) - POST /api/v1/salesshift/analytics/attribution/backfill — Backfill attribution touches for the organization. [code-only] (https://localhost:3021/docs/api/reports#post-api-v1-salesshift-analytics-attribution-backfill) - GET /api/v1/salesshift/analytics/campaign-performance — Per-campaign engagement: opened/replied come from ss_email_tracking. [code-only] (https://localhost:3021/docs/api/reports#get-api-v1-salesshift-analytics-campaign-performance) - GET /api/v1/salesshift/analytics/contract-cycle — E-sign cycle: status counts, avg hours sent→completed, last 5 contracts. [code-only] (https://localhost:3021/docs/api/reports#get-api-v1-salesshift-analytics-contract-cycle) - GET /api/v1/salesshift/analytics/email — Sent/opened/clicked/replied/bounced counts from the email tracking table. [live-call] (https://localhost:3021/docs/api/reports#get-api-v1-salesshift-analytics-email) - GET /api/v1/salesshift/analytics/engagement — Reply-category breakdown + top 10 engaged contacts (opens + 5x replies). [code-only] (https://localhost:3021/docs/api/reports#get-api-v1-salesshift-analytics-engagement) - GET /api/v1/salesshift/analytics/funnel — Deal pipeline funnel: stages in display_order with OPEN deal count, value and each stage's share of the first stage (deals sit in their CURRENT stage). [code-only] (https://localhost:3021/docs/api/reports#get-api-v1-salesshift-analytics-funnel) - GET /api/v1/salesshift/analytics/overview — ONE aggregate powering the Overview dashboard — every number is real SQL. [live-call] (https://localhost:3021/docs/api/reports#get-api-v1-salesshift-analytics-overview) - GET /api/v1/salesshift/analytics/pipeline-history — What the funnel looked like over time — the question fixed dashboards could never answer. [live-call] (https://localhost:3021/docs/api/reports#get-api-v1-salesshift-analytics-pipeline-history) - POST /api/v1/salesshift/analytics/pipeline-snapshot/run — Take a pipeline snapshot immediately instead of waiting for the scheduled run. [code-only] (https://localhost:3021/docs/api/reports#post-api-v1-salesshift-analytics-pipeline-snapshot-run) - GET /api/v1/salesshift/analytics/sales — Win/loss counts and pipeline value aggregated from the org's deals. [live-call] (https://localhost:3021/docs/api/reports#get-api-v1-salesshift-analytics-sales) - GET /api/v1/salesshift/analytics/timeseries — Per-day sent/opened/replied counts. [code-only] (https://localhost:3021/docs/api/reports#get-api-v1-salesshift-analytics-timeseries) - GET /api/v1/salesshift/dashboards — The organization's dashboards. [live-call] (https://localhost:3021/docs/api/reports#get-api-v1-salesshift-dashboards) - POST /api/v1/salesshift/dashboards — Create a dashboard owned by the calling user. [code-only] (https://localhost:3021/docs/api/reports#post-api-v1-salesshift-dashboards) - GET /api/v1/salesshift/dashboards/{dashboard_id} — One dashboard with its widgets. [code-only] (https://localhost:3021/docs/api/reports#get-api-v1-salesshift-dashboards-dashboard-id) - POST /api/v1/salesshift/dashboards/{dashboard_id}/widgets — Add a widget backed by a saved report to a dashboard. [code-only] (https://localhost:3021/docs/api/reports#post-api-v1-salesshift-dashboards-dashboard-id-widgets) - DELETE /api/v1/salesshift/dashboards/widgets/{widget_id} — Remove a widget from a dashboard. [code-only] (https://localhost:3021/docs/api/reports#delete-api-v1-salesshift-dashboards-widgets-widget-id) - PATCH /api/v1/salesshift/deals/{deal_id}/forecast-category — Set a deal's forecast category (commit, best case, pipeline, omitted). [code-only] (https://localhost:3021/docs/api/reports#patch-api-v1-salesshift-deals-deal-id-forecast-category) - GET /api/v1/salesshift/emails — Inbox feed — every tracked outbound email with its engagement state. [live-call] (https://localhost:3021/docs/api/reports#get-api-v1-salesshift-emails) - GET /api/v1/salesshift/forecast — Category roll-up from live deals, plus every submission for the period so called-vs-actual is visible rather than lost. [live-call] (https://localhost:3021/docs/api/reports#get-api-v1-salesshift-forecast) - POST /api/v1/salesshift/forecast/submit — Append a submission. [code-only] (https://localhost:3021/docs/api/reports#post-api-v1-salesshift-forecast-submit) - GET /api/v1/salesshift/goals — The organization's goals. [live-call] (https://localhost:3021/docs/api/reports#get-api-v1-salesshift-goals) - POST /api/v1/salesshift/goals — Create a goal against a known metric. [code-only] (https://localhost:3021/docs/api/reports#post-api-v1-salesshift-goals) - GET /api/v1/salesshift/goals/leaderboard — Attainment per owner: actuals from the same data the reports use, goals from ss_goals, sorted by percentage of target. [code-only] (https://localhost:3021/docs/api/reports#get-api-v1-salesshift-goals-leaderboard) - GET /api/v1/salesshift/reports — The organization's saved reports. [live-call] (https://localhost:3021/docs/api/reports#get-api-v1-salesshift-reports) - POST /api/v1/salesshift/reports — Save a report; the definition is compiled and run first, so an unrunnable report is never stored. [live-call] (https://localhost:3021/docs/api/reports#post-api-v1-salesshift-reports) - GET /api/v1/salesshift/reports/{report_id} — One saved report, executed by default. [live-call] (https://localhost:3021/docs/api/reports#get-api-v1-salesshift-reports-report-id) - PATCH /api/v1/salesshift/reports/{report_id} — Update a saved report's name or definition. [code-only] (https://localhost:3021/docs/api/reports#patch-api-v1-salesshift-reports-report-id) - DELETE /api/v1/salesshift/reports/{report_id} — Delete a report along with its dashboard widgets and schedules. [live-call] (https://localhost:3021/docs/api/reports#delete-api-v1-salesshift-reports-report-id) - GET /api/v1/salesshift/reports/{report_id}/export — Run a saved report and return it as a downloadable file. [live-call] (https://localhost:3021/docs/api/reports#get-api-v1-salesshift-reports-report-id-export) - POST /api/v1/salesshift/reports/{report_id}/schedule — Schedule recurring delivery of a saved report. [code-only] (https://localhost:3021/docs/api/reports#post-api-v1-salesshift-reports-report-id-schedule) - GET /api/v1/salesshift/reports/{report_id}/schedules — The delivery schedules attached to one report. [code-only] (https://localhost:3021/docs/api/reports#get-api-v1-salesshift-reports-report-id-schedules) - GET /api/v1/salesshift/reports/datasets — What the builder UI renders. [live-call] (https://localhost:3021/docs/api/reports#get-api-v1-salesshift-reports-datasets) - POST /api/v1/salesshift/reports/run — Run a report definition without saving it. [live-call] (https://localhost:3021/docs/api/reports#post-api-v1-salesshift-reports-run) ### Settings and team Org integrations, suppressions, sending mailboxes, DNS checks, dashboard counters and teammate management. Reference page: https://localhost:3021/docs/api/settings - POST /api/v1/salesshift/settings/dns-check — Check SPF / DMARC TXT records for a sending domain (DKIM needs the selector, so it reports 'unknown' unless one is provided). [code-only] (https://localhost:3021/docs/api/settings#post-api-v1-salesshift-settings-dns-check) - GET /api/v1/salesshift/settings/integrations — The organization's configured integrations (email, AI, payment providers). [live-call] (https://localhost:3021/docs/api/settings#get-api-v1-salesshift-settings-integrations) - POST /api/v1/salesshift/settings/integrations — Store credentials in Vault and upsert the metadata row. [code-only] (https://localhost:3021/docs/api/settings#post-api-v1-salesshift-settings-integrations) - DELETE /api/v1/salesshift/settings/integrations/{integration_id} — Delete one integration. [code-only] (https://localhost:3021/docs/api/settings#delete-api-v1-salesshift-settings-integrations-integration-id) - POST /api/v1/salesshift/settings/integrations/{integration_id}/test — Read the credentials back out of Vault and use them against the provider for real — a Vault round-trip alone proves nothing about whether the key, host, port or password still work. [code-only] (https://localhost:3021/docs/api/settings#post-api-v1-salesshift-settings-integrations-integration-id-test) - GET /api/v1/salesshift/settings/mailboxes — The organization's configured sending mailboxes. [live-call] (https://localhost:3021/docs/api/settings#get-api-v1-salesshift-settings-mailboxes) - POST /api/v1/salesshift/settings/mailboxes — Register a sending mailbox for the organization. [code-only] (https://localhost:3021/docs/api/settings#post-api-v1-salesshift-settings-mailboxes) - POST /api/v1/salesshift/settings/poll-replies-now — Manually run one IMAP reply-detection pass (the background loop also runs this every ~5 minutes). [code-only] (https://localhost:3021/docs/api/settings#post-api-v1-salesshift-settings-poll-replies-now) - GET /api/v1/salesshift/settings/suppressions — Up to 500 suppressed addresses for the organization. [live-call] (https://localhost:3021/docs/api/settings#get-api-v1-salesshift-settings-suppressions) - POST /api/v1/salesshift/settings/suppressions — Add an address to the organization's suppression list. [code-only] (https://localhost:3021/docs/api/settings#post-api-v1-salesshift-settings-suppressions) - DELETE /api/v1/salesshift/settings/suppressions/{suppression_id} — Release an address. [code-only] (https://localhost:3021/docs/api/settings#delete-api-v1-salesshift-settings-suppressions-suppression-id) - GET /api/v1/salesshift/settings/team — Every user of the current organization (active and deactivated). [live-call] (https://localhost:3021/docs/api/settings#get-api-v1-salesshift-settings-team) - PATCH /api/v1/salesshift/settings/team/{user_id} — Change a teammate's role, or bring a deactivated one back. [code-only] (https://localhost:3021/docs/api/settings#patch-api-v1-salesshift-settings-team-user-id) - DELETE /api/v1/salesshift/settings/team/{user_id} — Deactivate a teammate; admin only, and the caller cannot deactivate themselves. [code-only] (https://localhost:3021/docs/api/settings#delete-api-v1-salesshift-settings-team-user-id) - POST /api/v1/salesshift/settings/team/invite — Create a teammate account in THIS org via the shared tenant-user creator, then email them their credentials. [code-only] (https://localhost:3021/docs/api/settings#post-api-v1-salesshift-settings-team-invite) - GET /api/v1/salesshift/stats — Dashboard counters: contacts, companies, open deals, active sequences and the email funnel. [live-call] (https://localhost:3021/docs/api/settings#get-api-v1-salesshift-stats) ### Plans and your subscription What the workspace pays SalesShift: the published plans, this workspace's own subscription and entitlements, Stripe checkout and the billing portal, and the node handshake behind the free self-hosted plan. Not the customer's own invoicing — that is Invoicing and payments. Reference page: https://localhost:3021/docs/api/billing - POST /api/v1/salesshift/billing/activate — Put this workspace on a free plan. [live-call] (https://localhost:3021/docs/api/billing#post-api-v1-salesshift-billing-activate) - POST /api/v1/salesshift/billing/cancel — Cancel the Stripe subscription, at period end or immediately. [live-call] (https://localhost:3021/docs/api/billing#post-api-v1-salesshift-billing-cancel) - POST /api/v1/salesshift/billing/change — Move to another paid plan, change the seat count, or both. [live-call] (https://localhost:3021/docs/api/billing#post-api-v1-salesshift-billing-change) - POST /api/v1/salesshift/billing/checkout — Start a Stripe Checkout session for a paid plan at a given seat count. [live-call] (https://localhost:3021/docs/api/billing#post-api-v1-salesshift-billing-checkout) - POST /api/v1/salesshift/billing/checkout/confirm — Called by the browser when Stripe redirects back. [code-only] (https://localhost:3021/docs/api/billing#post-api-v1-salesshift-billing-checkout-confirm) - GET /api/v1/salesshift/billing/entitlements — What this workspace may do, without the billing detail. [live-call] (https://localhost:3021/docs/api/billing#get-api-v1-salesshift-billing-entitlements) - GET /api/v1/salesshift/billing/events — The workspace's platform-billing event log, newest first. [live-call] (https://localhost:3021/docs/api/billing#get-api-v1-salesshift-billing-events) - GET /api/v1/salesshift/billing/invoices — Stripe is the ledger; we do not keep a shadow copy to drift out of date. [live-call] (https://localhost:3021/docs/api/billing#get-api-v1-salesshift-billing-invoices) - GET /api/v1/salesshift/billing/plans — The published plans, what each includes, and whether it is bought or activated. [live-call] (https://localhost:3021/docs/api/billing#get-api-v1-salesshift-billing-plans) - POST /api/v1/salesshift/billing/portal — Card changes, cancellation and receipts are Stripe's hosted portal. [live-call] (https://localhost:3021/docs/api/billing#post-api-v1-salesshift-billing-portal) - POST /api/v1/salesshift/billing/resume — Undo a cancellation that has not taken effect yet. [live-call] (https://localhost:3021/docs/api/billing#post-api-v1-salesshift-billing-resume) - GET /api/v1/salesshift/billing/self-hosted — Whether this workspace has a registered node, and the identity a node must report to become one. [live-call] (https://localhost:3021/docs/api/billing#get-api-v1-salesshift-billing-self-hosted) - POST /api/v1/salesshift/billing/self-hosted/node — Register the tenant's own node, after the node proves whose it is. [live-call] (https://localhost:3021/docs/api/billing#post-api-v1-salesshift-billing-self-hosted-node) - DELETE /api/v1/salesshift/billing/self-hosted/node — Detach the node. [live-call] (https://localhost:3021/docs/api/billing#delete-api-v1-salesshift-billing-self-hosted-node) - GET /api/v1/salesshift/billing/subscription — This workspace's own subscription: plan, seats, period, members and the entitlements it resolves to. [live-call] (https://localhost:3021/docs/api/billing#get-api-v1-salesshift-billing-subscription) - POST /api/v1/salesshift/billing/webhook — Unauthenticated by design — the signature IS the authentication. [live-call] (https://localhost:3021/docs/api/billing#post-api-v1-salesshift-billing-webhook) ### Webhooks and tracking Inbound provider webhooks for SendGrid, Mailgun and SES, the open pixel, the click redirect and unsubscribe. Reference page: https://localhost:3021/docs/api/webhooks - GET /api/v1/salesshift/t/c/{tracking_id} — Public click tracker; records the click then redirects to the http(s) destination. [code-only] (https://localhost:3021/docs/api/webhooks#get-api-v1-salesshift-t-c-tracking-id) - GET /api/v1/salesshift/t/o/{tracking_id}.png — Public 1x1 tracking pixel; records an open against the tracking id. [code-only] (https://localhost:3021/docs/api/webhooks#get-api-v1-salesshift-t-o-tracking-id-png) - GET /api/v1/salesshift/u/{tracking_id} — Public unsubscribe confirmation page for a tracking id. [code-only] (https://localhost:3021/docs/api/webhooks#get-api-v1-salesshift-u-tracking-id) - POST /api/v1/salesshift/u/{tracking_id} — Public unsubscribe submit; suppresses the address and returns an HTML confirmation. [code-only] (https://localhost:3021/docs/api/webhooks#post-api-v1-salesshift-u-tracking-id) - POST /api/v1/salesshift/webhooks/{integration_id}/mailgun — Mailgun webhook — {'event-data': {...}} payload. [code-only] (https://localhost:3021/docs/api/webhooks#post-api-v1-salesshift-webhooks-integration-id-mailgun) - POST /api/v1/salesshift/webhooks/{integration_id}/sendgrid — SendGrid Event Webhook — JSON array of events. [code-only] (https://localhost:3021/docs/api/webhooks#post-api-v1-salesshift-webhooks-integration-id-sendgrid) - POST /api/v1/salesshift/webhooks/{integration_id}/ses — AWS SES via SNS. [code-only] (https://localhost:3021/docs/api/webhooks#post-api-v1-salesshift-webhooks-integration-id-ses) ### AI AI email drafting through the organization's configured AI provider. Reference page: https://localhost:3021/docs/api/ai - POST /api/v1/salesshift/ai/write-email — Draft an email with the organization's configured AI provider. [code-only] (https://localhost:3021/docs/api/ai#post-api-v1-salesshift-ai-write-email) ## Optional - [Endpoint index as JSON](https://localhost:3021/docs/api/endpoints.json) - [vxcli reference](https://localhost:3021/docs/cli) - [SDK reference](https://localhost:3021/docs/sdks) Generated from app/docs/_inventory.json (2026-08-13).