Skip to content

DevelopersPartners

Add builder intelligence to your product in one call.

Your product already shows the market. One call adds the other half: whether anyone is building the project behind a token, what they last shipped, and a link to the evidence. No key needed, no provider call on HEY’s side, and nothing in it is a buy or sell signal.

The call

GET /api/v1/builder?chain=4663&token=0x…

curl -H "x-hey-integration: my-bot/1.0.0" "https://heyresearch.xyz/api/v1/builder?chain=4663&token=0xb33eb16782776b4d738c0fd643577cb0284db610"
Auth
None; a key lifts limits
Limit
120 / min, more keyed
Cache
60 seconds
CORS
Open

Live

What one call returns

Hey Research Lab, read from HEY’s database as this page loaded — the same answer your call gets. An example chosen by its most recent verified ship, not a recommendation.

Builder intelligence Powered by HEY

Hey Research Lab

ShippingVerified builder
Latest
Active development: 100+ commits since 2026-09-17 across 1 contributor · 1h ago
30 days
5 meaningful ships
Changed
Active development: 100+ commits since 2026-09-17 across 1 contributor · 1h ago
Evidence →

Scored 43m ago. Not a rating and not a price signal.

The JSON behind it
{
  "contract_address": "0xb33eb16782776b4d738c0fd643577cb0284db610",
  "chain_id": 4663,
  "last_activity_at": "2026-09-29T21:59:16.000Z",
  "status": "active",
  "token_verification": "VERIFIED",
  "activity_applies_to_token": true,
  "hey_project_url": "https://heyresearch.xyz/project/hey-research-lab",
  "repo_url": "https://github.com/hey-research-lab/hey-research-open",
  "last_commit": null,
  "last_code_activity": {
    "summary": "Active development: 100+ commits since 2026-09-17 across 1 contributor",
    "commits": 100,
    "commits_partial": true,
    "commits_30d": 186,
    "commits_30d_partial": true,
    "window_start": "2026-08-30T23:05:35.599Z",
    "active_days": 13,
    "contributors": 1,
    "repo_url": "https://github.com/hey-research-lab/hey-research-open",
    "observed_at": "2026-09-29T21:59:16.000Z"
  },
  "latest_release": {
    "title": "v0.1.0",
    "version": "v0.1.0",
    "url": "https://github.com/hey-research-lab/hey-research-open/releases/tag/v0.1.0",
    "timestamp": "2026-09-11T09:03:12.000Z"
  },
  "latest_deployment": null,
  "research_level": "VERIFIED_BUILDER",
  "activity_measured": true,
  "as_of": "2026-09-29T22:21:56.101Z",
  "verified_builder": true,
  "latest_meaningful_ship": {
    "title": "Active development: 100+ commits since 2026-09-17 across 1 contributor",
    "url": "https://github.com/hey-research-lab/hey-research-open",
    "timestamp": "2026-09-29T21:59:16.000Z",
    "kind": "CODE_ACTIVITY",
    "evidence_id": "ship:b0abe7b6-5a88-43b9-a497-bd207446c201"
  },
  "meaningful_ships_30d": 5,
  "latest_change": {
    "id": "ship:b0abe7b6-5a88-43b9-a497-bd207446c201",
    "type": "build.code_activity",
    "summary": "Active development: 100+ commits since 2026-09-17 across 1 contributor",
    "occurred_at": "2026-09-29T21:59:16.000Z",
    "precision": "WEEK",
    "detected_at": "2026-09-28T10:50:14.573Z",
    "evidence_id": "ship:b0abe7b6-5a88-43b9-a497-bd207446c201",
    "url": "https://heyresearch.xyz/api/evidence/ship%3Ab0abe7b6-5a88-43b9-a497-bd207446c201"
  },
  "latest_change_state": "recorded",
  "latest_signal": {
    "id": "f5334739-4d4d-47ce-b740-87784205eff7",
    "kind": "release_published",
    "label": "Release published",
    "headline": "v0.1.0",
    "observed_at": "2026-09-11T09:03:12.000Z",
    "evidence_id": "signal:f5334739-4d4d-47ce-b740-87784205eff7",
    "url": "https://heyresearch.xyz/signals/f5334739-4d4d-47ce-b740-87784205eff7"
  },
  "market_status": {
    "status": "ACTIVE_MARKET",
    "observed_at": "2026-09-29T23:03:34.241Z"
  },
  "badge_url": "https://heyresearch.xyz/badge/hey-research-lab.svg",
  "project_link": "https://heyresearch.xyz/project/hey-research-lab?utm_source=hey_api&utm_medium=partner_api&utm_campaign=builder_card",
  "hey_status": "SHIPPING",
  "hey_status_label": "Shipping",
  "hey_status_help": "Shipped something meaningful in the last 7 days.",
  "hey_project_name": "Hey Research Lab",
  "disclaimer": "HEY reports what a team shipped and how it knows. It is not a rating, not a verdict, and says nothing about what a token will do."
}

The Partner Card

Eight facts, each one HEY can back

Every partner card can show these. Anything HEY does not hold is an explicit null or a stated state, never a zero.

  • Builder status

    hey_status_label, hey_status, status, activity_measured

    Print hey_status_label. When activity_measured is false, say HEY has not measured building yet.

  • Verified builder

    verified_builder

    Show “Verified builder” when true; show nothing when false.

  • Latest meaningful ship

    latest_meaningful_ship

    title · relative time of timestamp; link url when present. Nothing when null.

  • Ships / 30d

    meaningful_ships_30d

    “N meaningful ships / 30d”. When null, print nothing — never “0 ships”.

  • Latest change

    latest_change, latest_change_state

    summary · relative time of occurred_at (else detected_at, “observed”); link url. When unavailable, print nothing.

  • Project URL

    project_link, hey_project_url

    Always link project_link: the one condition of use.

  • Badge

    badge_url

    An SVG image; optional.

  • Freshness

    as_of, last_activity_at

    “Scored <relative as_of>”. Cache for 60 seconds at most; HEY’s edge already does.

Every field, its type and its unknown
contract_address

string · since 2026-09-20

The contract asked about, lower-cased.
chain_id

integer · since 2026-09-20

The chain HEY indexes: Robinhood Chain, 4663.
status

string · since 2026-09-20

active, stale, dormant or unknown. There is no abandoned: HEY sees silence, not intent.Unknown: unknown: not enough public sources to say either way.
hey_status

string · since 2026-09-20

HEY’s own activity status: SHIPPING, ACTIVE, RESUMED, QUIET, DORMANT or UNKNOWN. Derived from what the project ships, never from price.
hey_status_label

string · since 2026-09-20

The status in HEY’s words. Print this rather than a word of your own.
hey_status_help

string · since 2026-09-20

One sentence explaining the status.
hey_project_name

string · since 2026-09-26

The project’s name as HEY publishes it.
hey_project_url

string · since 2026-09-20

The canonical project page, without labels.
project_link

string · since 2026-09-30

The project page with HEY’s attribution labels (utm_medium=partner_api, utm_source = your declared integration or hey_api). Link this one.
token_verification

string · since 2026-09-25

VERIFIED, UNVERIFIED or MISMATCH: whether the project itself names this contract.
activity_applies_to_token

boolean · since 2026-09-27

False exactly on MISMATCH: then print the activity as the project’s, never as this token’s, and do not link the token to the project.
verified_builder

boolean · since 2026-09-30

HEY verified the project as a builder, source by source (the badge the project page shows).
research_level

string · since 2026-09-26

INDEXED, RESEARCHED or VERIFIED_BUILDER: how far HEY’s research went.
activity_measured

boolean · since 2026-09-26

Whether HEY measured this project’s building at all. False means an unknown status is not a finding.
last_activity_at

string | null · since 2026-09-20

The project’s most recent meaningful activity HEY recorded (ISO 8601).Unknown: null when HEY holds none.
latest_meaningful_ship

object | null · since 2026-09-30

The newest ship HEY counts as building evidence now: title, url, timestamp, kind and its ship: evidence id.Unknown: null when HEY holds none.
meaningful_ships_30d

integer | null · since 2026-09-30

Meaningful ships in thirty days by the rule behind the status: a week of prereleases or code summaries counts once.Unknown: null — never 0 — when HEY did not measure building and holds none.
latest_change

object | null · since 2026-09-30

The newest builder-side event in HEY’s change ledger: id, type, summary, occurred_at, precision, detected_at, evidence_id, url. Only the builder story: market, usage, coverage and narrative events are left out.Unknown: null; latest_change_state says whether none was recorded or the ledger could not answer.
latest_change_state

string · since 2026-09-30

recorded, none_recorded or unavailable.Unknown: unavailable: the ledger has not run or could not be read — unknown, not none.
latest_signal

object | null · since 2026-09-30

The newest standing HEY Signal about building, contracts, launch or research, with its signal: evidence id. Market-group and address-count kinds are left out.Unknown: null when none stands.
repo_url

string | null · since 2026-09-20

A repository HEY counts as the project’s own evidence.Unknown: null when HEY counts none.
last_commit

null · since 2026-09-20

Always null: HEY aggregates commits into weekly summaries and stores no SHA. Read last_code_activity.
last_code_activity

object | null · since 2026-09-20

The newest weekly code summary, with commits_30d counted like the scan card’s.Unknown: null when HEY holds none.
latest_release

object | null · since 2026-09-20

The newest counted release: title, version, url, timestamp.Unknown: null when HEY holds none.
latest_deployment

object | null · since 2026-09-20

The newest counted post-launch deployment or upgrade. A launch itself is not a ship.Unknown: null when HEY holds none.
market_status

object · since 2026-09-30

This token’s market state (status, observed_at): context only, never a builder input and never a direction.Unknown: INSUFFICIENT_DATA with observed_at: null — not measured, not zero.
badge_url

string · since 2026-09-30

The project’s README badge (SVG).
as_of

string | null · since 2026-09-26

When HEY last scored the project: the moment the status and counts describe.Unknown: null when never scored.
disclaimer

string · since 2026-09-20

HEY reports what a team shipped and how it knows; not a rating, not a verdict.

Examples

Eight products, one call

Plain JavaScript you can paste. Each one is run by HEY’s test suite against the card’s real shape, so the code below is the code that was tested.

Telegram bot

A reply when someone pastes a contract into a chat, with one Evidence button.

const HEY = 'https://heyresearch.xyz';

// Returns a sendMessage payload, or null to stay quiet.
async function heyTelegramReply(token) {
  const r = await fetch(`${HEY}/api/v1/builder?chain=4663&token=${token}`, {
    headers: { 'x-hey-integration': 'my-telegram-bot/1.0.0' },
  });
  if (!r.ok) return null; // 404: HEY has no page · 400: not a token · 429/5xx: stay quiet
  const c = await r.json();

  const lines = [c.hey_project_name];
  if (!c.activity_applies_to_token) {
    lines.push("The project's own site names another contract. HEY's research is about the project, not this token.");
    return { text: lines.join('\n') };
  }
  lines.push('Builder: ' + c.hey_status_label + (c.verified_builder ? ' · Verified builder' : ''));
  if (c.latest_meaningful_ship) lines.push('Latest: ' + c.latest_meaningful_ship.title + ' · ' + ago(c.latest_meaningful_ship.timestamp));
  if (c.meaningful_ships_30d !== null) lines.push('30d: ' + c.meaningful_ships_30d + ' meaningful ships');
  return {
    text: lines.join('\n'),
    reply_markup: { inline_keyboard: [[{ text: 'Evidence on HEY', url: c.project_link }]] },
  };
}

function ago(iso) {
  const h = Math.floor((Date.now() - Date.parse(iso)) / 3600000);
  return h < 24 ? h + 'h ago' : Math.floor(h / 24) + 'd ago';
}

Discord bot

An embed for a token lookup command.

const HEY = 'https://heyresearch.xyz';

// Returns a Discord embed, or null to stay quiet.
async function heyDiscordEmbed(token) {
  const r = await fetch(`${HEY}/api/v1/builder?chain=4663&token=${token}`, {
    headers: { 'x-hey-integration': 'my-discord-bot/1.0.0' },
  });
  if (!r.ok) return null;
  const c = await r.json();
  if (!c.activity_applies_to_token) return null; // the activity is the project's, not this token's

  const fields = [{ name: 'Builder', value: c.hey_status_label + (c.verified_builder ? ' · Verified builder' : ''), inline: true }];
  if (c.meaningful_ships_30d !== null) fields.push({ name: 'Meaningful ships, 30d', value: String(c.meaningful_ships_30d), inline: true });
  if (c.latest_meaningful_ship) fields.push({ name: 'Latest ship', value: c.latest_meaningful_ship.title.slice(0, 200) });
  if (c.latest_change) fields.push({ name: 'Latest change', value: c.latest_change.summary.slice(0, 200) });
  return {
    title: c.hey_project_name,
    url: c.project_link,
    description: c.hey_status_help,
    fields,
    footer: { text: 'Builder intelligence by HEY Research Lab. Not a rating.' },
    timestamp: c.as_of ?? undefined,
  };
}

Trading terminal

A side panel beside the chart: the chart is the market, this is the builder.

const HEY = 'https://heyresearch.xyz';

// A side panel beside the chart: the builder half of the picture.
async function heyBuilderPanel(token) {
  const r = await fetch(`${HEY}/api/v1/builder?chain=4663&token=${token}`, {
    headers: { 'x-hey-integration': 'my-terminal/2.3.0' },
  });
  if (r.status === 404) return { state: 'not_indexed', href: (await r.json()).scan_url };
  if (!r.ok) return null;
  const c = await r.json();
  return {
    state: c.activity_applies_to_token ? 'ok' : 'other_contract',
    status: c.hey_status_label,           // HEY's word, never your own
    measured: c.activity_measured,        // false: "not measured yet", not "inactive"
    verified: c.verified_builder,
    latest: c.latest_meaningful_ship,     // null when HEY holds none
    ships30d: c.meaningful_ships_30d,     // null is unknown, never render it as 0
    change: c.latest_change_state === 'recorded' ? c.latest_change : null,
    asOf: c.as_of,
    href: c.activity_applies_to_token ? c.project_link : null,
  };
}

DEX interface

One row in a swap page’s token details.

const HEY = 'https://heyresearch.xyz';

// One row on a swap page's token details. Titles come from projects: escape them.
async function heyDexRow(token) {
  const r = await fetch(`${HEY}/api/v1/builder?chain=4663&token=${token}`, {
    headers: { 'x-hey-integration': 'my-dex/1.0.0' },
  });
  if (!r.ok) return '';
  const c = await r.json();
  if (!c.activity_applies_to_token) return '';
  const parts = [esc(c.hey_status_label)];
  if (c.meaningful_ships_30d !== null) parts.push(c.meaningful_ships_30d + ' ships / 30d');
  if (c.latest_meaningful_ship) parts.push('latest: ' + esc(c.latest_meaningful_ship.title));
  return '<div class="hey-row">Builder · ' + parts.join(' · ') +
    ' <a href="' + esc(c.project_link) + '" target="_blank" rel="noopener">Evidence ↗</a></div>';
}

function esc(s) {
  return String(s).replace(/[&<>"']/g, (ch) => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;', "'": '&#39;' })[ch]);
}

Launchpad

Under a launch: whether HEY has found a builder behind it yet.

const HEY = 'https://heyresearch.xyz';

// Under a launch: whether HEY has found a builder behind it yet.
async function heyLaunchBadge(token) {
  const r = await fetch(`${HEY}/api/v1/builder?chain=4663&token=${token}`, {
    headers: { 'x-hey-integration': 'my-launchpad/1.0.0' },
  });
  if (r.status === 404) return { label: 'No HEY research yet', href: (await r.json()).scan_url, image: null };
  if (!r.ok) return null;
  const c = await r.json();
  if (!c.activity_applies_to_token) return null;
  return {
    label: c.verified_builder ? 'Verified builder on HEY' : 'Researched on HEY: ' + c.hey_status_label,
    href: c.project_link,
    image: c.badge_url, // an SVG with the name, status and last ship
  };
}

Explorer

One line under a contract’s address.

const HEY = 'https://heyresearch.xyz';

// One line under a contract's address on an explorer page.
async function heyExplorerLine(token) {
  const r = await fetch(`${HEY}/api/v1/builder?chain=4663&token=${token}`, {
    headers: { 'x-hey-integration': 'my-explorer/1.0.0' },
  });
  if (!r.ok) return null;
  const c = await r.json();
  const verification = { VERIFIED: 'named by the project', UNVERIFIED: 'not yet named by the project', MISMATCH: 'the project names another contract' };
  let text = 'HEY: ' + verification[c.token_verification];
  if (c.activity_applies_to_token) {
    text += ' · builder ' + c.hey_status_label.toLowerCase();
    if (c.latest_meaningful_ship) text += ' · last ship ' + c.latest_meaningful_ship.timestamp.slice(0, 10);
  }
  return { text, href: c.activity_applies_to_token ? c.project_link : null };
}

Project directory

A page of listings, thirty tokens in one keyed call.

const HEY = 'https://heyresearch.xyz';

// A page of up to 30 tokens in one keyed call (the scan card's bulk form).
async function heyDirectoryRows(tokens, apiKey) {
  const r = await fetch(`${HEY}/api/v1/scan?chain=4663&tokens=${tokens.join(',')}`, {
    headers: { authorization: 'Bearer ' + apiKey, 'x-hey-integration': 'my-directory/1.0.0' },
  });
  if (!r.ok) return [];
  const { items } = await r.json();
  return items.map((item) => {
    if (!item.found) return { token: item.input, label: null, href: null }; // not indexed: print nothing
    return {
      token: item.input,
      label: item.status_label + (item.verified_builder ? ' · Verified builder' : ''),
      // Absent means unknown: only a measured count is a number.
      ships30d: item.activity.meaningful_ships_30d ?? null,
      href: item.activity_applies_to_token ? item.project_link : null,
    };
  });
}

AI agent

A tool an assistant calls, answering in facts with evidence ids.

const HEY = 'https://heyresearch.xyz';

// A tool an agent can call. The answer restates HEY; it never adds a verdict.
const heyBuilderTool = {
  name: 'hey_builder_card',
  description: 'Who is building a Robinhood Chain token, what they shipped and HEY\'s evidence. Not a rating, not a price signal.',
  input_schema: { type: 'object', properties: { token: { type: 'string', pattern: '^0x[0-9a-fA-F]{40}$' } }, required: ['token'] },
};

async function heyBuilderToolCall({ token }) {
  const r = await fetch(`${HEY}/api/v1/builder?chain=4663&token=${token}`, {
    headers: { 'x-hey-integration': 'my-agent/0.1.0' },
  });
  if (r.status === 404) return 'HEY has not published a project for this contract. That says nothing about the token.';
  if (!r.ok) return 'HEY did not answer; say nothing about the builder.';
  const c = await r.json();
  const facts = [
    'Project: ' + c.hey_project_name + ' (' + c.hey_project_url + ')',
    'Token named by the project: ' + c.token_verification + (c.activity_applies_to_token ? '' : ' - do not attribute the activity to this token'),
    'Builder status: ' + c.hey_status_label + (c.activity_measured ? '' : ' (building not measured)'),
    'Verified builder: ' + (c.verified_builder ? 'yes' : 'no'),
    'Meaningful ships, 30d: ' + (c.meaningful_ships_30d === null ? 'unknown' : c.meaningful_ships_30d),
  ];
  if (c.latest_meaningful_ship) facts.push('Latest ship: ' + c.latest_meaningful_ship.title + ' at ' + c.latest_meaningful_ship.timestamp + ' [' + c.latest_meaningful_ship.evidence_id + ']');
  if (c.latest_change) facts.push('Latest change: ' + c.latest_change.summary + (c.latest_change.evidence_id ? ' [' + c.latest_change.evidence_id + ']' : ''));
  facts.push('Scored: ' + (c.as_of ?? 'never'), 'Cite: ' + c.project_link, c.disclaimer);
  return facts.join('\n');
}

Attribution

Say who you are, and link the evidence

  • Name your integration. Send x-hey-integration: your-product/1.4.0, or add integration=your-product/1.4.0 to the URL. Lower-case letters, digits, ., _ and -, an optional /version. It is optional and a self-declaration, never an identity; anything else is ignored.
  • Link project_link. It is the project page with utm_source=your-product (or hey_api when you named none), utm_medium=partner_api and utm_campaign=builder_card, so HEY can tell you how many readers followed it. hey_project_url stays the bare canonical URL.
  • What HEY records. Per request: the route, the status, the name you declared, the project the answer was about, and a caller digest salted daily. No address, no user agent, no person. A key, from your account, is what identifies a partner — and lifts the limits.
  • A header makes the answer private. The name travels in project_link, so an answer shaped by the header is not shared from a cache. The query-parameter form is part of the URL and caches normally.

Rules of use

Six things to get right

  • Carry the link. Whatever you render, link project_link. Someone who sees a HEY line should be one tap from the evidence behind it. This is the one condition of use.
  • Print HEY’s words. Use hey_status_label, never your own word for the status. There is no “abandoned”, “dead” or “risky” in HEY’s vocabulary, and a quiet project is not a failed one.
  • Unknown is not zero. A null count means HEY did not measure it. Print nothing, or “not measured”, never “0 ships”. activity_measured: false means an unknown status is not a finding.
  • A token is not a project. When activity_applies_to_token is false the project’s own site names another contract: never print the activity as this token’s, and do not link the token to the project.
  • No verdict, no signal. HEY sends no score, no grade and no safe or unsafe reading, and building says nothing about what a token will do. Put a risk read from a tool that does that work beside the line, not inside it.
  • Stay quiet on a failure. A 404 means HEY has not published a project for that contract (offer scan_url); a 400 is a malformed address; on 429 or 5xx print nothing rather than a guess.