Create a test thesis
POST
https://fomodata.dev /v1 /test /thesesTest keys only (live keys get 400 TEST_MODE_ONLY). Creates a sandbox thesis visible only to your project and emits a labelled thesis.created event (livemode: false, source: "sandbox", test: true) to your project's test-mode webhooks and streams. Use it to exercise your integration end to end; it is never real Fomo activity.
Example request
curl -X POST 'https://fomodata.dev/v1/test/theses' \
-H "Authorization: Bearer $FOMODATA_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"handle": "@sbx_milo",
"token": "$RUN",
"text": "Testing my race-entry webhook."
}'Request body
application/jsonTestThesisRequest
handlestringrequiredAuthor handle for the test thesis.tokenstringrequiredSandbox token:$RUN,$SEEK,$RACE,$TAG,$ART,$CRAFT, or any new symbol (created as a test token for your project).textstringrequired
Example bodyJSON
{
"handle": "@sbx_milo",
"token": "$RUN",
"text": "Testing my race-entry webhook."
}Response
201 The test thesis and its event
application/jsonTestThesisResult
objectenumrequired"test_thesis"thesisobjectrequired+ 12 child attributesobjectenumrequired"thesis"idstringrequiredprofileobjectrequired+ 4 child attributesidstringrequiredhandlestringrequireddisplay_namestring | nullrequiredavatar_urlstring (uri) | nullrequired
tokenobjectrequired+ 5 child attributesidstringrequiredsymbolstringrequirednamestring | nullrequiredchainstringrequiredaddressstringrequired
textstringrequiredpublic_urlstring (uri) | nullrequiredFomo exposes no public per-thesis permalink today, so this is null unless one becomes available.likesinteger | nullrequiredrepliesinteger | nullrequiredcreated_atstring (date-time)requiredupdated_atstring (date-time)requiredsourceenumrequiredWhere the data came from.sandbox= clearly-labelled test fixtures."fomo""sandbox"livemodebooleanrequired
eventobjectrequired+ 8 child attributesobjectenumrequired"event"idstringrequiredtypeenumrequired"thesis.created""profile.updated""token.activity""token.thesis_velocity"created_atstring (date-time)requiredlivemodebooleanrequiredsourceenumrequiredfomodata= derived by FomoData from authorized upstream events (activity, velocity)."fomo""sandbox""fomodata"testbooleantrue for dashboard/API-generated test events (never real Fomo activity).dataThesisCreatedData | ProfileUpdatedData | TokenActivityData | ThesisVelocityDatarequired
201 · exampleJSON
{
"object": "test_thesis",
"thesis": {
"object": "thesis",
"id": "th_7Hq2LmZx9RkT4bVn0sYc3D",
"profile": {
"id": "fp_4KZq8mXw2T0aN6rB1cYd9E",
"handle": "@milo",
"display_name": "Milo",
"avatar_url": "https://example.com"
},
"token": {
"id": "tk_9bF2kLmQ0sVx7RtY3nHc1A",
"symbol": "$RUN",
"name": "Run",
"chain": "robinhood",
"address": "0x5a4d1f3c0f6e2b8d9a7c4e1f0b3d6a9c2e5f8a1b"
},
"text": "Course looks fast today. Running it back.",
"public_url": "https://example.com",
"likes": 0,
"replies": 0,
"created_at": "2026-10-07T10:04:12.000Z",
"updated_at": "2026-10-07T10:04:12.000Z",
"source": "fomo",
"livemode": true
},
"event": {
"object": "event",
"id": "evt_2Nf8QpLx0VbT6mRz4kWc1S",
"type": "thesis.created",
"created_at": "2026-10-07T10:04:12.000Z",
"livemode": true,
"source": "fomo",
"test": true,
"data": {
"thesis_id": "string",
"profile": {
"id": "fp_4KZq8mXw2T0aN6rB1cYd9E",
"handle": "@milo",
"display_name": "Milo",
"avatar_url": "https://example.com"
},
"token": {
"id": "tk_9bF2kLmQ0sVx7RtY3nHc1A",
"symbol": "$RUN",
"name": "Run",
"chain": "robinhood",
"address": "0x5a4d1f3c0f6e2b8d9a7c4e1f0b3d6a9c2e5f8a1b"
},
"text": "string",
"created_at": "2026-10-07T10:04:12.000Z",
"public_url": "https://example.com"
}
}
}Errors
| Status | When |
|---|---|
400 | Bad request |
401 | Missing, invalid, revoked or expired API key |
403 | Insufficient scope, live access not approved, or history limit |
404 | Not found (or feature disabled) |
409 | Conflict (e.g. ambiguous token symbol) |
422 | Validation failed |
429 | Rate limit or quota exceeded |
All errors use the standard envelope. See error codes for every code value.