Skip to content

短链服务 ​

为 tio.fyi 短链系统提供 JSON 接口:创建、查看、编辑、删除短链,并支持密钥管理。

接口信息 ​

项目说明
接口地址https://tio.fyi/api.php
请求方法POST(推荐,携带 JSON body)或 GET(只读操作)
返回格式JSON(UTF-8)
鉴权方式Authorization: Bearer <API密钥>,见下方「鉴权」
调用对象本人名下短链;创建与编辑仅限链接(url)类型,文本/Markdown 只能网页端维护

鉴权 ​

每个用户拥有唯一 API 密钥,一把密钥对应一个用户,仅可操作该用户名下的短链。

密钥为 64 位十六进制串(32 字节随机生成),首次访问短链管理页时自动生成。

四种携带方式(任选其一):

方式说明
Authorization: Bearer <密钥>首选
X-API-Key: <密钥>部分 Nginx 配置会丢弃 Authorization 头时使用
?api_key=<密钥>无法设置请求头的环境(如纯 GET 链接)
JSON body 中的 api_key 字段只想用一个 body 携带全部参数时

会话登录态优先:浏览器带着登录 Cookie 请求接口时,按登录用户处理,不读密钥。

**获取密钥:**登录 短链管理 → 左侧「API 密钥」卡片 → 复制密钥。 重置密钥:同一卡片的「重置密钥」按钮(红色)。重置后旧密钥立即失效,需重新同步配置。

密钥安全

密钥等同于你的账号凭据,请勿提交到公开仓库或写在前端代码中。

一句话速用

唯一必填参数是 url(长链),其余全部可省略——省略 code 自动生成、省略 wechat_allowed 视为允许微信、省略 expire_days 视为永不过期、省略 max_clicks 视为无次数上限。

调用参数 ​

create — 创建短链 ​

参数类型必填默认值说明
actionstring是—固定 create
urlstring是—长链(目标地址)。含中文或敏感关键词时建议改用 url_b64
url_b64string否—url 的 UTF-8 base64,与 url 二选一,优先使用
codestring否自动生成 6 位短链代码,a-zA-Z0-9,长度 1–32
wechat_allowedint否11 允许微信内打开,0 禁止
expire_daysint否0有效天数:0 永不过期
max_clicksint否不限访问次数上限,0 或空视为不限
overwriteint否API: 1 / 网页: 0短链已存在且属于同一用户时是否覆盖
typestring否url仅支持 url,传 text/markdown 会报错

目标链接校验规则 ​

url / url_b64 解码后的内容需同时满足以下条件,否则返回 请输入有效的链接地址:

  • 长度 ≤ 4096 字节(strlen 按字节计),且不含换行符
  • 带协议头,形如 scheme://...:http/https 之外也允许 clash://、tg://、bilibili://、weixin:// 等自定义应用协议
  • 禁止 javascript:、vbscript:、data: 等危险伪协议
  • 不能指向 tio.fyi 自身(防止短链指向短链造成自环)
  • 中文与复杂查询参数可正常传入;命中 WAF 误拦截时改用 url_b64

update — 编辑短链 ​

参数类型必填默认值说明
actionstring是—固定 update
idint是—短链 ID
codestring是—短链代码
urlstring是—目标地址(同 url_b64 规则)
wechat_allowedint否不改动省略则不改动
expire_daysint否保持原值省略 = 保持原过期时间;0 = 清除过期
max_clicksint否保持原上限省略 = 保持原上限;空/0 = 取消上限

编辑限制

接口不支持修改 type(与网页端一致),如需改为文本/Markdown 请重新创建。

其他操作 ​

action方法必填参数说明
listGETsearch、page(可选)分页 20 条/页,仅返回本人短链;按 code 或 url 模糊匹配,网页端创建的文本/Markdown 短链也会一并返回
deletePOSTid删除短链,成功返回 {"success":true,"message":"删除成功"}
update_wechatPOSTid、wechat_allowed单独切换微信可开状态,返回 {"success":true,"wechat_allowed":0|1}
reset_api_keyPOST—重置密钥并返回新密钥 {"success":true,"api_key":"..."};仅网页登录态可用,防止密钥被盗后远程轮换锁死账号

有效期与次数上限的生效表现

过期或访问次数达上限的短链,访问时返回 HTTP 410「链接已过期」,不再跳转。

覆盖规则 ​

短链代码全站唯一,创建时按归属与 overwrite 决定行为:

短链归属overwrite结果
不存在—正常创建,code 自动生成或使用传入值
他人(或无归属)任意❌ 该短链代码已被其他用户占用
本人1✅ 删旧插新:删除原记录并重新插入,id 变更、点击数与创建时间重置,返回 overwritten: true
本人0返回 needs_overwrite: true,由调用方确认后带 overwrite: 1 重发

网页与接口的差别

网页端默认 overwrite=0(弹窗让你确认后再覆盖),接口默认 overwrite=1(直接覆盖,不打断自动化流程)。显式传递 overwrite 时以传入值为准。

调用示例 ​

创建短链(不指定代码) ​

请求:

bash
curl -X POST 'https://tio.fyi/api.php?action=create' \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer 你的API密钥' \
  -d '{"url":"https://example.com/hello"}'

返回示例:

json
{
  "success": true,
  "id": 12,
  "code": "Kzufb6",
  "url": "https://example.com/hello",
  "type": "url",
  "wechat_allowed": 1,
  "expires_at": null,
  "max_clicks": null,
  "overwritten": false,
  "short_url": "https://tio.fyi/Kzufb6"
}

指定短链代码 + 完整参数 ​

请求:

bash
curl -X POST 'https://tio.fyi/api.php?action=create' \
  -H 'Content-Type: application/json' \
  -H 'X-API-Key: 你的API密钥' \
  -d '{
    "url": "https://example.com/sale",
    "code": "sale2026",
    "wechat_allowed": 0,
    "expire_days": 7,
    "max_clicks": 100
  }'

使用 url_b64 避免误拦截 ​

请求:

python
import base64, json, urllib.request

key = "你的API密钥"
body = {
    "url_b64": base64.b64encode("https://example.com/中文路径?x=1&y=2".encode()).decode(),
    "code": "cnlink",
}
req = urllib.request.Request(
    "https://tio.fyi/api.php?action=create",
    data=json.dumps(body).encode(),
    headers={"Content-Type": "application/json", "Authorization": f"Bearer {key}"},
)
print(json.load(urllib.request.urlopen(req)))

覆盖已存在的同名短链 ​

请求:

bash
# 第一次:code 已存在且属于你,返回 needs_overwrite
curl -X POST 'https://tio.fyi/api.php?action=create' \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer 你的API密钥' \
  -d '{"url":"https://example.com/v2","code":"sale2026"}'

# 返回
# {"success":false,"needs_overwrite":true,"message":"该短链代码已存在,是否覆盖原内容?"}

# 第二次:带 overwrite=1 确认覆盖
curl -X POST 'https://tio.fyi/api.php?action=create' \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer 你的API密钥' \
  -d '{"url":"https://example.com/v2","code":"sale2026","overwrite":1}'

查询短链列表 ​

请求:

bash
curl 'https://tio.fyi/api.php?action=list&search=sale&page=1' \
  -H 'Authorization: Bearer 你的API密钥'

返回示例:

json
{
  "success": true,
  "data": [
    {
      "id": 13,
      "code": "sale2026",
      "url": "https://example.com/v2",
      "type": "url",
      "clicks": 4,
      "wechat_allowed": 1,
      "expires_at": "2026-10-10 00:00:00",
      "max_clicks": 100
    }
  ],
  "total": 1,
  "page": 1,
  "pages": 1
}

编辑短链 ​

请求:

bash
# 传 expire_days=0 清除过期;不传 expire_days 则保持原值
curl -X POST 'https://tio.fyi/api.php?action=update' \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer 你的API密钥' \
  -d '{"id":13,"code":"sale2026","url":"https://example.com/v3","expire_days":0,"max_clicks":""}'

返回示例:

json
{
  "success": true,
  "id": 13,
  "code": "sale2026",
  "url": "https://example.com/v3",
  "short_url": "https://tio.fyi/sale2026"
}

删除短链 / 切换微信 ​

请求:

bash
curl -X POST 'https://tio.fyi/api.php?action=delete' \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer 你的API密钥' \
  -d '{"id":13}'

curl -X POST 'https://tio.fyi/api.php?action=update_wechat' \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer 你的API密钥' \
  -d '{"id":13,"wechat_allowed":0}'

错误处理 ​

所有响应均含 success 字段,失败时附 message;覆盖确认场景额外返回 needs_overwrite。业务错误统一返回 HTTP 200 + "success": false,以响应体中的 success 判断成败。

HTTP 状态码message说明
200未授权:请先登录,或提供有效的 API 密钥密钥缺失、错误或过期
200API 仅支持链接类型,文本与 Markdown 请在网页端创建通过接口创建非链接类型
200API 仅支持链接类型,请在网页端编辑该内容通过接口编辑文本/Markdown 短链
200请输入内容url / url_b64 为空
200请输入有效的链接地址目标地址不符合链接格式
200短链代码只能包含字母和数字,长度 1-32 位code 格式非法
200该短链代码已被其他用户占用短链代码属于他人
200该短链代码已存在,是否覆盖原内容?返回 needs_overwrite:true,需确认后重发
200该短链代码已被占用编辑时改为已被占用的代码
200短链不存在 / 无效的IDid 无权或不存在
200该操作需在登录后的网页中执行用密钥调用 reset_api_key
200无效的操作请求action 不受支持
200服务器错误,请稍后再试数据库异常
403—命中站点防火墙(WAF),返回 HTML 拦截页;改用 url_b64 或调整目标地址重试
410—短链已过期或访问次数达上限,不再跳转

问题反馈

遇到问题请前往 GitHub Issues 提问

Released under the MPL-2.0 License.