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,
 "translation_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
translation_cost_usdOn-demand ?lang= translation of the claim text and panel explanations (strong_lang_en/strong_lang_es shortcuts are free)

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"
# {"audio_duration_seconds": 812.4, "cost_usd": 0.0135}

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 reports your activity as volumes, not money: claims_detected and claims_elected (claims), queries (one research method run on one claim - two methods on the same claim count as 2), transcription (minutes of audio), plus counts for translations, re-analyses and API calls. It returns totals, a time series, by_kind (each row with volume and unit) and by_debate. range accepts 7d, 30d, mtd, all, or explicit from/to.

Plans and quotas

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
{"detail": "Quota exceeded",
 "error": {"code": "quota_exceeded",
           "details": {"kind": "claims", "used": 500, "limit": 500,
                       "resets_at": "2025-02-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
{"plan": "pro", "features": ["youtube", "tiktok", "instagram",
                             "elector", "modes:agentic", "export_pdf"]}

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.