OSS-first docs
These docs teach the open system first: contracts, generated surfaces, runtimes, governance, and incremental adoption. Studio shows up as the operating layer on top, not as the source of truth.
Twilio-powered WhatsApp integration for inbound webhooks and outbound conversational messaging.
Source Definition
export const messagingWhatsappTwilioIntegrationSpec = defineIntegration({
meta: {
key: 'messaging.whatsapp.twilio',
version: '1.0.0',
category: 'messaging',
title: 'WhatsApp via Twilio',
description:
'Twilio-powered WhatsApp integration for inbound webhooks and outbound conversational messaging.',
domain: 'communications',
owners: ['platform.messaging'],
tags: ['messaging', 'whatsapp', 'twilio'],
stability: StabilityEnum.Beta,
},
supportedModes: ['managed', 'byok'],
transports: [
{ type: 'rest', baseUrl: 'https://api.twilio.com' },
{
type: 'webhook',
inbound: {
signatureHeader: 'x-twilio-signature',
signingAlgorithm: 'hmac-sha1',
},
},
],
preferredTransport: 'rest',
supportedAuthMethods: [{ type: 'basic' }],
capabilities: {
provides: [
{ key: 'messaging.inbound', version: '1.0.0' },
{ key: 'messaging.outbound', version: '1.0.0' },
],
},
configSchema: {
schema: {
type: 'object',
properties: {
fromNumber: {
type: 'string',
description:
'Default WhatsApp-enabled Twilio sender number (e.g. whatsapp:+15551234567).',
},
},
},
example: {
fromNumber: 'whatsapp:+15551234567',
},
},
secretSchema: {
schema: {
type: 'object',
required: ['accountSid', 'authToken'],
properties: {
accountSid: {
type: 'string',
description: 'Twilio account SID.',
},
authToken: {
type: 'string',
description: 'Twilio auth token.',
},
},
},
example: {
accountSid: 'ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
authToken: '***',
},
},
healthCheck: {
method: 'custom',
timeoutMs: 4000,
},
docsUrl: 'https://www.twilio.com/docs/whatsapp',
constraints: {
rateLimit: {
rpm: 200,
},
},
byokSetup: {
setupInstructions:
'Create a Twilio project with WhatsApp sender provisioning, then provide account SID/auth token and sender number.',
keyRotationSupported: true,
quotaTrackingSupported: false,
},
});