SLSmartletter API

Newsletters

Newsletter issues (campaigns): write, review, test, send, schedule, pause, report.

get/newsletters— List newsletters

Keys: full_access

Query parameters

status"draft" | "scheduled" | "sending" | "paused" | "sent" | "failed" | "held"
limitinteger1–100, default 20.
afteruuidId of the last item of the previous page (older items).
beforeuuidId of the first item of the previous page (newer items).
curl -X GET https://api.smartletter.ai/newsletters \
  -H "Authorization: Bearer $SMARTLETTER_API_KEY"

Response 200

{
  "object": "list",
  "has_more": false,
  "data": [
    {
      "object": "newsletter",
      "id": "7c3e1a52-0000-4000-8000-000000000001",
      "segment_id": "2d9e4b11-0000-4000-8000-000000000003",
      "topic_id": null,
      "subject": "This week in AI",
      "preheader": "Three tools worth your time",
      "status": "draft",
      "body": {
        "format": "markdown",
        "content": "# Hello\n\nThree tools this week…"
      },
      "audience_limit": null,
      "scheduled_for": null,
      "pause_reason": null,
      "recipient_estimate": null,
      "created_at": "2026-10-17T09:00:00.000Z",
      "updated_at": "2026-10-17T09:00:00.000Z"
    }
  ]
}

post/newsletters— Create a draft

Creates a draft from a Markdown or HTML body. The platform adds the footer (unsubscribe link, postal address) when the issue is sent.

Keys: full_access

Body

subjectrequiredstringSubject line.
preheaderstringPreview text shown after the subject.
segment_iduuidNewsletter (segment) to send from. Optional when the workspace has a single active newsletter.
topic_iduuidTopic of that newsletter; its subscribers receive the issue.
markdownstringBody in Markdown. Give `markdown` or `html`.
htmlstringBody in HTML. The platform footer is added around it.
curl -X POST https://api.smartletter.ai/newsletters \
  -H "Authorization: Bearer $SMARTLETTER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"subject":"This week in AI","preheader":"Three tools worth your time","markdown":"# Hello\n\nThree tools this week…"}'

Response 201

{
  "object": "newsletter",
  "id": "7c3e1a52-0000-4000-8000-000000000001",
  "segment_id": "2d9e4b11-0000-4000-8000-000000000003",
  "topic_id": null,
  "subject": "This week in AI",
  "preheader": "Three tools worth your time",
  "status": "draft",
  "body": {
    "format": "markdown",
    "content": "# Hello\n\nThree tools this week…"
  },
  "audience_limit": null,
  "scheduled_for": null,
  "pause_reason": null,
  "recipient_estimate": null,
  "created_at": "2026-10-17T09:00:00.000Z",
  "updated_at": "2026-10-17T09:00:00.000Z"
}

get/newsletters/{id}— Retrieve a newsletter

Keys: full_access

curl -X GET https://api.smartletter.ai/newsletters/<id> \
  -H "Authorization: Bearer $SMARTLETTER_API_KEY"

Response 200

{
  "object": "newsletter",
  "id": "7c3e1a52-0000-4000-8000-000000000001",
  "segment_id": "2d9e4b11-0000-4000-8000-000000000003",
  "topic_id": null,
  "subject": "This week in AI",
  "preheader": "Three tools worth your time",
  "status": "draft",
  "body": {
    "format": "markdown",
    "content": "# Hello\n\nThree tools this week…"
  },
  "audience_limit": null,
  "scheduled_for": null,
  "pause_reason": null,
  "recipient_estimate": null,
  "created_at": "2026-10-17T09:00:00.000Z",
  "updated_at": "2026-10-17T09:00:00.000Z"
}

patch/newsletters/{id}— Update a draft

Keys: full_access

Body

subjectstring
preheaderstring
topic_iduuid
markdownstring
htmlstring
curl -X PATCH https://api.smartletter.ai/newsletters/<id> \
  -H "Authorization: Bearer $SMARTLETTER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"subject":"This week in AI (updated)"}'

Response 200

{
  "object": "newsletter",
  "id": "7c3e1a52-0000-4000-8000-000000000001",
  "segment_id": "2d9e4b11-0000-4000-8000-000000000003",
  "topic_id": null,
  "subject": "This week in AI",
  "preheader": "Three tools worth your time",
  "status": "draft",
  "body": {
    "format": "markdown",
    "content": "# Hello\n\nThree tools this week…"
  },
  "audience_limit": null,
  "scheduled_for": null,
  "pause_reason": null,
  "recipient_estimate": null,
  "created_at": "2026-10-17T09:00:00.000Z",
  "updated_at": "2026-10-17T09:00:00.000Z"
}

delete/newsletters/{id}— Delete a draft

Only drafts can be deleted. Unschedule a scheduled issue first.

Keys: full_access

curl -X DELETE https://api.smartletter.ai/newsletters/<id> \
  -H "Authorization: Bearer $SMARTLETTER_API_KEY"

Response 200

{
  "object": "newsletter",
  "id": "7c3e1a52-0000-4000-8000-000000000001",
  "deleted": true
}

post/newsletters/{id}/duplicate— Duplicate

Copies subject, preheader, body and targeting into a new draft. Never the sending state or the stats.

Keys: full_access

curl -X POST https://api.smartletter.ai/newsletters/<id>/duplicate \
  -H "Authorization: Bearer $SMARTLETTER_API_KEY"

Response 201

{
  "object": "newsletter",
  "id": "9a0d2f3e-0000-4000-8000-000000000004",
  "segment_id": "2d9e4b11-0000-4000-8000-000000000003",
  "topic_id": null,
  "subject": "This week in AI",
  "preheader": "Three tools worth your time",
  "status": "draft",
  "body": {
    "format": "markdown",
    "content": "# Hello\n\nThree tools this week…"
  },
  "audience_limit": null,
  "scheduled_for": null,
  "pause_reason": null,
  "recipient_estimate": null,
  "created_at": "2026-10-17T09:00:00.000Z",
  "updated_at": "2026-10-17T09:00:00.000Z"
}

get/newsletters/{id}/review— Pre-send review

Runs the checks a send runs (subject, unsubscribe link, Gmail clipping at ~102 KB, postal address, sending domain) without sending. Blocking items make send and schedule fail with 422.

Keys: full_access

curl -X GET https://api.smartletter.ai/newsletters/<id>/review \
  -H "Authorization: Bearer $SMARTLETTER_API_KEY"

Response 200

{
  "object": "review",
  "blocking": false,
  "items": [
    {
      "id": "subject",
      "level": "ok"
    },
    {
      "id": "gmail_clip",
      "level": "ok",
      "values": {
        "kb": 18
      }
    }
  ]
}

post/newsletters/{id}/test— Send a test email

Sends the issue to the workspace owner only, subject prefixed with [Test]. 10 per hour; counts in the monthly quota.

Keys: full_access

curl -X POST https://api.smartletter.ai/newsletters/<id>/test \
  -H "Authorization: Bearer $SMARTLETTER_API_KEY"

Response 200

{
  "object": "test_email",
  "to": "owner@acme.com"
}

post/newsletters/{id}/send— Send now

Locks the rendered issue and starts sending. Warm-up, test batch and automatic pauses apply. audience_limit sends to the N most engaged contacts first. A blocking pre-send item answers 422 presend_blocked with the items in details.

Keys: full_access · accepts Idempotency-Key

Body

audience_limitintegerSend only to the N most engaged contacts now; the rest can follow with send-more.
curl -X POST https://api.smartletter.ai/newsletters/<id>/send \
  -H "Authorization: Bearer $SMARTLETTER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"audience_limit":500}'

Response 200

{
  "object": "newsletter",
  "id": "7c3e1a52-0000-4000-8000-000000000001",
  "status": "sending"
}

post/newsletters/{id}/schedule— Schedule

Schedules a draft up to one year ahead. Same checks as a send.

Keys: full_access · accepts Idempotency-Key

Body

scheduled_atrequireddatetimeISO 8601 date, in the future, at most one year ahead.
audience_limitintegerSend only to the N most engaged contacts now; the rest can follow with send-more.
curl -X POST https://api.smartletter.ai/newsletters/<id>/schedule \
  -H "Authorization: Bearer $SMARTLETTER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"scheduled_at":"2026-10-20T08:00:00Z"}'

Response 200

{
  "object": "newsletter",
  "id": "7c3e1a52-0000-4000-8000-000000000001",
  "status": "scheduled",
  "scheduled_for": "2026-10-20T08:00:00.000Z"
}

post/newsletters/{id}/unschedule— Unschedule

Keys: full_access

curl -X POST https://api.smartletter.ai/newsletters/<id>/unschedule \
  -H "Authorization: Bearer $SMARTLETTER_API_KEY"

Response 200

{
  "object": "newsletter",
  "id": "7c3e1a52-0000-4000-8000-000000000001",
  "status": "draft"
}

post/newsletters/{id}/pause— Pause sending

Keys: full_access

curl -X POST https://api.smartletter.ai/newsletters/<id>/pause \
  -H "Authorization: Bearer $SMARTLETTER_API_KEY"

Response 200

{
  "object": "newsletter",
  "id": "7c3e1a52-0000-4000-8000-000000000001",
  "status": "paused"
}

post/newsletters/{id}/resume— Resume sending

Resumes a manual pause (or a quota / suspension pause once lifted). A pause for bounces, complaints or a failed test batch needs our team: 409.

Keys: full_access

curl -X POST https://api.smartletter.ai/newsletters/<id>/resume \
  -H "Authorization: Bearer $SMARTLETTER_API_KEY"

Response 200

{
  "object": "newsletter",
  "id": "7c3e1a52-0000-4000-8000-000000000001",
  "status": "sending"
}

post/newsletters/{id}/send-more— Send to the next N

For an issue sent with an audience_limit: sends to the next count most engaged contacts. Nobody gets it twice.

Keys: full_access · accepts Idempotency-Key

Body

countrequiredintegerHow many of the next most engaged contacts to add.
curl -X POST https://api.smartletter.ai/newsletters/<id>/send-more \
  -H "Authorization: Bearer $SMARTLETTER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"count":1000}'

Response 200

{
  "object": "newsletter",
  "id": "7c3e1a52-0000-4000-8000-000000000001",
  "status": "sending"
}

get/newsletters/{id}/report— Report

Opens, clicks, bounces, complaints and unsubscribes, sending progress, and results per mailbox provider.

Keys: full_access

curl -X GET https://api.smartletter.ai/newsletters/<id>/report \
  -H "Authorization: Bearer $SMARTLETTER_API_KEY"

Response 200

{
  "object": "report",
  "id": "7c3e1a52-0000-4000-8000-000000000001",
  "status": "sent",
  "totals": {
    "sent": 1200,
    "delivered": 1188,
    "opened": 540,
    "clicked": 96,
    "bounced": 12,
    "complained": 0,
    "unsubscribed": 4
  },
  "rates": {
    "delivery": 0.99,
    "open": 0.4545,
    "click": 0.0808,
    "bounce": 0.01,
    "complaint": 0,
    "unsubscribe": 0.0034
  },
  "progress": {
    "attempted": 1200,
    "recipient_estimate": 1200,
    "audience_limit": null
  },
  "providers": [
    {
      "provider": "gmail",
      "sent": 700,
      "delivered": 698,
      "opened": 330,
      "clicked": 60,
      "bounced": 2,
      "complained": 0
    }
  ]
}