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:
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
| Lane | Cost per fresh report | How |
|---|---|---|
| Credits (default) | dynamic quote (now 484cr); cached = half; already purchased = free | Buy 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 Stripe | Subscribe from your profile; API-key runs then skip credits entirely |
| BYOK | flat 50 credits; provider costs bill to your own OpenRouter key | Store 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.