Skip to main content
POST
JavaScript

Authorizations

Authorization
string
header
required

Bearer authentication header of the form Bearer <token>, where <token> is your auth token.

Headers

Idempotency-Key
string

A unique key that makes this request idempotent. If Courier receives another request with the same Idempotency-Key, it returns the stored response from the first request without performing the operation again (including the original status code and any error). Use it to safely retry POST requests after network failures without risking duplicate sends. The key is scoped to this endpoint.

x-idempotency-expiration
string

How long the idempotency key remains valid, as a Unix epoch timestamp in seconds or an ISO 8601 date string. Only applies when Idempotency-Key is provided. If omitted, the key is retained for 25 hours; the maximum is 1 year.

Path Parameters

section_id
string
required

Id of the workspace preference to create the topic in.

Body

application/json

Request body for creating a preference topic.

name
string
required

Human-readable name for the preference topic.

default_status
enum<string>
required

The default subscription status applied when a recipient has not set their own.

Available options:
OPTED_OUT,
OPTED_IN,
REQUIRED
description
string | null

Optional description shown under the topic on the hosted preferences page.

routing_options
enum<string>[] | null

Default channels delivered for this topic. Defaults to empty if omitted.

Available options:
direct_message,
email,
push,
sms,
webhook,
inbox
allowed_preferences
enum<string>[] | null

Preference controls a recipient may customize for this topic. Defaults to empty if omitted.

A preference control a recipient may customize for a topic.

Available options:
snooze,
channel_preferences
include_unsubscribe_header
boolean | null

Whether to include a list-unsubscribe header on emails for this topic.

topic_data
object | null

Arbitrary metadata associated with the topic.

digest
TopicDigestCreateRequest · object | null

Batch this topic's notifications instead of delivering each one. Omit, or send null, to create the topic without one.

Response

Created

A subscription preference topic in your workspace.

id
string
required

The preference topic id.

name
string
required

Human-readable name.

default_status
enum<string>
required

The default subscription status applied when a recipient has not set their own.

Available options:
OPTED_OUT,
OPTED_IN,
REQUIRED
routing_options
enum<string>[]
required

Default channels delivered for this topic. May be empty.

Available options:
direct_message,
email,
push,
sms,
webhook,
inbox
allowed_preferences
enum<string>[]
required

Preference controls a recipient may customize. May be empty.

A preference control a recipient may customize for a topic.

Available options:
snooze,
channel_preferences
include_unsubscribe_header
boolean
required

Whether a list-unsubscribe header is included on emails for this topic.

topic_data
object
required

Arbitrary metadata associated with the topic.

created
string
required

ISO-8601 timestamp of when the topic was created.

updated
string
required

ISO-8601 timestamp of the last update.

description
string | null

Optional description shown under the topic on the hosted preferences page.

digest
TopicDigestResponse · object | null

The topic's digest configuration, when one is set, and the only place a schedule's schedule_id is returned — the value the /digests/schedules/{schedule_id} endpoints are keyed by. Every read of a topic carries it, including the section and topic listings, so a digest can be located without a request per topic.

Absent rather than null on a topic with no digest, so "never configured" and "cleared" read the same way.

On a listing, absent can also mean the digest could not be read: those endpoints return the topics without their digests rather than failing outright, since listing preferences must not depend on the digest store being healthy. Read the single topic when the answer has to distinguish the two.

creator
string | null

Id of the creator.

updater
string | null

Id of the last updater.