List an SMS template's versions
/v1/sms/templates/{template_ref}/versionsfor await (const version of bird.smsTemplates.versions.list("bird_otp_verification")) {
console.log(version.id, version.version_number);
}for version in client.sms_templates.versions.list("bird_otp_verification"):
print(version.id, version.version_number)for version, err := range client.SmsTemplates.Versions.List(context.Background(), "bird_otp_verification", bird.SmsTemplatesVersionsListParams{}) {
if err != nil {
log.Fatal(err)
}
fmt.Println(version.Id, *version.VersionNumber)
}foreach ($bird->smsTemplates->versions->list('bird_otp_verification') as $version) {
echo $version->getId(), ' ', $version->getVersionNumber(), "\n";
}bird sms templates versions list <template-ref>curl -X GET "https://us1.platform.bird.com/v1/sms/templates/{template_ref}/versions" \
-H "Authorization: Bearer $TOKEN" \
--url-query "sort=created_at" \
--url-query "order=desc" \
--url-query "limit=25"{
"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_refstringThe template's ID (smt_…) or slug.
Query Parameters
sortstringField to sort by.
Possible values: created_at
orderstringSort direction. Defaults to desc, which sorts from newest to oldest or largest to smallest, depending on the selected sort field.
Possible values: asc, desc
limitintegerMaximum number of items to return per page.
starting_afterstringCursor from the next_cursor field of a previous list response. Returns items immediately after the cursor position in the current sort order.
ending_beforestringCursor 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
dataOne page of the template's versions, newest first.
Show child attributes
data.idTemplate version ID.
data.template_idThe template this version belongs to.
data.version_numberSequential publication number. Null for the draft; a built-in template reports 1.
data.statusWhether 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.revisionThe version's revision counter.
data.variablesVariables inferred from the version's text and shared by each language.
data.default_languageThe language this version treats as its default.
data.available_languagesLanguages this version contains, without their text.
data.created_atWhen the version was created. Null for a built-in template's synthetic version.
data.published_atWhen the version was published. Null for the draft and for a built-in template's synthetic version.
next_cursorCursor for the next page. Pass back as starting_after to advance forward. null when no next page exists.
prev_cursorCursor for the previous page. Pass back as ending_before to step backward. null when no previous page exists.
refresh_cursorRefresh 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.
Related resources
Continue with the documentation, guides and examples for this topic.