ProjectDetail
One project's dossier: the card, plus the long description, the newest ships, every registered source with how it was established, the market reading, the score and the on-chain activity. `score` is present only when HEY ran the pipeline: a zero there is "measured, nothing found", absent is "not measured". See https://heyresearch.xyz/docs/public-api for the reference. Absent means unknown, never zero.
Properties
| Name | Type | Description |
|---|---|---|
| slug | string | The project's slug on HEY. |
| name | string | |
| symbol | string | The tracked token's ticker, as shown. Never the identity: that is `token`. |
| shortDescription | string | |
| projectKind | string | What kind of project it is (utility, meme, infrastructure, …). |
| activityStatus | string | What HEY claims about the project's activity: `SHIPPING`, `ACTIVE`, `QUIET`, `DORMANT`, `RESUMED` or `UNKNOWN` (HEY cannot read the building — never "abandoned"). From meaningful builder activity, nev |
| researchLevel | string | How far HEY's research went. Kept for machines; public pages draw only the Verified Builder badge. |
| catalogStatus | string | The record's catalogue state (e.g. `VERIFIED_BUILDER`, `QUALIFIED`). |
| stillBuilding | boolean | v1 meaning, unchanged: the Still Building badge is held — counted ships during a market drawdown HEY tracked; not a buy signal. A false is "not held"; read `stillBuildingState` to tell "not met" from |
| stillBuildingState | object | |
| heysOwnToken | object | |
| lastShippedAt | string | The newest meaningful ship HEY counted. |
| primaryNarrative | object | The project's primary narrative. |
| token | object | |
| launchedVia | object | Where the token launched, when HEY observed the launch. Absent when unknown or independent — never a launchpad called "Unknown". |
| venue | string | The pool the current market reading came from, in words ("Uniswap v4"): where the token trades, not where it launched. |
| trades24h | object | Trades in the reading's last day, from the same provider as `marketCap`. Counts of trades, never of accounts. |
| tokenLock | object | |
| priceChange24hPct | number | The reading's 24-hour price change, in percent. Market context only. |
| hasBuilderSource | boolean | Whether HEY holds a repository, org, changelog or feed to read building from; false explains an UNKNOWN status. |
| chainEvidence | boolean | Whether HEY holds Robinhood Chain evidence for the project — a token, a verified contract, a registry listing or the chain evidence the builder surfaces filter on (2026-11-09). False is a measured "no |
| integrationRecord | boolean | The page is an integration record: published with no Robinhood Chain evidence, its ships recorded, never a Verified Builder (2026-11-09). |
| integrationRecordSentence | string | The page's own sentence for an integration record; present only when `integrationRecord` is true. |
| websiteUrl | string | |
| officialX | object | |
| logoUrl | string | The artwork the project chose. Absent where HEY does not know it; draw a monogram. |
| stillBuildingEvidence | object | The drawdown behind a `stillBuilding: true`. Absent when the claim is not being made. |
| marketCap | object | Market context only, with the provider that reported it. Never a ranking input; absent is unknown, never zero. |
| valuationWithheld | string | Why `marketCap` is absent when HEY holds a reading it will not publish: the market's reason code or status (`launch_pool_no_trades`, `readings_implausible`, `NO_LIQUIDITY`, …), or the valuation gate's |
| liquidity | object | The liquidity the project page prints. When the current reading carries none, the token's last recorded depth, dated by its own `observedAt` and with no `source`. Absent is unknown, never zero. |
| volume24h | object | The reading's 24-hour volume. Absent is unknown, never zero. |
| launchStage | string | Where the launch stands: on its curve, graduated, or trading in a DEX pool. Absent when HEY does not know. |
| tokenMarket | object | |
| tokenVerification | object | |
| url | string | The project's page on HEY. |
| longDescription | string | |
| ships | arraynull | The newest ships, as `/api/ships?project=` would list them. `null` (2026-11-08) when HEY recorded none and does not measure the project's building (activity unknown, or no builder source it reads and |
| shipsNotMeasured | object | With `ships: null` (2026-11-08, additive): why HEY cannot say none shipped. Absent whenever `ships` is a list. |
| builderSourcesUnavailable | objectnull | Every repository, changelog and feed HEY reads the project's building from stopped answering (2026-11-11, additive). Display only: after 21 days with no counted ship dated since, the activity status i |
| firstSeenAt | string | Deprecated alias kept for callers: on registry and launchpad pages it held the outside listing date. Read `firstRecordedByHeyAt`. |
| firstRecordedByHeyAt | string | When HEY first recorded the project: HEY's knowledge time, never an outside date. |
| externalListedAt | string | The date an outside registry or launchpad gives the project. Absent when HEY holds none. |
| externalListedSource | string | Which outside registry or launchpad gave `externalListedAt` (`defillama`, `virtuals`, …). |
| isClaimed | boolean | A builder proved control of the page. Proving ownership changes no status, score or order on its own. |
| submitted | boolean | The page was submitted by its builder (self-reported). |
| narratives | array | |
| sources | array | |
| market | object | |
| score | object | |
| onchainActivity | object | |
| defiTvl | object | TVL DefiLlama reports for the project's protocol on this chain. Context; never a ranking input. |
| disclaimer | string |
JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://artifacts.apis.io/heyresearch-xyz/json-schema/heyresearch-xyz-project-detail-schema.json",
"title": "ProjectDetail",
"description": "One project's dossier: the card, plus the long description, the newest ships, every registered source with how it was established, the market reading, the score and the on-chain activity. `score` is present only when HEY ran the pipeline: a zero there is \"measured, nothing found\", absent is \"not measured\". See https://heyresearch.xyz/docs/public-api for the reference. Absent means unknown, never zero.",
"x-generated": "2026-11-11",
"x-method": "derived",
"x-generator": "derive-json-schema.py",
"x-source": "openapi/heyresearch-xyz-openapi.json#/components/schemas/ProjectDetail",
"type": "object",
"additionalProperties": true,
"required": [
"slug",
"name",
"projectKind",
"activityStatus",
"researchLevel",
"catalogStatus",
"stillBuilding",
"stillBuildingState",
"url",
"ships",
"builderSourcesUnavailable",
"firstSeenAt",
"firstRecordedByHeyAt",
"isClaimed",
"submitted",
"narratives",
"sources",
"disclaimer"
],
"properties": {
"slug": {
"type": "string",
"description": "The project's slug on HEY."
},
"name": {
"type": "string"
},
"symbol": {
"type": "string",
"description": "The tracked token's ticker, as shown. Never the identity: that is `token`."
},
"shortDescription": {
"type": "string"
},
"projectKind": {
"type": "string",
"description": "What kind of project it is (utility, meme, infrastructure, …)."
},
"activityStatus": {
"type": "string",
"description": "What HEY claims about the project's activity: `SHIPPING`, `ACTIVE`, `QUIET`, `DORMANT`, `RESUMED` or `UNKNOWN` (HEY cannot read the building — never \"abandoned\"). From meaningful builder activity, never the token price. The list may grow; an unknown value is a status HEY added."
},
"researchLevel": {
"type": "string",
"description": "How far HEY's research went. Kept for machines; public pages draw only the Verified Builder badge."
},
"catalogStatus": {
"type": "string",
"description": "The record's catalogue state (e.g. `VERIFIED_BUILDER`, `QUALIFIED`)."
},
"stillBuilding": {
"type": "boolean",
"description": "v1 meaning, unchanged: the Still Building badge is held — counted ships during a market drawdown HEY tracked; not a buy signal. A false is \"not held\"; read `stillBuildingState` to tell \"not met\" from \"not measured\"."
},
"stillBuildingState": {
"$ref": "#/$defs/StillBuildingState"
},
"heysOwnToken": {
"$ref": "#/$defs/HeysOwnToken"
},
"lastShippedAt": {
"type": "string",
"format": "date-time",
"description": "The newest meaningful ship HEY counted."
},
"primaryNarrative": {
"type": "object",
"additionalProperties": true,
"description": "The project's primary narrative.",
"required": [
"slug",
"name"
],
"properties": {
"slug": {
"type": "string"
},
"name": {
"type": "string"
}
}
},
"token": {
"$ref": "#/$defs/Token"
},
"launchedVia": {
"type": "object",
"additionalProperties": true,
"description": "Where the token launched, when HEY observed the launch. Absent when unknown or independent — never a launchpad called \"Unknown\".",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"description": "The launchpad, by name."
},
"url": {
"type": "string"
}
}
},
"venue": {
"type": "string",
"description": "The pool the current market reading came from, in words (\"Uniswap v4\"): where the token trades, not where it launched."
},
"trades24h": {
"type": "object",
"additionalProperties": true,
"description": "Trades in the reading's last day, from the same provider as `marketCap`. Counts of trades, never of accounts.",
"required": [
"buys",
"sells"
],
"properties": {
"buys": {
"type": "integer",
"minimum": 0,
"description": "Buy trades in the reading's last day."
},
"sells": {
"type": "integer",
"minimum": 0,
"description": "Sell trades in the reading's last day."
},
"source": {
"type": "string",
"description": "The provider that reported the figure, under its public name."
},
"observedAt": {
"type": "string",
"format": "date-time",
"description": "When that provider's reading was taken."
}
}
},
"tokenLock": {
"$ref": "#/$defs/TokenLock"
},
"priceChange24hPct": {
"type": "number",
"description": "The reading's 24-hour price change, in percent. Market context only."
},
"hasBuilderSource": {
"type": "boolean",
"description": "Whether HEY holds a repository, org, changelog or feed to read building from; false explains an UNKNOWN status."
},
"chainEvidence": {
"type": "boolean",
"description": "Whether HEY holds Robinhood Chain evidence for the project — a token, a verified contract, a registry listing or the chain evidence the builder surfaces filter on (2026-11-09). False is a measured \"none\": such a project is never counted among Robinhood Chain builders."
},
"integrationRecord": {
"type": "boolean",
"description": "The page is an integration record: published with no Robinhood Chain evidence, its ships recorded, never a Verified Builder (2026-11-09)."
},
"integrationRecordSentence": {
"type": "string",
"description": "The page's own sentence for an integration record; present only when `integrationRecord` is true."
},
"websiteUrl": {
"type": "string"
},
"officialX": {
"$ref": "#/$defs/OfficialX"
},
"logoUrl": {
"type": "string",
"description": "The artwork the project chose. Absent where HEY does not know it; draw a monogram."
},
"stillBuildingEvidence": {
"type": "object",
"additionalProperties": true,
"description": "The drawdown behind a `stillBuilding: true`. Absent when the claim is not being made.",
"required": [
"drawdownPercent"
],
"properties": {
"drawdownPercent": {
"type": "number",
"description": "The decline HEY tracked, in percent."
},
"shipsSinceDecline": {
"type": "integer",
"minimum": 0,
"description": "Counted ships since the decline began."
}
}
},
"marketCap": {
"type": "object",
"additionalProperties": true,
"description": "Market context only, with the provider that reported it. Never a ranking input; absent is unknown, never zero.",
"required": [
"usd",
"source"
],
"properties": {
"usd": {
"type": "number",
"description": "The valuation in USD."
},
"source": {
"type": "string",
"description": "The provider that reported the figure, under its public name."
},
"observedAt": {
"type": "string",
"format": "date-time",
"description": "When that provider's reading was taken."
},
"kind": {
"type": "string",
"enum": [
"marketCap",
"fdv"
],
"description": "`fdv` when the provider reported no circulating figure and the fully diluted valuation stands in."
}
}
},
"valuationWithheld": {
"type": "string",
"description": "Why `marketCap` is absent when HEY holds a reading it will not publish: the market's reason code or status (`launch_pool_no_trades`, `readings_implausible`, `NO_LIQUIDITY`, …), or the valuation gate's reason (`valuation_over_liquidity`, `unlisted_over_ceiling`, `chain_evidence_contradicts`, `sources_disagree`, and since 2026-11-09 `quote_side_thin`). Absent when HEY holds no reading at all."
},
"liquidity": {
"type": "object",
"additionalProperties": true,
"description": "The liquidity the project page prints. When the current reading carries none, the token's last recorded depth, dated by its own `observedAt` and with no `source`. Absent is unknown, never zero.",
"required": [
"usd",
"kind"
],
"properties": {
"usd": {
"type": "number",
"description": "Liquidity in USD."
},
"source": {
"type": "string",
"description": "The provider that reported the figure, under its public name."
},
"observedAt": {
"type": "string",
"format": "date-time",
"description": "When that provider's reading was taken."
},
"kind": {
"type": "string",
"enum": [
"market",
"launch_inventory"
],
"description": "`market` is depth a trader could use; `launch_inventory` is a launch pool's own supply at its last price (\"Not a market reading\")."
}
}
},
"volume24h": {
"type": "object",
"additionalProperties": true,
"description": "The reading's 24-hour volume. Absent is unknown, never zero.",
"required": [
"usd"
],
"properties": {
"usd": {
"type": "number",
"description": "Volume in USD."
},
"source": {
"type": "string",
"description": "The provider that reported the figure, under its public name."
},
"observedAt": {
"type": "string",
"format": "date-time",
"description": "When that provider's reading was taken."
}
}
},
"launchStage": {
"type": "string",
"enum": [
"CURVE",
"GRADUATED",
"DEX"
],
"description": "Where the launch stands: on its curve, graduated, or trading in a DEX pool. Absent when HEY does not know."
},
"tokenMarket": {
"$ref": "#/$defs/TokenMarketDetail"
},
"tokenVerification": {
"$ref": "#/$defs/TokenVerification"
},
"url": {
"type": "string",
"description": "The project's page on HEY."
},
"longDescription": {
"type": "string"
},
"ships": {
"type": [
"array",
"null"
],
"items": {
"$ref": "#/$defs/Ship"
},
"description": "The newest ships, as `/api/ships?project=` would list them. `null` (2026-11-08) when HEY recorded none and does not measure the project's building (activity unknown, or no builder source it reads and no counted ship), so it cannot say none shipped; `shipsNotMeasured` says why. `[]` is a measured none."
},
"shipsNotMeasured": {
"type": "object",
"additionalProperties": true,
"description": "With `ships: null` (2026-11-08, additive): why HEY cannot say none shipped. Absent whenever `ships` is a list.",
"required": [
"reason",
"text"
],
"properties": {
"reason": {
"type": "string",
"enum": [
"activity_not_measured"
],
"description": "Why `ships` is null."
},
"text": {
"type": "string",
"description": "The reason in one sentence."
}
}
},
"builderSourcesUnavailable": {
"type": [
"object",
"null"
],
"additionalProperties": true,
"description": "Every repository, changelog and feed HEY reads the project's building from stopped answering (2026-11-11, additive). Display only: after 21 days with no counted ship dated since, the activity status is UNKNOWN (hbm-v37). `null` when it does not hold.",
"required": [
"since",
"sourceCount",
"line"
],
"properties": {
"since": {
"type": "string",
"format": "date-time",
"description": "The day the last builder source went dark: the newest date HEY marked one unavailable."
},
"sourceCount": {
"type": "integer",
"minimum": 1,
"description": "How many own builder sources (repositories, changelogs, feeds) are unavailable."
},
"line": {
"type": "string",
"description": "The one dated sentence HEY prints for it, with the liquidity fact when the tracked token's market reads liquidity gone. It says what HEY read, never why."
}
}
},
"firstSeenAt": {
"type": "string",
"format": "date-time",
"description": "Deprecated alias kept for callers: on registry and launchpad pages it held the outside listing date. Read `firstRecordedByHeyAt`."
},
"firstRecordedByHeyAt": {
"type": "string",
"format": "date-time",
"description": "When HEY first recorded the project: HEY's knowledge time, never an outside date."
},
"externalListedAt": {
"type": "string",
"format": "date-time",
"description": "The date an outside registry or launchpad gives the project. Absent when HEY holds none."
},
"externalListedSource": {
"type": "string",
"description": "Which outside registry or launchpad gave `externalListedAt` (`defillama`, `virtuals`, …)."
},
"isClaimed": {
"type": "boolean",
"description": "A builder proved control of the page. Proving ownership changes no status, score or order on its own."
},
"submitted": {
"type": "boolean",
"description": "The page was submitted by its builder (self-reported)."
},
"narratives": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": true,
"description": "A narrative the project sits in.",
"required": [
"slug",
"name",
"isPrimary"
],
"properties": {
"slug": {
"type": "string"
},
"name": {
"type": "string"
},
"isPrimary": {
"type": "boolean"
}
}
}
},
"sources": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": true,
"description": "A registered source and how it was established.",
"required": [
"id",
"url",
"sourceType",
"isVerified",
"confidence",
"contextOnly"
],
"properties": {
"id": {
"type": "string",
"description": "The source's typed evidence id, `source:<uuid>`, which `/api/evidence/{id}` resolves."
},
"url": {
"type": "string"
},
"sourceType": {
"type": "string",
"description": "`GITHUB_REPO`, `WEBSITE`, `X`, `CHANGELOG`, …"
},
"isVerified": {
"type": "boolean",
"description": "Stored value: HEY checked the source (pages say \"Checked by HEY\")."
},
"confidence": {
"type": "string",
"description": "How the source was established (`OFFICIAL`, `AUTHORITATIVE_LINK`, `DISCOVERED`, …)."
},
"contextOnly": {
"type": "boolean",
"description": "The source is shown as context and counts toward nothing."
},
"contextReason": {
"type": "string",
"description": "The quality gate's stored reason the source is context only."
},
"contextWords": {
"type": "string",
"description": "On a context-only source, why it is held and what would make it count, in one sentence."
}
}
}
},
"market": {
"$ref": "#/$defs/ProjectMarketReading"
},
"score": {
"$ref": "#/$defs/ProjectScore"
},
"onchainActivity": {
"$ref": "#/$defs/OnchainActivity"
},
"defiTvl": {
"type": "object",
"additionalProperties": true,
"description": "TVL DefiLlama reports for the project's protocol on this chain. Context; never a ranking input.",
"required": [
"tvlUsd",
"protocol",
"protocolName",
"matchedBy",
"source",
"observedAt"
],
"properties": {
"tvlUsd": {
"type": "number",
"description": "Value locked in USD, as DefiLlama reports it on this chain."
},
"protocol": {
"type": "string",
"description": "DefiLlama's protocol slug."
},
"protocolName": {
"type": "string"
},
"matchedBy": {
"type": "string",
"description": "How HEY matched the protocol to the project."
},
"source": {
"type": "string",
"const": "defillama"
},
"observedAt": {
"type": "string",
"format": "date-time",
"description": "When that provider's reading was taken."
}
}
},
"disclaimer": {
"type": "string"
}
},
"$defs": {
"CodeSubstance": {
"type": "object",
"additionalProperties": true,
"description": "What a week of code activity changed. The counts are FACTs about the commits HEY read. Absent on every other ship and on a week HEY never evaluated — never a zero.",
"required": [
"verdict",
"classifierVersion",
"countsAsBuilding",
"commitsListed",
"commitsRead",
"changedCode",
"documentationOrMaintenance",
"substanceUnknown",
"notRead",
"files",
"weekFullyListed",
"automatedCommits",
"sampled",
"basis",
"summary"
],
"properties": {
"verdict": {
"type": "string",
"enum": [
"SUBSTANTIVE",
"LOW_INFORMATION",
"UNKNOWN"
],
"description": "DERIVED by `classifierVersion`. `LOW_INFORMATION` (documentation or maintenance only) is kept on the record and does not count as building; `UNKNOWN` (not read in full yet) counts as before."
},
"classifierVersion": {
"type": "string"
},
"countsAsBuilding": {
"type": "boolean"
},
"commitsListed": {
"type": "integer",
"minimum": 0,
"description": "Human, non-merge commits of the week HEY holds."
},
"commitsRead": {
"type": "integer",
"minimum": 0,
"description": "Of those, read and classified."
},
"changedCode": {
"type": "integer",
"minimum": 0,
"description": "Commits read as changing code."
},
"documentationOrMaintenance": {
"type": "integer",
"minimum": 0,
"description": "Commits read as documentation or maintenance only."
},
"substanceUnknown": {
"type": "integer",
"minimum": 0,
"description": "Commits read whose changes could not be placed."
},
"notRead": {
"type": "integer",
"minimum": 0,
"description": "Not read: waiting, or not needed once one commit had changed code."
},
"files": {
"type": "object",
"additionalProperties": true,
"description": "Changed files by class, over the commits read.",
"required": [
"source",
"test",
"docs",
"readme",
"dependency",
"config",
"ci",
"generated",
"asset",
"whitespace",
"rename",
"data",
"unknown"
],
"properties": {
"source": {
"type": "integer"
},
"test": {
"type": "integer"
},
"docs": {
"type": "integer"
},
"readme": {
"type": "integer"
},
"dependency": {
"type": "integer"
},
"config": {
"type": "integer"
},
"ci": {
"type": "integer"
},
"generated": {
"type": "integer"
},
"asset": {
"type": "integer"
},
"whitespace": {
"type": "integer"
},
"rename": {
"type": "integer"
},
"data": {
"type": "integer"
},
"unknown": {
"type": "integer"
}
}
},
"weekFullyListed": {
"type": "boolean",
"description": "Every commit of the week was on a page HEY read."
},
"automatedCommits": {
"type": "integer",
"minimum": 0,
"description": "Bot or automated-stream commits HEY holds for the week, never counted."
},
"sampled": {
"type": "boolean",
"description": "The verdict rests on a sample of a burst week."
},
"basis": {
"type": [
"string",
"null"
],
"enum": [
"all_read",
"burst_sample",
"automated_only",
null
],
"description": "What a LOW_INFORMATION verdict rests on; null otherwise."
},
"summary": {
"type": "string",
"description": "One plain sentence, as the page says it."
}
}
},
"CodeWeek": {
"type": "object",
"additionalProperties": true,
"description": "A code week by its fixed Monday–Sunday UTC window. Absent on every other ship.",
"required": [
"isoWeek",
"start",
"end",
"repository",
"commits",
"commitsAtLeast",
"highlights",
"title",
"complete"
],
"properties": {
"isoWeek": {
"type": "string",
"description": "The ISO week key, `2026-w40`."
},
"start": {
"type": "string",
"format": "date-time",
"description": "Monday 00:00 UTC, inclusive."
},
"end": {
"type": "string",
"format": "date-time",
"description": "The next Monday 00:00 UTC, exclusive."
},
"repository": {
"type": "string",
"description": "`owner/repo`."
},
"commits": {
"type": [
"integer",
"null"
],
"minimum": 0,
"description": "Human, non-merge commits HEY counted in the week; null when it holds no count."
},
"commitsAtLeast": {
"type": "boolean",
"description": "The count is a floor: the page HEY read stopped inside the week."
},
"commitsUrl": {
"type": "string",
"description": "The week’s commits on GitHub."
},
"highlights": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": true,
"description": "A commit of the week.",
"required": [
"subject",
"sha",
"committedAt",
"readAsCode"
],
"properties": {
"subject": {
"type": "string"
},
"sha": {
"type": "string"
},
"committedAt": {
"type": "string",
"format": "date-time",
"description": "When the commit was made."
},
"readAsCode": {
"type": "boolean",
"description": "HEY read the commit as changing code; false = not read yet."
},
"url": {
"type": "string"
}
}
},
"description": "Up to three commits, those HEY read as changing code first; never a bot’s, a merge’s or a documentation-only one."
},
"title": {
"type": "string",
"description": "The one display title every HEY surface prints for the week."
},
"complete": {
"type": "boolean",
"description": "Whether the week had ended when the response was made: false while `end` is still ahead."
}
}
},
"DiscoveryGapWithheld": {
"type": "string",
"enum": [
"no_token",
"market_not_live",
"token_not_the_projects",
"market_too_thin",
"active_pool_not_read",
"no_market_reading",
"no_build_momentum",
"activity_unknown"
],
"description": "Why a project has no Discovery Gap (hbm-v18): it is not measured, and this says why — never a zero. `market_too_thin`: the tracked token's market is not ACTIVE_MARKET (low liquidity, no trades in a day, insufficient data), is only a launch curve, or is ACTIVE_MARKET only as a launch pool (`launch_pool_trading`, \"Launch pool only\", hbm-v22), or (hbm-v31, 2026-10-18) its reading carries less than $1,000 of 24-hour volume, so a gap would measure the thin market, not the building. `activity_unknown` (hbm-v27, 2026-10-12): HEY cannot read the project's building (activity status UNKNOWN), so there is no building to set against the market. `active_pool_not_read` (hbm-v21): the market is active only because another pool of the same token holds the liquidity, and HEY holds no current reading of that pool — a rescued market is measured on that pool's reading, never on the token's own thin pool. Absent beside a gap, and on a score written before hbm-v18. The list may grow; an unknown value means not measured."
},
"HeysOwnToken": {
"type": "boolean",
"enum": [
true
],
"description": "`true` on `$HEY`, HEY's own token, and absent on every other project (2026-09-30, additive). Show \"HEY’s own token — researched by the same rules\" beside it. HEY researches it by the same rules as every project: no ranking bonus and no demotion, and the flag is set after a page is ordered."
},
"OfficialX": {
"type": "object",
"additionalProperties": true,
"description": "The project’s official X account (additive fields 2026-10-18). The state is read through twitterapi.io, an independent provider not affiliated with X — an account last read active daily by its stable id (since 2026-10-18), any other about weekly by handle: identity context only, never an input to the activity status or a score. Since the founder’s 2026-10-18 rulings an account read as SUSPENDED or NOT_FOUND no longer counts toward `has=x` or a card’s completeness; UNAVAILABLE and unread accounts still do.",
"required": [
"handle",
"url",
"status",
"checkedAt",
"linkHeld",
"corroboration",
"corroborationCheckedAt",
"foundByHey"
],
"properties": {
"handle": {
"type": "string",
"description": "v1 meaning, unchanged: the X account the project’s own sources vouch for."
},
"url": {
"type": "string",
"description": "v1 meaning, unchanged: that account’s address on x.com."
},
"status": {
"type": [
"string",
"null"
],
"enum": [
"ACTIVE",
"SUSPENDED",
"UNAVAILABLE",
"NOT_FOUND",
null
],
"description": "Additive (2026-10-18): what HEY’s last read of the account found. Null when HEY holds no read of this handle — `statusReason` says why — never a default. Do not link an account whose status is SUSPENDED or NOT_FOUND."
},
"statusReason": {
"type": "string",
"enum": [
"not_read",
"read_failed"
],
"description": "Sent only with `status: null`."
},
"checkedAt": {
"type": [
"string",
"null"
],
"format": "date-time",
"description": "When that read was made (ISO 8601); null when no read answered."
},
"linkHeld": {
"type": [
"string",
"null"
],
"enum": [
"handle_reassigned",
"links_other_project",
"not_the_project",
"copied_pair",
"account_of_another_page",
null
],
"description": "Additive (2026-10-18, founder ruling): `handle_reassigned` when the handle now answers for a different X account than the one HEY first read. HEY holds the link — its pages print a dated line instead — until a moderator confirms the new account. `links_other_project` (additive, 2026-10-18) when the account’s own profile links another published project’s site and not this project’s: the handle is that project’s account. `not_the_project` (additive, 2026-10-19) when a moderator held the account as not the project’s. `copied_pair` (additive, 2026-11-09) when HEY holds a borrowed account copied onto the page with its listing or launch: a named brand’s, a famous host’s, or an organisation-verified account a year older than a launchpad token HEY has not verified. `account_of_another_page` (additive, 2026-11-09) when another published page shows the same active account and stands behind it (a VERIFIED token or the account linking its site back) while this page has neither. Do not link any of them. Null otherwise."
},
"corroboration": {
"type": [
"string",
"null"
],
"enum": [
"mutual_site_link",
null
],
"description": "Additive (2026-10-18, founder ruling): `mutual_site_link` when the account’s own profile links the project’s own site (`websiteUrl`), the site that links the account — trust in the X account itself as the project’s own, and nothing else: no source confidence, indexing, status, score, order or publication reads it. Null when it does not hold or HEY cannot say."
},
"corroborationCheckedAt": {
"type": [
"string",
"null"
],
"format": "date-time",
"description": "Additive (2026-10-18): the read that found the mutual link (ISO 8601); null when `corroboration` is null."
},
"foundByHey": {
"type": "boolean",
"description": "Additive (2026-10-19): true when HEY found the account by the project’s name — its profile links the project’s site, but the project’s own pages do not name it — and no person has verified it yet. Such an account is never a mutual link, its posts are not shown and it is never tagged."
}
}
},
"OnchainActivity": {
"type": "object",
"additionalProperties": true,
"description": "Events the token contract emitted, as HEY last read them from the chain. Counts, never accounts. Context; never a ranking input.",
"required": [
"daysCovered",
"daysMeasured",
"truncated",
"observedAt"
],
"properties": {
"events24h": {
"type": "integer",
"minimum": 0,
"description": "Events the token contract emitted on `eventsDay`. Absent when HEY could not read the contract’s events on any day in the window — a gap in what HEY can read, not a quiet contract. A present 0 is a day HEY read and found none."
},
"eventsDay": {
"type": "string",
"format": "date",
"description": "The UTC day `events24h` counts (2026-10-22, additive): the newest day HEY read, never a rolling 24 hours, and not current when `observedAt` is old. Absent with `events24h`."
},
"partialDay": {
"type": "object",
"additionalPropertie
# --- truncated at 32 KB (65 KB total) ---
# Full source: https://artifacts.apis.io/heyresearch-xyz/json-schema/heyresearch-xyz-project-detail-schema.json
Work with this as data
Every JSON Schema here is available over the APIs.io API and to AI agents over MCP.
MCP server
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
Tools for schemas
4 MCP tools reach this
find_json_schemasBrowse and filter every JSON Schema in the catalog.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.
Call it yourself
curl for this page
curl "https://apis.io/api/v1/json-schemas/heyresearch-xyz-project-detail"
curl "https://apis.io/api/v1/json-schemas?limit=25"
Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.
Get an API key
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.