API 参考

账号授权

导入会话

通过会话 URL 或渠道专用凭证发起授权。TikTok session 账号使用 tiktok.cookies;pending 时需查询授权和运行状态,直到 authorized 且 running。HTTP 200 本身不代表授权完成。

POSThttps://api.unifyport.ai/v1/accounts/{account_id}/auth/session

支持的渠道

TelegramXFacebookTikTokWhatsApp Protocol

调用前准备

在服务端使用资源所属工作区的 X-Api-Key。运行示例前替换所有占位符。

按渠道准备会话材料:Telegram 和 X 使用已有会话 URL 或引用,只有 WhatsApp Protocol 使用 whatsapp-protocol 凭证对象。先查看对应渠道指南,会话材料和密钥不要写入日志。

参数从哪里取得
account_id
从创建或查询账号的响应取得 data.id。账号标识属于 X-Api-Key 对应的工作区。 获取账号

请求参数

请求头

X-Api-Key
string必填

工作区 API Key,工作区由该请求头解析得到。

Content-Type
string必填

发送 JSON 请求体时使用 application/json。

路径参数

account_id
string必填

用于该 authentication 路由的标识符。

请求体

session_url
string

已有渠道会话的 URL 或引用。 Facebook 必须提供 session_url,指向含 cookies 数组及 c_user、xs、datr 的 JSON。导入成功后仍需确认运行态就绪。

format: uri

whatsapp-protocol
object

WhatsApp Protocol 会话导入凭证,只能通过此嵌套对象提交至 /v1/accounts/{account_id}/auth/session,不能通过 provider_data 提交。提供该对象时,phone、static_pub_key、static_pri_key、identity_pub_key 和 identity_pri_key 必填。响应不回显协议密钥或其他敏感凭证。phone 用于身份一致性校验;协议公钥、私钥仅供上游启动使用。edge_routing 由平台固定注入,不得提交。

phone
string

会话导入时若提供 whatsapp-protocol,phone 必填且必须为非空字符串,用于身份一致性校验。格式化输入允许包含空格、连字符、括号或加号;服务端将其归一化为正数字符串。

minLength: 1

platform
integer

WhatsApp Protocol 会话导入的平台值(int32)。

format: int32

app_version
string

WhatsApp Protocol 会话导入的应用版本。

server_address
string

WhatsApp Protocol 会话导入的渠道服务器地址。

fallback_server_addresses[]
string[]

WhatsApp Protocol 会话导入的备用服务器地址列表。

country
string

WhatsApp Protocol 会话导入的国家代码。

device
integer

WhatsApp Protocol 会话导入的设备值(uint32)。

format: uint32

static_pub_key
string

协议公钥;只写。

minLength: 1

static_pri_key
string

协议私钥;只写。

minLength: 1

identity_pub_key
string

身份公钥;只写。

minLength: 1

identity_pri_key
string

身份私钥;只写。

minLength: 1

hash
string

已弃用的兼容字段;当前值被忽略且不保存,建议省略。

peer_kem_public
string

对端 KEM 公钥;只写。

auth_hex_data
string

当前认证十六进制数据;只写。

authhexdata
string

已弃用的旧版认证十六进制数据字段;只写。

pq_handshake_mode
string

WhatsApp Protocol 会话导入的 PQ 握手模式。

use_xxkem_handshake
boolean

WhatsApp Protocol 会话导入是否使用 XXKEM 握手。

tiktok
object

仅用于 auth_mode=session 的 TikTok 账号。提交时,tiktok 必须是唯一的顶层字段,其内部仅接受 cookies 和可选的 user_id。整个导入 JSON 不超过 65536 字节。格式校验通过不表示凭证有效或授权成功。需要扫码或验证码时会返回相应等待状态;session 模式暂不提供这些步骤的交互接续。不保证重复导入覆盖已有登录或实现 Cookie 热替换。

user_id
string

可选兼容字段,不用于身份校验或绑定;实际身份以授权结果为准。

cookies[]
object[]

提交 tiktok 时必填:包含 1–128 个 Cookie 的只写数组。同名同域不可重复,其他导出的 Cookie 属性予以保留。有效性由登录结果判断。

minItems: 1 · maxItems: 128

name
string

每个 TikTok Cookie 必填的非空名称。

minLength: 1

value
string

每个 TikTok Cookie 必填的非空值;只写。

minLength: 1

domain
string

每个 TikTok Cookie 必填的非空域名,保留导出值。

minLength: 1

path
string

每个 TikTok Cookie 必填的路径,必须以 / 开头。

pattern: ^/

expires
number

可选的导出 Unix 秒时间戳或会话 Cookie 标记;不在导入阶段判断是否过期。

secure
boolean

可选的 TikTok Cookie 导出 Secure 标志。

http_only
boolean

可选的 TikTok Cookie 导出 HttpOnly 标志。

same_site
string

可选的 TikTok Cookie 导出 SameSite 值。

如何理解结果

先读取授权结果,再检查 runtime_status。完成会话导入与建立在线连接是不同阶段。

响应 pending · TikTok session

{
  "request_id": "<REQUEST_ID>",
  "data": {
    "account_id": "acc_example",
    "provider": "tiktok",
    "action": "import_session",
    "status": "pending",
    "runtime_status": "starting"
  }
}

响应 authorized

{
  "request_id": "<REQUEST_ID>",
  "data": {
    "account_id": "acc_example",
    "status": "authorized"
  }
}

响应体

account_id
string

该响应所对应的渠道账号。

status
string

当前授权流程状态,例如 pending_auth、awaiting_qr_scan、awaiting_code、pending、passkey_required、passkey_pending、passkey_confirmation、passkey_confirmation_sent、authorized 或 failed。

响应

200

200 OK

请求成功,响应体示例如上。

400

请求错误

请求体、路径或参数不合法。

401

未授权

X-Api-Key 请求头缺失或无效。

403

禁止访问

请求已识别,但不允许执行该操作。

404

未找到

未找到请求的资源;请结合 error.code 和当前操作核对。

409

冲突

当前操作与已有的渠道账号或资源冲突。

500

服务端错误

服务端遇到了未预期的错误。

502

上游网关错误

渠道适配器或上游渠道未能完成该操作。

失败后怎么处理

检查 HTTP 状态和 error.code/numeric_code,保存 request_id 用于排查。按原因修正参数、继续授权或检查运行态。重试发送及其他写操作前先确认上一次结果,避免重复操作。 错误码参考

结合当前操作读取 HTTP 状态、error.code 和 error.numeric_code。数字码按字符串处理。保留 request_id 排障;它不是幂等键或任务标识。

invalid_request · 10000 · 400

检查 JSON 请求体和必填字段。

处理与重试: 按当前操作与渠道条件修正参数后再请求。重复提交相同的无效请求不会解决错误。

示意 JSON;message 随实际原因变化 · 400 · 10000
{
  "request_id": "req_example",
  "error": {
    "code": "invalid_request",
    "numeric_code": "10000",
    "message": "Invalid request parameters"
  }
}
invalid_target_workspace · 11003 · 400

工作区覆盖目标为空或格式无效。移除覆盖请求头,改用目标工作区所属的 API Key。

触发条件: 适用于携带 X-Workspace-Id 工作区覆盖请求头的请求。

处理与重试: 按当前操作与渠道条件修正参数后再请求。重复提交相同的无效请求不会解决错误。

示意 JSON;message 随实际原因变化 · 400 · 11003
{
  "request_id": "req_example",
  "error": {
    "code": "invalid_target_workspace",
    "numeric_code": "11003",
    "message": "Invalid target workspace"
  }
}
provider_invalid_request · 30001 · 400

检查渠道专属字段及其格式。

处理与重试: 按当前操作与渠道条件修正参数后再请求。重复提交相同的无效请求不会解决错误。

示意 JSON;message 随实际原因变化 · 400 · 30001
{
  "request_id": "req_example",
  "error": {
    "code": "provider_invalid_request",
    "numeric_code": "30001",
    "message": "Provider rejected the request"
  }
}
unsupported_action · 30005 · 400

无法识别此账号操作,请使用文档列出的操作。

处理与重试: 选择文档列为支持的渠道与动作。重复请求不会增加能力或开通内测权限。

示意 JSON;message 随实际原因变化 · 400 · 30005
{
  "request_id": "req_example",
  "error": {
    "code": "unsupported_action",
    "numeric_code": "30005",
    "message": "Action not supported"
  }
}
invalid_api_key · 11001 · 401

检查 API Key 是否正确且已启用。

处理与重试: 保留 request_id 与结构化错误码,先排查当前操作,再决定下一步。

示意 JSON;message 随实际原因变化 · 401 · 11001
{
  "request_id": "req_example",
  "error": {
    "code": "invalid_api_key",
    "numeric_code": "11001",
    "message": "Invalid API key"
  }
}
missing_api_key · 11000 · 401

请添加 X-Api-Key 请求头。

处理与重试: 保留 request_id 与结构化错误码,先排查当前操作,再决定下一步。

示例 · 401 · 11000
{
  "request_id": "req_xxx",
  "error": {
    "code": "missing_api_key",
    "numeric_code": "11000",
    "message": "Missing X-Api-Key header"
  }
}
workspace_override_forbidden · 11002 · 403

请求尝试使用此 API Key 无权使用的工作区覆盖。移除覆盖请求头,改用目标工作区所属的 API Key。

触发条件: 适用于携带 X-Workspace-Id 工作区覆盖请求头的请求。

处理与重试: 保留 request_id 与结构化错误码,先排查当前操作,再决定下一步。

示意 JSON;message 随实际原因变化 · 403 · 11002
{
  "request_id": "req_example",
  "error": {
    "code": "workspace_override_forbidden",
    "numeric_code": "11002",
    "message": "Workspace override is not allowed"
  }
}
target_workspace_not_found · 11004 · 404

覆盖指定的工作区不存在或不可用。核对工作区归属,移除覆盖请求头并使用目标工作区 API Key;重复请求不会增加访问权限。

触发条件: 适用于携带 X-Workspace-Id 工作区覆盖请求头的请求。

处理与重试: 核对目标标识、资源归属与当前工作区。不要把已确认缺失或无法访问的目标当作临时服务故障自动重试。

示意 JSON;message 随实际原因变化 · 404 · 11004
{
  "request_id": "req_example",
  "error": {
    "code": "target_workspace_not_found",
    "numeric_code": "11004",
    "message": "Target workspace not found"
  }
}
account_already_authorized · 20016 · 409

账号已完成授权,本次动作拒绝重复授权。刷新授权状态并复用已完成结果,不要循环重新授权或取消。

处理与重试: 保留 request_id 与结构化错误码,先排查当前操作,再决定下一步。

示意 JSON;message 随实际原因变化 · 409 · 20016
{
  "request_id": "req_example",
  "error": {
    "code": "account_already_authorized",
    "numeric_code": "20016",
    "message": "Account is already authorized; re-authentication is not required"
  }
}
account_binding_not_found · 30006 · 409

账号尚无有效的渠道连接绑定,请检查账号状态。

处理与重试: 查询授权与运行态,再按目标状态和渠道支持选择刷新、启动或重连。连接问题本身不证明已登出;依赖连接的业务操作前确认 running。

示意 JSON;message 随实际原因变化 · 409 · 30006
{
  "request_id": "req_example",
  "error": {
    "code": "account_binding_not_found",
    "numeric_code": "30006",
    "message": "Account is not bound to an available server"
  }
}
duplicate_provider_account · 20015 · 409

工作区内已有另一个账号绑定相同的渠道身份。

处理与重试: 保留 request_id 与结构化错误码,先排查当前操作,再决定下一步。

示意 JSON;message 随实际原因变化 · 409 · 20015
{
  "request_id": "req_example",
  "error": {
    "code": "duplicate_provider_account",
    "numeric_code": "20015",
    "message": "A provider account with the same identity already exists in this workspace"
  }
}
egress_configuration_pending · 20032 · 409

当前无法确认或读取平台默认网络配置;这不表示账号已退出登录。

触发条件: 本操作使用平台分配的网络容量或账号固定的默认网络配置。

处理与重试: 保留 request_id,再次写入前核对账号或创建结果。等待容量或配置恢复,或联系支持;不要自动反复创建账号、更换网络或重启账号。

示意 JSON;message 随实际原因变化 · 409 · 20032
{
  "request_id": "req_example",
  "error": {
    "code": "egress_configuration_pending",
    "numeric_code": "20032",
    "message": "Account network configuration is pending verification"
  }
}
provider_account_mismatch · 20017 · 409

请求中的渠道身份与账号绑定不一致。

处理与重试: 保留 request_id 与结构化错误码,先排查当前操作,再决定下一步。

示意 JSON;message 随实际原因变化 · 409 · 20017
{
  "request_id": "req_example",
  "error": {
    "code": "provider_account_mismatch",
    "numeric_code": "20017",
    "message": "Authenticated provider account does not match the bound account; re-scan with the original account"
  }
}
provider_not_ready · 30009 · 409

连接尚未就绪,请检查授权及 runtime_status 后再决定是否重试。

处理与重试: 查询授权与运行态,再按目标状态和渠道支持选择刷新、启动或重连。连接问题本身不证明已登出;依赖连接的业务操作前确认 running。

示意 JSON;message 随实际原因变化 · 409 · 30009
{
  "request_id": "req_example",
  "error": {
    "code": "provider_not_ready",
    "numeric_code": "30009",
    "message": "Provider client is not ready"
  }
}
wallet_account_creation_in_progress · 20030 · 409

同一工作区已有余额账号正在创建,或目标账号尚未完成初始化。

处理与重试: 建号竞争时按 Retry-After 等待,若原请求提供了 Idempotency-Key,重试时沿用原键。授权请求遇到此错误时,使用创建响应的 billing.operation_id 查询 GET /v1/account-operations/{operation_id},等待 data.state=SUCCEEDED 后在原账号上重试原操作。billing.state=ACTIVE 不代表初始化完成;不要重新建号。

示意 JSON;message 随实际原因变化 · 409 · 20030
{
  "request_id": "req_example",
  "error": {
    "code": "wallet_account_creation_in_progress",
    "numeric_code": "20030",
    "message": "Account creation is in progress; please wait"
  }
}
run_auth_action_failed · 20010 · 500

执行授权动作:授权动作失败,需检查已有流程,不代表必须重新授权。

处理与重试: 查询当前授权流程,检查是否需要用户操作。不要仅因本次失败重新发起授权,也不要向已过期或已结束的会话重复提交。

示意 JSON;message 随实际原因变化 · 500 · 20010
{
  "request_id": "req_example",
  "error": {
    "code": "run_auth_action_failed",
    "numeric_code": "20010",
    "message": "Failed to run auth action"
  }
}
run_auth_action_failed · 20020 · 500

核对 account_id,并使用账号所属工作区的 X-Api-Key。此工作区下未找到的账号不能用当前 Key 访问。

触发条件: 适用于账号不存在的情况;保留原 HTTP 状态和操作 code,通过 numeric_code 细分账号缺失。

处理与重试: 核对目标标识、资源归属与当前工作区。不要把已确认缺失或无法访问的目标当作临时服务故障自动重试。

示意 JSON;message 随实际原因变化 · 500 · 20020
{
  "request_id": "req_example",
  "error": {
    "code": "run_auth_action_failed",
    "numeric_code": "20020",
    "message": "Account not found"
  }
}
provider_adapter_not_found · 30004 · 502

渠道服务暂不可用,请检查状态或稍后再试;重试写操作前先确认上次结果。

处理与重试: 查询当前授权流程,检查是否需要用户操作。不要仅因本次失败重新发起授权,也不要向已过期或已结束的会话重复提交。

示意 JSON;message 随实际原因变化 · 502 · 30004
{
  "request_id": "req_example",
  "error": {
    "code": "provider_adapter_not_found",
    "numeric_code": "30004",
    "message": "Provider adapter unavailable"
  }
}
provider_unavailable · 30002 · 502

渠道服务暂不可用,请检查状态或稍后再试;重试写操作前先确认上次结果。

处理与重试: 查询当前授权流程,检查是否需要用户操作。不要仅因本次失败重新发起授权,也不要向已过期或已结束的会话重复提交。

示例 · 502 · 30002
{
  "request_id": "req_example_provider_unavailable",
  "error": {
    "code": "provider_unavailable",
    "numeric_code": "30002",
    "message": "Provider service unavailable"
  }
}
provider_unavailable · 30020 · 502

whatsapp-protocol 同步请求以 numeric_code=30020 标识账号登录受限,可影响会话导入、运行态、发送与联系人查询,并保留当前操作的 HTTP 状态与 code。不要将 WhatsApp 的 20102 回调契约套用到此渠道。

处理与重试: 停止自动发送与重试,引导用户前往官方 WhatsApp 客户端检查并处理限制。问题解决并完成必要的重新授权后再恢复;此前为 running 不证明限制已解除。

适用渠道: WhatsApp Protocol

示例 · 502 · 30020
{
  "request_id": "req_example_account_restricted",
  "error": {
    "code": "provider_unavailable",
    "numeric_code": "30020",
    "message": "Account login is restricted. Check the official WhatsApp app for details."
  }
}