twilio-content-template-builder — Codex skill: Twilio templates
Builds and sends message templates through the Twilio Content API: WhatsApp, SMS, RCS and MMS with variables and Meta approval.
npx skills add openai/plugins --skill twilio-content-template-builder -a codexWhat twilio-content-template-builder does
The skill walks your agent through the Content API. A template gets a ContentSid like HX..., and sending happens with content_sid plus content_variables. Supported types include twilio/text, twilio/media, twilio/quick-reply, twilio/call-to-action, twilio/list-picker, twilio/card and twilio/carousel, each tied to its own set of channels.
Ready-made Python and Node.js calls cover template creation, sending, approval submission, status checks, listing and deletion. Variables run sequentially — {{1}}, {{2}} — with no gaps, up to 100 per template, and the non-variable to variable ratio has to be at least (2x + 1) : x.
You need a Twilio account, the TWILIO_ACCOUNT_SID and TWILIO_AUTH_TOKEN environment variables, and the SDK: pip install twilio or npm install twilio. WhatsApp templates also need an active sender. One thing to plan around: without Meta approval a WhatsApp template cannot be sent outside the 24-hour service window, and a rejected template cannot be resubmitted under the same name — pick a new one.
What it helps with
- create a message template with variables through the Content API
- send a WhatsApp message by
ContentSid - submit a template for Meta approval and track its status
- pick the right content type for a given channel
- add SMS fallback text to an RCS template
Example prompts for the agent
- Create an appointment-reminder template with variables {{1}}, {{2}} and {{3}}, then show me the ContentSid
- Send that template to whatsapp:+15558675310 with Sarah as the name
- Submit the template for approval in the UTILITY category and check the status
How to install twilio-content-template-builder
1Skills CLI (Vercel)
npx skills add openai/plugins --skill twilio-content-template-builder -a codex2Manually: put the files in place
.agents/skills/twilio-content-template-builder/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add openai/plugins --skill twilio-content-template-builder -a claude-code2Manually: put the files in place
~/.claude/skills/twilio-content-template-builder/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/twilio-content-template-builder/
Manually: put the files in place
.cursor/skills/twilio-content-template-builder/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install openai/plugins twilio-content-template-builder2Manually: put the files in place
.github/skills/twilio-content-template-builder/SKILL.mdPlatform CLI
gemini skills install https://github.com/openai/plugins --path plugins/twilio-developer-kit/skills/twilio-content-template-builderManually: put the files in place
.devin/skills/twilio-content-template-builder/SKILL.mdThe legacy .windsurf/skills/ path still works
Claude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
Step by step, with commands for each platform: Codex skills: how to install, where they live, how to call them
Questions about twilio-content-template-builder
How do I install twilio-content-template-builder in Claude?
Run npx skills add openai/plugins --skill twilio-content-template-builder -a codex, then check .agents/skills/twilio-content-template-builder/SKILL.md.
What does twilio-content-template-builder do?
It helps your agent create, send and delete templates through the Twilio Content API, including Meta approval requests for WhatsApp and status checks.
What do I need before using this skill?
A Twilio account, the TWILIO_ACCOUNT_SID and TWILIO_AUTH_TOKEN environment variables, and the SDK: pip install twilio or npm install twilio. WhatsApp templates need an active sender.
Source text
SKILL.md · MIT
---
name: twilio-content-template-builder
description: >
Create, manage, and send message templates using Twilio's Content API.
Covers template creation for WhatsApp, SMS, RCS, and MMS; variable usage;
WhatsApp Meta approval; and sending templates via ContentSid. Use this skill
when building structured messages that require pre-approval or consistent
formatting across channels.
---
## Overview
The Content API creates channel-agnostic templates identified by a `ContentSid` (`HX...`). WhatsApp templates must be approved by Meta before use outside the 24-hour service window.
---
## Prerequisites
- Twilio account — New to Twilio? See `twilio-account-setup`
- For WhatsApp templates: active WhatsApp sender
— See `twilio-whatsapp-send-message` (sandbox) or `twilio-whatsapp-manage-senders` (production)
- Environment variables:
- `TWILIO_ACCOUNT_SID`
- `TWILIO_AUTH_TOKEN`
— See `twilio-iam-auth-setup` for credential setup and best practices
- SDK: `pip install twilio` / `npm install twilio`
---
## Quickstart
**Step 1 — Create a template via Console** (simplest)
Console > Messaging > Content Template Builder > Create new. Use `{{1}}`, `{{2}}` for variables. Save to get a `ContentSid`.
**Step 2 — Send the template**
**Python**
```python
import os
from twilio.rest import Client
client = Client(os.environ["TWILIO_ACCOUNT_SID"], os.environ["TWILIO_AUTH_TOKEN"])
message = client.messages.create(
from_="whatsapp:+14155238886",
to="whatsapp:+15558675310",
content_sid="HXxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
content_variables='{"1": "Sarah", "2": "March 28", "3": "10:00 AM"}'
)
print(message.sid)
```
**Node.js**
```node
const twilio = require("twilio");
const client = twilio(process.env.TWILIO_ACCOUNT_SID, process.env.TWILIO_AUTH_TOKEN);
const message = await client.messages.create({
from: "whatsapp:+14155238886",
to: "whatsapp:+15558675310",
contentSid: "HXxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
contentVariables: JSON.stringify({ "1": "Sarah", "2": "March 28", "3": "10:00 AM" }),
});
```
---
## Key Patterns
### Create a Template via API
**Python**
```python
template = client.content.v1.contents.create(
friendly_name="appointment-reminder",
language="en",
types={
"twilio/text": {
"body": "Hi {{1}}, your appointment is on {{2}} at {{3}}. Reply YES to confirm."
}
}
)
print(template.sid) # HXxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
```
**Node.js**
```node
const template = await client.content.v1.contents.create({
friendlyName: "appointment-reminder",
language: "en",
types: {
"twilio/text": {
body: "Hi {{1}}, your appointment is on {{2}} at {{3}}. Reply YES to confirm.",
},
},
});
console.log(template.sid);
```
### Submit for WhatsApp Approval
**Python**
```python
approval = client.content.v1 \
.contents(template.sid) \
.approval_requests \
.create(name="appointment-reminder", category="UTILITY")
print(approval.status) # PENDING
```
**Node.js**
```node
const approval = await client.content.v1
.contents(templateSid)
.approvalRequests.create({ name: "appointment-reminder", category: "UTILITY" });
console.log(approval.status);
```
Categories: `UTILITY`, `MARKETING`, `AUTHENTICATION`
### Check Approval Status
**Python**
```python
content = client.content.v1.contents(template.sid).fetch()
print(content.approval_requests.status) # APPROVED | REJECTED | PENDING
```
**Node.js**
```node
const content = await client.content.v1.contents(templateSid).fetch();
console.log(content.approvalRequests.status);
```
Approval typically takes under 1 hour.
### List and Delete Templates
**Python**
```python
for template in client.content.v1.contents.list():
print(template.sid, template.friendly_name, template.language)
client.content.v1.contents("HXxxxxxxxxxx").delete()
```
**Node.js**
```node
const templates = await client.content.v1.contents.list();
templates.forEach(t => console.log(t.sid, t.friendlyName, t.language));
await client.content.v1.contents("HXxxxxxxxxxx").remove();
```
### Supported Content Types
| Type | `types` key | Channels |
|------|------------|---------|
| Plain text | `twilio/text` | All |
| Media (image, video) | `twilio/media` | WhatsApp, MMS, RCS |
| Quick reply buttons | `twilio/quick-reply` | WhatsApp, RCS |
| Call-to-action buttons | `twilio/call-to-action` | WhatsApp, RCS |
| List picker | `twilio/list-picker` | WhatsApp |
| Card | `twilio/card` | RCS |
| Carousel | `twilio/carousel` | RCS |
### RCS Fallback Text
When sending a rich RCS template (card, carousel, quick reply) via a Messaging Service with SMS fallback configured, Twilio uses the template's `twilio/text` body as the SMS fallback copy. Any template intended for RCS should include a `twilio/text` entry so recipients on non-RCS devices still receive a readable message.
---
## Variable Rules
- Use `{{1}}`, `{{2}}` — sequential, no skipping
- Max 100 variables per template
- Provide sample values for WhatsApp submissions
- Non-variable to variable ratio must be at least `(2x + 1) : x`
---
## CANNOT
- **Cannot use WhatsApp templates without Meta approval** — Plan for up to 24 hours review time
- **Cannot resubmit a rejected template with the same name** — Use a different name for resubmission
- **Cannot include custom variables in AUTHENTICATION templates** — Fixed format required by Meta
---
## Next Steps
- **Channel overview and onboarding guide:** `twilio-messaging-overview`
- **Send WhatsApp messages:** `twilio-whatsapp-send-message`
- **Register a production WhatsApp sender:** `twilio-whatsapp-manage-senders`
© Twilio · MIT · openai/plugins