跳转到主要内容
POST
/
v2
/
apps
/
{app_id}
/
snapshots
创建 snapshot
curl --request POST \
  --url https://api.squarecloud.app/v2/apps/{app_id}/snapshots \
  --header 'Authorization: <authorization>'
import requests

url = "https://api.squarecloud.app/v2/apps/{app_id}/snapshots"

headers = {"Authorization": "<authorization>"}

response = requests.post(url, headers=headers)

print(response.text)
const options = {method: 'POST', headers: {Authorization: '<authorization>'}};

fetch('https://api.squarecloud.app/v2/apps/{app_id}/snapshots', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));
<?php

$curl = curl_init();

curl_setopt_array($curl, [
CURLOPT_URL => "https://api.squarecloud.app/v2/apps/{app_id}/snapshots",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: <authorization>"
],
]);

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}
package main

import (
"fmt"
"net/http"
"io"
)

func main() {

url := "https://api.squarecloud.app/v2/apps/{app_id}/snapshots"

req, _ := http.NewRequest("POST", url, nil)

req.Header.Add("Authorization", "<authorization>")

res, _ := http.DefaultClient.Do(req)

defer res.Body.Close()
body, _ := io.ReadAll(res.Body)

fmt.Println(string(body))

}
HttpResponse<String> response = Unirest.post("https://api.squarecloud.app/v2/apps/{app_id}/snapshots")
.header("Authorization", "<authorization>")
.asString();
require 'uri'
require 'net/http'

url = URI("https://api.squarecloud.app/v2/apps/{app_id}/snapshots")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["Authorization"] = '<authorization>'

response = http.request(request)
puts response.read_body
{
    "status": "success",
    "response": {
        "url": "https://snapshots.squarecloud.app/applications/23457145698959364/a23d130fcc9ddaf2d288ae9599a4292c32.zip?AWSAccessKeyId=i06Xdad2dRD74Pm8Xly&Expires=1753081182&Signature=riWPedawcsouRAPGU5n3kGHnWoOuw%3D",
        "key": "AWSAccessKeyId=i06Xdad2dRD74Pm8Xly&Expires=1753081182&Signature=riWPedawcsouRAPGU5n3kGHnWoOuw%3D"
    }
}
{
  "status": "error",
  "code": "SNAPSHOT_PROCESSING"
}
{
  "status": "error",
  "code": "KEEP_CALM",
  "message": "You already requested a snapshot recently. Please wait a minute before trying again. 1r/5s"
}
{
  "status": "error",
  "code": "DAILY_SNAPSHOTS_LIMIT_REACHED",
  "message": "You are being rate limited for daily snapshots. 8r/24h"
}
每个账户每 24 小时最多可执行 (RAM / 256) * 2 次 snapshot。
Authorization
string
必填
你账户的 API 密钥。你可以在账户设置中找到它。

参数

app_id
string
必填
应用的 ID。你可以在应用控制面板的 URL 中找到它。

软截止(soft deadline)行为

此路由遵循软截止模型 —— 它不再总是同步响应。
  • 如果 snapshot 在 约 90 秒 内完成,路由将返回 200 success 以及一个签名下载 URL(有效期 30 天),与以前完全相同。
  • 如果 snapshot 生成时间超过 约 90 秒,路由将立即返回 202 及代码 SNAPSHOT_PROCESSING这不是失败。 snapshot 会在后台继续生成,并会自行出现在 snapshot 列表 中,通常在约 2 分钟内。对于大型应用而言这是预期行为。
不要将此 POST 端点用作轮询机制。要检查处于 SNAPSHOT_PROCESSING 状态的 snapshot 是否已完成,请使用 列出 SnapshotGET)端点 —— 而非再次 POST。在 snapshot 完成后重新 POST 会从头开始一个全新的 snapshot。
客户端应按如下方式对响应进行分支处理:
响应含义应对方式
status === "success"snapshot 已就绪。使用 url 下载它。
status === "error"code === "SNAPSHOT_PROCESSING"snapshot 仍在生成中。等待约 2 分钟,然后通过 列出 SnapshotGET)确认。不要重新 POST
status === "error" 且带有任何其他 code实际失败。处理错误(见下文)。

响应

status
string
指示调用是否成功。成功时为 success,否则为 error
response
object
响应的内容。仅当 statussuccess 时存在。
SNAPSHOT_PROCESSING
202
当 snapshot 超过约 90 秒的软截止时返回。snapshot 仍在后台生成,并会自行出现在 snapshot 列表中,通常在约 2 分钟内。这不是错误 —— 请等待并通过 GET 列表端点确认。

错误

snapshot 请求可能会以 429 Too Many Requests 被拒绝。使用 code 字段区分这两种情况:
KEEP_CALM
429
短期冷却 —— 你触发了每用户(每 5 秒 1 个请求)或每应用(每 180 秒 1 个请求)的限制。请稍后退避并重试。
DAILY_SNAPSHOTS_LIMIT_REACHED
429
已达每日配额 —— 账户已用尽其套餐的每日 snapshot 额度(每 24 小时 (RAM / 256) × 2 次)。随着滚动的 24 小时窗口推进,配额会释放;如需更高的每日额度,请升级套餐。
{
    "status": "success",
    "response": {
        "url": "https://snapshots.squarecloud.app/applications/23457145698959364/a23d130fcc9ddaf2d288ae9599a4292c32.zip?AWSAccessKeyId=i06Xdad2dRD74Pm8Xly&Expires=1753081182&Signature=riWPedawcsouRAPGU5n3kGHnWoOuw%3D",
        "key": "AWSAccessKeyId=i06Xdad2dRD74Pm8Xly&Expires=1753081182&Signature=riWPedawcsouRAPGU5n3kGHnWoOuw%3D"
    }
}
{
  "status": "error",
  "code": "SNAPSHOT_PROCESSING"
}
{
  "status": "error",
  "code": "KEEP_CALM",
  "message": "You already requested a snapshot recently. Please wait a minute before trying again. 1r/5s"
}
{
  "status": "error",
  "code": "DAILY_SNAPSHOTS_LIMIT_REACHED",
  "message": "You are being rate limited for daily snapshots. 8r/24h"
}