Courier Courier Create API
The Courier Create API from Courier — 4 operation(s) for courier create.
The Courier Create API from Courier — 4 operation(s) for courier create.
openapi: 3.0.1
info:
title: Courier Audiences Courier Create API
description: The Courier REST API.
version: "1.0"
servers:
- url: https://api.courier.com
description: Production
tags:
- name: Courier Create
paths:
/tenants/{tenant_id}/templates/{template_id}:
get:
operationId: tenants_getTemplateByTenant
tags:
- Courier Create
parameters:
- name: tenant_id
in: path
description: Id of the tenant for which to retrieve the template.
required: true
schema:
type: string
- name: template_id
in: path
description: Id of the template to be retrieved.
required: true
schema:
type: string
responses:
'200':
description: ''
content:
application/json:
schema:
$ref: '#/components/schemas/GetTemplateByTenantResponse'
'400':
description: ''
content:
application/json:
schema:
$ref: '#/components/schemas/BadRequest'
summary: Get a Template in Tenant
security:
- BearerAuth: []
put:
operationId: tenants_replaceTemplate
tags:
- Courier Create
description: 'Creates or updates a notification template for a tenant.
If the template already exists for the tenant, it will be updated (200).
Otherwise, a new template is created (201).
Optionally publishes the template immediately if the `published` flag is set to true.
'
parameters:
- name: tenant_id
in: path
description: Id of the tenant for which to create or update the template.
required: true
schema:
type: string
- name: template_id
in: path
description: Id of the template to be created or updated.
required: true
schema:
type: string
responses:
'200':
description: Template updated successfully
content:
application/json:
schema:
$ref: '#/components/schemas/PutTenantTemplateResponse'
'201':
description: Template created successfully
content:
application/json:
schema:
$ref: '#/components/schemas/PutTenantTemplateResponse'
'400':
description: Bad request - validation error
content:
application/json:
schema:
$ref: '#/components/schemas/BadRequest'
'404':
description: Tenant not found
content:
application/json:
schema:
$ref: '#/components/schemas/NotFound'
'413':
description: Payload too large - template size exceeds maximum allowed
content:
application/json:
schema:
$ref: '#/components/schemas/PayloadTooLarge'
summary: Create or Update a Tenant Template
security:
- BearerAuth: []
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/PutTenantTemplateRequest'
/tenants/{tenant_id}/templates/{template_id}/publish:
post:
operationId: tenants_publishTemplate
tags:
- Courier Create
description: 'Publishes a specific version of a notification template for a tenant.
The template must already exist in the tenant''s notification map.
If no version is specified, defaults to publishing the "latest" version.
'
parameters:
- name: tenant_id
in: path
description: Id of the tenant that owns the template.
required: true
schema:
type: string
- name: template_id
in: path
description: Id of the template to be published.
required: true
schema:
type: string
responses:
'200':
description: Template published successfully
content:
application/json:
schema:
$ref: '#/components/schemas/PostTenantTemplatePublishResponse'
'400':
description: Bad request - validation error
content:
application/json:
schema:
$ref: '#/components/schemas/BadRequest'
'404':
description: Template or tenant not found
content:
application/json:
schema:
$ref: '#/components/schemas/NotFound'
summary: Publish a Tenant Template
security:
- BearerAuth: []
requestBody:
required: false
content:
application/json:
schema:
$ref: '#/components/schemas/PostTenantTemplatePublishRequest'
/tenants/{tenant_id}/templates/{template_id}/versions/{version}:
get:
operationId: tenants_getTemplateVersion
tags:
- Courier Create
description: 'Fetches a specific version of a tenant template.
Supports the following version formats:
- `latest` - The most recent version of the template
- `published` - The currently published version
- `v{version}` - A specific version (e.g., "v1", "v2", "v1.0.0")
'
parameters:
- name: tenant_id
in: path
description: Id of the tenant for which to retrieve the template.
required: true
schema:
type: string
- name: template_id
in: path
description: Id of the template to be retrieved.
required: true
schema:
type: string
- name: version
in: path
description: Version of the template to retrieve. Accepts "latest", "published", or a specific version string (e.g., "v1", "v2").
required: true
schema:
type: string
responses:
'200':
description: ''
content:
application/json:
schema:
$ref: '#/components/schemas/GetTemplateByTenantResponse'
'400':
description: Bad request - invalid version format
content:
application/json:
schema:
$ref: '#/components/schemas/BadRequest'
'404':
description: Template, version, or tenant not found
content:
application/json:
schema:
$ref: '#/components/schemas/NotFound'
summary: Get a Specific Template Version
security:
- BearerAuth: []
/tenants/{tenant_id}/templates:
get:
operationId: tenants_getTemplateListByTenant
tags:
- Courier Create
parameters:
- name: tenant_id
in: path
description: Id of the tenant for which to retrieve the templates.
required: true
schema:
type: string
- name: limit
in: query
description: The number of templates to return (defaults to 20, maximum value of 100)
required: false
schema:
type: integer
nullable: true
- name: cursor
in: query
description: Continue the pagination with the next cursor
required: false
schema:
type: string
nullable: true
responses:
'200':
description: ''
content:
application/json:
schema:
$ref: '#/components/schemas/ListTemplatesByTenantResponse'
'400':
description: ''
content:
application/json:
schema:
$ref: '#/components/schemas/BadRequest'
summary: List Templates in Tenant
security:
- BearerAuth: []
components:
schemas:
ElementalImageNode:
title: ElementalImageNode
type: object
description: Used to embed an image into the notification.
properties:
src:
type: string
description: The source of the image.
href:
type: string
nullable: true
description: A URL to link to when the image is clicked.
align:
$ref: '#/components/schemas/IAlignment'
nullable: true
description: The alignment of the image.
altText:
type: string
nullable: true
description: Alternate text for the image.
width:
type: string
nullable: true
description: CSS width properties to apply to the image. For example, 50px
required:
- src
allOf:
- $ref: '#/components/schemas/ElementalBaseNode'
MessageRoutingChannel:
title: MessageRoutingChannel
oneOf:
- type: string
- $ref: '#/components/schemas/MessageRouting'
MessageChannels:
title: MessageChannels
type: object
additionalProperties:
$ref: '#/components/schemas/Channel'
MessageRoutingMethod:
title: MessageRoutingMethod
type: string
enum:
- all
- single
BadRequest:
title: BadRequest
type: object
properties:
type:
type: string
enum:
- invalid_request_error
required:
- type
allOf:
- $ref: '#/components/schemas/BaseError'
PostTenantTemplatePublishResponse:
title: PostTenantTemplatePublishResponse
type: object
description: Response from publishing a tenant template
properties:
id:
type: string
description: The template ID
version:
type: string
description: The published version of the template
published_at:
type: string
description: The timestamp when the template was published
required:
- id
- version
- published_at
GetTemplateByTenantResponse:
title: GetTemplateByTenantResponse
type: object
properties: {}
allOf:
- $ref: '#/components/schemas/SingleTemplateTenantAssociation'
Locale:
title: Locale
type: object
properties:
content:
type: string
required:
- content
PayloadTooLarge:
title: PayloadTooLarge
type: object
description: Error returned when the request payload exceeds the maximum allowed size
properties:
type:
type: string
enum:
- invalid_request_error
required:
- type
allOf:
- $ref: '#/components/schemas/BaseError'
PutTenantTemplateResponse:
title: PutTenantTemplateResponse
type: object
description: Response from creating or updating a tenant notification template
properties:
id:
type: string
description: The template ID
version:
type: string
description: The version of the saved template
published_at:
type: string
nullable: true
description: The timestamp when the template was published. Only present if the template was published as part of this request.
required:
- id
- version
ElementalMetaNode:
title: ElementalMetaNode
type: object
description: "The meta element contains information describing the notification that may \nbe used by a particular channel or provider. One important field is the title \nfield which will be used as the title for channels that support it."
properties:
title:
type: string
nullable: true
description: The title to be displayed by supported channels. For example, the email subject.
allOf:
- $ref: '#/components/schemas/ElementalBaseNode'
ChannelMetadata:
title: ChannelMetadata
type: object
properties:
utm:
$ref: '#/components/schemas/UTM'
nullable: true
ElementalDividerNode:
title: ElementalDividerNode
type: object
description: Renders a dividing line between elements.
properties:
color:
type: string
nullable: true
description: The CSS color to render the line with. For example, `#fff`
allOf:
- $ref: '#/components/schemas/ElementalBaseNode'
TextStyle:
title: TextStyle
type: string
enum:
- text
- h1
- h2
- subtext
ElementalChannelNode:
title: ElementalChannelNode
type: object
description: "The channel element allows a notification to be customized based on which channel it is sent through. \nFor example, you may want to display a detailed message when the notification is sent through email, \nand a more concise message in a push notification. Channel elements are only valid as top-level \nelements; you cannot nest channel elements. If there is a channel element specified at the top-level \nof the document, all sibling elements must be channel elements.\nNote: As an alternative, most elements support a `channel` property. Which allows you to selectively \ndisplay an individual element on a per channel basis. See the \n[control flow docs](https://www.courier.com/docs/platform/content/elemental/control-flow/) for more details."
properties:
channel:
type: string
example: email
description: 'The channel the contents of this element should be applied to. Can be `email`,
`push`, `direct_message`, `sms` or a provider such as slack'
raw:
type: object
additionalProperties: true
nullable: true
description: Raw data to apply to the channel. If `elements` has not been specified, `raw` is required.
allOf:
- $ref: '#/components/schemas/ElementalBaseNode'
PutTenantTemplateRequest:
title: PutTenantTemplateRequest
type: object
description: Request body for creating or updating a tenant notification template
properties:
published:
type: boolean
default: false
description: Whether to publish the template immediately after saving. When true, the template becomes the active/published version. When false (default), the template is saved as a draft.
template:
$ref: '#/components/schemas/TenantTemplateInput'
required:
- template
IActionButtonStyle:
title: IActionButtonStyle
type: string
enum:
- button
- link
TenantTemplateDataNoContent:
title: TenantTemplateDataNoContent
type: object
description: The template's data containing it's routing configs
properties:
routing:
$ref: '#/components/schemas/MessageRouting'
required:
- routing
BaseError:
title: BaseError
type: object
properties:
message:
type: string
description: A message describing the error that occurred.
required:
- message
ElementalTextNode:
title: ElementalTextNode
type: object
description: Represents a body of text to be rendered inside of the notification.
properties:
content:
type: string
description: 'The text content displayed in the notification. Either this
field must be specified, or the elements field'
align:
$ref: '#/components/schemas/TextAlign'
description: Text alignment.
text_style:
$ref: '#/components/schemas/TextStyle'
nullable: true
description: Allows the text to be rendered as a heading level.
color:
type: string
nullable: true
description: Specifies the color of text. Can be any valid css color value
bold:
type: string
nullable: true
description: Apply bold to the text
italic:
type: string
nullable: true
description: Apply italics to the text
strikethrough:
type: string
nullable: true
description: Apply a strike through the text
underline:
type: string
nullable: true
description: Apply an underline to the text
locales:
$ref: '#/components/schemas/Locales'
nullable: true
description: Region specific content. See [locales docs](https://www.courier.com/docs/platform/content/elemental/locales/) for more details.
format:
type: string
enum:
- markdown
nullable: true
required:
- content
- align
allOf:
- $ref: '#/components/schemas/ElementalBaseNode'
SingleTemplateTenantAssociation:
title: SingleTemplateTenantAssociation
type: object
properties:
data:
$ref: '#/components/schemas/TenantTemplateData'
required:
- data
allOf:
- $ref: '#/components/schemas/BaseTemplateTenantAssociation'
ElementalHtmlNode:
title: ElementalHtmlNode
type: object
description: Raw HTML string inside an Elemental document. When rendering a message, this node is turned into output only for the email channel; for other channels it produces no blocks.
properties:
content:
type: string
description: Raw HTML string to render inside the notification.
locales:
$ref: '#/components/schemas/Locales'
nullable: true
description: Region-specific `content` overrides. See [locales docs](https://www.courier.com/docs/platform/content/elemental/locales/) for more details.
required:
- content
allOf:
- $ref: '#/components/schemas/ElementalBaseNode'
MessageProvidersType:
title: MessageProvidersType
type: object
properties:
override:
type: object
additionalProperties: true
nullable: true
description: Provider-specific overrides.
if:
type: string
nullable: true
description: JS conditional with access to data/profile.
timeouts:
type: integer
nullable: true
metadata:
$ref: '#/components/schemas/Metadata'
nullable: true
RoutingMethod:
title: RoutingMethod
type: string
enum:
- all
- single
TenantTemplateInput:
title: TenantTemplateInput
type: object
description: Template configuration for creating or updating a tenant notification template
properties:
channels:
$ref: '#/components/schemas/MessageChannels'
description: Channel-specific delivery configuration (email, SMS, push, etc.)
content:
$ref: '#/components/schemas/ElementalContent'
description: Template content configuration including blocks, elements, and message structure
providers:
$ref: '#/components/schemas/MessageProviders'
description: Provider-specific delivery configuration for routing to specific email/SMS providers
routing:
$ref: '#/components/schemas/MessageRouting'
description: Message routing configuration for multi-channel delivery strategies
required:
- content
Timeouts:
title: Timeouts
type: object
properties:
provider:
type: integer
nullable: true
channel:
type: integer
nullable: true
x-stainless-naming:
csharp:
type_name: ChannelTimeouts
Metadata:
title: Metadata
type: object
properties:
utm:
$ref: '#/components/schemas/UTM'
nullable: true
x-stainless-naming:
csharp:
type_name: ProviderMetadata
NotFound:
title: NotFound
type: object
properties:
type:
type: string
enum:
- invalid_request_error
required:
- type
allOf:
- $ref: '#/components/schemas/BaseError'
ElementalContent:
title: ElementalContent
type: object
properties:
version:
type: string
description: For example, "2022-01-01"
elements:
type: array
items:
$ref: '#/components/schemas/ElementalNode'
required:
- version
- elements
ElementalActionNode:
title: ElementalActionNode
type: object
description: Allows the user to execute an action. Can be a button or a link.
properties:
content:
type: string
description: The text content of the action shown to the user.
href:
type: string
description: The target URL of the action.
action_id:
type: string
nullable: true
description: A unique id used to identify the action when it is executed.
align:
nullable: true
description: The alignment of the action button. Defaults to "center".
allOf:
- $ref: '#/components/schemas/IAlignment'
background_color:
type: string
nullable: true
description: The background color of the action button.
style:
nullable: true
description: Defaults to `button`.
allOf:
- $ref: '#/components/schemas/IActionButtonStyle'
locales:
description: Region specific content. See [locales docs](https://www.courier.com/docs/platform/content/elemental/locales/) for more details.
allOf:
- $ref: '#/components/schemas/Locales'
required:
- content
- href
- locales
allOf:
- $ref: '#/components/schemas/ElementalBaseNode'
ElementalNode:
title: ElementalNode
oneOf:
- type: object
allOf:
- type: object
properties:
type:
type: string
enum:
- text
- $ref: '#/components/schemas/ElementalTextNode'
required:
- type
- type: object
allOf:
- type: object
properties:
type:
type: string
enum:
- meta
- $ref: '#/components/schemas/ElementalMetaNode'
required:
- type
- type: object
allOf:
- type: object
properties:
type:
type: string
enum:
- channel
- $ref: '#/components/schemas/ElementalChannelNode'
required:
- type
- channel
- type: object
allOf:
- type: object
properties:
type:
type: string
enum:
- image
- $ref: '#/components/schemas/ElementalImageNode'
required:
- type
- type: object
allOf:
- type: object
properties:
type:
type: string
enum:
- action
- $ref: '#/components/schemas/ElementalActionNode'
required:
- type
- type: object
allOf:
- type: object
properties:
type:
type: string
enum:
- divider
- $ref: '#/components/schemas/ElementalDividerNode'
required:
- type
- type: object
allOf:
- type: object
properties:
type:
type: string
enum:
- quote
- $ref: '#/components/schemas/ElementalQuoteNode'
required:
- type
- type: object
allOf:
- type: object
properties:
type:
type: string
enum:
- html
- $ref: '#/components/schemas/ElementalHtmlNode'
required:
- type
Locales:
title: Locales
type: object
additionalProperties:
$ref: '#/components/schemas/Locale'
nullable: true
UTM:
title: UTM
type: object
properties:
source:
type: string
nullable: true
medium:
type: string
nullable: true
campaign:
type: string
nullable: true
term:
type: string
nullable: true
content:
type: string
nullable: true
TenantTemplateData:
title: TenantTemplateData
type: object
description: The template's data containing it's routing configs and Elemental content
properties:
routing:
$ref: '#/components/schemas/MessageRouting'
content:
$ref: '#/components/schemas/ElementalContent'
required:
- routing
- content
ListTemplateTenantAssociation:
title: ListTemplateTenantAssociation
type: object
properties:
data:
$ref: '#/components/schemas/TenantTemplateDataNoContent'
required:
- data
allOf:
- $ref: '#/components/schemas/BaseTemplateTenantAssociation'
BaseTemplateTenantAssociation:
title: BaseTemplateTenantAssociation
type: object
properties:
id:
type: string
description: The template's id
created_at:
type: string
description: The timestamp at which the template was created
updated_at:
type: string
description: The timestamp at which the template was last updated
published_at:
type: string
description: The timestamp at which the template was published
version:
type: string
description: The version of the template
required:
- id
- created_at
- updated_at
- published_at
- version
MessageRouting:
title: MessageRouting
type: object
properties:
method:
$ref: '#/components/schemas/MessageRoutingMethod'
channels:
type: array
items:
$ref: '#/components/schemas/MessageRoutingChannel'
required:
- method
- channels
MessageProviders:
title: MessageProviders
type: object
additionalProperties:
$ref: '#/components/schemas/MessageProvidersType'
ListTemplatesByTenantResponse:
title: ListTemplatesByTenantResponse
type: object
properties:
items:
type: array
items:
$ref: '#/components/schemas/ListTemplateTenantAssociation'
nullable: true
has_more:
type: boolean
description: Set to true when there are more pages that can be retrieved.
url:
type: string
description: A url that may be used to generate these results.
next_url:
type: string
nullable: true
description: "A url that may be used to generate fetch the next set of results. \nDefined only when `has_more` is set to true"
cursor:
type: string
nullable: true
description: "A pointer to the next page of results. Defined \nonly when `has_more` is set to true"
type:
type: string
enum:
- list
description: Always set to `list`. Represents the type of this object.
required:
- has_more
- url
- type
TextAlign:
title: TextAlign
type: string
enum:
- left
- center
- right
PostTenantTemplatePublishRequest:
title: PostTenantTemplatePublishRequest
type: object
description: Request body for publishing a tenant template version
properties:
version:
type: string
default: latest
description: The version of the template to publish (e.g., "v1", "v2", "latest"). If not provided, defaults to "latest".
ElementalQuoteNode:
title: ElementalQuoteNode
type: object
description: Renders a quote block.
properties:
content:
type: string
description: The text value of the quote.
align:
$ref: '#/components/schemas/IAlignment'
nullable: true
description: Alignment of the quote.
borderColor:
type: string
nullable: true
description: CSS border color property. For example, `#fff`
text_style:
$ref: '#/components/schemas/TextStyle'
locales:
$ref: '#/components/schemas/Locales'
description: Region specific content. See [locales docs](https://www.courier.com/docs/platform/content/elemental/locales/) for more details.
required:
- content
- text_style
- locales
allOf:
- $ref: '#/components/schemas/ElementalBaseNode'
ElementalBaseNode:
title: ElementalBaseNode
type: object
properties:
channels:
type: array
items:
type: string
nullable: true
ref:
type: string
nullable: true
if:
type: string
nullable: true
loop:
type: string
nullable: true
IAlignment:
title: IAlignment
type: string
enum:
- center
- left
- right
- full
Channel:
title: Channel
type: object
properties:
brand_id:
type: string
nullable: true
description: Brand id used for rendering.
providers:
type: array
items:
type: string
nullable: true
description: Providers enabled for this channel.
routing_method:
$ref: '#/components/schemas/RoutingMethod'
nullable: true
description: Defaults to `single`.
if:
type: string
nullable: true
description: JS conditional with access to data/profile.
timeouts:
$ref: '#/components/schemas/Timeouts'
nullable: true
override:
type: object
additionalProperties: true
nullable: true
description: Channel specific overrides.
metadata:
$ref: '#/components/schemas/ChannelMetadata'
nullable: true
x-stainless-naming:
csharp:
type_name: MessageChannel
securitySchemes:
BearerAuth:
type: http
scheme: bearer