Campaigns

Create a campaign

Creates a draft campaign. Give the content as html_content (optionally with the editor's json_content) or as a template_id, whose HTML is copied onto the campaign. Every list, segment, topic and template must belong to your team. The sender domain is checked when the campaign is sent, not here; language override senders are checked here and must use a verified sending domain. Send or schedule the draft with the send and schedule endpoints. Requires the campaigns:write scope. Not available to sandbox keys.

post/campaigns

Request

  • Base URL: https://app.lettr.com/api
  • URL: https://app.lettr.com/api/campaigns
  • Auth: HTTP bearer

Request body

namestring

Campaign name. Required unless subject is given, in which case the subject is used.

subjectstring nullable
from_emailstring email nullable
from_namestring nullable
reply_tostring email nullable
html_contentstring nullable

Email HTML. Merge tags such as {{first_name}} are filled from contact properties. Cannot be combined with template_id; required when json_content is given.

json_contentobject nullable

Editor JSON stored next to html_content so the campaign can be opened in the editor.

template_idinteger nullable

Template from one of your projects. Its HTML is copied onto the campaign. Cannot be combined with html_content.

language_overridesobject nullable

Per-language sender and subject overrides, keyed by language code.

Example request

{
  "name": "October newsletter",
  "subject": "News for October",
  "from_email": "news@example.com",
  "from_name": "Example",
  "html_content": "<p>Hello {{first_name}}</p>"
}

Response

Campaign created successfully.

messagestring required

Example response

{
  "message": "Campaign created successfully.",
  "data": {
    "id": "0193e6a8-1f3a-7c2a-b9e2-1aa1d2e5d3f0",
    "name": "Spring Sale",
    "status": "sent",
    "sent_count": 124,
    "created_at": "2026-05-01T09:00:00+00:00"
  }
}

Changes

No recorded changes to this operation across all 1 revision of this API.