Docs

Everything you need to know about robinhood.bio in five minutes: the model, the URLs, the badge and the API.

Last updated 14 Sep 2026

What it is

robinhood.bio gives a wallet on Robinhood Chain a face and a page. You connect a wallet, claim a username, and get an identity card at robinhood.bio/<username>: a deterministic pixel portrait, your role, links, projects and a snapshot of your onchain activity. One link for every bio, with share cards that unfurl on X, Telegram, Discord and Farcaster.

Your page itself lives in our database, not on chain: editing it costs no gas and needs no transaction. The chain is what we read - your activity, your contracts, your NFTs - plus the block height at which you claimed, which we record so your citizen number has a timestamp. Your wallet signature is the only credential (Sign-In with Ethereum); there is no email and no password.

Free while our token launches

Every page is free and fully featured right now. The lifetime plan will be paid in our own token on Robinhood Chain, and that token has not launched yet - so nothing is for sale, nothing is charged, and no page is paused or released for not paying.

Claim now and your page stays free for life. Claim during this free launch and you keep your page free for life, even after the token opens and payments begin.

When the token goes live, keeping a name forever will be a single onchain transfer paid in TOKEN: no subscription and no renewal. We will announce the exact price here and on the page itself before anything changes; the free period starts counting only from then.

The first 1,000 paying pages carry a permanent GENESIS stamp.

Can you claim a name?

A name is 3 to 30 characters from a-z, 0-9, _ and -. Case never matters, and the lowercase is locale-independent, so a Turkish keyboard cannot turn your I into something else. Two names that look alike to a human cannot both exist: we compare a confusable skeleton, so v1talik and vitalik are the same name.

Some names are not for sale. Route names (docs, explore, city, claimers, settings...) would collide with a page and can never be claimed. Brand names and dangerous words (support, official, airdrop, anything containing "robinhood") are blocked outright. Well-known handles are held for whoever can prove they own them. Names of 3 or 4 characters are premium: they are sold, and they skip the free period.

Your wallet needs a little history before it can claim, which keeps a script from taking a thousand names: at least one transaction on Robinhood Chain, or a wallet at least 7 days old, or a verified handle that matches the name you want. There is also a daily claim budget per address.

The name token

Your username can be minted as an NFT on Robinhood Chain (ERC-721). The token IS the name: hold it and the page is yours, sell it and the name goes with it - same model as ENS. Minting is optional; a page works exactly the same with or without a token.

Registration costs about $2 per year, paid in the chain's native currency. There is no subscription - you pay once for a year, and renew when you choose. Renewal needs no signature and no login: anyone can renew anyone's name straight from a block explorer, so even if this site goes down your name is safe as long as you renew it.

There is no grace period. When a name expires it is immediately available to anyone for the base price. An expired token cannot be transferred - this protects buyers from purchasing a name that someone else can claim for a year's rent. If you hold a name you care about, renew it before the expiry date.

Only the hash of your name is stored on chain - never the string itself. The token art shows the name and expiry, nothing personal: no portrait, no bio, no wallet address. Because the token is transferable, art built from the holder's face would be wrong the moment it sells.

An ENS name on Ethereum

Mint your username as a name token (above) and it becomes a real ENS name on Ethereum mainnet: marcus.robinhood.bio. Anyone can type it into the ENS app, Etherscan, Rainbow or a viem/ethers script and get back the wallet that holds the name today. It costs nothing extra and needs no second transaction - the ENS name comes with the onchain mint.

It is gasless because the answer never lives on Ethereum. A DNSSEC-signed record on robinhood.bio tells ENS to ask our gateway, which reads the current holder from Robinhood Chain and returns a signed answer (ENS calls this CCIP-Read, or offchain resolution). Ethereum checks the signature and hands your app the address. Nothing is written to mainnet, so nothing costs gas and nothing needs renewing there - you only ever renew the name token on Robinhood Chain.

The name always resolves to whoever holds the token right now. Ownership is read live from the chain at the moment of lookup, never from a cached copy, so selling or transferring the name token carries the ENS name with it: the buyer's wallet answers as soon as the transfer confirms, and there is nothing to update here.

This works only for names that are minted on chain. A username that has only been claimed on the site, or a name token that has lapsed, resolves to nothing at all - exactly as an unregistered ENS name does. Mint the name, or renew a lapsed one, and it starts resolving again.

It works anywhere that follows the ENS standard for offchain names: the official ENS app, Etherscan, Rainbow, and libraries like viem and ethers with CCIP-Read enabled (on by default in recent versions). Support for DNSSEC-backed ENS names still varies between wallets, so a name that resolves in one app may not yet resolve in another - that is the wallet's ENS support, not your name.

// viem follows CCIP-Read automatically
import { normalize } from "viem/ens";
const address = await client.getEnsAddress({
  name: normalize("marcus.robinhood.bio"),
});
// -> the wallet that holds the marcus name token right now

The profit chart

If your onchain block is public, your page can show a 7-day profit chart. Read it literally: it is the realized profit on trades you CLOSED in the last seven days, priced in the chain's own currency. It is not your portfolio, not your balance, and not the value of what you still hold - a position you never sold contributes nothing, however it moved.

What it cannot see, and says so instead of guessing: token-to-token swaps have no native leg, so they are skipped and counted; a block holding more than one sale cannot be split between them, so those sales are skipped rather than double-counted; tokens that arrived without a purchase have no cost to measure against; tokenized stocks never appear at all. When anything is skipped the chart tells you how many.

"3 of 4 sells closed in profit" counts SALES, not positions - selling one position in three parts and winning twice reads as 2 of 3. The bars are the seven calendar days the chart draws, and they always add up to the headline figure. Nothing here is advice, and none of it is a prediction.

What your page shows, and how to turn it off

Settings has one switch per field: wallet address, balance tier (off by default), NFTs, transaction count, the 7-day profit chart, projects, social links, listing in Explore and the register, and asking search engines not to index you. Off means the field is absent from the HTML - not blurred, not replaced with a placeholder.

One switch is bigger than the rest: the onchain block's own visibility toggle in the editor. Turn that off and the entire snapshot goes - counts, first transaction, NFTs, the profit chart and your building on the register - regardless of the individual switches underneath it.

How fresh the numbers are

Your page shows a stored snapshot, never a live query - that is what stops visitors from spending your data budget. It refreshes about once a day, and the refresh button on your own page forces it with a ten-minute cooldown.

If our data provider fails, or answers successfully with nothing for a wallet we already know has history, we keep your previous numbers and retry within the hour rather than publish zeros. Your building level never decreases for the same reason: a bad read must not demolish a house.

The register

Your citizen number is a serial: it is issued once, it is yours permanently, and it is never reissued. robinhood.bio/city is the public register of those numbers, drawn as a street - one plot per number, your building sized by your onchain activity, and at the end exactly one open plot with the next number on it.

Numbers that are not publicly listed - paused, unlisted, hidden, or simply never issued - all render identically as a closed plot with no name and no reason. That is deliberate: the shape of the street must not reveal who is there.

Explore and Claimers

robinhood.bio/explore is a public directory of pages that have opted in to being listed. It shows each person's card, role and activity level. Pages are unlisted by default - you choose to appear in Settings.

robinhood.bio/claimers lists everyone who has claimed a name, in the order they claimed, with their citizen number. Unlike Explore, Claimers shows every claimed name regardless of listing preference - the act of claiming a name on a public chain is itself public. What it does not show is anything behind a privacy switch: no wallet, no stats, no links.

Your page in the terminal

Every page has a plain-text version. curl, wget and HTTPie get it automatically; so does any client sending Accept: text/plain.

curl https://robinhood.bio/marcus
# or explicitly
curl https://robinhood.bio/api/curl/marcus

The 88x31 badge

A classic web badge, rendered from your card. Paste it in a README, a blog footer or a forum signature.

<a href="https://robinhood.bio/marcus">
  <img src="https://robinhood.bio/api/badge/marcus" width="88" height="31" alt="marcus on robinhood.bio">
</a>

Share images

Open Graph (1200x630), story (1080x1920) and QR images are generated from your live card and refresh when you edit.

https://robinhood.bio/api/og/marcus
https://robinhood.bio/api/story/marcus
https://robinhood.bio/api/qr/marcus

Avatar API

Portraits are deterministic: the same wallet always gets the same 32x32 face. You can render any username's portrait (or any address's, or any string's) as a PNG at 32, 64, 96, 128 or 160 pixels. Photo avatars are served from the same URL.

<img src="https://robinhood.bio/api/avatar/marcus?s=128" width="128" height="128" alt="marcus">

# any seed works, e.g. a wallet address or a name
https://robinhood.bio/api/avatar/0x1a2b...9f3c?s=64

Privacy stance

Hidden fields are never rendered - not on the page, not in share images, not in the API, not even as a placeholder. Balances are off by default; transaction counts are shown as buckets (0, 1+, 10+, 100+, 1k+, 10k+); tokenized stock holdings are never shown.

Visiting a profile never triggers an RPC or explorer call: the page reads a stored snapshot. The one documented exception is the wallet report at robinhood.bio/card/<address>, which reads the chain on demand and caches the result for an hour.

Your building on the register is drawn from the same transaction count as the bucket, so it appears only while that number is public. Hide the transaction count and your plot shows bare ground - with no label saying why, because the label would be the disclosure.

Analytics are cookieless daily counters: one view per visitor per UTC day, identified only by a salted hash of their IP that changes daily. Nothing is stored in the visitor's browser, and your own visits are not counted. Export and delete live in Settings.

Contact

Support: support@robinhood.bio. Abuse and impersonation: abuse@robinhood.bio.

Not affiliated with, endorsed by, or officially connected with Robinhood Markets, Inc.