Courier Courier Create API

The Courier Create API from Courier — 4 operation(s) for courier create.

OpenAPI Specification

courier-courier-create-api-openapi.yml Raw ↑
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