TapCub 正式上线:统计、分析、客服一个平台免费用
帮助中心

怎么用 HTTP API 发送事件?

不用 SDK,直接向 /api/v1/track 发送业务事件和档案更新:鉴权、调试模式下的头一个请求、字段和事件类型、响应,以及错误、限制和重试。

快速开始3 分钟阅读最后更新 2026 年 11 月 6 日TapCub 团队

简短回答

向 https://api.pathclue.com/api/v1/track 发 POST,在 Authorization: Bearer 请求头里放一个带「服务端 Track」权限的密钥,请求体是 {"events": [ … ]},一次 1 到 1,000 个事件。接入期间加上 ?debug=1:服务端会校验每个事件并逐条返回结果,但不入库。

没有你所用语言的服务端 SDK,或者要从网关、任务调度器发送时,用 HTTP API。如果你的技术栈有 SDK(Node.js、Python、PHP、Java、Go),优先用 SDK:它已经处理了批量、重试和刷新。见从服务端发送事件。

开始之前

  • 创建一个带「服务端 Track」(track:write)权限的项目 API 密钥:创建和管理 API 密钥。
  • 密钥只放在服务端,比如环境变量 TAPCUB_API_KEY。
  • 页面浏览继续交给网站脚本。HTTP API 用来发业务事件(订单、付款、注册)和用户档案更新,不用来发浏览。

发送头一个事件

curl -X POST "https://api.pathclue.com/api/v1/track?debug=1" \
  -H "Authorization: Bearer $TAPCUB_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "events": [{
      "type": "track",
      "event": "purchase",
      "login_id": "u_1001",
      "insert_id": "ord_1001",
      "time": 1759363200123,
      "properties": { "revenue": 19.9, "currency": "USD" },
      "context": { "platform": "server" }
    }]
  }'

调试模式的响应带 debug: true,results 里每个事件一条,附带警告。没有问题后去掉 ?debug=1 再发一次。事件会出现在 全端分析 › 数据 › 事件与属性。

事件字段

字段说明
type默认 track,见下表
event事件名,1 到 100 个字符。track 必填
login_id / device_id谁做的。已登录用户用 login_id;匿名用户用 device_id(最长 72 个字符)
timeUnix 毫秒。和服务器时间相差超过 72 小时会被改成当前时间,并返回警告
insert_id最长 36 个字符。幂等键:同一个 ID 只保留头一条。用订单号或支付号
session_id最长 32 个字符。不带时事件照常入库,但不计入会话指标
properties事件或档案属性
grouptype:id,比如 company:acme,把事件挂到某个账户上
contextip、user_agent、url、platform、country、lang,以及用于注册归因的 campaign

事件类型

type用途
track记录一个业务事件(默认)
track_signup记录注册,并把匿名设备关联到新的 login_id
bind / unbind添加或移除邮箱、手机号等身份(放在 identities 里)
profile_set、profile_set_once、profile_unset、profile_increment、profile_append更新用户档案属性
item_set / item_delete写入商品、文章等维度数据,带 item_type 和 item_id
track_update / track_overwrite合并或替换已存事件的属性,必须带 insert_id
group_set设置账户(group)的属性

例子:一个请求里同时更新档案、绑定邮箱。

{ "events": [
  { "type": "profile_set", "login_id": "u_1001", "properties": { "plan": "pro", "$name": "Ada" } },
  { "type": "bind", "login_id": "u_1001", "identities": { "email": "ada@example.com" } }
] }

邮箱或手机号如果不是 64 位十六进制的哈希值,服务端会先哈希再存储,这一条会返回警告 plaintext_identity_hashed。想完全不发送明文,就自己先做 SHA-256。

读懂响应

成功的调用返回 received、accepted、rejected、events(进入缓冲的行数)和 results。非调试模式下,results 只列出失败或有警告的条目:index 是它在 events 里的位置,ok: false 表示这一条没有入库。同一请求里的其他条目照常接收。

在地址参数里加 validation_behavior=enforce,任何产生警告的条目都会被拒绝,比如用来确保明文邮箱永远不会被接收。

错误、限制和重试

响应含义怎么办
400 VALIDATION请求体不符合格式看 issues;整个请求被拒绝
401 NO_API_KEY / BAD_API_KEY密钥缺失、错误、已吊销或已过期检查请求头和密钥
403密钥没有「服务端 Track」权限换一个带 track:write 的密钥
413 PAYLOAD_TOO_LARGE请求体超过 2 MB拆成更小的批次
429 RATE_LIMIT这个密钥每分钟超过 600 次请求等 retryAfter 秒,再退避重试
5xx服务端错误指数退避重试

重试规则:每次重试都保持同一个 insert_id,避免重复计数;指数退避,限制重试次数;尽量批量发送(每次最多 1,000 个事件),不要一个事件发一次请求。

相关

这篇回答解决你的问题了吗?

我们会根据反馈修改和补充这篇内容。

看清数据,找到增长。

每一次点击,都有数据依据。装好一行代码,1 分钟看到第一批数据。

无需信用卡 · 统计与客服都有免费版 · 统计无 Cookie