Get desktop application:
View/edit binary Protocol Buffers messages
Bulk Methods
Block API
Casts
Resolves the current channel registry owner address to an fid using the same node-local consistency class as GetOnChainEvents: resolution covers only the verification shards this node hosts, and shard-0 ownership state and verification shards progress independently, so transient skew is possible. This read is not consensus. Because the owner is the last-write-wins verifier of the address across ALL shards, a node that does not host every data shard can return an fid that is stale (an older verifier whose home shard it hosts, when the true latest verifier lives on a shard it does not host) or 0/"parked" (when no hosted shard holds any verifier). Only a node hosting all data shards is guaranteed to return the globally-correct owner. Callers that need an authoritative answer must query a full node. Expiry is returned as-is and may be in the past. The registry contract emits no onchain event when a lapsed registration's grace period ends, so this endpoint reports the last known registration (owner address + expiry) until a later registration supersedes it; it never computes grace or release state. Callers interpret `expiry` themselves (e.g. against the deployed grace period). NOT_FOUND is returned only for a channel key with no registration record at all.
0 = registered but no verified owner found on this node's hosted shards ("parked"). Parking is computed at read time, never stored.
Raw 20-byte EVM address from the channel registry fold.
Absolute expiry, unix seconds, as emitted by the registry contract. May be in the past: lapsed registrations are returned until superseded (see GetChannelOwner in rpc.proto).
Lists channels for a raw 20-byte EVM owner address, including lapsed registrations (expiry in the past) until a later registration supersedes them — see GetChannelOwner's expiry note; callers interpret `expiry` themselves. Uses the same node-local consistency class as GetChannelOwner: resolution covers only the verification shards this node hosts, and shard-0 ownership state and verification shards progress independently, so transient skew is possible. This read is not consensus. `page_token` is opaque bytes; callers page until `next_page_token` is unset, which marks the end of enumeration. A page that lands exactly on the last entry may return a token that yields one final empty page, so a present token means "page again", not "results guaranteed".
Raw 20-byte EVM address.
Lists channels that currently resolve to `fid`, including lapsed registrations (see GetChannelOwner's expiry note). The node must host the fid's home shard, following existing fid-routed read behavior. Address resolution uses the same node-local consistency class as GetChannelOwner: resolution covers only the verification shards this node hosts, and shard-0 ownership state and verification shards progress independently, so transient skew is possible. This read is not consensus. This is a joined read over the fid's verified EVM addresses and the channel owner-address index. The verified addresses are enumerated in ascending order, making the owner-address index key a globally ordered composite cursor across the join. `page_token` is opaque bytes and the paging contract is identical to GetChannelsByAddress: page until `next_page_token` is unset (a boundary-aligned page may return one final empty page). There is no `reverse` (addresses iterate ascending only).
Opaque composite cursor over the fid's verified addresses joined with the channel owner-address index. No reverse cursor (addresses iterate ascending).
(message has no fields)
Unified, source-tagged view of connected peers. Includes peers we have no collected ContactInfoBody for (e.g. validators) as CONTACT_SOURCE_DERIVED entries built from the live connection — kept distinct from collected data.
(message has no fields)
Response Types for the Sync RPC Methods
Links
Network-wide topology: centralized crawl of connected validators over the gossip port, aggregating each validator's local mesh view. Admin-gated.
Network-wide topology assembled by the centralized crawl over the gossip port. `nodes` is one MeshView per responding validator (including self).
unix millis
Mesh health & topology: this node's local view of the gossip mesh. Admin-gated.
OnChain Events DEPRECATED in favor of GetSigner (unified). Returns on-chain signer events only — gasless / off-chain keys are not surfaced through this RPC.
DEPRECATED in favor of GetSignersByFid (unified). Returns on-chain signer events only — gasless / off-chain keys are not surfaced through this RPC.
Reactions
To be deprecated
Unified signer surface — returns both on-chain and off-chain (gasless) keys.
Request for GetSignersByFid. Mirrors `FidRequest` but adds an optional list of `requester_fids` so callers can fetch the current app-nonce for one or more requesters alongside the signer list. Used in lieu of `FidRequest` so the shared message stays lean.
FIDs (verified `requestFid` from SignedKeyRequestMetadata) whose current app-nonce should be included in the response. The response's `requester_fid_nonces` list carries one entry per FID supplied here, in the same order. Empty list ⇒ no app nonces in the response.
Total count of currently-active gasless (off-chain) keys for this FID. Populated from the O(1) per-FID counter maintained alongside the gasless key store, so it stays cheap regardless of the page size.
Per-FID cap on active gasless keys (NEYN-10579). Lets clients show "X/Y delegations" without hardcoding the limit on their side.
Current value of the user-nonce counter for this FID, i.e. the highest nonce ever accepted on KEY_ADD or custody-signed KEY_REMOVE for the user. The next valid user-nonce is strictly greater than this value. Returns 0 when no gasless activity has occurred for this FID yet, matching the merge-time validation rule that treats a missing counter as 0.
Current app-nonce counter, keyed by requester FID. Contains one entry per FID supplied in `request.requester_fids`; missing counters are surfaced as 0 so clients can read the map directly without falling back to defaults. The next valid self-revocation nonce for a given requester is strictly greater than the value here.
User Data
Username Proof
Verifications
Write API
Events
optional uint32 total_shards = 3; // Not required for snapchain
Validation Methods
Shard + height of the snapshot. Only those combinations returned from the `GetShardSnapshotMetadata` are valid
The trie prefix to iterate under. Only leaf node keys under this sub tree will be returned.
If NONE, then start from the left-most leaf node under the prefix
List of trie keys and its associated message
For each (unique) FID that was sent in `messages` above, that FID's account root hash in the trie.
If this is None, all entries under the prefix have been returned
Used as response type in: HubService.GetBlocks
Used as field type in: , ,
Used in:
Used in: ,
Used in:
Used in:
Fans a shard-0 onchain-event merge (e.g. a channel registration) out to every data shard so each can maintain a derived replica. Emitted by shard 0 only when the ChannelOwnershipEvents feature (>= V20) is active; applied by every data shard's replica fold. No code path mints this type below V20, so it stays absent on any network where the feature is inactive.
Block types
Used in:
Used in:
* Adds a new Cast
Used in:
URLs to be embedded in the cast
Fids mentioned in the cast
Parent cast of the cast
Parent URL
Text of the cast
Positions of the mentions in the text
URLs or cast ids to be embedded in the cast
Type of cast
* Identifier used to look up a Cast
Used as request type in: HubService.GetCast
Used as field type in: , , , , , ,
Fid of the user who created the cast
Hash of the cast
* Removes an existing Cast
Used in:
Hash of the cast to remove
* Type of cast
Used in:
* ADVISORY metadata only: the protocol accepts casts into a channel regardless of mode, and never enforces it at cast merge. Clients may enforce it.
Used in:
Used in:
Resolved winner; 0 = parked.
Absolute expiry, unix seconds, as emitted by the registry contract. May be in the past: lapsed registrations are listed until superseded (see GetChannelOwner in rpc.proto).
Used in:
Used in:
32-byte keccak256 of the channel key (the verbatim registry name), equal to the ERC-721 tokenId and to ChannelRegisterBody.label in onchain_event.proto.
Used in:
Used in:
32-byte keccak256 of the channel key (the verbatim registry name), equal to the ERC-721 tokenId and to ChannelRegisterBody.label in onchain_event.proto.
What caused a channel's recorded owner to (possibly) change. NONE (0) is the proto3 zero-default and is never emitted on a real hint; treat a NONE or otherwise unrecognized cause as "re-read the owner" and do not assume the set of causes is closed — new causes may be added over time. RENEW is deliberately absent: extending a registration's expiry is not an ownership change, so renewals emit no hint.
Used in:
A trigger telling consumers that a channel's owner may have changed. It is a nudge, not authoritative data — it carries no resolved owner. CONSUMER CONTRACT (stable API): - Delivery is at-least-once across the full shard set (see the coverage note below) and may over-emit: the resolved winner may not have actually changed since the last hint. Treat a hint as "re-read", never as "the owner is now X". - Hints carry NO fid claims. On receipt, call GetChannelOwner to learn the current owner; this body's owner_address is a raw registry-owner address, not an authoritative resolution. - REGISTER/TRANSFER hints ride the shard-0 -> data-shard fan-out. The LATEST ownership update of a channel hints on every shard, but any single shard may COALESCE a rapid same-channel burst down to just the latest hint, so no single shard's stream is guaranteed to carry every hint. VERIFICATION_ADD/REMOVE hints appear only on the verifier's home shard. Complete coverage therefore requires subscribing to all shards and, as above, treating each hint as a re-read trigger rather than a full log. - Nothing fires when a lapsed registration's grace period ends (the chain is silent at expiry); consumers apply expiry themselves.
Used in:
Channel identifier; pass this to GetChannelOwner to resolve the current owner.
Raw 20-byte EVM registry-owner address the hint concerns: for REGISTER/TRANSFER, the newly-recorded owner; for VERIFICATION_ADD/REMOVE, the owner address whose verification changed. Not an authoritative resolution — consumers call GetChannelOwner.
* A single pin per channel; a new pin replaces the previous one.
Used in:
32-byte keccak256 of the channel key (the verbatim registry name), equal to the ERC-721 tokenId and to ChannelRegisterBody.label in onchain_event.proto.
The pinned cast. An empty cast_hash unpins.
Field-presence rules below are producer conventions (the connector), not merge validity rules: the store checks them only as index-input gating, so an event that fails those checks still merges as a raw onchain event — it just builds no channel index entries.
Used in:
Verbatim name from the registry event; label = keccak256(channel_key). Empty for TRANSFER (the ERC-721 Transfer log carries only the tokenId). The registry contract validates name length only, so non-UTF-8 names are registrable onchain but unrepresentable here (proto3 string requires valid UTF-8). Such logs fail ABI decode in the connector and are never minted as events — deterministic on every node, and the dropped names are untypeable in any client.
Absolute unix timestamp in seconds. 0 for TRANSFER.
REGISTER: the registrant. TRANSFER: the receiving address. Empty for RENEW.
keccak256(channel_key), equal to the ERC-721 tokenId. Present on all event types — the join key tying REGISTER/RENEW/TRANSFER for one channel together.
Used in:
Used in:
32-byte keccak256 of the channel key (the verbatim registry name), equal to the ERC-721 tokenId and to ChannelRegisterBody.label in onchain_event.proto — the join key tying a channel's registry events and messages together.
Used as response type in: HubService.GetChannelsByAddress, HubService.GetChannelsByFid
Used in:
Used in: , ,
Used in:
set only when source == COLLECTED
always present (esp. for DERIVED)
set for DERIVED: the live-connection address
Used in:
Used in:
Used in: , , ,
Where a peer's address/contact data came from. Keeps internally-derived (observed) data from being conflated with peer-attested gossip data.
Used in: ,
real ContactInfoBody received over the contact-info topic
internal: PeerId + observed connection address only
Used in:
Used in:
Used in:
Used as response type in: AdminService.RetryFnameEvents, AdminService.RetryOnchainEvents, AdminService.RunOnchainEventsMigration, AdminService.UploadSnapshot
(message has no fields)
* Farcaster network the message is intended for
Used in: , , ,
Public primary network
Public test network
Private test network
Used in:
Used as request type in: HubService.GetCastsByFid, HubService.GetCastsByMention, HubService.GetCurrentStorageLimitsByFid, HubService.GetIdRegistryOnChainEvent, HubService.GetLinkCompactStateMessageByFid, HubService.GetOnChainSignersByFid, HubService.GetUserDataByFid, HubService.GetUserNameProofsByFid, HubService.GetVerificationsByFid
Used as request type in: HubService.GetAllCastMessagesByFid, HubService.GetAllLendStorageMessagesByFid, HubService.GetAllLinkMessagesByFid, HubService.GetAllReactionMessagesByFid, HubService.GetAllUserDataMessagesByFid, HubService.GetAllVerificationMessagesByFid
Fname transfers
Used in: ,
* A Farcaster Frame action
Used in:
URL of the Frame triggering the action
The index of the button pressed (1-4)
The cast which contained the frame url
Text input from the user, if present
Serialized frame state value
Chain-specific transaction ID for tx actions
Chain-specific address for tx actions
TODO: This probably needs a signature? Should we use ConsensusMessage?
Used in:
Used as request type in: HubService.GetMeshTopology, HubService.GetMeshView
default true (applied by the handler)
Reserved for the recursive crawl; ignored by the local view, kept so the wire format doesn't break when a propagating crawl is added later.
Used in:
* Type of hashing scheme used to produce a digest of MessageData
Used in:
Default scheme for hashing MessageData
Used in:
(message has no fields)
Used in: , , , , , , , , , , ,
Used as response type in: HubService.GetEvent, HubService.Subscribe
Used as field type in:
Deprecated MergeIdRegistryEventBody merge_id_registry_event_body = 6; MergeNameRegistryEventBody merge_name_registry_event_body = 7;
Deprecated MergeRentRegistryEventBody merge_rent_registry_event_body = 9; MergeStorageAdminRegistryEventBody merge_storage_admin_registry_event_body = 10;
Used in: ,
Deprecated HUB_EVENT_TYPE_MERGE_ID_REGISTRY_EVENT = 4; HUB_EVENT_TYPE_MERGE_NAME_REGISTRY_EVENT = 5;
Deprecated HUB_EVENT_TYPE_MERGE_RENT_REGISTRY_EVENT = 7; HUB_EVENT_TYPE_MERGE_STORAGE_ADMIN_REGISTRY_EVENT = 8;
Used in:
Used in:
* Registers an Ed25519 key for an FID via custody-authenticated message
Used in:
Ed25519 public key (32 bytes)
1 = Ed25519
EIP-712 signature from custody address
Farcaster epoch timestamp after which the custody signature is invalid
Monotonically increasing per-FID user nonce
ABI-encoded SignedKeyRequestMetadata
Must be 1 (SignedKeyRequest)
Optional: tx hash of the FID registration transaction
Allowed MessageType values; required and non-empty
Seconds; must be > 0. Sliding expiry window; max enforced at validation.
* Revokes an Ed25519 key via custody signature or self-revocation
Used in:
Ed25519 public key to remove
EIP-712 (custody) or Ed25519 (self-revocation) signature
1 = custody (EIP-712), 2 = self (Ed25519)
Farcaster epoch timestamp after which the signature is invalid
Monotonically increasing nonce (user nonce for custody, app nonce for self)
Used in:
* Adds or removes a Link
Used in:
Type of link, <= 8 characters
User-defined timestamp that preserves original timestamp when message.data.timestamp needs to be updated for compaction
The fid the link relates to
* A Compaction message for the Link Store
Used in:
Type of link, <= 8 characters
* Protocol-relevant, unlike CastingMode: this is intended to gate whether an fid may add itself as a member (a ChannelMemberBody with CHANNEL_MEMBER_ACTION_ADD_MEMBER whose fid equals the sending message's fid). OPEN admits self-adds; APPROVAL requires a moderator. Not enforced yet — no channel message merges on any network.
Used in:
Gossip related messages
Used in:
Used in:
Used in:
Used in:
Used in:
Carries the whole original OnChainEvent (carry-the-original convention, mirroring MergeMessageEventBody): data shards replay the same input shard 0 saw and the existing channel fold consumes it unmodified (see the enum comment above — gated at V20).
Used in:
Used in:
Used in:
Used in:
set iff PeerId matched a validator-set entry
COLLECTED vs DERIVED — never conflate the two
set only when contact_source == COLLECTED
internal: live-connection addr; not a self-announced IP
Used in:
node identity key (always present)
key is in the validator set at current height
Used as response type in: HubService.GetMeshView
Used as field type in:
The responding node. Named `local` (not `self`) to avoid the Rust keyword.
unix millis
* A Message is a delta operation on the Farcaster network. The message protobuf is an envelope that wraps a MessageData object and contains a hash and signature which can verify its authenticity.
Used as request type in: HubService.SubmitMessage, HubService.ValidateMessage
Used as response type in: HubService.GetCast, HubService.GetLink, HubService.GetReaction, HubService.GetUserData, HubService.GetVerification, HubService.SubmitMessage
Used as field type in: , , , , , , , , , , , ,
Contents of the message
Hash digest of data
Hash scheme that produced the hash digest
Signature of the hash digest
Signature scheme that produced the signature
Public key or address of the key pair that produced the signature
MessageData serialized to bytes if using protobuf serialization other than ts-proto
* A MessageData object contains properties common to all messages and wraps a body object which contains properties specific to the MessageType.
Used in:
Type of message contained in the body
Farcaster ID of the user producing the message
Farcaster epoch timestamp in seconds
Farcaster network the message is intended for
SignerAddBody signer_add_body = 11; // Deprecated
SignerRemoveBody signer_remove_body = 13; // Deprecated
Compaction messages
Used in:
* Type of the MessageBody
Used in:
Add a new Cast
Remove an existing Cast
Add a Reaction to a Cast
Remove a Reaction from a Cast
Add a new Link
Remove an existing Link
Add a Verification of an Ethereum Address
Remove a Verification
Deprecated MESSAGE_TYPE_SIGNER_ADD = 9; // Add a new Ed25519 key pair that signs messages for a user MESSAGE_TYPE_SIGNER_REMOVE = 10; // Remove an Ed25519 key pair that signs messages for a user
Add metadata about a user
Add or replace a username proof
A Farcaster Frame action
Link Compaction State Message
Register an Ed25519 key via custody-authenticated message
Revoke an Ed25519 key via custody signature or self-revocation
Used as response type in: HubService.GetAllCastMessagesByFid, HubService.GetAllLendStorageMessagesByFid, HubService.GetAllLinkMessagesByFid, HubService.GetAllReactionMessagesByFid, HubService.GetAllUserDataMessagesByFid, HubService.GetAllVerificationMessagesByFid, HubService.GetCastsByFid, HubService.GetCastsByMention, HubService.GetCastsByParent, HubService.GetLinkCompactStateMessageByFid, HubService.GetLinksByFid, HubService.GetLinksByTarget, HubService.GetReactionsByCast, HubService.GetReactionsByFid, HubService.GetReactionsByTarget, HubService.GetUserDataByFid, HubService.GetVerificationsByFid
Used as request type in: AdminService.SubmitOnChainEvent
Used as response type in: AdminService.SubmitOnChainEvent, HubService.GetIdRegistryOnChainEvent, HubService.GetIdRegistryOnChainEventByAddress, HubService.GetOnChainSigner
Used as field type in: , , , , ,
Used as response type in: HubService.GetOnChainEvents, HubService.GetOnChainSignersByFid
Used in: ,
Used in:
repeated Transaction transactions = 4; // Transactions for the shard level proposals (submitted by shard leader) repeated ShardHeader shard_headers = 5; // shard headers for the block level proposal (submitted by the block leader)
* Type of Protocol to disambiguate verification addresses
Used in: ,
Used in:
* Adds or removes a Reaction from a Cast
Used in:
Type of reaction
CastId of the Cast to react to
URL to react to
* Type of Reaction
Used in: , , ,
Like the target cast
Share target cast to the user's audience
Used as request type in: HubService.GetReactionsByCast, HubService.GetReactionsByTarget
Used in:
These fields are used by the client to store the progress in the DB
The WorkUnitResponse from the last pass
The last FID processed (to continue from last pass)
Used in:
Used in:
Used in: , , ,
Used in:
Uniquely identifies a hash within a shard
Used in: , ,
Used in:
State root for the shard after applying the transactions for the height
Used in:
Used in:
Used in:
The trie key of the leaf node.
This should always be present, will be None only if a trie key's message was not found in the DB, which should be never happen..
Used in:
* Type of signature scheme used to sign the Message hash
Used in:
Ed25519 signature (default)
ECDSA signature using EIP-712 scheme
Unified per-key record. Optional fields are populated only when carried by the underlying source (on-chain signer event vs. gasless KEY_ADD record).
Used in: ,
32-byte Ed25519 public key
1 = Ed25519
Common metadata. All timestamps are Unix epoch seconds regardless of source; off-chain values that natively live in Farcaster time (MessageData.timestamp, gasless last-used tracking) are converted at the RPC boundary so clients can compare/compute across sources without an epoch table.
Unix epoch seconds
Unix epoch seconds; off-chain only
duration in seconds; off-chain only
Unix epoch seconds; computed as last_used_at + ttl when ttl > 0
Off-chain–only fields
mirrors KeyAddBody.scopes (raw MessageType ints)
verified requestFid from SignedKeyRequestMetadata
user nonce on the originating KEY_ADD
On-chain–only payload — original event for callers that need raw fields (block_hash, transaction_hash, log_index, metadata bytes, etc.).
Used in:
Used in:
Used in:
Used as request type in: HubService.GetOnChainSigner, HubService.GetSigner
Source of a signer record returned by GetSigner / GetSignersByFid.
Used in:
gasless / KEY_ADD
Used in:
Used in:
Used in:
Used in:
Used in: ,
Used in:
Used in:
Used in:
Used in:
Used in:
Used in:
Used in:
Used in: ,
Used in:
peer is in OUR gossipsub mesh for this topic
Used in: ,
State root for the account after applying the transaction for the fid
A validator that the crawl could not query directly. The crawl is connected-only: validators the serving node has no live connection to, or that did not respond in time, are surfaced here rather than dropped.
Used in:
set when the missing node is a known validator
"not_connected" | "timeout" | "error: …"
* Adds metadata about a user
Used in:
Type of metadata
Value of the metadata
* Type of UserData
Used in: ,
Profile Picture for the user
Display Name for the user
Bio for the user
URL of the user
Preferred Name for the user
Current location for the user
Username of user on twitter
Username of user on github
Banner image for the user
Primary address for the user on Ethereum
Primary address for the user on Solana
Profile token in CAIP-19 format
URL of the user's live activity
Used as request type in: AdminService.SubmitUserNameProof
Used as response type in: AdminService.SubmitUserNameProof, HubService.GetUsernameProof
Used as field type in: , , ,
Used in:
Used in:
Validator initiated prunes/revokes etc
Used in:
* Adds a Verification of ownership of an Address based on Protocol
Used in:
Address being verified for a given Protocol
Signature produced by the user's address for a given Protocol
Hash of the latest Ethereum block when the signature was produced
Type of verification. 0 = EOA, 1 = contract
0 for EOA verifications, 1 or 10 for contract verifications
Protocol of the Verification
* Removes a Verification of a given protocol
Used in:
Address of the Verification to remove
Protocol of the Verification to remove
Used in: ,
Consensus messages
Used in: