订阅 CRUD
订阅 API 使用 camelCase 字段。服务端管理字段会在响应中返回,但不能出现在写请求里。操作语义
AI 集成在更新或删除前,应该先查询并确认目标订阅;除非用户已经提供了准确的订阅 UUID。写操作需要带
write 权限的 API Key;只读 Key 会收到 403 insufficient_scope。
分页
GET /api/v1/subscriptions 按创建时间倒序返回,支持两个可选查询参数:
响应中包含
pagination 对象。当 hasMore 为 true 时,用 offset + limit 获取下一页。
400 invalid_pagination。
过滤与排序
GET /api/v1/subscriptions 在分页之外,还支持以下可选过滤器和排序:
将
status=active 与 expiringBefore 组合即可回答「哪些即将续费」。非法取值返回 400 invalid_query,并带 field 与 suggestedFix。
订阅对象
可写字段
idcreatedAtupdatedAt
POST 或 PATCH 请求里发送服务端管理字段。
字段规则
nextPaymentDate 是权威的订阅计划日期。月付订阅通过 billingAnchorDay 保留原始日历日期,短月份只会临时落到月末,例如:1 月 31 日 → 2 月 28/29 日 → 3 月 31 日。如果服务是固定每 30 天扣费,而不是每月固定日期,请使用 period: "custom" 和 customDate: "30"。响应中的 lastPaymentDate 只是反推得到的兼容字段,新集成不应再依赖它。
生命周期:取消、暂停、恢复 vs 删除
订阅有一个status:active(计费中)、paused(暂停)、cancelled(已取消、停止计费但保留历史)。修改状态是软操作——记录及其审计历史都会保留,可随时恢复为 active。而 DELETE 是永久删除,会一并移除该记录的审计历史。
当用户表示不再使用某服务但将来可能回来时,优先改状态而不是删除:
active 订阅计入活跃支出。只有当用户希望永久删除记录时才用 DELETE。
自然语言示例
新增订阅
用户意图:修改计费周期
用户意图:- 调用
GET /api/v1/subscriptions找到 Netflix 记录。 - 向用户确认具体记录和修改内容。
- 调用
PATCH /api/v1/subscriptions/{id}。
删除重复记录
用户意图:- 调用
GET /api/v1/subscriptions找到重复候选。 - 向用户确认订阅名称和 id。
- 调用
DELETE /api/v1/subscriptions/{id}。
自定义计费周期
如果不是月付或年付,把period 设为 custom,并把 customDate 设为表示天数的正整数字符串。
customDate 设为 "30";不要选择 monthly。
从 custom 改回 monthly 或 yearly 时,省略 customDate。服务端会清理旧的自定义计费数据。