View .md

Usage and billing

Usage is counted per organization and per calendar month (UTC), and compared with the monthly quotas of the organization's plan. This page lists what each endpoint counts, what is free, how to read the counters, and the limits of each plan.

What is metered

The meter keeps four counters per organization and month:

CounterMeasuresQuota
pagesPages fetched or documents parsedPages per month
searchesSearch engine queriesSearches per month
browserSecondsTime spent in an interactive browserBrowser seconds per month
crawlsCrawl and batch scrape jobs startedNone (informational)

What each endpoint adds:

EndpointCountedWhen
Scrape1 pageWhen the page is fetched, from the site or from the cache.
Scrape with actions, wait_for or screenshotBrowser seconds, not pagesWhen the browser run ends.
Crawl1 crawl, then 1 page per page in the resultsThe crawl when it is queued; the pages when the job finishes, including pages that failed.
Batch scrape1 crawl, then 1 page per URL in the batchThe same as crawl.
Search1 searchWhen the search engines answer, including when the answer comes from the search cache.
Search with search_depth: "advanced"1 page per result readAfter the results are read.
Search with scrape or include_answer1 page per result scrapedAfter the results are scraped.
ResearchThe searches and pages_read reported in the response's usageWhen a new run succeeds.
Extract1 page per source readAfter the sources are read, before the model runs.
llms.txt1 page per page scrapedAfter the pages are scraped.
POST /orgs/{id}/parse1 page per documentWhen parsing succeeds.
Browser session actionsBrowser secondsPer actions call: its duration rounded up to whole seconds, at least 1.

What is free

  • Cached research answers. Asking the same research question with the same options again within 10 minutes returns the stored answer with "cached": true, and it is not metered. The cache is kept by each API server, so on a deployment with several servers a repeat can still run (and be metered) again. Pass "no_cache": true to force a new, metered run.
  • Map. Map is not metered, but it is refused with 402 once the page quota is used up.
  • Reads and polling. Crawl status, cancellation, crawl errors and GET /whoami are never metered.
  • Rejected and failed requests. A request refused before any work starts (validation, scope, rate limit or quota) costs nothing, and so do a scrape whose page could not be fetched, a search the engines did not answer, and a research run that failed or timed out.

Cache hits on scrape and search are faster and do not touch the target site or the search engine, but they are still counted: a cached scrape counts one page and a cached search counts one search.

Reading usage

The dashboard shows the current period under Billing (Billing & usage). The same numbers come from the API:

GET/orgs/{id}/usage

This endpoint takes a session token from a member of the organization; API keys cannot read usage. GET /whoami with an API key returns the organization's plan.

bash
curl "https://xdive.dev/api/orgs/$ORG_ID/usage" \
  -H "Authorization: Bearer $SESSION_TOKEN"
json
{
  "browserSecondsUsed": 45,
  "crawlsUsed": 4,
  "limits": {
    "name": "free",
    "monthlyPages": 1000,
    "monthlySearches": 100,
    "monthlyBrowserSeconds": 600,
    "maxBrowserSessions": 1,
    "maxSchedules": 3,
    "requestsPerMinute": 60,
    "maxConcurrentRequests": 5,
    "maxConcurrentCrawls": 2
  },
  "pagesUsed": 312,
  "period": "2026-10",
  "plan": "free",
  "proxy": {
    "enabled": false,
    "monthlyPages": 200,
    "pagesUsed": 0
  },
  "schedules": 1,
  "searchesUsed": 27
}
FieldTypeDescription
periodstringThe current period, the UTC calendar month as YYYY-MM.
planstringThe organization's plan.
limitsobjectThe plan's limits; see Plans. -1 means unlimited.
pagesUsedintegerPages counted this period.
searchesUsedintegerSearches counted this period.
browserSecondsUsedintegerBrowser seconds counted this period.
crawlsUsedintegerCrawl and batch scrape jobs started this period.
schedulesintegerSchedules that exist now (a count, not monthly usage).
proxyobjectThe organization's residential proxy entitlement, used for government and banking sites: enabled (set by the platform administrator; false until then), monthlyPages (the monthly allowance of proxied pages; 0 allows none) and pagesUsed (pages fetched through the proxy this period).

Counters are updated within seconds of the work, not instantly.

Per-key budgets

An API key can have its own monthly page and search budget, on top of the plan quota. Give a key with a budget to an AI agent or a contractor, and it stops at that budget without using up the organization's quota.

bash
curl -X POST "$XDIVE_URL/api/orgs/$ORG_ID/api-keys" \
  -H "Authorization: Bearer $SESSION_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"name": "research agent", "scopes": ["scrape", "search"], "monthly_page_limit": 500, "monthly_search_limit": 100}'
  • 0, the default, means only the plan quota applies.
  • Change a budget with PATCH /orgs/{id}/api-keys/{keyId} and {"monthly_page_limit": 1000}. An omitted field keeps its value. The change applies at once.
  • GET /orgs/{id}/api-keys lists each key's pagesUsed and searchesUsed this month.
  • A request over the key's budget gets 402 QUOTA_EXCEEDED, and the message names the key's budget. A crawl started with less budget left than its max_pages is shortened to what is left. A batch scrape with more URLs than the budget allows is refused.
  • Budgets reset with the plan period, at the start of each calendar month (UTC).

Plans

Every organization is on one plan. New organizations start on free.

Limitfreeproenterprise
Pages per month (monthlyPages)1,00050,000Unlimited
Searches per month (monthlySearches)10010,000Unlimited
Browser seconds per month (monthlyBrowserSeconds)60036,000Unlimited
Browser sessions at once (maxBrowserSessions)1310
Schedules (maxSchedules)350Unlimited
Requests per minute (requestsPerMinute)606006,000
Concurrent synchronous requests (maxConcurrentRequests)550500
Concurrent crawls, fair share (maxConcurrentCrawls)21050

When a monthly quota is used up, the requests that need it return 402 until the next month or an upgrade. See Errors and limits for the details and for how the per-minute and concurrency limits behave.

Changing plans

Only the organization's owner can change its plan, from Billing in the dashboard.

  • When the server has billing configured, upgrading goes through a hosted checkout (POST /orgs/{id}/billing/checkout with {"plan": "pro"} returns its url), and the new plan applies once the payment is confirmed. Downgrading to free is immediate.
  • When billing is not configured, as on many self-hosted servers, the owner switches plans directly with PUT /orgs/{id}/plan and {"plan": "pro"}.