跳到主要内容

Sink REST API

每个 Sink 实例都会发布自己的 OpenAPI 文档:

  • https://your-domain/_docs/openapi.json — 机器可读的 OpenAPI JSON
  • https://your-domain/_docs/scalar — Scalar 交互式参考
  • https://your-domain/_docs/swagger — Swagger UI

公开演示明确位于 https://sink.cool/_docs/scalar。该 Schema 描述演示实例;自托管实例请换成自己的域名。

身份认证

API 端点要求在 Authorization Header 中携带站点令牌:

http
Authorization: Bearer YOUR_SITE_TOKEN

其值是 NUXT_SITE_TOKEN。配置 Cloudflare Access 后,已登录仪表盘的浏览器请求也可以使用 Cloudflare 提供的已签名 Access 应用令牌。Sink 会校验签名、签发者、受众和有效期。

端点

链接

方法端点说明
POST/api/link/create创建短链接。
PUT/api/link/edit更新现有链接。
POST/api/link/upsertSlug 已存在时返回原链接,否则创建新链接。
POST/api/link/delete删除链接。
GET/api/link/query按 Slug 获取一个链接。
GET/api/link/search搜索链接。
GET/api/link/list使用游标分页列出链接。
GET/api/link/export以 JSON 导出一页链接;持续传递 cursor,直到 list_complete 为 true。
POST/api/link/import导入已校验批次;已有活动 Slug 会跳过。
POST/api/link/check检查最多 10 个已存链接的目标可用性,超时范围为 1–30 秒。
GET/api/link/ai生成 AI Slug 建议。
GET/api/link/og-ai生成 AI OpenGraph 元数据。

分析与日志

方法端点说明
GET/api/stats/counters获取分析计数器。
GET/api/stats/metrics按维度获取详细指标。
GET/api/stats/views获取时序访问量。
GET/api/stats/heatmap获取热力图数据。
GET/api/stats/export将访问分析导出为 CSV;这是动态 stats action 路由实际公开的 URL。
GET/api/logs/events获取近期事件日志。
GET/api/logs/locations获取近期访问位置。

迁移与工具

方法端点说明
GET/api/link/migration/status检查 KV 到 D1 的迁移标记并返回标记内容。
POST/api/link/migration/run将一页受限数据(最多 40 条 KV 记录)复制到 D1;携带响应中的不透明游标继续,直到 completed 为 true。
GET/api/verify验证凭据,并报告 site-tokencloudflare-access
GET/api/location返回 Cloudflare 请求元数据中的纬度和经度。
POST/api/upload/image将 OpenGraph 图片上传到 R2。
POST/api/backup手动触发 KV 兼容性备份到 R2。

D1 是权威存储。KV 是写穿式读取缓存,并在写入迁移标记前临时提供旧链接。迁移不会覆盖已有 D1 行;force=true 只会重新扫描 KV,不会改变这条规则。如果某一页出现失败,该次迁移运行会被丢弃;解决问题后需开始新的运行。

创建短链接

http
POST /api/link/create
Authorization: Bearer SinkCool
Content-Type: application/json

{
  "url": "https://github.com/miantiao-me/Sink",
  "slug": "sink",
  "comment": "GitHub repository",
  "expiration": 1767225599,
  "apple": "https://apps.apple.com/app/id6745417598",
  "google": "https://play.google.com/store/apps/details?id=com.example",
  "geo": { "US": "https://example.com/us" },
  "title": "Sink - Link Shortener",
  "description": "A simple, speedy, secure link shortener",
  "image": "/_assets/images/sink/cover.webp",
  "password": "correct-horse-battery-staple",
  "unsafe": false,
  "redirectWithQuery": true
}
字段类型必填说明
urlstring目标 URL,最多 2048 个字符。
slugstring自定义 Slug;省略时自动生成。
commentstring内部备注。
expirationnumber未来的 Unix 秒级时间戳。
apple / googlestring特定设备的目标 URL。
geoobject国家/地区代码到 URL 的路由映射。
title / description / imagestringOpenGraph 元数据。
cloakingboolean在 iframe 中加载目标并保留短网址。
redirectWithQueryboolean单链接查询参数转发覆盖值。
passwordstring密码保护;以哈希形式存储。
unsafeboolean要求显示不安全链接确认页。

地域路由使用 Cloudflare 的两字母国家/地区代码。设备路由优先于默认或地域目标。程序客户端访问受密码保护链接时可传 x-link-password,确认不安全目标后可传 x-link-confirm: true

导出访问分析

http
GET /api/stats/export?startAt=1717200000&endAt=1719791999&slug=sink
Authorization: Bearer SinkCool

响应为 text/csv,包含 slugurlviewerviewsreferer 列。可以传入分析视图使用的时间、Slug、国家/地区、浏览器和设备等查询参数。

导入与导出行为

链接导出分页大小为 NUXT_PUBLIC_KV_BATCH_LIMIT(默认 50);每次导入接受其一半(默认 25)。该限制用于兼容性与控制请求成本,并不表示每条链接固定执行两次 KV 操作。链接创建和重复检测是 D1 权威操作,随后进行尽力而为的 KV 写穿缓存更新。已过期的导入会被拒绝,重复项会跳过。导出会保留 Sink 可迁移存储格式中的密码哈希,以便原样导入;仪表盘显示的遮盖值不能作为明文密码导入。

CORS

构建时设置 NUXT_API_CORS=true,即可为 /api/** 启用 CORS。