Account
Usage
Check this month's credits from code, and break usage down per API key, project, day or endpoint. Free: it costs 0 credits.
curl "https://api.104-236-84-15.sslip.io/v1/usage" \
-H "Authorization: Bearer $PAGETEER_API_KEY"const res = await fetch('https://api.104-236-84-15.sslip.io/v1/usage', {
headers: { Authorization: `Bearer ${process.env.PAGETEER_API_KEY}` },
});
const data = await res.json();
if (!res.ok) throw new Error(data.error.message);
console.log(data, res.headers.get('x-credits-remaining'));import os
import requests
headers = {"Authorization": f"Bearer {os.environ['PAGETEER_API_KEY']}"}
res = requests.get(
"https://api.104-236-84-15.sslip.io/v1/usage",
headers=headers,
params={},
timeout=120,
)
res.raise_for_status()
print(res.json(), res.headers["x-credits-remaining"])Response
{
"period": "2026-10",
"plan": "free",
"granted": 1000,
"used": 212,
"remaining": 788,
"overage_cap": 0,
"billable": 0,
"spend_limit_cents": 0,
"estimated_cost_cents": 0,
"resets_at": "2026-11-01T00:00:00.000Z"
}| Name | Type | Description |
|---|---|---|
period | string | The current period: the calendar month in UTC, YYYY-MM. |
plan | "free" | "payg" | "invoiced" | Billing mode: free, pay as you go (card) or invoiced. |
granted | integer | Free credits this month (1,000 on every mode). |
used | integer | Credits used this month, free and billable. |
remaining | integer | Free credits left: max(0, granted − used). Same as the x-credits-remaining header. |
overage_cap | integer | Billable credits your spend limit allows beyond the free credits. 0 means requests stop at the free credits. |
billable | integer | Credits used beyond the free credits: max(0, used − granted). |
spend_limit_cents | integer | Your monthly spend limit in US cents (0 on the free mode). |
estimated_cost_cents | integer | What the billable credits cost so far, in US cents, on the usage rates. |
resets_at | string | ISO time the next period starts (the 1st, 00:00 UTC). |
Credits you can still spend this month = granted + overage_cap − used. A request that does not fit is refused with 402 and costs nothing; its error.reason says why (see 402 reasons).
Usage by key, project, day or endpoint
Pass from and to to get totals for any range of days, and group to break them down in groups. The fields above stay the same and always describe the current month. Ranges read the daily usage totals we keep for 400 days, so they reach further back than the 30-day request log.
| Name | Type | Description |
|---|---|---|
group | "key" | "project" | "day" | "endpoint" | How to break usage down: per API key, per project label (keys without one are grouped as null, "No project"), per UTC day, or per endpoint. Without it there is no groups field. |
from | YYYY-MM-DD | First UTC day to include. Default: 1st of this month. |
to | YYYY-MM-DD | Last UTC day to include. The range is inclusive and covers at most 400 days; a longer or reversed range, or an invalid date, is a 400 invalid_request. Default: today. |
curl "https://api.104-236-84-15.sslip.io/v1/usage?group=key&from=2026-09-01&to=2026-09-30" \
-H "Authorization: Bearer $PAGETEER_API_KEY"const res = await fetch(`https://api.104-236-84-15.sslip.io/v1/usage?${new URLSearchParams({"group":"key","from":"2026-09-01","to":"2026-09-30"})}`, {
headers: { Authorization: `Bearer ${process.env.PAGETEER_API_KEY}` },
});
const data = await res.json();
if (!res.ok) throw new Error(data.error.message);
console.log(data, res.headers.get('x-credits-remaining'));import os
import requests
headers = {"Authorization": f"Bearer {os.environ['PAGETEER_API_KEY']}"}
res = requests.get(
"https://api.104-236-84-15.sslip.io/v1/usage",
headers=headers,
params={
"group": "key",
"from": "2026-09-01",
"to": "2026-09-30",
},
timeout=120,
)
res.raise_for_status()
print(res.json(), res.headers["x-credits-remaining"]){
"period": "2026-10",
…
"from": "2026-09-01",
"to": "2026-09-30",
"group": "key",
"totals": { "requests": 2210, "credits": 7040, … },
"groups": [
{
"key": "66f1c0ffee0123456789abcd",
"key_name": "Production",
"key_prefix": "pk_live_AbCd",
"project": "Property Radar",
"totals": {
"requests": 1840,
"credits": 6215,
"errors": 37,
"blocked": 12,
"proxy_bytes": 418230112,
"browser": 1105,
"http": 702,
"ms": 5122840
}
}
]
}| Name | Type | Description |
|---|---|---|
from, to | string | The range used (defaults filled in). Present when you passed group, from or to, together with totals. |
group | string | The group you asked for. |
totals | object | Everything in the range, with the same fields as a group’s totals below. |
groups[].key | string | null | The group: an API key id (group=key), a project label (null for keys without one), a day YYYY-MM-DD, or an endpoint name (render, search, crawl…). Days come in date order; the other groups by credits, then requests, highest first. |
groups[].key_name, key_prefix | string | With group=key: the key's name and display prefix. |
groups[].project | string | null | With group=key or project: the project label. |
totals.requests | integer | Requests made (crawl pages and batch items count one each). |
totals.credits | integer | Credits charged. |
totals.errors | integer | Requests we answered with a status of 400 or more. |
totals.blocked | integer | Requests the site blocked. |
totals.proxy_bytes | number | Bytes through the residential proxy (your own, normally). |
totals.browser, totals.http | integer | Fetches served in browser mode and in HTTP mode. |
totals.ms | integer | Sum of request durations in milliseconds. |
Keys and projects are reported under each key's current name and project, so relabelling a key moves its history with it. Requests made with test keys are included, with 0 credits, 0 proxy bytes and no browser or HTTP fetches. Days are UTC, and today's numbers update as requests finish.
In the dashboard
The Usage page shows the same data for any period up to 400 days: totals, a daily chart, a table by project with each key underneath, an endpoint breakdown and a CSV export, filterable by project, key and live or test. Enter what your proxy provider charges per GB there to see an estimated proxy cost next to each key and project.
Errors
| Status | Code | When | Charged | What to do |
|---|---|---|---|---|
| 400 | invalid_request | A parameter is missing, invalid or unknown (the message and error.issues name it). | No | Fix the request; retrying it unchanged fails again. |
| 401 | invalid_api_key | No key, an unknown key, or a revoked or expired key. | No | Check the Authorization header and the key on the API keys page. |
| 403 | org_suspended | The account is suspended. | No | Contact support. |
| 429 | rate_limited | Over your requests per minute, or too many requests to one site across the platform right now. | No | Wait Retry-After seconds, then back off with jitter. |
| 500 / 502 / 503 | internal_error | Something failed on our side (rendering engine, LLM extraction or the API itself), or the rendering engine is at capacity (503, Retry-After: 5). | No | Retry with backoff (honor Retry-After); quote x-request-id if it persists. |