Sign inGet Started

List an SMS template's versions

GET
/v1/sms/templates/{template_ref}/versions
for await (const version of bird.smsTemplates.versions.list("bird_otp_verification")) {
  console.log(version.id, version.version_number);
}
Response200
{
  "data": [
    {
      "id": "smv_01krdgeqcxet5s7t44vh8rt9mg",
      "template_id": "smt_01krdgeqcxet5s7t44vh8rt9mg",
      "version_number": 1,
      "status": "published",
      "revision": 1,
      "variables": [
        {
          "key": "order_number",
          "type": "text",
          "required": true,
          "constraint": "A string, number, or boolean."
        }
      ],
      "default_language": "en",
      "created_at": "2026-09-10T09:00:00Z",
      "published_at": "2026-09-10T09:00:00Z",
      "available_languages": [
        "en"
      ]
    }
  ],
  "next_cursor": "eyJ2IjoxLCJzIjoiXCIyMDI2LTA1LTI1VDE0OjAzOjEwWlwiIiwiaSI6IjAxOTJmM2IxLTRjN2UtN2EyYi05ZDYxLThmM2E1YzJlN2I0MCJ9",
  "prev_cursor": null,
  "refresh_cursor": "eyJ2IjoxLCJzIjoiXCIyMDI2LTA1LTI1VDE2OjQyOjAxWlwiIiwiaSI6IjAxOTJmM2IxLTllMDQtN2NkMy1iODE3LTJhNmY0ZDFjOGUwOSJ9"
}

Returns a cursor-paginated version history, newest first. Each entry is shallow and names its variables and languages. Read a version item or one of its languages to retrieve text. A built-in template exposes its current catalogue content as one synthetic published version.

Parameters

template_refstring

The template's ID (smt_…) or slug.

Query Parameters

sortstring

Field to sort by.

Possible values: created_at

orderstring

Sort direction. Defaults to desc, which sorts from newest to oldest or largest to smallest, depending on the selected sort field.

Possible values: asc, desc

limitinteger

Maximum number of items to return per page.

starting_afterstring

Cursor from the next_cursor field of a previous list response. Returns items immediately after the cursor position in the current sort order.

ending_beforestring

Cursor from the prev_cursor or refresh_cursor field of a previous list response. Returns items immediately before the cursor position in the current sort order. prev_cursor returns the preceding page. refresh_cursor anchors at the first row of that response, which on a newest-first sort is how to fetch the items that have appeared since.

Response Payload

data
array of object
required

One page of the template's versions, newest first.

Show child attributes
data.id
string
required

Template version ID.

data.template_id
string
required

The template this version belongs to.

data.version_number
nullable integer
required

Sequential publication number. Null for the draft; a built-in template reports 1.

data.status
string
required

Whether the version is the editable draft or published. Published workspace versions are immutable and remain published after a later version goes live. A built-in template's synthetic published version projects the current catalogue entry.

Possible values: draft, published

data.revision
integer
required

The version's revision counter.

data.variables
array of object
required

Variables inferred from the version's text and shared by each language.

Show child attributes
data.default_language
string
required

The language this version treats as its default.

data.available_languages
array of string
required

Languages this version contains, without their text.

data.created_at
nullable string
required

When the version was created. Null for a built-in template's synthetic version.

data.published_at
nullable string
required

When the version was published. Null for the draft and for a built-in template's synthetic version.

next_cursor
nullable string
required

Cursor for the next page. Pass back as starting_after to advance forward. null when no next page exists.

prev_cursor
nullable string
required

Cursor for the previous page. Pass back as ending_before to step backward. null when no previous page exists.

refresh_cursor
nullable string
required

Refresh anchor, the first row of this response. Pass back as ending_before to fetch what precedes it in the current sort order. On a newest-first sort those are the items that have appeared since; on any other sort they are the items that sort earlier, so refreshing such a list means re-fetching it instead. Non-null whenever data is non-empty; null only on an empty page. Distinct from prev_cursor.

Continue with the documentation, guides and examples for this topic.