跳过主要内容

REST API + MCP

API 与 MCP 文档

REST 负责上传和 HTTPS 地址;MCP 让 AI 客户端用同一个 API key 调用压缩任务。

激活免费 API 并创建密钥

免费 API 是独立于浏览器工具的云端功能。使用 Google 登录并确认账户是 Google 已验证的 @gmail.com 后,再通过 Turnstile,即可在每个 UTC 自然月获得 500 credits,不绑卡。免费云端压缩每月有 20 美元计算预算。

激活后在账户设置页创建 API key。该账户下所有 key 共用同一 credit 池、限速和未完成任务上限。免费计算预算用尽后,新免费任务会暂停到页面显示的恢复时间;付费 Developer 任务和浏览器本地压缩继续独立工作。

获取免费 API 密钥

创建上传任务

发送 multipart 请求,包含 GIF 文件和 JSON 字符串 options。目标模式使用十进制字节 targetBytes;不要把 mode 或 targetBytes 拆成单独表单字段。

每个创建请求都必须带账户范围内的 Idempotency-Key。同一个 key 搭配同一个文件和选项会返回原任务,不会再次预占 credits。

curl -X POST https://compressgif.net/api/v1/compressions \
  -H "Authorization: Bearer cg_live_xxx" \
  -H "Idempotency-Key: demo-upload-001" \
  -F "file=@animation.gif" \
  -F 'options={"mode":"target","targetBytes":1000000}'

轮询任务并下载结果

创建响应的顶层 id 就是任务 ID,并不嵌套在 job 属性内。把它保存为 JOB_ID,用于状态查询地址。创建响应本身不提供下载链接,即使幂等重放的是已完成任务,也需要查询状态。将示例中的 YOUR_JOB_ID 替换为该 ID;任务成功后,把 result.downloadUrl 填入 DOWNLOAD_URL,再执行下载命令。

status 为 queued 或 processing 时,result 为 null;为 succeeded 时,读取 result.downloadUrl 和 result.expiresInSeconds。遇到 failed 或 canceled,请停止轮询,检查 error.code 和 error.message,不要继续尝试下载。

建议每隔几秒查询一次,并遵守账户的查询限速。文件仍可访问时,重新查询状态可以获得新的下载链接。链接最长有效 15 分钟,但不会延长文件的 24 小时访问期限。轮询、下载和完全相同请求的幂等重放都不消耗 credits。

JOB_ID='YOUR_JOB_ID'
curl "https://compressgif.net/api/v1/compressions/$JOB_ID" \
  -H "Authorization: Bearer cg_live_xxx"

DOWNLOAD_URL='PASTE_result.downloadUrl_HERE'
curl --fail --location "$DOWNLOAD_URL" -o compressed.gif

提交 HTTPS 地址

JSON 创建请求使用 sourceUrl 和 options。服务端只抓取 HTTPS,逐跳验证重定向,阻止私网地址,并执行同样的文件大小限制。

如果某个网站阻止浏览器 CORS,本地 URL 导入可能失败。REST URL 导入仍属于云端任务,会使用你的 API key、credits、限速和保留规则。

curl -X POST https://compressgif.net/api/v1/compressions \
  -H "Authorization: Bearer cg_live_xxx" \
  -H "Idempotency-Key: demo-url-001" \
  -H "Content-Type: application/json" \
  -d '{"sourceUrl":"https://example.com/animation.gif","options":{"mode":"quality"}}'

读取用量和重置窗口

GET /api/v1/usage 返回 { usage }。usage 包含当前额度池、额度上限、已用、预占、剩余、resetAt、windowStart 和 windowEnd。

免费 API 按 UTC 自然月重置。Developer 按订阅锚点逐月重置,年付也按月发放,未用 credits 不结转。 免费 API 每分钟可创建 10 个任务,Developer 为 60 个;查询接口每个账户每分钟最多 120 次。免费账户最多同时有 2 个未完成任务,Developer 为 20 个。免费队列最多积压 100 个任务,等待超过 10 分钟会终止并释放预占额度。

curl https://compressgif.net/api/v1/usage \
  -H "Authorization: Bearer cg_live_xxx"

MCP 配置

MCP 接口是 /api/mcp 上的 Streamable HTTP,提供 compress_gif、get_compression 和 get_usage,并使用同一个 REST API key。

MCP 接受远程 HTTPS GIF 地址。本地文件请通过 REST 上传;不要向 MCP 传服务器本地路径或大型 Base64。

调用 compress_gif 时,传入 sourceUrl、可选的 options 对象和必填的 idempotencyKey;随后把返回的 id 传给 get_compression。适配层将 REST 响应放在 structuredContent.data 中;工具调用成功不代表压缩任务已经完成。调用 get_usage 时传入空对象,即可查询余额。

{
  "mcpServers": {
    "compressgif": {
      "url": "https://compressgif.net/api/mcp",
      "headers": { "Authorization": "Bearer cg_live_xxx" }
    }
  }
}

Credits、目标模式与扣费

不超过 5MB 的输入,质量/体积模式扣 1 credit,目标模式扣 2 credits。超过 5MB 且不超过 20MB 的输入扣 2 credits,目标模式扣 4 credits。 每次处理最多 60 秒,包含最多 8 次候选编码。

验证失败、系统失败和超时不扣用户 credits。返回有效结果但未达目标时,因为计算已完成,仍按已披露报价结算,并标记 targetMet: false。

任务中的 credits 和 cost.credits 表示报价,不代表已经实际扣点。接受任务时预占 credits,成功后结算,失败则释放。当前已用、预占和剩余额度请查询 /api/v1/usage。

错误、幂等与限速

401(API_KEY_REQUIRED、API_KEY_INVALID)表示密钥缺失或无效。402(INSUFFICIENT_CREDITS)表示额度耗尽;403(FREE_API_NOT_ACTIVE)表示尚未激活免费 API。409(IDEMPOTENCY_CONFLICT)表示同一 Idempotency-Key 被不同输入复用。

413(INPUT_TOO_LARGE)表示输入超过文件限制;422(INVALID_GIF)表示 GIF 或参数无效。429(RATE_LIMITED、TOO_MANY_OUTSTANDING_TASKS)表示触发请求或未完成任务上限。503(FREE_COMPUTE_BUDGET_EXHAUSTED)表示免费计算预算已用尽,下一 UTC 自然月恢复;付费 API 与浏览器工具继续工作。其他 503 表示服务暂不可用。如返回 Retry-After,请遵守。

隐私与保留

浏览器本地压缩和云端 API 任务的数据处理方式不同。需要 GIF 留在设备上时,请使用浏览器工具;需要远程自动化处理时,再使用 REST 或 MCP。

浏览器工具不会上传你的 GIF。通过地址导入时,浏览器会直接访问图片所在网站。API 和 MCP 会上传文件,或由服务抓取公开 HTTPS 地址。应用、数据库和文件存储由 Cloudflare 托管。API 原始文件和结果文件在 24 小时后无法访问,下载链接最长有效 15 分钟。过期文件由后台清理,实际删除可能晚于访问失效时间。 为了解可靠性和使用情况,我们在 Cloudflare 服务日志中记录压缩成功或失败、输入输出大小、目标达成状态、下载等技术事件。这些事件不包含文件名、来源地址或文件内容。Cloudflare 还会处理提供服务和安全防护所需的请求数据。产品事件日志最多保留 7 天。

鉴权与密钥保管

创建任务、查询状态和用量时,发送 Authorization: Bearer YOUR_API_KEY,也可以使用 x-api-key 请求头。账户登录 Cookie 不能替代 API key;同一账户的所有密钥共用额度和限制。

把密钥放在服务端环境变量或 AI 客户端的安全配置中,不要写进公开网页、代码仓库或图片地址。密钥泄露后,请在 API 密钥设置中撤销并重新创建。免费浏览器工具不需要 API key。

压缩参数与输入限制

mode 支持 quality、size 或 target,默认是 quality。target 模式必须传正整数 targetBytes,单位是十进制字节:100KB 为 100000,1MB 为 1000000。使用 multipart 上传时,这些参数都放在 JSON 字符串 options 内。

可选参数 colors 支持 auto、64、128 或 256;lossyLevel 是 0 到 200 的整数;width 是 1 到 4096 的整数,用于主动调整尺寸,不传则保留原尺寸。目前不支持丢帧或格式转换参数。

每个请求处理一个 GIF。免费 API 输入最多 5MB,Developer 最多 20MB;两者还要求每条边不超过 4096 像素、最多 1,000 帧,且宽 × 高 × 帧数不超过 50,000,000。即使动画很短,尺寸过大也可能先触及这些限制。

重试时避免重复处理

每个新的文件与参数组合使用新的 Idempotency-Key;网络响应不确定、需要重试时,继续使用原 key。key 长度为 1–128 个非空格、可打印 ASCII 字符。完全相同的请求会返回原任务;同一个 key 换了输入或参数,会返回 409 IDEMPOTENCY_CONFLICT。

遇到 429 或临时 503 时,遵守返回的 Retry-After,并逐步延长重试间隔。402 表示 credits 不足,需要等待额度重置或更改套餐,重复请求不能解决。503 FREE_COMPUTE_BUDGET_EXHAUSTED 表示新免费任务暂停至页面显示的恢复时间,付费任务和本地工具仍独立运行。

对失败任务重放同一个 key,仍会返回原失败任务。请先检查原因,确实需要重新处理时再换一个 key。不要每次超时都创建新 key,因为第一次请求可能已经被接受。

开源源码包

下载独立浏览器压缩器源码包和 MCP 适配层源码包。这些归档只包含公开集成代码,不包含账号、计费或私有模板代码。

接口

OpenAPI JSON
接口用途
POST /api/v1/compressions通过上传 GIF 或提交公开 HTTPS GIF 地址创建压缩任务。返回 202 和任务 ID;完全相同的幂等重放返回已有任务。
GET /api/v1/compressions/{id}读取队列状态、credits 费用、输出字节数、targetMet、实际参数,以及就绪后的 result.downloadUrl。
GET /api/v1/usage读取 { usage } 包装对象,包含当前额度池、上限、已用、预占、剩余、resetAt、windowStart 和 windowEnd。
POST /api/mcpStreamable HTTP MCP 接口,提供 compress_gif、get_compression 和 get_usage,并复用 REST 的 API key、credits 与限速。
GET /openapi.json供生成客户端、测试和 AI 工具使用的机器可读 REST 契约。