查询工具目录
“查询工具目录”章节选择 toolId 和 params 前先读取目录。返回值包含图片与视频工具、水印辅助工具、参数类型、媒体限制与当前价格。是否能处理还取决于输入素材和可用算力,不能把一种参数类型用于所有工具。
例如 image-sr 使用 {"type":"scale","value":2} 进行图片 2 倍超分。使用其他倍数前先查询返回的选项。视频超分使用 video-sr,同样需要根据输入与参数重新报价。
/api/v1/tools调用示例
curl --include --fail-with-body --silent --show-error --max-time 60 \ --request GET 'https://app.berserkapi.com/api/v1/tools' \ --header "Authorization: Bearer $GLACIER_API_KEY"// Node.js 22+; save as example.mjs, then: node example.mjsconst key = process.env.GLACIER_API_KEY;if (!key) throw new Error('Set GLACIER_API_KEY');const response = await fetch('https://app.berserkapi.com/api/v1/tools', { method: 'GET', headers: { Authorization: `Bearer ${key}`, }, signal: AbortSignal.timeout(60_000),});const text = await response.text();if (!response.ok) throw new Error(`HTTP ${response.status}: ${text}`);console.log(response.status, text);# Python 3.10+; standard library; python example.pyimport osimport urllib.requestimport urllib.error
headers = {"Authorization": "Bearer " + os.environ["GLACIER_API_KEY"]}request = urllib.request.Request( "https://app.berserkapi.com/api/v1/tools", method="GET", headers=headers,)try: with urllib.request.urlopen(request, timeout=60) as response: print(response.status, response.read().decode("utf-8"))except urllib.error.HTTPError as error: raise RuntimeError(f"HTTP {error.code}: {error.read().decode('utf-8')}") from error// Go 1.22+; go run example.gopackage main
import ( "fmt" "io" "net/http" "os" "time")
func main() { key := os.Getenv("GLACIER_API_KEY") if key == "" { panic("Set GLACIER_API_KEY") } req, err := http.NewRequest("GET", "https://app.berserkapi.com/api/v1/tools", nil) if err != nil { panic(err) } req.Header.Set("Authorization", "Bearer " + key) client := &http.Client{Timeout: 60 * time.Second} res, err := client.Do(req) if err != nil { panic(err) } defer res.Body.Close() data, err := io.ReadAll(res.Body) if err != nil { panic(err) } if res.StatusCode >= 300 { panic(fmt.Sprintf("HTTP %d: %s", res.StatusCode, data)) } fmt.Println(res.StatusCode, string(data))}// cargo add reqwest@0.13 --features blocking// Save in src/main.rs, then: cargo runuse std::{env, error::Error, time::Duration};
fn main() -> Result<(), Box<dyn Error>> { let client = reqwest::blocking::Client::builder() .timeout(Duration::from_secs(60)).build()?; let response = client.request(reqwest::Method::GET, "https://app.berserkapi.com/api/v1/tools") .bearer_auth(env::var("GLACIER_API_KEY")?) .send()?; let status = response.status(); let text = response.text()?; if !status.is_success() { return Err(format!("HTTP {status}: {text}").into()); } println!("{status} {text}"); Ok(())}// Java 17+; save as Example.java, then: java Example.javaimport java.net.URI;import java.net.http.*;import java.time.Duration;import java.util.Objects;
class Example { public static void main(String[] args) throws Exception { var key = Objects.requireNonNull(System.getenv("GLACIER_API_KEY")); var client = HttpClient.newBuilder().connectTimeout(Duration.ofSeconds(30)).build(); var request = HttpRequest.newBuilder(URI.create("https://app.berserkapi.com/api/v1/tools")) .timeout(Duration.ofSeconds(60)) .header("Authorization", "Bearer " + key) .method("GET", HttpRequest.BodyPublishers.noBody()) .build(); var response = client.send(request, HttpResponse.BodyHandlers.ofString()); if (response.statusCode() >= 300) throw new IllegalStateException("HTTP " + response.statusCode() + ": " + response.body()); System.out.println(response.statusCode() + " " + response.body()); }}// .NET 8+; dotnet new console; replace Program.cs; dotnet runusing System;using System.Net.Http;using System.Net.Http.Headers;using System.Text;
var key = Environment.GetEnvironmentVariable("GLACIER_API_KEY") ?? throw new InvalidOperationException("Set GLACIER_API_KEY");using var client = new HttpClient { Timeout = TimeSpan.FromSeconds(60) };using var request = new HttpRequestMessage(new HttpMethod("GET"), "https://app.berserkapi.com/api/v1/tools");request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", key);using var response = await client.SendAsync(request);var text = await response.Content.ReadAsStringAsync();if (!response.IsSuccessStatusCode) throw new HttpRequestException($"HTTP {(int)response.StatusCode}: {text}");Console.WriteLine($"{(int)response.StatusCode} {text}");响应字段 · 200
animatedboolean必填能处理动图(多帧的 GIF / WebP / APNG / AVIF):每一帧都处理,产物沿用原格式;为 false 的图片工具不接受动图
animatedPriceobject必填处理动图的价格(积分):bands 是每帧的价格(按每帧的输出像素分档),消耗 = max(minCredits, 所在档 × 帧数);null 表示不处理动图或暂未开放
展开字段 / 类型
bandsobject[]必填按输出像素分档的每次价格(像素上限递增);为空表示不分档
展开字段 / 类型
creditsinteger · int64必填这一档每次的积分
minimum: 0 · maximum: 10000000
maxPixelsinteger · int64必填这一档输出像素(宽 × 高)的上限
minimum: 1 · maximum: 1000000000
fixedCreditsinteger · int64必填每任务固定费(积分);整单费用不低于 minCredits
minCreditsinteger · int64必填unitCreditsinteger · int64必填unitDivisorinteger · int64必填单价分母,实际单价为 unitCredits / unitDivisor;用整数精确表达小数价格
unitSizeinteger · int64必填每计量单位的像素或像素帧数;0 表示沿用默认 U,图片为1600万像素、视频为62208000像素帧
billing"fixed" | "work"必填descriptionstring必填group"enhance" | "restore" | "detect"必填idstring必填kind"image" | "video"必填limitsobject必填对处理后画面的上限(超分按放大后的尺寸计算;时长、帧数按输入计算),超限的任务会被拒绝
展开字段 / 类型
maxAspectinteger · int64必填长边 / 短边上限
maxBytesinteger · int64必填文件大小上限(字节)
maxDurationMsinteger · int64必填视频时长上限(毫秒)
maxFrameRateinteger · int64必填视频帧率上限(帧/秒)
maxFramesinteger · int64必填视频帧数上限
maxPixelsinteger · int64必填总像素(宽 × 高)上限
maxSideinteger · int64必填长边上限(像素)
minSideinteger · int64必填短边下限(像素)
namestring必填paramobject | object | object | object | object必填展开字段 / 类型
类型 1 ·
objecttype"none"必填
类型 2 ·
objectdefaultinteger · int64必填optionsinteger · int64[]必填展开字段 / 类型
integer · int64smallInputMaxPixelsinteger · int64必填smallInputMaxSideinteger · int64必填type"scale"必填
类型 3 ·
objectdefaultinteger · int64必填optionsinteger · int64[]必填展开字段 / 类型
integer · int64type"fps"必填
类型 4 ·
objectdefaultboolean必填type"faceProtect"必填
类型 5 ·
objectmaxRegionsinteger · int64必填type"regions"必填
priceobject必填当前价格(积分);null 表示暂未开放。实际消耗以 quoteTask 为准
展开字段 / 类型
bandsobject[]必填按输出像素分档的每次价格(像素上限递增);为空表示不分档
展开字段 / 类型
creditsinteger · int64必填这一档每次的积分
minimum: 0 · maximum: 10000000
maxPixelsinteger · int64必填这一档输出像素(宽 × 高)的上限
minimum: 1 · maximum: 1000000000
fixedCreditsinteger · int64必填每任务固定费(积分);整单费用不低于 minCredits
minCreditsinteger · int64必填unitCreditsinteger · int64必填unitDivisorinteger · int64必填单价分母,实际单价为 unitCredits / unitDivisor;用整数精确表达小数价格
unitSizeinteger · int64必填每计量单位的像素或像素帧数;0 表示沿用默认 U,图片为1600万像素、视频为62208000像素帧
查询积分余额
“查询积分余额”章节钱包返回当前账户的积分余额与即将到期的积分信息。网页与 API 任务共用这份余额,只读密钥也可查询。积分使用整数单位,不随文档语言切换改变;准确的处理消耗请通过任务报价获取。
/api/v1/wallet调用示例
curl --include --fail-with-body --silent --show-error --max-time 60 \ --request GET 'https://app.berserkapi.com/api/v1/wallet' \ --header "Authorization: Bearer $GLACIER_API_KEY"// Node.js 22+; save as example.mjs, then: node example.mjsconst key = process.env.GLACIER_API_KEY;if (!key) throw new Error('Set GLACIER_API_KEY');const response = await fetch('https://app.berserkapi.com/api/v1/wallet', { method: 'GET', headers: { Authorization: `Bearer ${key}`, }, signal: AbortSignal.timeout(60_000),});const text = await response.text();if (!response.ok) throw new Error(`HTTP ${response.status}: ${text}`);console.log(response.status, text);# Python 3.10+; standard library; python example.pyimport osimport urllib.requestimport urllib.error
headers = {"Authorization": "Bearer " + os.environ["GLACIER_API_KEY"]}request = urllib.request.Request( "https://app.berserkapi.com/api/v1/wallet", method="GET", headers=headers,)try: with urllib.request.urlopen(request, timeout=60) as response: print(response.status, response.read().decode("utf-8"))except urllib.error.HTTPError as error: raise RuntimeError(f"HTTP {error.code}: {error.read().decode('utf-8')}") from error// Go 1.22+; go run example.gopackage main
import ( "fmt" "io" "net/http" "os" "time")
func main() { key := os.Getenv("GLACIER_API_KEY") if key == "" { panic("Set GLACIER_API_KEY") } req, err := http.NewRequest("GET", "https://app.berserkapi.com/api/v1/wallet", nil) if err != nil { panic(err) } req.Header.Set("Authorization", "Bearer " + key) client := &http.Client{Timeout: 60 * time.Second} res, err := client.Do(req) if err != nil { panic(err) } defer res.Body.Close() data, err := io.ReadAll(res.Body) if err != nil { panic(err) } if res.StatusCode >= 300 { panic(fmt.Sprintf("HTTP %d: %s", res.StatusCode, data)) } fmt.Println(res.StatusCode, string(data))}// cargo add reqwest@0.13 --features blocking// Save in src/main.rs, then: cargo runuse std::{env, error::Error, time::Duration};
fn main() -> Result<(), Box<dyn Error>> { let client = reqwest::blocking::Client::builder() .timeout(Duration::from_secs(60)).build()?; let response = client.request(reqwest::Method::GET, "https://app.berserkapi.com/api/v1/wallet") .bearer_auth(env::var("GLACIER_API_KEY")?) .send()?; let status = response.status(); let text = response.text()?; if !status.is_success() { return Err(format!("HTTP {status}: {text}").into()); } println!("{status} {text}"); Ok(())}// Java 17+; save as Example.java, then: java Example.javaimport java.net.URI;import java.net.http.*;import java.time.Duration;import java.util.Objects;
class Example { public static void main(String[] args) throws Exception { var key = Objects.requireNonNull(System.getenv("GLACIER_API_KEY")); var client = HttpClient.newBuilder().connectTimeout(Duration.ofSeconds(30)).build(); var request = HttpRequest.newBuilder(URI.create("https://app.berserkapi.com/api/v1/wallet")) .timeout(Duration.ofSeconds(60)) .header("Authorization", "Bearer " + key) .method("GET", HttpRequest.BodyPublishers.noBody()) .build(); var response = client.send(request, HttpResponse.BodyHandlers.ofString()); if (response.statusCode() >= 300) throw new IllegalStateException("HTTP " + response.statusCode() + ": " + response.body()); System.out.println(response.statusCode() + " " + response.body()); }}// .NET 8+; dotnet new console; replace Program.cs; dotnet runusing System;using System.Net.Http;using System.Net.Http.Headers;using System.Text;
var key = Environment.GetEnvironmentVariable("GLACIER_API_KEY") ?? throw new InvalidOperationException("Set GLACIER_API_KEY");using var client = new HttpClient { Timeout = TimeSpan.FromSeconds(60) };using var request = new HttpRequestMessage(new HttpMethod("GET"), "https://app.berserkapi.com/api/v1/wallet");request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", key);using var response = await client.SendAsync(request);var text = await response.Content.ReadAsStringAsync();if (!response.IsSuccessStatusCode) throw new HttpRequestException($"HTTP {(int)response.StatusCode}: {text}");Console.WriteLine($"{(int)response.StatusCode} {text}");响应字段 · 200
balanceCreditsinteger · int64必填积分余额(含未到期的赠送积分)
giftCreditsinteger · int64必填其中未到期的赠送积分(扣除时先扣)
giftExpiresAtstring | null · date-time必填最早一批赠送积分的到期时间;没有赠送积分时为 null
giftExpiringCreditsinteger · int64必填最早到期的那一批还剩的积分
purchasedCreditsinteger · int64必填subscriptionCreditsinteger · int64必填subscriptionExpiresAtstring | null · date-time必填subscriptionExpiringCreditsinteger · int64必填
查询套餐权益
“查询套餐权益”章节图片包余额、免加急次数、已购期限与当前套餐由后端统一返回。网页与 API 共用额度。报价与创建任务可传 useImagePack: true 或 rush: true;图片包仅支持增强静态图片超分,不能与加急同时使用。失败和取消会退回原周期额度,过期额度不会延长。
/api/v1/benefits调用示例
curl --include --fail-with-body --silent --show-error --max-time 60 \ --request GET 'https://app.berserkapi.com/api/v1/benefits' \ --header "Authorization: Bearer $GLACIER_API_KEY"// Node.js 22+; save as example.mjs, then: node example.mjsconst key = process.env.GLACIER_API_KEY;if (!key) throw new Error('Set GLACIER_API_KEY');const response = await fetch('https://app.berserkapi.com/api/v1/benefits', { method: 'GET', headers: { Authorization: `Bearer ${key}`, }, signal: AbortSignal.timeout(60_000),});const text = await response.text();if (!response.ok) throw new Error(`HTTP ${response.status}: ${text}`);console.log(response.status, text);# Python 3.10+; standard library; python example.pyimport osimport urllib.requestimport urllib.error
headers = {"Authorization": "Bearer " + os.environ["GLACIER_API_KEY"]}request = urllib.request.Request( "https://app.berserkapi.com/api/v1/benefits", method="GET", headers=headers,)try: with urllib.request.urlopen(request, timeout=60) as response: print(response.status, response.read().decode("utf-8"))except urllib.error.HTTPError as error: raise RuntimeError(f"HTTP {error.code}: {error.read().decode('utf-8')}") from error// Go 1.22+; go run example.gopackage main
import ( "fmt" "io" "net/http" "os" "time")
func main() { key := os.Getenv("GLACIER_API_KEY") if key == "" { panic("Set GLACIER_API_KEY") } req, err := http.NewRequest("GET", "https://app.berserkapi.com/api/v1/benefits", nil) if err != nil { panic(err) } req.Header.Set("Authorization", "Bearer " + key) client := &http.Client{Timeout: 60 * time.Second} res, err := client.Do(req) if err != nil { panic(err) } defer res.Body.Close() data, err := io.ReadAll(res.Body) if err != nil { panic(err) } if res.StatusCode >= 300 { panic(fmt.Sprintf("HTTP %d: %s", res.StatusCode, data)) } fmt.Println(res.StatusCode, string(data))}// cargo add reqwest@0.13 --features blocking// Save in src/main.rs, then: cargo runuse std::{env, error::Error, time::Duration};
fn main() -> Result<(), Box<dyn Error>> { let client = reqwest::blocking::Client::builder() .timeout(Duration::from_secs(60)).build()?; let response = client.request(reqwest::Method::GET, "https://app.berserkapi.com/api/v1/benefits") .bearer_auth(env::var("GLACIER_API_KEY")?) .send()?; let status = response.status(); let text = response.text()?; if !status.is_success() { return Err(format!("HTTP {status}: {text}").into()); } println!("{status} {text}"); Ok(())}// Java 17+; save as Example.java, then: java Example.javaimport java.net.URI;import java.net.http.*;import java.time.Duration;import java.util.Objects;
class Example { public static void main(String[] args) throws Exception { var key = Objects.requireNonNull(System.getenv("GLACIER_API_KEY")); var client = HttpClient.newBuilder().connectTimeout(Duration.ofSeconds(30)).build(); var request = HttpRequest.newBuilder(URI.create("https://app.berserkapi.com/api/v1/benefits")) .timeout(Duration.ofSeconds(60)) .header("Authorization", "Bearer " + key) .method("GET", HttpRequest.BodyPublishers.noBody()) .build(); var response = client.send(request, HttpResponse.BodyHandlers.ofString()); if (response.statusCode() >= 300) throw new IllegalStateException("HTTP " + response.statusCode() + ": " + response.body()); System.out.println(response.statusCode() + " " + response.body()); }}// .NET 8+; dotnet new console; replace Program.cs; dotnet runusing System;using System.Net.Http;using System.Net.Http.Headers;using System.Text;
var key = Environment.GetEnvironmentVariable("GLACIER_API_KEY") ?? throw new InvalidOperationException("Set GLACIER_API_KEY");using var client = new HttpClient { Timeout = TimeSpan.FromSeconds(60) };using var request = new HttpRequestMessage(new HttpMethod("GET"), "https://app.berserkapi.com/api/v1/benefits");request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", key);using var response = await client.SendAsync(request);var text = await response.Content.ReadAsStringAsync();if (!response.IsSuccessStatusCode) throw new HttpRequestException($"HTTP {(int)response.StatusCode}: {text}");Console.WriteLine($"{(int)response.StatusCode} {text}");响应字段 · 200
concurrencyinteger · int64必填imagesRemaininginteger · int64必填maxVideoMinutesinteger · int64必填paidPlanboolean必填periodEndsAtstring | null · date-time必填planIdstring必填retentionDaysinteger · int64必填rushesRemaininginteger · int64必填storageGBinteger · int64必填subscriptionsobject[]必填展开字段 / 类型
endsAtstring · date-time必填idstring必填planIdstring必填startsAtstring · date-time必填
topupBonusPercentinteger · int64必填