Every API here is available over the APIs.io API and to AI agents over MCP.
openapi: 3.2.0
info:
version: 1.0.0
title: Customer.io App Newsletter Variants API
description: 'Our App API provides ways to trigger messages and retrieve information about people, campaigns, broadcasts, and more.
# Overview
The App API provides methods to send newsletters, transactional messages, and API-triggered broadcasts. You can create newsletters from scratch and update transactional messages and API-triggered broadcasts.
For transactional messages and API-triggered broadcasts, your payload acts as a message "trigger" and can contain `data` that you reference in your messages using liquid—`{{trigger.<data>}}`.
The other endpoints help you retrieve information about people, segments, campaigns, broadcasts, etc; it also lets you update campaign actions, messages, newsletter variants, etc. Aside from the [API-triggered broadcast](#triggerBroadcast) (1 per 10 seconds) and [Transactional](#sendEmail) (100 per second) endpoints, requests are limited to 10 per second.
# Use our Postman collection
We''ve generated a Postman collection to help you get started with our APIs.
If you fork this collection, you might want to disable the *Watch original collection* option. We automatically update our Postman collection whenever we release changes to our documentation, even if we don''t change our APIs—which happens daily! Rather than being flooded with Postman notifications, you can check out our [Release Notes](/release-notes/) for updates to our APIs.
**NOTE**: Postman endpoints default to our US APIs. If you''re in our European (EU) region, you''ll need to add `-eu` to the server variables (`track_api_url` and `app_api_url`).
[<img src="https://run.pstmn.io/button.svg" alt="Run In Postman" style="width: 128px; height: 32px;">](https://god.gw.postman.com/run-collection/23697545-2931c004-e63d-4cdc-bf4b-e685ba6da42d?action=collection%2Ffork&source=rip_markdown&collection-url=entityId%3D23697545-2931c004-e63d-4cdc-bf4b-e685ba6da42d%26entityType%3Dcollection%26workspaceId%3Db886877f-fc09-475f-84fe-6221a98f4d18#?env%5BCustomer.io%20API%20Environment%5D=W3sia2V5IjoidHJhY2tfYXBpX3VybCIsInR5cGUiOiJkZWZhdWx0IiwidmFsdWUiOiJ0cmFjay5jdXN0b21lci5pbyIsImVuYWJsZWQiOnRydWV9LHsia2V5IjoiYXBwX2FwaV91cmwiLCJ0eXBlIjoiZGVmYXVsdCIsInZhbHVlIjoiYXBpLmN1c3RvbWVyLmlvIiwiZW5hYmxlZCI6dHJ1ZX0seyJrZXkiOiJzaXRlX2lkIiwidHlwZSI6ImRlZmF1bHQiLCJ2YWx1ZSI6IiIsImVuYWJsZWQiOnRydWV9LHsia2V5IjoiYXBpX2tleSIsInR5cGUiOiJzZWNyZXQiLCJ2YWx1ZSI6IiIsImVuYWJsZWQiOnRydWV9LHsia2V5IjoiYmVhcmVyIiwidHlwZSI6ImRlZmF1bHQiLCJ2YWx1ZSI6IiIsImVuYWJsZWQiOnRydWV9LHsia2V5IjoiYnJvYWRjYXN0X2lkIiwidHlwZSI6ImRlZmF1bHQiLCJ2YWx1ZSI6IiIsImVuYWJsZWQiOnRydWV9LHsia2V5IjoiaW1wb3J0X2lkIiwidHlwZSI6ImRlZmF1bHQiLCJ2YWx1ZSI6IiIsImVuYWJsZWQiOnRydWV9LHsia2V5IjoiZW1haWxfYWRkcmVzcyIsInR5cGUiOiJkZWZhdWx0IiwidmFsdWUiOiIiLCJlbmFibGVkIjp0cnVlfSx7ImtleSI6InN1cHByZXNzaW9uX3R5cGUiLCJ0eXBlIjoiZGVmYXVsdCIsInZhbHVlIjoiIiwiZW5hYmxlZCI6dHJ1ZX0seyJrZXkiOiJjb2xsZWN0aW9uX2lkIiwidHlwZSI6ImRlZmF1bHQiLCJ2YWx1ZSI6IiIsImVuYWJsZWQiOnRydWV9LHsia2V5Ijoic25pcHBldF9uYW1lIiwidHlwZSI6ImRlZmF1bHQiLCJ2YWx1ZSI6IiIsImVuYWJsZWQiOnRydWV9LHsia2V5Ijoid2ViaG9va19pZCIsInR5cGUiOiJkZWZhdWx0IiwidmFsdWUiOiIiLCJlbmFibGVkIjp0cnVlfSx7ImtleSI6InNlbmRlcl9pZCIsInR5cGUiOiJkZWZhdWx0IiwidmFsdWUiOiIiLCJlbmFibGVkIjp0cnVlfSx7ImtleSI6ImV4cG9ydF9pZCIsInR5cGUiOiJkZWZhdWx0IiwidmFsdWUiOiIiLCJlbmFibGVkIjp0cnVlfSx7ImtleSI6Im1lc3NhZ2VfaWQiLCJ0eXBlIjoiZGVmYXVsdCIsInZhbHVlIjoiIiwiZW5hYmxlZCI6dHJ1ZX0seyJrZXkiOiJzZWdtZW50X2lkIiwidHlwZSI6ImRlZmF1bHQiLCJ2YWx1ZSI6IiIsImVuYWJsZWQiOnRydWV9LHsia2V5IjoibmV3c2xldHRlcl9pZCIsInR5cGUiOiJkZWZhdWx0IiwidmFsdWUiOiIiLCJlbmFibGVkIjp0cnVlfSx7ImtleSI6ImNvbnRlbnRfaWQiLCJ0eXBlIjoiZGVmYXVsdCIsInZhbHVlIjoiIiwiZW5hYmxlZCI6dHJ1ZX0seyJrZXkiOiJjYW1wYWlnbl9pZCIsInR5cGUiOiJkZWZhdWx0IiwidmFsdWUiOiIiLCJlbmFibGVkIjp0cnVlfSx7ImtleSI6ImFjdGlvbl9pZCIsInR5cGUiOiJkZWZhdWx0IiwidmFsdWUiOiIiLCJlbmFibGVkIjp0cnVlfSx7ImtleSI6ImN1c3RvbWVyX2lkIiwidHlwZSI6ImRlZmF1bHQiLCJ2YWx1ZSI6IiIsImVuYWJsZWQiOnRydWV9LHsia2V5IjoidHJhbnNhY3Rpb25hbF9pZCIsInR5cGUiOiJkZWZhdWx0IiwidmFsdWUiOiIiLCJlbmFibGVkIjp0cnVlfSx7ImtleSI6InRyaWdnZXJfaWQiLCJ0eXBlIjoiZGVmYXVsdCIsInZhbHVlIjoiIiwiZW5hYmxlZCI6dHJ1ZX0seyJrZXkiOiJmb3JtX2lkIiwidHlwZSI6ImRlZmF1bHQiLCJ2YWx1ZSI6IiIsImVuYWJsZWQiOnRydWV9LHsia2V5IjoiaWRlbnRpZmllciIsInR5cGUiOiJkZWZhdWx0IiwidmFsdWUiOiIiLCJlbmFibGVkIjp0cnVlfSx7ImtleSI6ImRldmljZV9pZCIsInR5cGUiOiJkZWZhdWx0IiwidmFsdWUiOiIiLCJlbmFibGVkIjp0cnVlfSx7ImtleSI6ImRlbGl2ZXJ5X2lkIiwidHlwZSI6ImRlZmF1bHQiLCJ2YWx1ZSI6IiIsImVuYWJsZWQiOnRydWV9XQ==)
# Server addresses: US and EU
Customer.io hosts services in the United States (US) and European Union. Select the appropriate server address for your region.
| Region | Server Address |
| :-- | :-- |
| US | https://api.customer.io |
| EU | https://api-eu.customer.io |
# Authentication
All requests to the Customer.io App API use an [App API Key](#App-API-Key).
To authenticate, provide your key as a Bearer token in a HTTP Authorization header. You can create and manage your API keys—including keys with different scopes—in [your account settings page](https://fly.customer.io/settings/api_credentials?keyType=app). Each operation on this page references the authorization header it requires.
# Rate Limits
Most endpoints on this page are limited to 10 requests per second. The exceptions are:
* The [transactional email](#operation/sendEmail) endpoint is limited to 100 requests per second.
* The [API-triggered broadcast endpoint](#operation/triggerBroadcast) is limited to 1 request every 10 seconds.
**Rate limits are subject to change. We may adjust these thresholds to ensure stable performance for all customers.**
'
servers:
- url: https://api.customer.io
description: The base URL for broadcasts, transactional messages, and data-retrieval APIs. These endpoints use bearer authorization, and require a [token that you generate in the UI](https://fly.customer.io/settings/api_credentials?keyType=app).
- url: https://api-eu.customer.io
description: The base URL for broadcasts, transactional messages, and data-retrieval APIs (EU region). These endpoints use bearer authorization, and require a [token that you generate in the UI](https://fly.customer.io/settings/api_credentials?keyType=app).
tags:
- name: Newsletter Variants
description: 'A newsletter variant is a translation or an A/B test. You can create, update, or delete variants in newsletters from these endpoints. You can also create a new A/B test group.
If your newsletters include assets like images or PDFs, host them in your [workspace''s assets](/integrations/api/app/#tag/assets) or at another public URL, and include the URL in your message content.
'
paths:
/v1/newsletters/{newsletter_id}/contents:
servers:
- url: https://api.customer.io
description: This API uses bearer authorization, requiring a [token that you generate in the UI](https://fly.customer.io/settings/api_credentials?keyType=app).
parameters:
- name: newsletter_id
in: path
required: true
description: The identifier of a newsletter.
schema:
type: integer
get:
summary: List newsletter variants
operationId: listNewsletterVariants
security:
- Bearer-Auth: []
description: Returns a newsletter's content variants—these are either different languages in a multi-language newsletter or A/B tests.
tags:
- Newsletter Variants
responses:
'200':
description: Returns newsletter `content_id`s. Each object represents an individual variant of this newsletter.
content:
application/json:
schema:
type: object
properties:
contents:
type: array
items:
x-scalar-ignore: true
allOf:
- x-scalar-ignore: true
type: object
properties:
id:
x-scalar-ignore: true
type: integer
description: The identifier of a newsletter variant—a language in a multi-language newsletter or a test in an A/B test.
readOnly: true
newsletter_id:
x-scalar-ignore: true
description: The identifier for a newsletter.
type: integer
example: 10
deduplicate_id:
x-scalar-ignore: true
type: string
readOnly: true
description: An identifier in the format `id:timestamp` where the id is for the object you're working with (Campaigns, Deliveries, Exports, Identities, Newsletters, Segments, and Templates), and the timestamp is the last time the object was updated.
example: 15:1492548073
name:
type: string
description: The name of the variant, if it exists.
readOnly: true
example: newsletter variant A
layout:
type: string
description: The layout used for the variant, if it exists.
example: <html><body>{{ content }}</body></html>
readOnly: true
body:
type: string
description: The body of the variant. You cannot modify the body if you created it with our drag-and-drop editor.
example: <strong>Hello from the API</strong>
body_amp:
x-scalar-ignore: true
type: string
description: AMP-enabled content for your email. If a recipient's email client doesn't support AMP, they receive your `body` content instead. Make sure you're [set up to send AMP](/journeys/channels/email/layouts/amp-for-email/) first.
language:
x-scalar-ignore: true
type: string
description: The language variant for your message. If you don't use our [localization feature](/journeys/channels/localization/getting-started), or this is the default message, this value is an empty string.
example: fr
readOnly: true
type:
x-scalar-ignore: true
description: Channel type for a newsletter or newsletter content variant.
type: string
enum:
- email
- webhook
- twilio
- push
- in_app
- inbox
readOnly: true
example: email
from:
x-scalar-ignore: true
type: string
description: The address that the message is from, relevant if the action `type` is `email`.
readOnly: true
example: sentFrom@example.com
from_id:
x-scalar-ignore: true
type: integer
description: The identifier of the `from` address, commonly known as the "sender". Use [List sender identities](#tag/sender-identities/listSenders) to find valid IDs.
example: 1
reply_to:
x-scalar-ignore: true
type: string
description: The address that receives replies for the message, if applicable.
readOnly: true
example: replyto@example.com
reply_to_id:
x-scalar-ignore: true
type:
- integer
- 'null'
description: The identifier for the `reply_to` address, if applicable. Use [List sender identities](#tag/sender-identities/listSenders) to find valid IDs.
example: 38
preprocessor:
x-scalar-ignore: true
type: string
description: If CSS pre-processing is enabled, this key is populated with `premailer`. Note, Juice replaced Premailer as the pre-processor, but you will only see `premailer` as the value.
enum:
- premailer
readOnly: true
recipient:
x-scalar-ignore: true
description: The recipient address for an action.
type: string
example: '{{customer.email}}'
subject:
x-scalar-ignore: true
type: string
description: The subject line for an `email` action.
example: Did you get that thing I sent you?
cc:
x-scalar-ignore: true
readOnly: true
description: The carbon-copy address(es) for this action.
type: string
bcc:
x-scalar-ignore: true
readOnly: true
description: The blind-copy address(es) for this action.
type: string
fake_bcc:
x-scalar-ignore: true
readOnly: true
type: boolean
description: 'If true, rather than sending true copies to BCC addresses, Customer.io sends a copy of the message with the subject line containing the recipient address(es).
'
preheader_text:
x-scalar-ignore: true
type: string
description: '[Also known as "preview text"](/journeys/channels/email/headers/custom-preheader-text/), this is the small block of text shown in an email inbox next to or underneath the subject line.
'
- type: object
properties:
headers:
x-scalar-ignore: true
description: A JSON string containing header objects with `name` and `value`. Names and values must be strings, with no non-ASCII characters or spaces. You can't overwrite reserved headers.
type: string
format: json
example: '[{"name":"X-Mailgun-Tag","value":"my-cool-tag"},{"name":"X-Custom-Header","value":"custom-value"}]'
'404':
description: The newsletter you requested does not exist.
'429':
description: Your request is over the 10-per-second limit.
x-codeSamples:
- lang: Shell + Curl
source: "curl --request GET \\\n --header 'Authorization: Bearer REPLACE_BEARER_TOKEN' \\\n --url https://api.customer.io/v1/newsletters/{newsletter_id}/contents"
- lang: Node + Native
source: "const http = require(\"https\");\n\nconst options = {\n \"method\": \"GET\",\n \"hostname\": \"api.customer.io\",\n \"port\": null,\n \"path\": \"/v1/newsletters/%7Bnewsletter_id%7D/contents\",\n \"headers\": {}\n};\n\nconst req = http.request(options, function (res) {\n const chunks = [];\n\n res.on(\"data\", function (chunk) {\n chunks.push(chunk);\n });\n\n res.on(\"end\", function () {\n const body = Buffer.concat(chunks);\n console.log(body.toString());\n });\n});\n\nreq.end();"
- lang: Ruby + Native
source: 'require ''uri''
require ''net/http''
require ''openssl''
url = URI("https://api.customer.io/v1/newsletters/%7Bnewsletter_id%7D/contents")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body'
- lang: Python + Python3
source: 'import http.client
conn = http.client.HTTPSConnection("api.customer.io")
conn.request("GET", "/v1/newsletters/%7Bnewsletter_id%7D/contents")
res = conn.getresponse()
data = res.read()
print(data.decode("utf-8"))'
- lang: Go + Native
source: "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io/ioutil\"\n)\n\nfunc main() {\n\n\turl := \"https://api.customer.io/v1/newsletters/%7Bnewsletter_id%7D/contents\"\n\n\treq, _ := http.NewRequest(\"GET\", url, nil)\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := ioutil.ReadAll(res.Body)\n\n\tfmt.Println(res)\n\tfmt.Println(string(body))\n\n}"
/v1/newsletters/{newsletter_id}/contents/{content_id}:
servers:
- url: https://api.customer.io
description: This API uses bearer authorization, requiring a [token that you generate in the UI](https://fly.customer.io/settings/api_credentials?keyType=app).
parameters:
- name: newsletter_id
in: path
required: true
description: The identifier of a newsletter.
schema:
type: integer
- name: content_id
in: path
required: true
description: 'The identifier of a message in a newsletter. If your newsletter has an A/B test group or includes multiple languages, each variant has its own `content_id`, separate from the `newsletter_id`.
Use [List variants of a newsletter](#tag/newsletter-variants/listNewsletterVariants) to find the `content_id` associated with the right variant.
'
schema:
type: integer
get:
summary: Get a newsletter variant
operationId: getNewsletterVariant
security:
- Bearer-Auth: []
description: Returns information about a specific variant of a newsletter, where a variant is either a language in a multi-language newsletter or a part of an A/B test.
tags:
- Newsletter Variants
responses:
'200':
description: Returns newsletter `content`.
content:
application/json:
schema:
type: object
properties:
content:
x-scalar-ignore: true
allOf:
- x-scalar-ignore: true
type: object
properties:
id:
x-scalar-ignore: true
type: integer
description: The identifier of a newsletter variant—a language in a multi-language newsletter or a test in an A/B test.
readOnly: true
newsletter_id:
x-scalar-ignore: true
description: The identifier for a newsletter.
type: integer
example: 10
deduplicate_id:
x-scalar-ignore: true
type: string
readOnly: true
description: An identifier in the format `id:timestamp` where the id is for the object you're working with (Campaigns, Deliveries, Exports, Identities, Newsletters, Segments, and Templates), and the timestamp is the last time the object was updated.
example: 15:1492548073
name:
type: string
description: The name of the variant, if it exists.
readOnly: true
example: newsletter variant A
layout:
type: string
description: The layout used for the variant, if it exists.
example: <html><body>{{ content }}</body></html>
readOnly: true
body:
type: string
description: The body of the variant. You cannot modify the body if you created it with our drag-and-drop editor.
example: <strong>Hello from the API</strong>
body_amp:
x-scalar-ignore: true
type: string
description: AMP-enabled content for your email. If a recipient's email client doesn't support AMP, they receive your `body` content instead. Make sure you're [set up to send AMP](/journeys/channels/email/layouts/amp-for-email/) first.
language:
x-scalar-ignore: true
type: string
description: The language variant for your message. If you don't use our [localization feature](/journeys/channels/localization/getting-started), or this is the default message, this value is an empty string.
example: fr
readOnly: true
type:
x-scalar-ignore: true
description: Channel type for a newsletter or newsletter content variant.
type: string
enum:
- email
- webhook
- twilio
- push
- in_app
- inbox
readOnly: true
example: email
from:
x-scalar-ignore: true
type: string
description: The address that the message is from, relevant if the action `type` is `email`.
readOnly: true
example: sentFrom@example.com
from_id:
x-scalar-ignore: true
type: integer
description: The identifier of the `from` address, commonly known as the "sender". Use [List sender identities](#tag/sender-identities/listSenders) to find valid IDs.
example: 1
reply_to:
x-scalar-ignore: true
type: string
description: The address that receives replies for the message, if applicable.
readOnly: true
example: replyto@example.com
reply_to_id:
x-scalar-ignore: true
type:
- integer
- 'null'
description: The identifier for the `reply_to` address, if applicable. Use [List sender identities](#tag/sender-identities/listSenders) to find valid IDs.
example: 38
preprocessor:
x-scalar-ignore: true
type: string
description: If CSS pre-processing is enabled, this key is populated with `premailer`. Note, Juice replaced Premailer as the pre-processor, but you will only see `premailer` as the value.
enum:
- premailer
readOnly: true
recipient:
x-scalar-ignore: true
description: The recipient address for an action.
type: string
example: '{{customer.email}}'
subject:
x-scalar-ignore: true
type: string
description: The subject line for an `email` action.
example: Did you get that thing I sent you?
cc:
x-scalar-ignore: true
readOnly: true
description: The carbon-copy address(es) for this action.
type: string
bcc:
x-scalar-ignore: true
readOnly: true
description: The blind-copy address(es) for this action.
type: string
fake_bcc:
x-scalar-ignore: true
readOnly: true
type: boolean
description: 'If true, rather than sending true copies to BCC addresses, Customer.io sends a copy of the message with the subject line containing the recipient address(es).
'
preheader_text:
x-scalar-ignore: true
type: string
description: '[Also known as "preview text"](/journeys/channels/email/headers/custom-preheader-text/), this is the small block of text shown in an email inbox next to or underneath the subject line.
'
- type: object
properties:
headers:
x-scalar-ignore: true
description: A JSON string containing header objects with `name` and `value`. Names and values must be strings, with no non-ASCII characters or spaces. You can't overwrite reserved headers.
type: string
format: json
example: '[{"name":"X-Mailgun-Tag","value":"my-cool-tag"},{"name":"X-Custom-Header","value":"custom-value"}]'
'404':
description: The newsletter or variant does not exist.
'429':
description: Your request is over the 10-per-second limit.
x-codeSamples:
- lang: Shell + Curl
source: "curl --request GET \\\n --header 'Authorization: Bearer REPLACE_BEARER_TOKEN' \\\n --url https://api.customer.io/v1/newsletters/{newsletter_id}/contents/{content_id}"
- lang: Node + Native
source: "const http = require(\"https\");\n\nconst options = {\n \"method\": \"GET\",\n \"hostname\": \"api.customer.io\",\n \"port\": null,\n \"path\": \"/v1/newsletters/%7Bnewsletter_id%7D/contents/%7Bcontent_id%7D\",\n \"headers\": {}\n};\n\nconst req = http.request(options, function (res) {\n const chunks = [];\n\n res.on(\"data\", function (chunk) {\n chunks.push(chunk);\n });\n\n res.on(\"end\", function () {\n const body = Buffer.concat(chunks);\n console.log(body.toString());\n });\n});\n\nreq.end();"
- lang: Ruby + Native
source: 'require ''uri''
require ''net/http''
require ''openssl''
url = URI("https://api.customer.io/v1/newsletters/%7Bnewsletter_id%7D/contents/%7Bcontent_id%7D")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body'
- lang: Python + Python3
source: 'import http.client
conn = http.client.HTTPSConnection("api.customer.io")
conn.request("GET", "/v1/newsletters/%7Bnewsletter_id%7D/contents/%7Bcontent_id%7D")
res = conn.getresponse()
data = res.read()
print(data.decode("utf-8"))'
- lang: Go + Native
source: "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io/ioutil\"\n)\n\nfunc main() {\n\n\turl := \"https://api.customer.io/v1/newsletters/%7Bnewsletter_id%7D/contents/%7Bcontent_id%7D\"\n\n\treq, _ := http.NewRequest(\"GET\", url, nil)\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := ioutil.ReadAll(res.Body)\n\n\tfmt.Println(res)\n\tfmt.Println(string(body))\n\n}"
put:
summary: Update a newsletter variant
operationId: updateNewsletterVariant
security:
- Bearer-Auth: []
description: 'Update the content of a newsletter: the default message, a test variant in an A/B test group, or a translation.
For an email, you can also update the envelope: from address, subject line, etc.
**NOTE**: You cannot manage content made with the drag-and-drop editor via API, and you cannot use this endpoint to update Design Studio emails. You can, however, [manage Design Studio content with other endpoints](#tag/design-studio).
'
tags:
- Newsletter Variants
requestBody:
content:
application/json:
schema:
oneOf:
- $ref: '#/components/schemas/updateEmailContent'
- $ref: '#/components/schemas/updateSmsContent'
- $ref: '#/components/schemas/updatePushContent'
- $ref: '#/components/schemas/updateWebhookContent'
- $ref: '#/components/schemas/updateInboxContent'
discriminator:
propertyName: type
responses:
'200':
description: Returns the updated newsletter variant.
content:
application/json:
schema:
type: object
properties:
content:
x-scalar-ignore: true
allOf:
- x-scalar-ignore: true
type: object
properties:
id:
x-scalar-ignore: true
type: integer
description: The identifier of a newsletter variant—a language in a multi-language newsletter or a test in an A/B test.
readOnly: true
newsletter_id:
x-scalar-ignore: true
description: The identifier for a newsletter.
type: integer
example: 10
deduplicate_id:
x-scalar-ignore: true
type: string
readOnly: true
description: An identifier in the format `id:timestamp` where the id is for the object you're working with (Campaigns, Deliveries, Exports, Identities, Newsletters, Segments, and Templates), and the timestamp is the last time the object was updated.
example: 15:1492548073
name:
type: string
description: The name of the variant, if it exists.
readOnly: true
example: newsletter variant A
layout:
type: string
description: The layout used for the variant, if it exists.
example: <html><body>{{ content }}</body></html>
readOnly: true
body:
type: string
description: The body of the variant. You cannot modify the body if you created it with our drag-and-drop editor.
example: <strong>Hello from the API</strong>
body_amp:
x-scalar-ignore: true
type: string
# --- truncated at 32 KB (150 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/customer-io/refs/heads/main/openapi/customer-io-newsletter-variants-api-openapi.yml