Credits
Understand the credit-based pricing system, purchase credit packs, and configure auto top-up.
How Credits Work
ScreenshotAPI uses a simple credit-based pricing model:
- 1 screenshot = 1 credit
- Credits are deducted only for successful screenshots
- Failed requests are never charged
- Credits never expire
- New accounts receive 200 free screenshots per month, and that included allowance resets at the start of each billing period (the first of the month on the free plan)
- Your plan's included allowance is always used first; credit packs are only drawn on after it runs out for the current period
This means you only pay for what you use — flexible subscriptions and pay-as-you-go credit packs, no overage fees, and no wasted spend.
Checking Your Balance
curl "https://screenshotapi.to/api/v1/credits" \
--cookie "session=your_session_cookie"const response = await fetch('https://screenshotapi.to/api/v1/credits', {
credentials: 'include'
})
const { balance } = await response.json()
console.log(`Remaining credits: ${balance}`)import requests
response = requests.get(
"https://screenshotapi.to/api/v1/credits",
cookies={"session": "your_session_cookie"}
)
balance = response.json()["balance"]
print(f"Remaining credits: {balance}")req, _ := http.NewRequest("GET", "https://screenshotapi.to/api/v1/credits", nil)
req.AddCookie(&http.Cookie{Name: "session", Value: "your_session_cookie"})
resp, err := http.DefaultClient.Do(req)
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
var result struct{ Balance int }
json.NewDecoder(resp.Body).Decode(&result)
fmt.Printf("Remaining credits: %d\n", result.Balance)require "net/http"
require "json"
uri = URI("https://screenshotapi.to/api/v1/credits")
req = Net::HTTP::Get.new(uri)
req["Cookie"] = "session=your_session_cookie"
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |http|
http.request(req)
}
balance = JSON.parse(response.body)["balance"]
puts "Remaining credits: #{balance}"$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => "https://screenshotapi.to/api/v1/credits",
CURLOPT_COOKIE => "session=your_session_cookie",
CURLOPT_RETURNTRANSFER => true,
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
echo "Remaining credits: " . $response["balance"];Your credit balance is also returned in the x-credits-remaining response header after every screenshot request, so you can track your balance without making a separate API call.
Credit Packs
Purchase credits in pre-configured packs. View available packs:
curl "https://screenshotapi.to/api/v1/credits/packs"[
{
"id": "pack_starter",
"name": "Starter",
"credits": 1000,
"priceCents": 900,
"isPopular": false
},
{
"id": "pack_growth",
"name": "Growth",
"credits": 5000,
"priceCents": 2900,
"isPopular": true
},
{
"id": "pack_pro",
"name": "Pro",
"credits": 25000,
"priceCents": 9900,
"isPopular": false
},
{
"id": "pack_scale",
"name": "Scale",
"credits": 100000,
"priceCents": 29900,
"isPopular": false
}
]The /credits/packs endpoint is public and does not require authentication.
Purchasing Credits
To purchase a credit pack, send the pack ID. You'll receive a checkout URL:
curl -X POST "https://screenshotapi.to/api/v1/credits/purchase" \
-H "Content-Type: application/json" \
-d '{"packId": "pack_pro"}' \
--cookie "session=your_session_cookie"const response = await fetch('https://screenshotapi.to/api/v1/credits/purchase', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
credentials: 'include',
body: JSON.stringify({ packId: 'pack_pro' })
})
const { checkoutUrl } = await response.json()
// Redirect user to checkoutUrl to complete payment
window.location.href = checkoutUrlimport requests
response = requests.post(
"https://screenshotapi.to/api/v1/credits/purchase",
json={"packId": "pack_pro"},
cookies={"session": "your_session_cookie"}
)
checkout_url = response.json()["checkoutUrl"]
# Redirect user to checkout_url to complete paymentbody := strings.NewReader(`{"packId": "pack_pro"}`)
req, _ := http.NewRequest("POST", "https://screenshotapi.to/api/v1/credits/purchase", body)
req.Header.Set("Content-Type", "application/json")
req.AddCookie(&http.Cookie{Name: "session", Value: "your_session_cookie"})
resp, err := http.DefaultClient.Do(req)
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
var result struct{ CheckoutURL string `json:"checkoutUrl"` }
json.NewDecoder(resp.Body).Decode(&result)
// Redirect user to result.CheckoutURL to complete paymentrequire "net/http"
require "json"
uri = URI("https://screenshotapi.to/api/v1/credits/purchase")
req = Net::HTTP::Post.new(uri, "Content-Type" => "application/json")
req["Cookie"] = "session=your_session_cookie"
req.body = { packId: "pack_pro" }.to_json
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |http|
http.request(req)
}
checkout_url = JSON.parse(response.body)["checkoutUrl"]
# Redirect user to checkout_url to complete payment$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => "https://screenshotapi.to/api/v1/credits/purchase",
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => ["Content-Type: application/json"],
CURLOPT_COOKIE => "session=your_session_cookie",
CURLOPT_POSTFIELDS => json_encode(["packId" => "pack_pro"]),
CURLOPT_RETURNTRANSFER => true,
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
// Redirect user to $response["checkoutUrl"] to complete paymentAfter successful payment, credits are automatically added to your account.
Transaction History
View your credit transaction history:
curl "https://screenshotapi.to/api/v1/credits/transactions?limit=10&offset=0" \
--cookie "session=your_session_cookie"Each transaction shows the type (purchase, auto_topup, usage, subscription), amount, description, and timestamp.
Auto Top-Up
Auto top-up helps you stay ahead of credit shortages by notifying you when your balance is low.
Configure credit balance monitoring from your dashboard. When your balance drops below a threshold you set, you'll be prompted to purchase more credits.
How it works:
- Set a threshold (e.g., 50 credits).
- Choose a credit pack to suggest (e.g., Growth pack with 5,000 credits).
- When your balance drops below 50, you'll see a prompt to buy more credits.
You can enable, disable, or reconfigure auto top-up at any time from the settings page.
Insufficient Credits
If you attempt a screenshot request once your plan's monthly allowance is used up and you have zero credits, you'll receive a 402 response:
{
"error": "Insufficient quota",
"message": "You've reached your plan's monthly screenshot limit. Your included allowance resets on 2026-08-01. Upgrade your plan or buy a credit pack to keep capturing now: https://screenshotapi.to/dashboard/billing",
"remainingInPlan": 0,
"creditBalance": 0,
"quotaResetsAt": "2026-08-01T00:00:00.000Z",
"upgradeUrl": "https://screenshotapi.to/dashboard/billing"
}The request is not processed and no credit is deducted. quotaResetsAt tells you when the included allowance returns, so an integration can requeue rather than fail permanently. To restore access immediately instead, buy a credit pack or upgrade your plan at the upgradeUrl.
Pricing Summary
| Pack | Credits | Price | Per Credit |
|---|---|---|---|
| Starter | 1,000 | $9.00 | $0.009 |
| Growth | 5,000 | $29.00 | $0.0058 |
| Pro | 25,000 | $99.00 | $0.00396 |
| Scale | 100,000 | $299.00 | $0.00299 |
Higher-volume packs offer a lower cost per credit. All prices are in USD and exclude applicable taxes.