Concepts
Farcaster identity (FIDs)
hypersnap-docs-web/src/concepts/fids.mdLast synced: May 20, 2026Farcaster identity (FIDs) #
Every Farcaster user has a Farcaster ID (FID) — a u64 assigned by the on-chain IdRegistry contract. An FID is permanent and non-transferable, but the custody address that controls it can change via the IdGateway contract.
The three moving parts #
- FID —
u64. Stable. Public. This is what appears in every API response. - Custody address — the Ethereum address currently in charge of the FID. Signing a Hypersnap management request (creating a webhook, registering a mini app) means producing an EIP-712 signature with this key.
- Signers — Ed25519 keys registered to an FID via the
KeyRegistrycontract. These sign Farcaster messages (casts, reactions, follows). Mini-app token webhooks (JFS) are validated against the active signer set for an FID.
Hypersnap reads (1)–(3) from on-chain state, indexed locally. The custody lookup is available everywhere EIP-712 verification happens; the signer lookup is used when verifying JFS token webhooks.
How Hypersnap derives custody #
When you sign a webhook-management request, Hypersnap:
- Recovers the signer address from your EIP-712 signature.
- Calls its
CustodyAddressLookup::get_custody_address(fid), which reads localIdRegistryevent state. - Rejects the request if the recovered address doesn't match.
If your custody address changes on-chain, the next request signed with the new key just works — Hypersnap follows the on-chain state, it does not maintain a separate registration step.
Usernames vs FIDs #
The API accepts both where it makes sense:
GET /v2/farcaster/user?fid=3— look up by FID.GET /v2/farcaster/user/by-username?username=dwr.eth— look up by username.
Usernames are either:
- fnames — off-chain usernames managed by the Farcaster name service.
- ENS names — verified on-chain.
- Basenames — the
.base.ethspace.
All three resolve through the same username_proof table and surface on the User object in your responses. When you display a user, prefer display_name → username → fid as fallbacks.
Why the API has no logins #
There are no session tokens, no API keys for reads, no OAuth dance. Public reads are genuinely public: Hypersnap serves them from local indexes, and the authoritative data is already public on-chain (signers, registrations) and in the Farcaster node network (messages). Anything that mutates state (webhooks, mini app registrations) is authenticated directly by the FID's custody key via EIP-712 — see Signed operations for the details.
Mirrored from hypersnap-docs-web. Edit the source to update this page.
Edit on GitHub