Getting started

Pricing & billing

Report pricing is dynamic: a cost-indexed quote recomputed from the rolling average of recent real report costs. Right now a fresh report is 484 credits (a credit ≈ $0.01–0.014 depending on pack). Never hardcode a price — read it:

Public — no auth
curl https://backend-production-092f.up.railway.app/api/credits/pricing
{"fresh_credits": 484, "cached_credits": 242, "byok_credits": 50}

Quote locking

The price you see is the price you pay: pass the quote back as quoted_credits when creating a report. The server honors it if the current quote is within 15%; you are never charged more than you passed. If the quote moved beyond tolerance you get 409 with {"code": "quote_expired"} and no report row is created — re-check and retry.

POST /api/reports {"event_id": "…", "quoted_credits": 484}
# 200 → charged min(current, quoted)
# 409 → {"code": "quote_expired", "cost_credits": <new quote>}

The three lanes

LaneCost per fresh reportHow
Credits (default)dynamic quote (now 484cr); cached = half; already purchased = freeBuy packs on the site; failed runs auto-refund to the pool they were charged from
API subscription$3.00 fresh / $1.50 cached, metered monthly via StripeSubscribe from your profile; API-key runs then skip credits entirely
BYOKflat 50 credits; provider costs bill to your own OpenRouter keyStore your OpenRouter key in your profile (AES-256-GCM at rest)

Every account also gets 1 free fresh report per week (the grant follows the current quote, resets Mondays).

Caching

If anyone ran the council on the same event today, you can buy the cached report for half price — GET /api/reports/check/{event_id} tells you (has_cached_report), and returns already_purchased: true with a report_id if it's already yours (free).

Costs you never pay

Failed council runs refund automatically and metered-lane failures are never billed. Server-side provider spend is our problem, not a pass-through — see Errors & limits for the failure semantics.