RTFC API

Costs, plans and quotas

You are billed for the work actually done - LLM calls, searches, transcription - marked up per your plan. There is no per-request fee, so a cheap claim is cheap.

What a claim cost

bash
curl -s $RTFC/claims/$CLAIM/cost -H "X-Auth-Token: $TOKEN"
json
{"detector_cost_usd": 0.0002, "worker_cost_usd": 0.0018,
 "search_cost_usd": 0.0004, "elector_cost_usd": 0.0,
 "total_cost_usd": 0.0024}
ComponentWhat it paid for
detector_cost_usdFinding the claim in the transcript
worker_cost_usdResearching it - the bulk, and it scales with research modes
search_cost_usdSearch-provider calls
elector_cost_usdThe LLM judge, when elector_enabled

total_cost_usd also appears on /claims/{id}/results and /best, and on each SSE result event as claim_total_cost_usd - so you can meter without extra requests.

Transcription is billed separately, by exact audio duration:

bash
curl -s $RTFC/debates/$DEBATE/transcription-cost -H "X-Auth-Token: $TOKEN"

Shared claims cost nothing

If a claim has already been researched - because another user shared the same public video, or the same claim text was checked in a shared pool - you get the existing answer and are charged $0.

This is deliberate and it is a feature, not a billing bug. Design for it: do not alert on a zero-cost claim, and do not assume cost is proportional to claims shown.

Your usage

bash
curl -s $RTFC/usage/me/summary -H "X-Auth-Token: $TOKEN"
curl -s "$RTFC/usage/me?range=30d&granularity=day" -H "X-Auth-Token: $TOKEN"

/usage/me returns totals, a time series, a breakdown by kind, and a breakdown by debate. range accepts 7d, 30d, mtd, all, or explicit from/to.

Plans and quotas

bash
curl -s $RTFC/plans            -H "X-Auth-Token: $TOKEN"
curl -s $RTFC/subscriptions/me -H "X-Auth-Token: $TOKEN"

A plan sets included units (claims, debates, transcript minutes, spend), whether overage is allowed, a hard spend cap, max concurrent debates, and which features you can use.

Quotas are enforced wherever the work is requested - the same limits apply whether you call the API or use the web interface. There is no way for the two to disagree.

Running out

Exceeding a quota returns 402:

json
{"error": {"code": "quota_exceeded",
           "details": {"kind": "claims", "plan": "free",
                       "usage": 100, "included": 100,
                       "reset_at": "2026-09-01T00:00:00Z"}}}

If you cross the limit mid-debate, research pauses rather than failing: already detected claims are held, not dropped, and are re-queued automatically when the period rolls over or you upgrade. Ingest keeps running - you do not lose the transcript.

You will see quota.threshold_reached at 80% if you subscribe to webhooks, which is the point at which it is still comfortable to act.

Features

Some capabilities are plan-gated - certain research modes, the elector, media platforms:

json
{"error": {"code": "plan_feature_unavailable",
           "details": {"feature": "research_modes", "value": "agentic"}}}

GET /v1/subscriptions/me lists what your plan allows, so you can hide what is unavailable instead of surfacing a 403.

Paying for a plan

See Payments for Checkout, the Customer Portal, and how overage is billed.