# Get an SMS template version

`GET /v1/sms/templates/{template_ref}/versions/{version_id}`

Returns one version with its variables and text in every language. A workspace draft is editable, while published workspace versions are immutable. A built-in template exposes its current catalogue content through a synthetic published version.

## Code samples

### TypeScript

```ts
const version = await bird.smsTemplates.versions.get(
  "bird_otp_verification",
  "smv_01ky4x8e4genzb7way45txfkm1",
);
console.log(version.id, Object.keys(version.languages));
```

### Python

```py
version = client.sms_templates.versions.get(
    "bird_otp_verification", "smv_01ky4x8e4genzb7way45txfkm1"
)
print(version.id, list(version.languages))
```

### Go

```go
version, err := client.SmsTemplates.Versions.Get(context.Background(), "bird_otp_verification", "smv_01ky4x8e4genzb7way45txfkm1")
if err != nil {
	log.Fatal(err)
}
if version.Languages == nil {
	log.Fatal("version has no languages")
}
fmt.Println(version.Id, len(*version.Languages))
```

### PHP

```php
$version = $bird->smsTemplates->versions->get(
    'bird_otp_verification',
    'smv_01ky4x8e4genzb7way45txfkm1',
);
echo $version->getId(), ' ', count($version->getLanguages() ?? []);
```

### CLI

```sh
bird sms templates versions get <template-ref> <version-id>
```

### cURL

```sh
curl -X GET "https://us1.platform.bird.com/v1/sms/templates/{template_ref}/versions/{version_id}" \
  -H "Authorization: Bearer $TOKEN"
```

## Example response `200`

```json
{
  "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."
    }
  ],
  "languages": {
    "en": {
      "text": "Your order {{ order_number }} is on its way.",
      "revision": 1,
      "content_hash": "sha256:3d948846f5f773fb7bed8ab81b57f3d0ff2cbff24cb549718f4d389f1ab0300a",
      "updated_at": "2026-09-10T09:00:00Z"
    }
  },
  "default_language": "en",
  "created_at": "2026-09-10T09:00:00Z",
  "published_at": "2026-09-10T09:00:00Z"
}
```

## Path parameters

- `template_ref` (string): The template's ID (`smt_…`) or slug.
- `version_id` (string): The version to read or reset.

## Response body

- `id` (string, required): Template version ID.
- `template_id` (string, required): The template this version belongs to.
- `version_number` (nullable integer, required): Sequential publication number. Null for the draft; a built-in template reports 1.
- `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`
- `revision` (integer, required): The version revision. A draft revision advances with each metadata or content change. Published workspace versions are frozen; a built-in template's synthetic version reports 0.
- `variables` (array of object, required): Variables inferred from the version's text. Every language in a publishable SMS version uses the same set. Built-in templates may apply additional typed constraints described by each variable.
- `variables.key` (string, required): The key this slot is filled by. On email and SMS it is the key you set in the send's `parameters` object. On WhatsApp it is the `name` you repeat on the matching parameter inside `components`, or, for a template whose placeholders are positional, the position itself as `1`, `2` and so on.
- `variables.type` (string, required)

  The value type this slot accepts. Built-in SMS templates use typed slots (`code`, `amount` and the rest), each of which rejects a value that does not match its `constraint`. Email, WhatsApp and workspace SMS templates use `text`. Workspace SMS parameters must be scalar values. Open enum: treat an unrecognized value as a future type rather than an error.

  Possible values (may grow over time): `code`, `ttl`, `count`, `ref`, `date`, `date_time`, `amount`, `currency`, `text`
- `variables.required` (boolean, required): Whether the send must supply this variable. Omitting a required value returns `422` on email, SMS, and WhatsApp sends.
- `variables.constraint` (string, required): A plain-language description of what values this variable accepts.
- `variables.sensitive` (boolean): Whether this slot's value is redacted from stored message content. A placeholder replaces the sensitive value in message history; transport queues can still carry the text needed for delivery.
- `languages` (object, required): Full content for each language, keyed by canonical BCP-47 tag.
- `default_language` (string, required): The language this version treats as its default.
- `created_at` (nullable string, required): When the version was created. Null for a built-in template's synthetic version.
- `published_at` (nullable string, required): When the version was published. Null for the draft and for a built-in template's synthetic version.

## Related resources

- [Should I use a Bird SDK or call the API directly?](/explained/platform/should-i-use-an-sdk-or-call-the-api-directly) (answer)
- [Build your first integration](/learn/paths/integration) (course)
- [Send your first email](/docs/get-started/send-your-first-email) (docs)

[Get an implementation brief](/learn/workspace?topic=api-basics)
