Fact It
Developers

API reference

Every endpoint and data type below is generated from the OpenAPI 3.1 spec, which is itself generated from the Zod schemas the server validates against — so this reference can never drift from the real contract.

POST/api/check

Fact-check a response

Extract claims from `response`, verify each against live evidence, and return the final Check. Non-streaming — the connection stays open until every verdict is ready. Use /api/check/stream to render verdicts as they land.

Auth: Required — Bearer token

Request body

FieldTypeRequiredDetails
responsestringrequiredminLength: 1
promptstringoptional—
sourceAppenumoptionalchatgpt-web | claude-web | gemini-web | perplexity-web | chatgpt-desktop | claude-desktop | dashboard | cli | otherdefault: other
sensitivityenumoptionalstrict | balanced | lightdefault: balanced
bypassCachebooleanoptional—
reviewobjectoptional—
verifierModelstringoptional—

review

FieldTypeRequiredDetails
reasonenumrequireduser-thumbs-down
priorVerdictsarray<object>optional—

priorVerdicts[]

FieldTypeRequiredDetails
claimTextstringrequired—
statusenumrequiredsupported | partial | contradicted | unsupported
confidencenumberrequiredmin: 0, max: 1
reasoningstringrequired—

Responses

StatusDescription
200The completed fact-check.
400The request body failed CheckRequest validation.
401Authentication required — no session cookie or API token was supplied (code: unauthenticated).
402Monthly credit allowance exhausted (code: credits_exhausted).
429Rate limit exceeded.
503Daily budget cap reached, or a transient identity/metering failure; retry (see Retry-After).

200 body — Check

FieldTypeRequiredDetails
idstringrequired—
sourceAppenumrequiredchatgpt-web | claude-web | gemini-web | perplexity-web | chatgpt-desktop | claude-desktop | dashboard | cli | other
promptstringoptional—
responsestringrequired—
verdictsarray<object>required—
degradedProvidersarray<object>optional—
overallConfidencenumberrequiredmin: 0, max: 1
modelobjectrequired—
costobjectoptional—
createdAtstring (date-time)required—

verdicts[]

FieldTypeRequiredDetails
claimIdstringrequired—
statusenumrequiredsupported | partial | contradicted | unsupported | pending
confidencenumberrequiredmin: 0, max: 1
evidencearray<object>required—
reasoningstringrequired—

evidence[]

FieldTypeRequiredDetails
urlstring (uri)required—
titlestringrequired—
snippetstringrequired—
lastModifiedAtstring (date-time)optional—
authorityScorenumberrequiredmin: 0, max: 1
recencyScorenumberrequiredmin: 0, max: 1
relevanceScorenumberrequiredmin: 0, max: 1
providerIdstringrequired—

degradedProviders[]

FieldTypeRequiredDetails
providerIdstringrequired—
kindenumrequiredquota | auth | rate-limit | upstream | network
statusintegeroptionalmin: -9007199254740991
messagestringrequired—

model

FieldTypeRequiredDetails
extractorstringrequired—
verifierstringrequired—

cost

FieldTypeRequiredDetails
usdnumberrequiredmin: 0
inputTokensintegerrequiredmin: 0
outputTokensintegerrequiredmin: 0
cacheReadTokensintegerrequiredmin: 0
cacheWriteTokensintegerrequiredmin: 0
searchCallsintegerrequiredmin: 0

Example

curl https://fact-it-web-412159981305.us-central1.run.app/api/check \
  -H 'Authorization: Bearer fk_your_token' \
  -H 'Content-Type: application/json' \
  -d '{ "response": "The Eiffel Tower is 984 feet tall." }'
POST/api/check/stream

Fact-check a response (streaming)

Same input as /api/check, streamed as Server-Sent Events. Each event is a PipelineEvent encoded as `data: <json>\n\n`. The terminal event is either `{ "type": "done", "check": Check }` or `{ "type": "error", ... }`.

Auth: Required — Bearer token

Request body

FieldTypeRequiredDetails
responsestringrequiredminLength: 1
promptstringoptional—
sourceAppenumoptionalchatgpt-web | claude-web | gemini-web | perplexity-web | chatgpt-desktop | claude-desktop | dashboard | cli | otherdefault: other
sensitivityenumoptionalstrict | balanced | lightdefault: balanced
bypassCachebooleanoptional—
reviewobjectoptional—
verifierModelstringoptional—

review

FieldTypeRequiredDetails
reasonenumrequireduser-thumbs-down
priorVerdictsarray<object>optional—

priorVerdicts[]

FieldTypeRequiredDetails
claimTextstringrequired—
statusenumrequiredsupported | partial | contradicted | unsupported
confidencenumberrequiredmin: 0, max: 1
reasoningstringrequired—

Responses

StatusDescription
200An SSE stream of PipelineEvent objects.
400Invalid JSON or CheckRequest.
401Authentication required — no session cookie or API token was supplied (code: unauthenticated).
402Monthly credit allowance exhausted (code: credits_exhausted).
429Rate limit exceeded.
503Daily budget cap reached, or a transient identity/metering failure; retry (see Retry-After).

200 body — PipelineEvent

type: "extracted"

FieldTypeRequiredDetails
type"extracted"required—
claimsarray<object>required—

claims[]

FieldTypeRequiredDetails
idstringrequired—
textstringrequired—
spanobjectrequired—
typeenumrequirednumeric | historical | current_event | scientific | biographical | definition | opinion
importanceenumrequiredcore | supporting | aside
freshnessNeedenumrequiredlive | recent | evergreen
searchQuerystringoptional—
domainenumrequiredgeneral | medical | legal | scientific | financial | news | personaldefault: general

span

FieldTypeRequiredDetails
startintegerrequiredmin: 0
endintegerrequiredmin: 0

type: "retrieving"

FieldTypeRequiredDetails
type"retrieving"required—
claimIdstringrequired—

type: "retrieved"

FieldTypeRequiredDetails
type"retrieved"required—
claimIdstringrequired—
evidencearray<object>required—

evidence[]

FieldTypeRequiredDetails
urlstring (uri)required—
titlestringrequired—
snippetstringrequired—
lastModifiedAtstring (date-time)optional—
authorityScorenumberrequiredmin: 0, max: 1
recencyScorenumberrequiredmin: 0, max: 1
relevanceScorenumberrequiredmin: 0, max: 1
providerIdstringrequired—

type: "verdict"

FieldTypeRequiredDetails
type"verdict"required—
verdictobjectrequired—

verdict

FieldTypeRequiredDetails
claimIdstringrequired—
statusenumrequiredsupported | partial | contradicted | unsupported | pending
confidencenumberrequiredmin: 0, max: 1
evidencearray<object>required—
reasoningstringrequired—

evidence[]

FieldTypeRequiredDetails
urlstring (uri)required—
titlestringrequired—
snippetstringrequired—
lastModifiedAtstring (date-time)optional—
authorityScorenumberrequiredmin: 0, max: 1
recencyScorenumberrequiredmin: 0, max: 1
relevanceScorenumberrequiredmin: 0, max: 1
providerIdstringrequired—

type: "done"

FieldTypeRequiredDetails
type"done"required—
checkobjectrequired—

check

FieldTypeRequiredDetails
idstringrequired—
sourceAppenumrequiredchatgpt-web | claude-web | gemini-web | perplexity-web | chatgpt-desktop | claude-desktop | dashboard | cli | other
promptstringoptional—
responsestringrequired—
verdictsarray<object>required—
degradedProvidersarray<object>optional—
overallConfidencenumberrequiredmin: 0, max: 1
modelobjectrequired—
costobjectoptional—
createdAtstring (date-time)required—

verdicts[]

FieldTypeRequiredDetails
claimIdstringrequired—
statusenumrequiredsupported | partial | contradicted | unsupported | pending
confidencenumberrequiredmin: 0, max: 1
evidencearray<object>required—
reasoningstringrequired—

evidence[]

FieldTypeRequiredDetails
urlstring (uri)required—
titlestringrequired—
snippetstringrequired—
lastModifiedAtstring (date-time)optional—
authorityScorenumberrequiredmin: 0, max: 1
recencyScorenumberrequiredmin: 0, max: 1
relevanceScorenumberrequiredmin: 0, max: 1
providerIdstringrequired—

degradedProviders[]

FieldTypeRequiredDetails
providerIdstringrequired—
kindenumrequiredquota | auth | rate-limit | upstream | network
statusintegeroptionalmin: -9007199254740991
messagestringrequired—

model

FieldTypeRequiredDetails
extractorstringrequired—
verifierstringrequired—

cost

FieldTypeRequiredDetails
usdnumberrequiredmin: 0
inputTokensintegerrequiredmin: 0
outputTokensintegerrequiredmin: 0
cacheReadTokensintegerrequiredmin: 0
cacheWriteTokensintegerrequiredmin: 0
searchCallsintegerrequiredmin: 0

type: "error"

FieldTypeRequiredDetails
type"error"required—
messagestringrequired—
claimIdstringoptional—

Example

# Same body as /api/check, but the response is an SSE stream
# (Content-Type: text/event-stream). Each event is `data: <PipelineEvent JSON>`.
curl -N https://fact-it-web-412159981305.us-central1.run.app/api/check/stream \
  -H 'Authorization: Bearer fk_your_token' \
  -H 'Content-Type: application/json' \
  -d '{ "response": "The Eiffel Tower is 984 feet tall." }'
POST/api/feedback

Rate a check

Submit an anonymous thumbs up/down on a check. Fire-and-forget; returns 202 and stores no account id (see the Feedback schema).

Auth: None

Request body

FieldTypeRequiredDetails
checkIdstringoptional—
sourceAppenumrequiredchatgpt-web | claude-web | gemini-web | perplexity-web | chatgpt-desktop | claude-desktop | dashboard | cli | other
ratingenumrequiredup | down
responseSnippetstringoptionalmaxLength: 2000
priorVerdictsarray<object>optional—
overallConfidencenumberoptionalmin: 0, max: 1
commentstringoptionalmaxLength: 1000

priorVerdicts[]

FieldTypeRequiredDetails
claimTextstringrequired—
statusenumrequiredsupported | partial | contradicted | unsupported
confidencenumberrequiredmin: 0, max: 1
reasoningstringrequired—

Responses

StatusDescription
202Feedback accepted.
400The request body failed Feedback validation.
429Rate limit exceeded.

202 body — Ok

FieldTypeRequiredDetails
ok"true"required—

Example

curl https://fact-it-web-412159981305.us-central1.run.app/api/feedback \
  -H 'Content-Type: application/json' \
  -d '{ "sourceApp": "other", "rating": "up" }'
GET/api/account/usage

Get credit balance

Plan and remaining credits for the authenticated caller. The one /api/account route that accepts an API token (read-only); the others require a session cookie.

Auth: Required — Bearer token

Responses

StatusDescription
200Current usage summary.
401Missing or invalid credential.
503Temporarily unavailable; retry.

200 body — UsageSummary

FieldTypeRequiredDetails
planstringrequiredPlan identifier, e.g. "free" or "pro".
monthlyCreditAllowanceintegerrequiredCredits included with the plan each period. NOT the usable total on its own — add bonusCredits, or just read creditsRemaining.
bonusCreditsintegeroptionalOne-off credits granted on top of the plan allowance for the current period (e.g. an approved top-up request). Cleared when the period rolls over. Absent on older servers.
creditsUsedintegerrequired—
creditsRemainingintegerrequiredmonthlyCreditAllowance + bonusCredits - creditsUsed, floored at 0.
periodStartstring (date-time)required—
byokEnabledbooleanrequiredWhether the caller has a bring-your-own-key verifier configured.

Example

curl https://fact-it-web-412159981305.us-central1.run.app/api/account/usage \
  -H 'Authorization: Bearer fk_your_token'

Data types

The shared object shapes referenced by the endpoints above.

Check

FieldTypeRequiredDetails
idstringrequired—
sourceAppenumrequiredchatgpt-web | claude-web | gemini-web | perplexity-web | chatgpt-desktop | claude-desktop | dashboard | cli | other
promptstringoptional—
responsestringrequired—
verdictsarray<object>required—
degradedProvidersarray<object>optional—
overallConfidencenumberrequiredmin: 0, max: 1
modelobjectrequired—
costobjectoptional—
createdAtstring (date-time)required—

verdicts[]

FieldTypeRequiredDetails
claimIdstringrequired—
statusenumrequiredsupported | partial | contradicted | unsupported | pending
confidencenumberrequiredmin: 0, max: 1
evidencearray<object>required—
reasoningstringrequired—

evidence[]

FieldTypeRequiredDetails
urlstring (uri)required—
titlestringrequired—
snippetstringrequired—
lastModifiedAtstring (date-time)optional—
authorityScorenumberrequiredmin: 0, max: 1
recencyScorenumberrequiredmin: 0, max: 1
relevanceScorenumberrequiredmin: 0, max: 1
providerIdstringrequired—

degradedProviders[]

FieldTypeRequiredDetails
providerIdstringrequired—
kindenumrequiredquota | auth | rate-limit | upstream | network
statusintegeroptionalmin: -9007199254740991
messagestringrequired—

model

FieldTypeRequiredDetails
extractorstringrequired—
verifierstringrequired—

cost

FieldTypeRequiredDetails
usdnumberrequiredmin: 0
inputTokensintegerrequiredmin: 0
outputTokensintegerrequiredmin: 0
cacheReadTokensintegerrequiredmin: 0
cacheWriteTokensintegerrequiredmin: 0
searchCallsintegerrequiredmin: 0

Verdict

FieldTypeRequiredDetails
claimIdstringrequired—
statusenumrequiredsupported | partial | contradicted | unsupported | pending
confidencenumberrequiredmin: 0, max: 1
evidencearray<object>required—
reasoningstringrequired—

evidence[]

FieldTypeRequiredDetails
urlstring (uri)required—
titlestringrequired—
snippetstringrequired—
lastModifiedAtstring (date-time)optional—
authorityScorenumberrequiredmin: 0, max: 1
recencyScorenumberrequiredmin: 0, max: 1
relevanceScorenumberrequiredmin: 0, max: 1
providerIdstringrequired—

Evidence

FieldTypeRequiredDetails
urlstring (uri)required—
titlestringrequired—
snippetstringrequired—
lastModifiedAtstring (date-time)optional—
authorityScorenumberrequiredmin: 0, max: 1
recencyScorenumberrequiredmin: 0, max: 1
relevanceScorenumberrequiredmin: 0, max: 1
providerIdstringrequired—

Claim

FieldTypeRequiredDetails
idstringrequired—
textstringrequired—
spanobjectrequired—
typeenumrequirednumeric | historical | current_event | scientific | biographical | definition | opinion
importanceenumrequiredcore | supporting | aside
freshnessNeedenumrequiredlive | recent | evergreen
searchQuerystringoptional—
domainenumrequiredgeneral | medical | legal | scientific | financial | news | personaldefault: general

span

FieldTypeRequiredDetails
startintegerrequiredmin: 0
endintegerrequiredmin: 0

CostSummary

FieldTypeRequiredDetails
usdnumberrequiredmin: 0
inputTokensintegerrequiredmin: 0
outputTokensintegerrequiredmin: 0
cacheReadTokensintegerrequiredmin: 0
cacheWriteTokensintegerrequiredmin: 0
searchCallsintegerrequiredmin: 0

UsageSummary

FieldTypeRequiredDetails
planstringrequiredPlan identifier, e.g. "free" or "pro".
monthlyCreditAllowanceintegerrequiredCredits included with the plan each period. NOT the usable total on its own — add bonusCredits, or just read creditsRemaining.
bonusCreditsintegeroptionalOne-off credits granted on top of the plan allowance for the current period (e.g. an approved top-up request). Cleared when the period rolls over. Absent on older servers.
creditsUsedintegerrequired—
creditsRemainingintegerrequiredmonthlyCreditAllowance + bonusCredits - creditsUsed, floored at 0.
periodStartstring (date-time)required—
byokEnabledbooleanrequiredWhether the caller has a bring-your-own-key verifier configured.