接口与快速开始
基址:https://gettgapi.com/api/open/v1。通过你的服务器调用,使用同一张授权码的剩余次数。无需客户注册账号,不需要 Telegram 客户端 API、两步认证密码或设备授权。每次申请仍需要号码持有人提供开发者门户验证码。
下载 OpenAPI 3.1 文档 · 下载 Python 完整示例 · 咨询接入
- 用授权码查询
GET /balance,确认剩余次数。 POST /applications提交号码、应用资料及使用授权,保存返回的申请id。- 每隔至少 5 秒查询申请。
waiting_code且challenge不为空时,让号码持有人提供本轮验证码。 POST /applications/{id}/code提交验证码,继续查询。- 状态为
succeeded后读取GET /applications/{id}/result。 - 在你的系统安全保存结果,确认保存成功后调用删除接口。删除后无法补领。
已有应用时返回已有结果;没有应用时尝试创建。平台不保证所有号码都能申请成功,限制或异常可能需要人工处理。
授权与请求格式
每个业务请求必须携带:
Authorization: Bearer YOUR_AUTHORIZATION_CODE
Accept: application/json
写入请求另外携带:
Content-Type: application/json
Idempotency-Key: 2e8718cd-84ef-4830-b273-66b3afdd682d
授权码可以带原有连字符,字母不区分大小写。不得放在 URL、网页前端、日志或公开仓库中。接口不使用网页 Cookie 或 CSRF Token,不开放跨站 CORS;授权码泄漏等同服务权限泄漏,应立即联系发放方停用。
仅使用 HTTPS。请求体最多 8 KiB;未知字段、错误类型或无效格式会被拒绝。所有时间字段为 Unix 秒;null 表示当前无此数据,不能当成 0。
成功响应统一为:
{"data": {"available": 1}, "request_id": "服务端生成的追踪编号"}
上面是结构示意,完整字段见各接口和 OpenAPI。响应头 X-Request-ID 与 request_id 一致;响应禁止缓存。request_id 用于联系客服排查,不能用作下次写入的幂等键。
授权码余额
GET /balance,成功 HTTP 200。
{
"data": {
"total": 10,
"available": 8,
"reserved": 1,
"consumed": 1,
"revoked": 0,
"max_concurrent": 2,
"result_retention_seconds": 1800
},
"request_id": "示例追踪编号"
}
total = available + reserved + consumed + revoked。reserved 为正在处理的预占次数,consumed 为已成功使用次数,revoked 为已收回次数。单张授权码同时最多两个预占申请,网页与接口共用这一限制及余额。
查询余额不消耗次数、不兑换授权码。次数用完后仍可通过原授权码读取接口申请及清除临时结果;停用或暂停后禁止访问,请联系发放方处理。
创建申请
POST /applications,成功或幂等重试成功均为 HTTP 202。
{
"phone": "+12025550123",
"title": "My Telegram App",
"short_name": "myapp2026",
"consent": true
}
| 字段 | 要求 |
|---|---|
| phone | 必填,包含国家区号;数字与开头可选的 +;空格会清理,缺少 + 自动补充;不接受其他字符 |
| title | 可选,默认 My Telegram App;3–60 字符,文字、数字、下划线、空格、点和连字符 |
| short_name | 必填,5–32 字符;英文字母开头,其后为英文字母、数字或下划线 |
| consent | 必填,必须是布尔值 true,确认有权使用此号码;不能传字符串 "true" |
HTTP 202 表示申请已受理,不代表验证码已送达或已经成功。返回申请对象见下一节。首次受理预占 1 次,成功才扣次。明确失败、创建前取消或重复结果会退回预占;结果未确认时保留预占并继续核对。
同一授权码、同一号码的未结束或成功记录不会重复创建。资料相同的接口记录会返回原申请;不同资料或原记录属于网页会话时返回 PHONE_ALREADY_USED。已删除结果的号码仍保留使用记录,不能用换幂等键的方式补领或重复计费。
申请查询与状态
GET /applications/{id},成功 HTTP 200,返回申请对象:
{
"data": {
"id": "28f4a4d0-e69f-48d4-b520-85c479873b1f",
"phone_mask": "+120••••123",
"title": "My Telegram App",
"short_name": "myapp2026",
"status": "waiting_code",
"message": "请在 Telegram 中查看验证码,并在下方输入。",
"challenge": {"id": "c8a34997-38bd-4a1c-90bb-5baac7dbabcc", "expires_at": 1790998200, "attempts_remaining": 5},
"poll_after_seconds": 5,
"retry_at": null,
"result_expires_at": null,
"quota": "reserved",
"created_at": 1790997600,
"updated_at": 1790997605
},
"request_id": "示例追踪编号"
}
| 状态 | 客户端下一步 |
|---|---|
| queued | 排队中,继续查询 |
| processing | 处理中或结果核对中,继续查询,不重复创建 |
| waiting_code | challenge 有值时提交验证码;为 null 时验证已过期,可取消后重新申请 |
| verifying | 验证码已提交,继续查询,不重复发码 |
| retry_wait | 系统等待或自动重试;参考 retry_at,继续查询,无需客户端重发 |
| review_required | 停止自动轮询,联系客服并提供申请 id 和 request_id |
| succeeded | 立即读取并安全保存结果 |
| failed | 本次失败,预占已退回;需要重新申请时使用新的幂等键 |
| cancelled | 已取消,预占已退回 |
| duplicate | 此授权码下已存在相同应用结果,本次不扣次;使用自己保存的结果 |
| deleted | 临时结果已清除,不可再获取 |
quota 为 reserved、consumed 或 released。challenge 仅在当前可输入验证码时存在;尝试失败或重新验证后,其 id 可能变化,必须重新查询。retry_at 是建议等待至的时间,不承诺该时刻必定完成。poll_after_seconds=0 表示无需持续自动轮询。
GET /applications?limit=20&before={id} 提供分页列表;limit 为 1–50,默认 20,before 可省略。结果按创建时间和 id 倒序,返回 data.items 与 data.next_before,后者为 null 时结束。只显示本授权码通过接口创建的记录;网页结果和其他授权码记录不可见。
提交验证码
POST /applications/{id}/code,成功 HTTP 202,返回更新后的申请对象。
{"challenge_id": "c8a34997-38bd-4a1c-90bb-5baac7dbabcc", "code": "Ab_cd-12"}
code 为 3–64 个可打印 ASCII 字符,不含空格,区分大小写。仅提交号码持有人本轮收到的开发者门户验证码;不提交两步密码,不使用旧验证轮次。单轮最多 5 次输入,验证码有效期以 challenge.expires_at 为准。
成功受理只代表已进入验证队列。若重试同一 HTTP 请求,保持同一个幂等键与完全相同参数。若验证码确实错误,先查询新 challenge,然后用新幂等键提交正确验证码。
取消申请
POST /applications/{id}/cancel,JSON 为 {"confirm": true},成功 HTTP 200,返回申请对象。
仅排队、等待验证码、等待重试等允许取消的状态可操作。正在执行或结果未确定的申请不能取消,返回 STATE_CONFLICT;此时继续查询,或联系人工。已取消和明确失败的申请重复取消不会再次退次数。
读取结果与确认删除
GET /applications/{id}/result,成功 HTTP 200:
{
"data": {"api_id": 12345678, "api_hash": "0123456789abcdef0123456789abcdef", "expires_at": 1790999400},
"request_id": "示例追踪编号"
}
示例不是可用凭据。结果默认仅提供 30 分钟交付窗口,以实际 expires_at 为准;不会因读取而续期。可多次读取,读取不会扣次数。请不要将 Hash 放入访问日志、浏览器分析、URL 或客服聊天。
保存成功并确认可用后,调用 POST /applications/{id}/result/deletion,JSON 为 {"confirm": true},成功 HTTP 200:
{
"data": {"application_id": "28f4a4d0-e69f-48d4-b520-85c479873b1f", "deleted_at": 1790998000, "status": "deleted"},
"request_id": "示例追踪编号"
}
删除会清除平台用于交付的临时 API 副本,保留使用次数和必要的处理记录,不会删除你的 Telegram 官方应用或你的系统已保存的副本。删除完成、交付过期或临时交付介质失效后,再次读取返回 HTTP 410。删除请求可安全重试;应先保存,后删除。
幂等、限流和重试
所有 POST 必须使用 Idempotency-Key:16–80 位字母、数字、点、下划线、冒号或连字符,建议 UUID。业务系统先持久化这个键,再发请求。每个不同操作生成新键;网络超时、断线或 5xx 后重试原操作时复用原键。
同一授权码的键全局绑定原操作和参数,不可跨接口复用。重放返回同一申请的当前状态,不保证字节级相同响应;不会重复发码、预占或扣次。结果删除后该键也不会创建新申请。不要以“超时就换键”处理未知响应。
| 限制 | 当前值 |
|---|---|
| 同一授权码全部请求 | 120 次/分钟 |
| 同一授权码写入 | 30 次/10 分钟,幂等重试也计入 |
| 同一授权码创建新请求 | 10 次/10 分钟 |
| 同一 IP 业务请求 | 180 次/分钟,另有短时突发保护 |
| 同一 IP 无效 Key | 15 次/10 分钟 |
| 同一号码申请 | 与网页共用每小时 5 次限制 |
| 同一授权码并行预占 | 2 个,网页与接口共用 |
| 验证码提交 | 每轮最多 5 次;单任务另有 10 次/10 分钟限制 |
429 和 503 按响应的 Retry-After 等待,建议指数退避并加入少量随机延迟。5xx、连接超时和读取超时都可能发生在服务器已经完成写入之后;复用原键重试,不能据此认定未扣次。4xx 通常先修正输入或查询进度,不自动无限重试。
服务过载或暂无法执行新申请时返回 503,未受理的请求不占次数。系统故障后会恢复持久任务,并核对已经提交但响应未知的申请;不会盲目再次创建。单机部署仍存在主机和机房故障边界,本接口未承诺多机容灾 SLA。
错误响应与错误码
{
"error": {"code": "RATE_LIMITED", "message": "请求过于频繁,请等待后重试。", "retryable": true, "retry_after_seconds": 60},
"request_id": "请提供此编号以便排查"
}
程序以 code 和 HTTP 状态判断,不解析 message,也不依赖内部实现。上游异常不会原样返回。可重试错误同时带 Retry-After;追踪编号不含授权码和申请结果。
| HTTP | code | 处理方式 |
|---|---|---|
| 401 | INVALID_KEY | 检查 Authorization 请求头和授权码 |
| 403 | KEY_DISABLED | 联系发放方检查停用或暂停状态 |
| 403 | ORIGIN_DENIED / HOST_DENIED | 从服务端调用文档基址 |
| 400 | HTTPS_REQUIRED / IDEMPOTENCY_REQUIRED | 使用 HTTPS,补齐合法幂等键 |
| 422 | INVALID_INPUT / PHONE_INVALID / CONSENT_REQUIRED | 对照字段和格式修正请求 |
| 409 | IDEMPOTENCY_CONFLICT | 找回原请求参数;新操作使用新键 |
| 409 | QUOTA_EXHAUSTED / CONCURRENCY_LIMIT | 查询余额或等待当前申请完成 |
| 409 | PHONE_ALREADY_USED | 处理原申请,不重复创建 |
| 404 | APPLICATION_NOT_FOUND | 检查申请 id、授权码和申请渠道 |
| 409 | CHALLENGE_EXPIRED / TOO_MANY_ATTEMPTS | 重新查询申请及当前验证码轮次 |
| 409 | STATE_CONFLICT | 当前不可操作,查询进度或联系客服 |
| 409 | RESULT_NOT_READY | 继续查询申请进度 |
| 410 | RESULT_GONE | 临时结果不可再次读取,使用自己保存的副本 |
| 429 | RATE_LIMITED | 按 Retry-After 等待 |
| 503 | SERVICE_BUSY / SERVICE_UNAVAILABLE | 退避并复用原幂等键重试 |
| 408 | REQUEST_TIMEOUT | 重试原请求,写入时复用原键 |
| 413 | BODY_TOO_LARGE | 将请求体缩小至 8 KiB 内 |
| 415 | UNSUPPORTED_MEDIA_TYPE | 使用未压缩的 application/json |
| 404 / 405 | NOT_FOUND / METHOD_NOT_ALLOWED | 检查接口路径和方法 |
接入示例与安全保存
下载页首 Python 示例,要求 Python 3.10+ 与 requests。它会在本地受限目录保存请求状态,以相同幂等键恢复未确认请求,并在结果安全落盘后询问是否删除平台临时副本。不要把工作目录加入版本库。
python3 -m pip install requests
python3 gettgapi_client.py --work-dir ./private-application
授权码和验证码在终端隐蔽输入,不写入示例日志;程序会询问号码和 short_name。下次使用同一目录会恢复这次操作;为另一号码申请请使用新的目录。请先在自己可控制的号码上测试,HTTP 受理和自动化测试不能替代真实号码验证。
请在自己的服务中加密保存结果、限制员工读取权限,并避免在客户端公开授权码。发放给不同客户时应使用各自独立授权码;同一授权码的持有人有权管理该码的全部接口申请。
需要接入协助,请访问 https://gettgapi.com/help#contact,提供 request_id 和申请 id 即可,不发送验证码、授权码全文或 API Hash。