Get a version's language
/v1/whatsapp/templates/{template_ref}/versions/{version_id}/languages/{language}const language = await bird.whatsapp.templates.versions.languages.get(
"bird_otp",
"wav_01ky4x8e4genzb7way45txfkm1",
"nl-BE",
);
for (const component of language.components) console.log(component.type);language = client.whatsapp.templates.versions.languages.get(
"bird_otp", "wav_01ky4x8e4genzb7way45txfkm1", "nl-BE"
)
for component in language.components:
print(component.type)language, err := client.Whatsapp.Templates.Versions.Languages.Get(context.Background(), "bird_otp", "wav_01ky4x8e4genzb7way45txfkm1", "nl-BE")
if err != nil {
log.Fatal(err)
}
fmt.Println(language.Language, len(language.Components))$language = $bird->whatsapp->templates->versions->languages->get('bird_otp', 'wav_01ky4x8e4genzb7way45txfkm1', 'nl-BE');
foreach ($language->getComponents() ?? [] as $component) {
echo $component->getType(), "\n";
}bird whatsapp templates versions languages get <template-ref> <version-id> <language>curl -X GET "https://us1.platform.bird.com/v1/whatsapp/templates/{template_ref}/versions/{version_id}/languages/{language}" \
-H "Authorization: Bearer $TOKEN"{
"language": "pt-BR",
"components": [
{
"type": "body",
"format": "text",
"text": "Your verification code is {{1}}.",
"code_expiration_minutes": 60,
"example_parameters": [
{
"type": "text",
"text": "123456",
"url": "https://www.example.com/holiday/banner.jpg",
"name": "first_name"
}
],
"buttons": [
{
"type": "url",
"otp_type": "copy_code",
"text": "Copy code",
"url": "https://www.example.com/orders/{{1}}",
"phone_number": "+14155550100",
"example_parameters": [
{
"type": "text",
"text": "123456",
"url": "https://www.example.com/holiday/banner.jpg",
"name": "first_name"
}
]
}
],
"cards": [
{
"components": [
{
"type": "header",
"format": "image",
"text": "Chronograph, brown leather",
"example_parameters": [
{
"text": "123456",
"url": "https://www.example.com/holiday/banner.jpg",
"name": "first_name"
}
],
"buttons": [
{
"type": "url",
"otp_type": "copy_code",
"text": "Copy code",
"url": "https://www.example.com/orders/{{1}}",
"phone_number": "+14155550100"
}
]
}
]
}
]
}
],
"status": "approved",
"revision": 4,
"content_hash": "sha256:9f2c4e1a7b03d85fbc6e29d417a05e8c3b1d9f76a2e4c018d53b7f9a6c2e18d4",
"category": "authentication",
"previous_category": "authentication",
"quality": {
"current_score": "green",
"previous_score": "green",
"updated_at": "2026-07-26T16:41:00Z"
},
"rejection": {
"category": "invalid_format",
"reason": "Parameters are adjacent.",
"recommendation": "Add text between the two parameters."
},
"error": {
"description": "component of type HEADER is missing expected field(s)",
"meta_error_code": "2388043"
},
"submitted_at": "2026-07-26T16:40:00Z",
"approved_at": "2026-07-21T08:15:00Z",
"updated_at": "2026-07-26T16:41:00Z",
"updated_by": "usr_01krdgeqcxet5s7t44vh8rt9mg"
}
Returns one language of one version: its content blocks, what this version's submission did with it, and everything Meta holds about it: review outcome and category.
Parameters
template_refstringTemplate ID (wat_ prefix) or slug. A value that parses as a valid ID resolves by ID; any other value resolves as a slug.
version_idstringID of the template version (wav_ prefix), as returned by the version list.
languagestringThe language, as a BCP-47 tag. Case and separator variance is accepted and normalised, and the canonical form is returned.
Response Payload
languageThe canonical tag this language is addressed by.
componentsThis language's content blocks, in display order, exactly as submitted or as they stand in the draft.
statusWhat this submission did with this language. Absent on a draft, which has not been submitted. On a superseded version this is history: how that submission went. It does not report whether the language is sendable now.
Possible values (may grow over time): approved, pending, rejected, paused, disabled, in_appeal, pending_deletion, limit_exceeded, archived, deleted, submit_failed
revisionThis language's write counter, incremented every time its content changes. It sits at 1 on content that has never been written through this API, which is every built-in template's language.
content_hashA hash over the serialized components this API surfaces, prefixed with the algorithm that produced it (sha256:) so the algorithm can change without the field becoming ambiguous. It tells you whether a language differs without transferring its content. Compare hashes only within one version of this API. Adding a field to the component shape changes every hash even when the underlying content is unchanged. Email's field of the same name carries bare hex and predates this form.
categoryThe category Meta is applying to this language, which is what messages from it are priced at.
Possible values (may grow over time): authentication, utility, marketing
previous_categoryThe category this language held before Meta moved it.
Possible values (may grow over time): authentication, utility, marketing
qualityMeta's quality rating for this language. Present only on the version currently in service, and only once Meta has rated it.
Show child attributes
quality.current_scoreMeta's rating for this language as of updated_at.
Possible values (may grow over time): green, yellow, red, unknown
quality.previous_scoreThe rating this language held before the most recent change. Absent when Meta has rated it only once. Usually differs from current_score, but Meta sometimes reports both as the same value, so compare timestamps rather than assuming a transition.
Possible values (may grow over time): green, yellow, red, unknown
quality.updated_atWhen the rating last changed. A re-evaluation that lands on the same rating does not move it, so this answers how long the language has held its current rating.
rejectionWhy Meta refused this content, present when status is rejected. Absent otherwise.
errorWhy the submission did not complete, present when status is submit_failed. Absent otherwise, including on a rejection, whose reason is in rejection.
submitted_atWhen this content was submitted to Meta. Null on a draft, which has not been submitted, and null for a built-in template's language, which Bird ships already approved rather than submitting on your behalf.
approved_atWhen Meta approved this exact content. It is a permanent mark on the content rather than a status, so a later pause or archival does not clear it. Null for a built-in template's language, whose approval predates Bird holding a date for it.
updated_atWhen this language last changed. Null for a built-in template's language, which Bird ships rather than stores.
updated_byThe workspace member who last wrote this language. Always null for a built-in template's language: nobody in the workspace authored it.
Related resources
Continue with the documentation, guides and examples for this topic.