API

Marketing

Settings, consent, lists, segments, content, campaigns, journeys, forms, landing pages and the public hooks.

See Marketing. Everything is read and changed as the caller: keys act as their maker, narrowed by the key's scopes. Scheduling, sending, publishing journeys and approving need marketing:send; settings, consent by hand and lifting a reputation pause need marketing:admin. Keys, MCP and Caity count against the organization's Marketing calls per minute.

The hooks under /v1/hooks/marketing need no sign-in: their tokens are sealed and say what they're for. Tracked links redirect only to the links of the message they came in.

Every route below, with its parameters, request and response, errors and samples, is in the API reference.

RouteWhat it does
GET /v1/hooks/marketing/c/:tokenA tracked link: 302 to the send's link at that position (HEAD and scanners count as machine clicks).
GET /v1/hooks/marketing/o/:tokenThe open pixel: always the image; bad or test tokens record nothing.
POST /v1/hooks/marketing/u/:tokenRFC 8058 one-click unsubscribe from everything (mail clients POST List-Unsubscribe=One-Click).
GET /v1/hooks/marketing/u/:tokenThe footer's Unsubscribe link: the preference centre, ready to unsubscribe (a GET never changes anything).
GET /v1/hooks/marketing/preferences/:tokenThe preference centre's address (masked), status and topics.
POST /v1/hooks/marketing/preferences/:tokenSaves the preference centre: a choice per topic, or unsubscribe from everything.
POST /v1/hooks/marketing/confirm/:tokenDouble opt-in: the confirmation page's Confirm button (a POST, so mail scanners can't confirm).
GET /v1/hooks/marketing/forms/:formIdA form as its page shows it, with a fresh ticket to send back.
POST /v1/hooks/marketing/forms/:formIdA submission (values by field, the consent box, the ticket, the page and its query parameters).
GET /v1/hooks/marketing/pages/:org/:slugA published landing page with its forms; view=1 counts a view.
GET /v1/orgs/:orgId/marketing/metaWhat the app loads first: settings, brand kit, sending state and readiness, Mail domains, approvers, members, limits and what the caller may do.
PUT /v1/orgs/:orgId/marketing/settingsSender, physical address, topics, approvals, frequency cap, send-time default, UTM and double opt-in (Marketing admins), over version.
PUT /v1/orgs/:orgId/marketing/brandThe brand kit marketing email is drawn in: logo, light and dark colours, font and corner radius (Marketing admins).
POST /v1/orgs/:orgId/marketing/resumeLifts the reputation guard's pause once the audience is cleaned (Marketing admins).
GET /v1/orgs/:orgId/marketing/usageMessages this month and today (the plan's month, warm-up's day) and the plan's limits.
GET /v1/orgs/:orgId/marketing/stats/dailyThe org's numbers per UTC day (from, to as YYYYMMDD; the last 30 days by default) and their totals.
GET /v1/orgs/:orgId/marketing/people/:addressAn address's consent, its history (newest first), its engagement summary and recent opens, clicks and unsubscribes.
PUT /v1/orgs/:orgId/marketing/people/:address/consentSets an address's consent by hand with a note as the evidence (Marketing admins); subscribing clears a bounce or complaint.
GET /v1/orgs/:orgId/marketing/listsStatic and suppression lists with their member counts.
POST /v1/orgs/:orgId/marketing/listsA static list (people added by hand, CSV or API) or a suppression list (never sent to), for email or texts.
GET /v1/orgs/:orgId/marketing/lists/:listIdOne list.
PATCH /v1/orgs/:orgId/marketing/lists/:listIdRenames a list or changes its description, over version.
DELETE /v1/orgs/:orgId/marketing/lists/:listIdDeletes a list no segment or unsent campaign uses (its members go in the background).
GET /v1/orgs/:orgId/marketing/lists/:listId/membersA page of a list's members.
POST /v1/orgs/:orgId/marketing/lists/:listId/membersAdds people by address (with merge fields for people not in Customers); admins may record the consent they gave elsewhere, with a note.
POST /v1/orgs/:orgId/marketing/lists/:listId/members/removeRemoves people from a list by address.
POST /v1/orgs/:orgId/marketing/lists/:listId/importsStarts a CSV import: small files with the request (content), larger ones to the returned upload URL.
GET /v1/orgs/:orgId/marketing/imports/:jobIdA list import's progress: rows read, added, skipped and why.
GET /v1/orgs/:orgId/marketing/imports/:jobId/previewThe file's columns, a few rows and the suggested mapping.
POST /v1/orgs/:orgId/marketing/imports/:jobId/startRuns the import with a mapping (a target per column: email, phone, firstName, … or blank) and, for admins, the consent people gave.
GET /v1/orgs/:orgId/marketing/segmentsSegments, by name, with their last size estimate.
POST /v1/orgs/:orgId/marketing/segmentsA segment: OR-groups of Customers filters (relative dates $daysAgo:N), engagement and list conditions.
POST /v1/orgs/:orgId/marketing/segments/previewThe first people a segment (saved or not) reaches, as the caller sees Customers: the builder's live preview.
GET /v1/orgs/:orgId/marketing/segments/:segmentIdOne segment with its groups and estimate.
PUT /v1/orgs/:orgId/marketing/segments/:segmentIdReplaces a segment's name, description and groups over version (its estimate is cleared).
DELETE /v1/orgs/:orgId/marketing/segments/:segmentIdDeletes a segment no unsent campaign or running journey uses.
POST /v1/orgs/:orgId/marketing/segments/:segmentId/estimateCounts the segment's people in the background (deduplicated by address); the result lands on the segment.
GET /v1/orgs/:orgId/marketing/templatesTemplates campaigns start from.
POST /v1/orgs/:orgId/marketing/templatesA template: a block document campaigns can start from.
GET /v1/orgs/:orgId/marketing/templates/:templateIdOne template with its document.
PATCH /v1/orgs/:orgId/marketing/templates/:templateIdChanges a template's name, description or document over version.
DELETE /v1/orgs/:orgId/marketing/templates/:templateIdDeletes a template (campaigns made from it keep their copy).
GET /v1/orgs/:orgId/marketing/blocksSaved blocks in the content library.
POST /v1/orgs/:orgId/marketing/blocksSaves a block (with its columns, if any) to the content library.
DELETE /v1/orgs/:orgId/marketing/blocks/:blockIdDeletes a saved block.
GET /v1/orgs/:orgId/marketing/imagesImages on the content library's CDN host.
POST /v1/orgs/:orgId/marketing/imagesAn image upload: the URL the browser PUTs the file to; then finish. PNG, JPEG, GIF or WebP.
POST /v1/orgs/:orgId/marketing/images/:imageId/finishFinishes an upload: the file is checked and the image goes on the CDN host.
DELETE /v1/orgs/:orgId/marketing/images/:imageIdDeletes an image (messages already sent keep showing it until it expires from caches).
POST /v1/orgs/:orgId/marketing/previewA message as one person would get it (a contact or lead the caller can read, else placeholder values), in a scheme and device.
POST /v1/orgs/:orgId/marketing/testA test to one to five members: "[Test]" in the subject, links work but don't count.
GET /v1/orgs/:orgId/marketing/campaignsCampaigns, newest first, with their numbers once sending started (status narrows them).
POST /v1/orgs/:orgId/marketing/campaignsA draft: a name, a topic, an audience (segments and lists to include and exclude) and content (a document, a template, or the starter).
GET /v1/orgs/:orgId/marketing/campaigns/:campaignIdOne campaign, and while it's a draft what stops it being sent (problems).
PATCH /v1/orgs/:orgId/marketing/campaigns/:campaignIdChanges a draft over version; changing one waiting for approval, or approved, withdraws the request.
DELETE /v1/orgs/:orgId/marketing/campaigns/:campaignIdDeletes a campaign that never sent.
POST /v1/orgs/:orgId/marketing/campaigns/:campaignId/duplicateA new draft with the same content and audience.
POST /v1/orgs/:orgId/marketing/campaigns/:campaignId/request-approvalAsks the org's approvers (other than the caller) to approve the campaign as it stands.
POST /v1/orgs/:orgId/marketing/campaigns/:campaignId/decideAn approver approves or declines (never their own request).
POST /v1/orgs/:orgId/marketing/campaigns/:campaignId/scheduleSchedules for at (epoch ms; now when left out), optionally spread over a day to each person's usual hour.
POST /v1/orgs/:orgId/marketing/campaigns/:campaignId/unscheduleTakes a scheduled campaign back (an approval stays).
POST /v1/orgs/:orgId/marketing/campaigns/:campaignId/pausePauses a sending campaign within a page of recipients.
POST /v1/orgs/:orgId/marketing/campaigns/:campaignId/resumeResumes a paused campaign where it stopped.
POST /v1/orgs/:orgId/marketing/campaigns/:campaignId/cancelCancels a scheduled, sending or paused campaign: nobody not yet sent it gets it.
GET /v1/orgs/:orgId/marketing/campaigns/:campaignId/resultsThe campaign and its numbers (sent, delivered, opened, clicked, unsubscribed, bounced, conversions, revenue, …).
GET /v1/orgs/:orgId/marketing/campaigns/:campaignId/recipientsThe send's recipients and what happened to each, a page at a time.
GET /v1/orgs/:orgId/marketing/campaigns/:campaignId/conversionsWon opportunities credited to the campaign, newest first.
GET /v1/orgs/:orgId/marketing/journeysJourneys, newest first, with how many people entered, are in them, completed and met the goal.
POST /v1/orgs/:orgId/marketing/journeysA draft journey (the definition is checked when it's published; problems lists what's missing).
POST /v1/orgs/:orgId/marketing/journeys/sms-estimateWhat a text step costs per message to each priced destination, for its text as written.
GET /v1/orgs/:orgId/marketing/journeys/:journeyIdOne journey with its draft, versions and approval, and what stops the draft going live (problems).
PATCH /v1/orgs/:orgId/marketing/journeys/:journeyIdChanges the name, description or draft over version; the live version is untouched until the next publish.
DELETE /v1/orgs/:orgId/marketing/journeys/:journeyIdDeletes a journey that never went live.
POST /v1/orgs/:orgId/marketing/journeys/:journeyId/duplicateA new draft journey from this one's draft.
POST /v1/orgs/:orgId/marketing/journeys/:journeyId/request-approvalAsks the org's approvers (other than the caller) to approve the draft as it stands.
POST /v1/orgs/:orgId/marketing/journeys/:journeyId/decideAn approver approves or declines the draft (never their own request).
POST /v1/orgs/:orgId/marketing/journeys/:journeyId/publishPublishes the draft as the next version and runs it; people already in it stay on theirs.
POST /v1/orgs/:orgId/marketing/journeys/:journeyId/pausePauses a running journey: nobody enters and nobody moves on until it resumes.
POST /v1/orgs/:orgId/marketing/journeys/:journeyId/resumeResumes a paused journey: everyone carries on from where they held.
POST /v1/orgs/:orgId/marketing/journeys/:journeyId/stopStops a journey for good: everyone in it leaves.
POST /v1/orgs/:orgId/marketing/journeys/:journeyId/enterPuts someone into a journey that takes entries by API: a Customers record, or an address with merge fields.
GET /v1/orgs/:orgId/marketing/journeys/:journeyId/peopleThe journey's people and where each is, a page at a time.
GET /v1/orgs/:orgId/marketing/journeys/:journeyId/people/:keyOne person in the journey, by their email, mobile or rec:<record id>.
GET /v1/orgs/:orgId/marketing/journeys/:journeyId/statsTotals, each step's numbers (entered, completed, exited, goal reached) and each email and text step's send.
GET /v1/orgs/:orgId/marketing/journeys/:journeyId/versions/:versionA published version as it was frozen.
GET /v1/orgs/:orgId/marketing/formsForms with their submission and spam counts.
POST /v1/orgs/:orgId/marketing/formsA form: fields mapped to lead or contact fields, defaults, a consent box (topics and wording) and what happens after.
GET /v1/orgs/:orgId/marketing/forms/:formIdOne form, with its consent wordings and the HTML that embeds it.
PUT /v1/orgs/:orgId/marketing/forms/:formIdReplaces a form over version; a new consent wording becomes a new version and the old ones are kept.
DELETE /v1/orgs/:orgId/marketing/forms/:formIdDeletes a form no running journey enters people from.
GET /v1/orgs/:orgId/marketing/forms/:formId/submissionsThe form's submissions, newest first.
GET /v1/orgs/:orgId/marketing/pagesLanding pages with their views.
POST /v1/orgs/:orgId/marketing/pagesA landing page: a block document with forms, at a slug in the org.
GET /v1/orgs/:orgId/marketing/pages/:pageIdOne landing page (its draft and what was published) and its public address.
PATCH /v1/orgs/:orgId/marketing/pages/:pageIdChanges the draft, name or address over version.
POST /v1/orgs/:orgId/marketing/pages/:pageId/publishPuts the draft live at /p/<org>/<slug> on the Marketing app.
POST /v1/orgs/:orgId/marketing/pages/:pageId/unpublishTakes a page down until it is published again.
DELETE /v1/orgs/:orgId/marketing/pages/:pageIdDeletes a landing page and frees its address.