mcpField
T
telnyx-api

telnyx-api

github.com/tdimino其他4141 次安装1 周前更新
代码仓库

关于 telnyx-api

telnyx-api 是面向使用 Telnyx 通信 API 的开发者技能,涵盖消息、语音、号码管理和 Webhook,并提供 TypeScript 示例及生产实践。

主要功能

  1. 01SMS 和 MMS API 示例
  2. 02语音与电话号码管理指南
  3. 03Webhook 处理与签名验证
  4. 04重试、速率限制与幂等处理
  5. 0510DLC 注册指南

适用场景

  1. 01在应用中发送 SMS 或 MMS
  2. 02处理入站消息和送达事件
  3. 03构建批量或定时消息发送
  4. 04准备美国 A2P 消息活动注册

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/tdimino/claude-code-minoan --skill telnyx-api

安装后在 Claude Code 中输入/telnyx-api确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

README.md
assets/examples/
provider-implementation.ts
send-sms.ts
webhook-handler.ts
references/
10dlc.md
authentication.md
best-practices.md
error-codes.md
index.md
messaging-api.md
production-patterns.md
webhooks.md
references/github/
CHANGELOG.md
file_structure.md
issues.md
README.md
releases.md
references/official-docs/
authentication.md
messaging.md
sdks.md
webhooks.md

详细介绍

Telnyx API - 全面的通信平台

v2.0 增强:此技能现已包含 Telnyx 官方文档、经过生产环境验证的 Twilio-Aldea 模式(包括使用 tweetnacl 进行 Ed25519 签名验证、与提供商无关的 Webhook 处理程序以及数据库幂等性),以及全面的 TypeScript SMS/MMS 消息示例。

何时使用此技能

在使用 Telnyx 通信 API 执行以下任务时,请使用此技能:

  • SMS/MMS 消息 - 以编程方式发送和接收文本消息
  • 语音通信 - 使用 Call Control API 构建语音通话应用
  • 电话号码管理 - 搜索、购买和配置电话号码
  • 消息配置文件 - 配置消息设置和 Webhook
  • Webhook 集成 - 处理实时事件和送达通知
  • 双向 SMS 对话 - 构建交互式 SMS 体验
  • 批量发送 SMS - 通过速率限制向多个收件人发送消息
  • 消息定时发送 - 安排在未来发送消息
  • 生产部署 - 部署带有错误处理和监控的消息功能
  • 10DLC 注册 - 注册品牌和营销活动,以符合美国 A2P 消息合规要求

此技能适用于在应用中构建通信功能、设置 SMS 通知系统、创建语音 IVR 系统或集成电话功能。

快速参考

1. 发送简单 SMS
const axios = require('axios');

async function sendSMS(to, from, text) {
  const response = await axios.post(
    'https://api.telnyx.com/v2/messages',
    { from, to, text },
    {
      headers: {
        'Authorization': `Bearer ${process.env.TELNYX_API_KEY}`,
        'Content-Type': 'application/json'
      }
    }
  );
  return response.data;
}

// Usage
await sendSMS('+14155552671', '+14155559999', 'Hello from Telnyx!');
2. 验证电话号码(E.164 格式)
function validateE164(phoneNumber) {
  const e164Regex = /^\+[1-9]\d{1,14}$/;

  if (!e164Regex.test(phoneNumber)) {
    return {
      valid: false,
      error: 'Phone number must be in E.164 format (e.g., +14155552671)'
    };
  }

  return { valid: true };
}

// Normalize US phone numbers to E.164
function formatToE164(number) {
  let digits = number.replace(/\D/g, '');
  if (!digits.startsWith('1')) {
    digits = '1' + digits;
  }
  return '+' + digits;
}
3. 处理收到的消息(Webhook)
const express = require('express');
app.use(express.json());

app.post('/webhooks/telnyx', (req, res) => {
  const event = req.body.data;

  if (event.event_type === 'message.received') {
    const from = event.payload.from.phone_number;
    const text = event.payload.text;
    const to = event.payload.to[0].phone_number;

    console.log(`Received: "${text}" from ${from}`);

    // Auto-reply
    await sendSMS(from, to, 'Thanks for your message!');
  }

  res.status(200).send('OK');
});
4. 验证 Webhook 签名(Ed25519)
const nacl = require('tweetnacl');

function verifyWebhook(rawBody, signature, timestamp, publicKey) {
  // Check timestamp freshness (prevent replay attacks)
  const timestampMs = parseInt(timestamp);
  const now = Date.now();
  if (Math.abs(now - timestampMs) > 5 * 60 * 1000) {
    return false; // Reject if older than 5 minutes
  }

  // Construct signed payload
  const signedPayload = `${timestamp}|${rawBody}`;

  // Decode signature and public key from hex
  const signatureBytes = Buffer.from(signature, 'hex');
  const publicKeyBytes = Buffer.from(publicKey, 'hex');

  // Verify Ed25519 signature
  return nacl.sign.detached.verify(
    Buffer.from(signedPayload, 'utf8'),
    signatureBytes,
    publicKeyBytes
  );
}

// Usage in Express
app.post('/webhooks/telnyx', (req, res) => {
  const signature = req.headers['telnyx-signature-ed25519'];
  const timestamp = req.headers['telnyx-timestamp'];
  const rawBody = JSON.stringify(req.body);

  if (!verifyWebhook(rawBody, signature, timestamp, process.env.TELNYX_PUBLIC_KEY)) {
    return res.status(401).send('Invalid signature');
  }

  // Process webhook...
  res.status(200).send('OK');
});
5. 发送消息并进行错误处理和重试
async function sendWithRetry(to, from, text, maxRetries = 3) {
  for (let attempt = 1; attempt <= maxRetries; attempt++) {
    try {
      return await sendSMS(to, from, text);
    } catch (error) {
      if (error.response?.status >= 500 && attempt < maxRetries) {
        // Server error - retry with exponential backoff
        const delayMs = Math.pow(2, attempt) * 1000;
        console.log(`Retry ${attempt} in ${delayMs}ms...`);
        await new Promise(resolve => setTimeout(resolve, delayMs));
      } else {
        throw error;
      }
    }
  }
}
6. 通过速率限制批量发送
async function sendBulkSMS(recipients, from, text) {
  const delayMs = 100; // 10 messages/second
  const results = [];

  for (const recipient of recipients) {
    try {
      const result = await sendSMS(recipient, from, text);
      results.push({ success: true, to: recipient, id: result.data.id });
    } catch (error) {
      results.push({ success: false, to: recipient, error: error.message });
    }

    await new Promise(resolve => setTimeout(resolve, delayMs));
  }

  return results;
}
7. 幂等地处理 Webhook(数据库)
// Using PostgreSQL with unique constraint
async function processWebhookIdempotent(event, client) {
  try {
    await client.query('BEGIN');

    // Try to insert event (will fail if duplicate due to unique constraint)
    await client.query(
      'INSERT INTO processed_webhooks (event_id, processed_at) VALUES ($1, NOW())',
      [event.id]
    );

    // Process event
    await handleEvent(event, client);

    await client.query('COMMIT');
  } catch (error) {
    await client.query('ROLLBACK');

    // If duplicate key error, event was already processed
    if (error.code === '23505') {
      console.log('Event already processed, skipping');
      return;
    }

    throw error;
  }
}
8. 双向对话状态机
const conversations = new Map();

app.post('/webhooks/telnyx', async (req, res) => {
  const event = req.body.data;

  if (event.event_type === 'message.received') {
    const from = event.payload.from.phone_number;
    const to = event.payload.to[0].phone_number;
    const text = event.payload.text.toLowerCase();

    let state = conversations.get(from) || 'start';
    let reply;

    switch (state) {
      case 'start':
        reply = "Welcome! What's your name?";
        conversations.set(from, 'asked_name');
        break;

      case 'asked_name':
        reply = `Nice to meet you, ${text}! How can I help?`;
        conversations.set(from, 'helping');
        break;

      case 'helping':
        reply = 'Thanks! A human will respond shortly.';
        conversations.delete(from);
        break;
    }

    await sendSMS(from, to, reply);
  }

  res.status(200).send('OK');
});
9. 检查 10DLC 营销活动状态
#!/bin/bash
# Monitor campaign approval status

CAMPAIGN_ID="your-campaign-id"
API_KEY="your-api-key"

STATUS=$(curl -s "https://api.telnyx.com/v2/10dlc/campaign/${CAMPAIGN_ID}" \
  -H "Authorization: Bearer ${API_KEY}" \
  | jq -r '.campaignStatus')

echo "Campaign status: ${STATUS}"

# Status values:
# - TCR_ACCEPTED: Campaign Registry approved (not yet ready)
# - MNO_PENDING: Waiting for carrier approval
# - MNO_PROVISIONED: Fully approved and ready for production
10. 处理常见错误
function handleTelnyxError(error) {
  if (!error.response) {
    return { type: 'NETWORK_ERROR', retriable: true };
  }

  const status = error.response.status;
  const errorData = error.response.data.errors?.[0];

  switch (status) {
    case 400:
    case 422:
      // Validation error - fix input
      return {
        type: 'VALIDATION_ERROR',
        message: errorData?.detail || 'Invalid request',
        retriable: false
      };

    case 401:
      // Check API key
      return { type: 'AUTH_ERROR', retriable: false };

    case 429:
      // Rate limit - wait and retry
      return {
        type: 'RATE_LIMIT',
        retriable: true,
        retryAfter: 60
      };

    case 500:
    case 502:
    case 503:
      // Server error - retry with backoff
      return { type: 'SERVER_ERROR', retriable: true };

    default:
      return { type: 'UNKNOWN_ERROR', retriable: false };
  }
}

核心概念

1. E.164 电话号码格式

国际电话号码格式:+[country code][number]

  • 美国示例:+14155552671
  • 英国示例:+442071234567
  • 始终包含 + 前缀
  • 最多 15 位数字(不含 +)
2. 消息配置文件

用于对号码进行分组并定义 Webhook 设置的配置容器。优势:

  • 集中管理 Webhook
  • 用于负载分配的号码池
  • 字母数字发件人 ID
  • 轻松管理号码
  • Webhook 故障转移 URL
3. 消息编码和分段
  • GSM-7:标准 ASCII 每段 160 个字符(成本更低)
  • UCS-2:表情符号/Unicode 每段 70 个字符(成本更高)
  • 长消息会拆分为多个段(最多 10 段)
  • 多段消息:GSM-7 每段 153 个字符,UCS-2 每段 67 个字符
4. Webhook 事件

有关消息状态的实时通知:

  • message.sent - 已发送至运营商
  • message.delivered - 已送达收件人
  • message.failed - 送达失败
  • message.received - 已收到入站消息
  • message.finalized - 已达到最终状态
5. 10DLC 营销活动审批阶段

了解美国消息服务时的关键事项:

  1. TCR_ACCEPTED - 营销活动注册中心已批准(尚不能发送)
  2. MNO_PENDING - 等待运营商批准(1-3 天)
  3. MNO_PROVISIONED - 已完全批准并准备就绪(可以关联号码并发送)
6. 身份验证

所有 API 请求都需要使用 Bearer 令牌进行身份验证:

Authorization: Bearer YOUR_API_KEY

将 API 密钥存储在环境变量中,切勿硬编码。

参考文件

references/ 目录包含详细文档:

authentication.md

API 密钥管理和安全的完整指南:

  • 创建和管理 API 密钥
  • 设置环境变量(Node.js、Python、Docker、Kubernetes)
  • 密钥轮换和安全最佳实践
  • 配置 IP 允许列表
  • 验证 Webhook 签名
  • 常见身份验证错误及解决方案
messaging-api.md

完整的 Messaging API 参考:

  • 完整的端点文档(/v2/messages)
  • 所有请求/响应参数
  • 消息状态值及生命周期
  • 字符编码详情(GSM-7 与 UCS-2)
  • 消息分段规则
  • MMS 限制及支持的格式
  • 分页和筛选选项
webhooks.md

全面的 webhook 参考:

  • 所有 webhook 事件类型及负载示例
  • Ed25519 签名验证(安全)
  • HMAC-SHA256 签名验证(旧版)
  • Webhook 配置(全局、配置文件、按消息)
  • 最佳实践(幂等性、异步处理、重试)
  • 使用 ngrok 在本地测试 webhook
  • 完整的 webhook 处理程序示例
  • 故障排查指南
error-codes.md

完整的错误参考与处理指南:

  • 所有 HTTP 状态码及其含义
  • 常见错误代码及解决方案
  • 验证错误(10001-10007)
  • 速率限制错误(429)
  • 服务器错误(500、502、503)
  • Webhook 专属投递错误
  • 全面的错误处理程序实现
  • 指数退避重试策略
best-practices.md

生产环境部署模式:

  • 在生产环境中使用 messaging profiles
  • 稳健的错误处理模式
  • 指数退避重试逻辑
  • 批量发送的速率限制
  • 消息跟踪和状态监控
  • 电话号码验证和格式化
  • 消息内容优化
  • 字符数限制处理
  • 使用队列进行 webhook 异步处理
  • 幂等性实现
  • 结构化日志记录和监控
  • 成本优化策略
  • 测试模式
  • 生产环境部署检查清单
number-management.md

电话号码操作:

  • 搜索可用号码
  • 购买电话号码
  • 配置号码设置
  • 转移现有号码
  • 号码池管理
10dlc.md

10DLC(10 位长号码)注册与合规:

  • 营销活动审批阶段(TCR_ACCEPTED → MNO_PENDING → MNO_PROVISIONED)
  • 品牌和营销活动注册流程
  • 用例选择(客户支持、营销、2FA 等)
  • TCPA 和 CTIA 合规要求
  • 必需的消息要素(opt-in、opt-out、HELP)
  • 通过 API 监控营销活动状态
  • 电话号码关联(仅限门户,不支持通过 API 操作)
  • 成本结构和预计时间(3-5 个工作日)
  • 常见问题和故障排查
  • 生产环境检查清单

官方 Telnyx 文档(NEW)

从 developers.telnyx.com 提取的完整官方文档:

  • references/official-docs/webhooks.md - 完整的 webhook 指南,包含签名验证、事件类型和最佳实践
  • references/official-docs/messaging.md - Messaging API 参考,包含 SMS/MMS 端点、字符编码和分段
  • references/official-docs/authentication.md - API 身份验证、安全性和最佳实践
  • references/official-docs/sdks.md - Node.js(v2,支持 TypeScript/ESM)、Python、Ruby、PHP、Java、Go 的服务端 SDK 文档

生产环境模式(NEW)

来自 Twilio-Aldea 生产代码库的真实场景模式:

  • references/production-patterns.md - 8 种经过实战验证的模式,包括:
    • 模式 1:使用 tweetnacl 验证 Ed25519 签名(安全的 webhook 身份验证)
    • 模式 2:与提供商无关的 webhook 处理程序(通过单一端点同时支持 Twilio 和 Telnyx)
    • 模式 3:用于签名验证的原始正文解析(保留原始字节)
    • 模式 4:通过数据库唯一约束实现幂等性(防止重复处理)
    • 模式 5:Messaging Profile 配置(适用于生产环境的设置)
    • 模式 6:带电话号码检测的调试模式(无成本测试)
    • 模式 7:带分类的数据库错误日志记录(持久化、可查询的跟踪记录)
    • 模式 8:E.164 电话号码标准化(处理所有格式)

代码示例(新增)

可用于生产环境的 TypeScript 示例:

  • assets/examples/webhook-handler.ts - 完整的 Webhook 处理程序,带有 Ed25519 签名验证
  • assets/examples/send-sms.ts - SMS/MMS 发送示例,包含错误处理和重试逻辑
  • assets/examples/provider-implementation.ts - 来自 Twilio-Aldea 的完整生产级 Provider 类

GitHub 仓库(新增)

references/github/README.md

GitHub 上的 Telnyx Node.js SDK 官方 README(team-telnyx/telnyx-node,62 个星标)

references/github/issues.md

16 个 GitHub Issue,展示了常见问题及解决方案:

  • Webhook 签名验证问题
  • TypeScript 类型定义
  • SDK 初始化错误
  • 速率限制处理
  • 环境配置
references/github/CHANGELOG.md

完整的 SDK 版本历史,包含重大变更和迁移说明

references/github/releases.md

81 个 GitHub Release,附有详细的 SDK 更新日志

references/github/file_structure.md

仓库结构(2,129 个文件),展示了 SDK 源代码的组织方式

使用此技能

新手指南

从这里开始:

  1. 使用快速参考示例 #1(发送简单 SMS)
  2. 为 API 密钥设置环境变量
  3. 使用快速参考示例 #2(验证电话号码)
  4. 测试向自己的电话号码发送消息
  5. 设置快速参考示例 #3(处理收到的消息)
  6. 使用 ngrok 测试双向消息

需要了解的关键概念:

  • E.164 电话号码格式(始终以 + 开头)
  • Bearer 令牌身份验证
  • 基本的 Webhook 处理
  • 消息编码(GSM-7 与 UCS-2)

参考文件:

  • 从 authentication.md 开始设置
  • 查看 messaging-api.md,了解基本 API 用法
  • 出现错误时查看 error-codes.md
  • 使用 webhooks.md 接收消息

新手常见错误:

  • 忘记在电话号码前加 +
  • 未使用 E.164 格式(例如,使用 (415) 555-2671,而不是 +14155552671)
  • 将 API 密钥硬编码,而不是使用环境变量
  • 未验证 Webhook 签名
中级用户指南

重点领域:

  1. 实现快速参考示例 #4(使用 Ed25519 验证 Webhook 签名)
  2. 使用快速参考示例 #5(带重试的错误处理)
  3. 使用快速参考示例 #8(状态机)构建对话流程
  4. 创建消息配置文件(参见 best-practices.md)
  5. 实现快速参考示例 #7(数据库幂等性)

需要掌握的关键概念:

  • 适用于生产环境的消息配置文件
  • Ed25519 Webhook 签名验证(比 HMAC 更安全)
  • 带重试逻辑的错误处理模式
  • 消息分段和成本优化
  • Webhook 处理的幂等性
  • 批量发送的速率限制

参考文件:

  • 学习 webhooks.md,了解事件类型和安全性
  • 查看 best-practices.md,了解生产环境模式
  • 使用 error-codes.md 实现全面的错误处理
  • 查看 production-patterns.md,了解实际应用

生产环境注意事项:

  • 始终验证 Webhook 签名(使用 Ed25519,而非 HMAC-SHA256)
  • 实现幂等性,避免重复处理
  • 使用指数退避进行重试
  • 将所有错误记录到数据库,以便调试
  • 监控消息送达率
面向高级用户

高级模式:

  1. 使用队列系统(Bull/Redis)实现 best-practices.md 中的批量消息发送
  2. 构建与服务提供商无关的处理程序(production-patterns.md 中的模式 2)
  3. 设置全面的错误日志记录(production-patterns.md 中的模式 7)
  4. 实现调试器模式,实现零成本测试(模式 6)
  5. 使用编码策略优化消息成本
  6. 使用 Call Control API 构建 IVR 系统
  7. 为大批量消息发送设置号码池
  8. 实现全面的监控和告警

关键主题:

  • 用于异步处理的消息队列系统(Bull/Redis)
  • 使用唯一约束实现由数据库支持的幂等性
  • 结构化日志记录(Winston)
  • 指标收集(Prometheus)
  • 生产环境部署模式
  • 使用统一接口的多服务提供商架构
  • 10DLC 活动注册与监控
  • Webhook 故障转移与重试机制

参考文件:

  • 深入阅读 best-practices.md,了解所有生产环境模式
  • 查阅 error-codes.md,了解全面的错误处理
  • 阅读 webhooks.md,了解高级 Webhook 模式
  • 分析 production-patterns.md,了解经过实战验证的实现方案
  • 查看 10dlc.md,了解美国 A2P 消息合规要求

架构模式:

  • 与服务提供商无关的设计(支持多个 SMS 服务提供商)
  • 使用消息队列的事件驱动架构
  • 由数据库支持的对话状态机
  • 采用指数退避的 Webhook 重试机制
  • 通过检测调试器模式优化成本
  • 支持故障转移的多区域部署

API 基础知识

基础 URL
https://api.telnyx.com/v2
身份验证标头
Authorization: Bearer YOUR_API_KEY
环境变量
# .env file
TELNYX_API_KEY=KEY019A080F468AAFD4AF4F6888D7795244_xxx
TELNYX_PUBLIC_KEY=your_public_key_for_webhook_validation
TELNYX_MESSAGING_PROFILE_ID=abc85f64-5717-4562-b3fc-2c9600000000
速率限制
  • 标准账户:每个端点每秒 10 个请求
  • 高容量账户:联系 Telnyx 提高限制
  • 对 429 响应实施指数退避
常见响应结构
{
  "data": {
    "id": "message-uuid",
    "type": "SMS",
    "from": { "phone_number": "+18445550001" },
    "to": [{ "phone_number": "+18665550001", "status": "queued" }],
    "text": "Hello!",
    "cost": { "amount": "0.0051", "currency": "USD" }
  }
}

快速入门检查清单

  • 在 https://telnyx.com/sign-up 注册 Telnyx 账户
  • 在 Mission Control Portal 中生成 API 密钥
  • 设置环境变量(切勿将密钥硬编码)
  • 购买电话号码用于测试
  • 发送第一条测试 SMS(快速参考 #1)
  • 验证电话号码(快速参考 #2)
  • 设置 Webhook 端点(本地开发可使用 ngrok)
  • 实现 Webhook 处理程序(快速参考 #3)
  • 添加 Ed25519 Webhook 签名验证(快速参考 #4)
  • 测试双向消息
  • 添加带重试逻辑的错误处理(快速参考 #5)
  • 为生产环境配置消息配置文件
  • (仅美国)如果要发送 A2P 消息,请注册 10DLC

按经验水平浏览

初学者(开始使用)
  1. 从 快速参考示例 #1(发送简单 SMS)开始
  2. 阅读 references/authentication.md,了解 API 设置
  3. 学习 references/messaging-api.md,了解消息 API 基础知识
  4. 使用 快速参考示例 #2(验证电话号码)
  5. 使用 快速参考示例 #3 设置 Webhook
  6. 使用 ngrok 在本地测试
中级用户(构建功能)
  1. 实现 Ed25519 签名验证(快速参考 #4)
  2. 阅读 references/webhooks.md,了解高级 Webhook 模式
  3. 使用消息配置文件(参见 best-practices.md)
  4. 实现幂等性(快速参考 #7)
  5. 构建对话状态机(快速参考 #8)
  6. 查看 assets/examples/webhook-handler.ts,了解完整实现
高级用户(生产环境部署)
  1. 构建与服务提供商无关的处理程序(production-patterns.md 模式 2)
  2. 实现错误日志记录与监控(production-patterns.md 模式 7)
  3. 设计使用统一接口的多服务提供商架构
  4. 使用 production-patterns.md 中的全部 8 种模式优化生产环境方案
  5. 学习 Twilio-Aldea 模式,了解基于 SMS 的 AI 平台架构
  6. 设置监控、告警和指标收集

v2.0 中的关键增强

官方文档集成
  • Webhooks 指南:完整的 Ed25519 签名验证、事件类型和重试逻辑
  • Messaging API:完整的端点参考、字符编码(GSM-7 与 UCS-2)和分段规则
  • 身份验证:API 密钥管理、安全最佳实践和环境变量设置
  • SDK 参考:7 种语言的服务端 SDK 文档
生产环境模式
  • Ed25519 签名验证:经过生产环境测试的 tweetnacl 实现(解决了安全验证问题)
  • 提供商无关设计:通过单个端点支持多个 SMS 提供商
  • 保留原始请求体:使用精确的字节序列进行正确的签名验证
  • 数据库幂等性:PostgreSQL 唯一约束模式(防止重复处理)
  • Messaging Profiles:通过集中式 Webhook 管理进行生产环境部署
  • 调试器模式:来自实时平台的零成本测试模式
  • 错误日志记录:基于数据库的错误跟踪与分类
  • E.164 规范化:正确处理所有电话号码格式
代码示例
  • TypeScript 示例:Webhook 处理程序、SMS 发送、具备完整类型安全的提供商类
  • 生产环境模式:来自 Twilio-Aldea SMS 平台的实际实现
  • 安全示例:Ed25519 验证、原始请求体解析、签名验证
数据来源
  • Telnyx 官方文档(通过 Firecrawl)
  • Exa 代码上下文(来自真实代码仓库的 8000 多个 Telnyx 模式令牌)
  • Twilio-Aldea 生产代码库(部署在 Netlify 上的基于 SMS 的 AI 治疗平台)

版本历史

  • v2.1(2026-04-21)- 更新以适配 Node SDK v2(完整 TypeScript 支持、ESM 模块),并注明计划消息发送(send_at 字段)是生产环境功能
  • v2.0(2025-11-01)- 增补 Telnyx 官方文档、Twilio-Aldea 的生产环境模式(Ed25519 验证、提供商无关的 Webhook、幂等性)、TypeScript 示例和全面的 Messaging API 指南
  • v1.0 - 初始技能创建,包含快速参考、错误代码和基本消息模式

更多资源

常见模式

模式:发送带跟踪信息的消息
const tracker = new Map();

async function sendTrackedMessage(to, from, text) {
  const response = await sendSMS(to, from, text);
  tracker.set(response.data.data.id, {
    to, from, text,
    status: 'queued',
    sentAt: new Date()
  });
  return response;
}

// In webhook handler
app.post('/webhooks/telnyx', (req, res) => {
  const event = req.body.data;
  if (event.event_type === 'message.delivered') {
    const msg = tracker.get(event.payload.id);
    if (msg) msg.status = 'delivered';
  }
  res.status(200).send('OK');
});
模式:转换为 E.164 格式
function formatToE164(number, defaultCountryCode = '1') {
  let digits = number.replace(/\D/g, '');
  if (!digits.startsWith(defaultCountryCode)) {
    digits = defaultCountryCode + digits;
  }
  return '+' + digits;
}

// Examples
formatToE164('415-555-2671');      // +14155552671
formatToE164('(415) 555-2671');    // +14155552671
formatToE164('+1 415-555-2671');   // +14155552671
模式:优化消息成本
// Prefer GSM-7 encoding (cheaper, longer)
function optimizeForGSM7(text) {
  // Replace unicode quotes with GSM-7 quotes
  return text
    .replace(/[""]/g, '"')
    .replace(/['']/g, "'")
    .replace(/[—–]/g, '-')
    .replace(/…/g, '...');
}

支持与故障排除

获取帮助
  1. 查看 error-codes.md 了解具体错误消息
  2. 查阅 best-practices.md 了解常见模式
  3. 访问 https://status.telnyx.com/ 查看服务状态
  4. 通过 Mission Control 门户联系支持团队
  5. 如果遇到美国 A2P 消息问题,请查看 10dlc.md
常见问题
  • 401 Unauthorized:检查 API 密钥格式(Bearer YOUR_API_KEY)
  • 10001 Invalid phone number:确保使用 E.164 格式(+14155552671)
  • 429 Rate limit:实施速率限制(快速参考 #6)
  • 未收到 Webhook:确认 URL 可公开访问且具有有效的 SSL
  • 消息未能在美国送达:检查 10DLC 活动状态(必须为 MNO_PROVISIONED)
调试提示
// Enable request/response logging
axios.interceptors.request.use(request => {
  console.log('Request:', request.url, request.data);
  return request;
});

axios.interceptors.response.use(
  response => {
    console.log('Response:', response.status, response.data);
    return response;
  },
  error => {
    console.error('Error:', error.response?.data);
    return Promise.reject(error);
  }
);

评论

支持 Markdown