sugimoe

给开发者的仓仓

HTTP API 和网页用的是同一套规则:不登录也能直接用,单个文件最大 200 MB,只收图片和短视频(PNG、JPEG、WebP、GIF、AVIF、MP4、WebM,按内容识别格式)。

上传

# 永久保存,返回直链
$ curl -F "file=@cat.png" https://sugi.moe/api/upload
https://files.sugi.moe/k3x9qa2m.png
# 临时保存:1h / 12h / 72h
$ curl -F "file=@cat.png" -F "expire=1h" https://sugi.moe/api/upload
# 从链接搬运
$ curl -F "url=https://example.com/a.png" https://sugi.moe/api/upload
# 直接 PUT 文件内容
$ curl -T cat.png "https://sugi.moe/api/upload?expire=12h"

想要 JSON?

加上 Accept: application/json,会多返回删除凭证和过期时间。

{
"url": "https://files.sugi.moe/k3x9qa2m.png",
"id": "k3x9qa2m",
"page": "https://sugi.moe/f/k3x9qa2m",
"size": 482113,
"type": "image/png",
"name": "cat.png",
"expires_at": null,
"delete_token": "d_7Yq2…"
}

删除

$ curl -X DELETE -H "Sugi-Token: d_7Yq2…" https://sugi.moe/api/files/k3x9qa2m

全部接口

POST /api/upload上传:multipart 字段 file(文件)或 url(链接),可选 expire(1h、12h、72h,不填就是永久)、style(random 或 cute)、name(显示用的文件名)。单个请求最多 90 MB
PUT /api/upload同上,但请求体就是文件本身,选项放在查询参数里(?expire=1h&style=cute&name=a.png)
POST /api/uploads?size=…分片上传(90 MB 以上、最多 200 MB):请求体是第一片(5 到 90 MB),返回 upload 会话、片大小和片数
PUT /api/uploads/:n上传第 n 片,请求头 Sugi-Upload: 会话;返回这一片的 etag
POST /api/uploads/complete结束分片上传,请求头带会话,JSON {"etags": [...]};返回和 /api/upload 一样的结果。DELETE /api/uploads 放弃
PUT /api/upload/<link>上传到 MCP 工具 create_upload 给的一次性链接:请求体就是文件(也可以用 multipart 的 file 字段),10 分钟内有效,只能用一次,返回和 /api/upload 一样的 JSON
GET /api/files/:id读取文件信息(链接、大小、类型、过期时间)
DELETE /api/files/:id删除文件,需要请求头 Sugi-Token: delete_token
POST /api/albums用 files=id1,id2(最多 100 个)和可选 title 打包成一个分享链接,返回链接和删除凭证
GET /api/albums/:id读取打包链接里的文件列表
DELETE /api/albums/:id删除打包链接(不会删除里面的文件),需要 Sugi-Token

限流:每个 IP 每 60 秒最多 10 次上传(一次上传、一次链接搬运、一次分片上传的开始各算一次),打包链接另算,也是 60 秒 10 次;另外防火墙对 /upload、/api/upload 和 /api/uploads 每个 IP 每 10 秒最多 5 次请求,超过会被拦 10 秒。超过限制会返回 429,歇一下再来就好。

旧接口 POST /upload 继续可用:只收 PNG、JPEG、WebP、GIF,最大 20 MB,链接是 https://sugi.moe/<内容哈希>.png 这种形式,相同内容得到同一个链接,没有删除凭证。