Skip to content
API reference · Theses

Verify a thesis

POSThttps://fomodata.dev/v1/verify/thesis
Scopes:theses:readRate class:verifyFlag:THESES_API_ENABLED

Checks that the identity posted a thesis on the token inside the time window — and nothing else. Verification never judges thesis quality, sentiment, intelligence or accuracy.

Always 200 with verified true/false and a machine-readable reason (VERIFIED, PROFILE_NOT_FOUND, TOKEN_NOT_FOUND, NO_THESIS_IN_WINDOW, TEXT_NOT_FOUND, THESIS_DELETED). For live keys, when nothing matches and the window ended within the last 15 minutes, FomoData syncs the token's latest theses from its authorized upstream once and re-checks (freshness.served_from: live_sync). If that sync fails while the realtime feed is also down, the call returns 503 instead of a possibly-false negative.

Example request

curl -X POST 'https://fomodata.dev/v1/verify/thesis' \
  -H "Authorization: Bearer $FOMODATA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "handle": "@milo",
  "token": "$RUN",
  "chain": "robinhood",
  "created_after": "2026-10-07T10:00:00Z",
  "created_before": "2026-10-07T10:10:00Z"
}'

Request body

application/jsonVerifyThesisRequest
  • handlestringAuthor handle. Pass this or profile_id.
  • profile_idstringFomoData profile id (fp_…) or Fomo user id. Pass this or handle.
  • tokenstringrequiredToken reference ($RUN, tk_…, address, chain:address).
  • chainstringNarrows a symbol that exists on several chains.
  • created_afterstringrequiredWindow start (ISO-8601, inclusive).
  • created_beforestringWindow end (ISO-8601, inclusive). Defaults to now.
  • containsstringOptional case-insensitive substring the thesis text must contain.
Example body
{
  "handle": "@milo",
  "token": "$RUN",
  "chain": "robinhood",
  "created_after": "2026-10-07T10:00:00Z",
  "created_before": "2026-10-07T10:10:00Z"
}

Response

200 Verification result

application/jsonThesisVerification
  • objectenumrequired"thesis_verification"
  • verifiedbooleanrequired
  • profile_idstring | nullrequired
  • thesis_idstring | nullrequired
  • created_atstring (date-time) | nullrequired
  • tokenstring | nullrequired
  • checksobjectrequired+ 6 child attributes
    • identitybooleanrequired
    • tokenbooleanrequired
    • time_windowbooleanrequired
    • thesis_existsbooleanrequired
    • not_deletedbooleanrequired
    • containsboolean | nullrequired
  • reasonenumrequiredMachine-readable outcome. Verification never judges thesis quality, sentiment or accuracy."VERIFIED""PROFILE_NOT_FOUND""TOKEN_NOT_FOUND""NO_THESIS_IN_WINDOW""TEXT_NOT_FOUND""THESIS_DELETED"
  • freshnessobjectrequired+ 3 child attributes
    • checked_atstring (date-time)required
    • upstream_synced_atstring (date-time) | nullrequired
    • served_fromenumrequired"live_sync""cache"
  • livemodebooleanrequired
200 · example
{
  "object": "thesis_verification",
  "verified": true,
  "profile_id": "string",
  "thesis_id": "string",
  "created_at": "2026-10-07T10:04:12.000Z",
  "token": "$RUN",
  "checks": {
    "identity": true,
    "token": true,
    "time_window": true,
    "thesis_exists": true,
    "not_deleted": true,
    "contains": true
  },
  "reason": "VERIFIED",
  "freshness": {
    "checked_at": "2026-10-07T10:04:12.000Z",
    "upstream_synced_at": "2026-10-07T10:04:12.000Z",
    "served_from": "live_sync"
  },
  "livemode": true
}

Errors

StatusWhen
400Bad request
401Missing, invalid, revoked or expired API key
403Insufficient scope, live access not approved, or history limit
404Not found (or feature disabled)
409Conflict (e.g. ambiguous token symbol)
422Validation failed
429Rate limit or quota exceeded
503Upstream unavailable

All errors use the standard envelope. See error codes for every code value.