> ## Documentation Index
> Fetch the complete documentation index at: https://docs.neynar.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Validate signed message

> Validate a message on the Farcaster network.



## OpenAPI

````yaml post /v1/validateMessage
openapi: 3.0.4
info:
  title: Farcaster Hub API
  version: 2.35.0
  description: >
    Perform basic queries of Farcaster state via the REST API of a Farcaster
    hub. See the [Neynar docs](https://docs.neynar.com/reference) for more
    details.
  contact:
    name: Neynar
    url: https://neynar.com/
    email: team@neynar.com
servers:
  - url: https://snapchain-api.neynar.com
security:
  - ApiKeyAuth: []
tags:
  - name: Info
    description: Operations related to hub information.
  - name: Casts
    description: Operations related to casts.
  - name: Reactions
    description: Operations related to reactions.
  - name: Links
    description: Operations related to links.
  - name: UserData
    description: Operations related to user data.
  - name: Fids
    description: Operations related to FIDs.
  - name: Storage
    description: Operations related to storage limits.
  - name: Usernames
    description: Operations related to usernames.
  - name: Verifications
    description: Operations related to verifications.
  - name: OnChainEvents
    description: Operations related to on-chain events.
  - name: Message
    description: Operations related to messages.
  - name: HubEvents
    description: Operations related to hub events.
paths:
  /v1/validateMessage:
    post:
      tags:
        - Message
      summary: Validate signed message
      description: Validate a message on the Farcaster network.
      operationId: validate-message
      requestBody:
        description: >
          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.
        content:
          application/octet-stream:
            schema:
              type: string
              format: binary
        required: true
      responses:
        '200':
          description: A successful response.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidateMessageResponse'
        default:
          $ref: '#/components/responses/ErrorResponse'
      externalDocs:
        description: Validate a message on the Farcaster network
        url: https://docs.neynar.com/reference/validate-message
components:
  schemas:
    ValidateMessageResponse:
      type: object
      properties:
        valid:
          type: boolean
        message:
          $ref: '#/components/schemas/Message'
      required:
        - valid
        - message
    Message:
      allOf:
        - type: object
          properties:
            data:
              oneOf:
                - $ref: '#/components/schemas/MessageDataCastAdd'
                - $ref: '#/components/schemas/MessageDataCastRemove'
                - $ref: '#/components/schemas/MessageDataReaction'
                - $ref: '#/components/schemas/MessageDataLink'
                - $ref: '#/components/schemas/MessageDataVerificationAdd'
                - $ref: '#/components/schemas/MessageDataVerificationRemove'
                - $ref: '#/components/schemas/MessageDataUserDataAdd'
                - $ref: '#/components/schemas/MessageDataUsernameProof'
                - $ref: '#/components/schemas/MessageDataFrameAction'
              discriminator:
                propertyName: type
                mapping:
                  MESSAGE_TYPE_CAST_ADD:
                    $ref: '#/components/schemas/MessageDataCastAdd'
                  MESSAGE_TYPE_CAST_REMOVE:
                    $ref: '#/components/schemas/MessageDataCastRemove'
                  MESSAGE_TYPE_REACTION_ADD:
                    $ref: '#/components/schemas/MessageDataReaction'
                  MESSAGE_TYPE_REACTION_REMOVE:
                    $ref: '#/components/schemas/MessageDataReaction'
                  MESSAGE_TYPE_LINK_ADD:
                    $ref: '#/components/schemas/MessageDataLink'
                  MESSAGE_TYPE_LINK_REMOVE:
                    $ref: '#/components/schemas/MessageDataLink'
                  MESSAGE_TYPE_VERIFICATION_ADD_ETH_ADDRESS:
                    $ref: '#/components/schemas/MessageDataVerificationAdd'
                  MESSAGE_TYPE_VERIFICATION_REMOVE:
                    $ref: '#/components/schemas/MessageDataVerificationRemove'
                  MESSAGE_TYPE_USER_DATA_ADD:
                    $ref: '#/components/schemas/MessageDataUserDataAdd'
                  MESSAGE_TYPE_USERNAME_PROOF:
                    $ref: '#/components/schemas/MessageDataUsernameProof'
                  MESSAGE_TYPE_FRAME_ACTION:
                    $ref: '#/components/schemas/MessageDataFrameAction'
          required:
            - data
        - $ref: '#/components/schemas/MessageCommon'
      description: >-
        A Message is a delta operation on the Farcaster network that represents
        a state change. Messages are the fundamental unit of data in Farcaster
        and can represent various actions like:

        - Creating or removing casts (posts)

        - Adding or removing reactions

        - Following or unfollowing users

        - Updating profile data

        - Verifying Ethereum addresses


        Each message contains:

        - A MessageData object with the actual content

        - A hash of the content for integrity verification

        - A cryptographic signature to prove authenticity

        - The signer's public key for verification


        Messages are immutable once created and form an append-only log of all
        user actions on the network.
    ErrorResponse:
      required:
        - code
        - details
        - errCode
        - metadata
        - name
        - presentable
      type: object
      properties:
        errCode:
          type: string
        presentable:
          type: boolean
        name:
          type: string
        code:
          type: integer
        details:
          type: string
        metadata:
          required:
            - errcode
          type: object
          properties:
            errcode:
              type: array
              items:
                type: string
    MessageDataCastAdd:
      description: >-
        Represents a new cast (post) being created in the Farcaster network. A
        cast can include text content, mentions of other users, embedded URLs,
        and references to parent posts for replies.
      allOf:
        - $ref: '#/components/schemas/MessageDataCommon'
        - type: object
          required:
            - castAddBody
          properties:
            castAddBody:
              description: >-
                The content and metadata of the new cast, including the text,
                mentions, embeds, and any parent references for replies.
              allOf:
                - $ref: '#/components/schemas/CastAddBody'
    MessageDataCastRemove:
      description: >-
        Represents a request to remove (delete) a previously created cast. Only
        the original creator of a cast can remove it.
      allOf:
        - $ref: '#/components/schemas/MessageDataCommon'
        - type: object
          required:
            - targetHash
          properties:
            targetHash:
              title: Hash of the cast to remove
              description: >-
                The unique hash identifier of the cast to be removed. Must be a
                cast that was previously created by the same FID specified in
                the message.
              pattern: ^0x[0-9a-fA-F]{40}$
              type: string
              example: '0x03aff391a6eb1772b20b4ead9a89f732be75fe27'
    MessageDataReaction:
      description: >-
        Represents a user's reaction to content on the Farcaster network.
        Reactions can be likes or recasts of casts, allowing users to express
        appreciation or share content with their followers.
      allOf:
        - $ref: '#/components/schemas/MessageDataCommon'
        - type: object
          required:
            - reactionBody
          properties:
            reactionBody:
              description: >-
                Contains the type of reaction (like/recast) and the target
                content being reacted to. The target can be specified either by
                castId or URL.
              allOf:
                - $ref: '#/components/schemas/ReactionBody'
    MessageDataLink:
      description: >-
        Represents a social graph connection between users in the Farcaster
        network. Currently supports following relationships between users.
      allOf:
        - $ref: '#/components/schemas/MessageDataCommon'
        - type: object
          required:
            - linkBody
          properties:
            linkBody:
              description: >-
                Contains the details of the social connection, including the
                type of relationship and the target user.
              allOf:
                - $ref: '#/components/schemas/LinkBody'
    MessageDataVerificationAdd:
      description: >-
        Represents a message that adds verification of ownership for an Ethereum
        or Solana address to a user's profile. This verification proves that the
        user controls the specified blockchain address.
      allOf:
        - $ref: '#/components/schemas/MessageDataCommon'
        - type: object
          required:
            - verificationAddEthAddressBody
          properties:
            verificationAddEthAddressBody:
              description: >-
                Contains the blockchain address being verified, along with
                cryptographic proof of ownership through a signature.
              allOf:
                - $ref: '#/components/schemas/VerificationAddEthAddressBody'
    MessageDataVerificationRemove:
      description: >-
        Represents a message that removes an existing blockchain address
        verification from a user's profile. This allows users to disassociate
        previously verified addresses from their account.
      allOf:
        - $ref: '#/components/schemas/MessageDataCommon'
        - type: object
          required:
            - verificationRemoveBody
          properties:
            verificationRemoveBody:
              description: >-
                Contains the blockchain address for which the verification
                should be removed from the user's profile.
              allOf:
                - $ref: '#/components/schemas/VerificationRemoveBody'
    MessageDataUserDataAdd:
      description: >-
        Represents a message that updates a user's profile metadata. This can
        include changes to profile picture, display name, bio, URL, or preferred
        username. Each update modifies a single profile field.
      allOf:
        - $ref: '#/components/schemas/MessageDataCommon'
        - type: object
          required:
            - userDataBody
          properties:
            userDataBody:
              description: >-
                Contains the type of profile metadata being updated and its new
                value.
              allOf:
                - $ref: '#/components/schemas/UserDataBody'
    MessageDataUsernameProof:
      allOf:
        - $ref: '#/components/schemas/MessageDataCommon'
        - type: object
          required:
            - usernameProofBody
          properties:
            usernameProofBody:
              $ref: '#/components/schemas/UserNameProof'
    MessageDataFrameAction:
      description: >-
        Represents a user's interaction with a Farcaster Frame, which is an
        interactive element embedded within a cast. Frames allow users to engage
        with content through clickable buttons, creating interactive experiences
        within the Farcaster network.
      allOf:
        - $ref: '#/components/schemas/MessageDataCommon'
        - type: object
          required:
            - frameActionBody
          properties:
            frameActionBody:
              description: >-
                Contains the details of the frame interaction, including which
                button was pressed and the associated cast and URL.
              allOf:
                - $ref: '#/components/schemas/FrameActionBody'
    MessageCommon:
      type: object
      properties:
        hash:
          title: Hash digest of data
          pattern: ^0x[0-9a-fA-F]{40}$
          type: string
          example: '0xd2b1ddc6c88e865a33cb1a565e0058d757042974'
        hashScheme:
          $ref: '#/components/schemas/HashScheme'
        signature:
          title: Signature of the hash digest
          pattern: ^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$
          type: string
          format: byte
        signatureScheme:
          $ref: '#/components/schemas/SignatureScheme'
        signer:
          title: Public key or address of the key pair that produced the signature
          pattern: ^0x[0-9a-fA-F]+$
          type: string
      required:
        - hash
        - hashScheme
        - signature
        - signatureScheme
        - signer
    MessageDataCommon:
      description: >-
        Common properties shared by all Farcaster message types. These
        properties provide essential metadata about the message's origin,
        timing, and network context.
      required:
        - fid
        - network
        - timestamp
      type: object
      properties:
        type:
          $ref: '#/components/schemas/MessageType'
        fid:
          title: Farcaster ID of the user producing the message
          description: >-
            The unique identifier (FID) of the user who created this message.
            FIDs are assigned sequentially when users register on the network
            and cannot be changed.
          type: integer
          format: uint64
          example: 2
        timestamp:
          description: >-
            Seconds since Farcaster Epoch (2021-01-01T00:00:00Z). Used to order
            messages chronologically and determine the most recent state. Must
            be within 10 minutes of the current time when the message is
            created.
          type: integer
          format: int64
          example: 48994466
        network:
          $ref: '#/components/schemas/FarcasterNetwork'
    CastAddBody:
      description: Adds a new Cast
      type: object
      properties:
        embedsDeprecated:
          title: URLs to be embedded in the cast
          type: array
          items:
            type: string
        mentions:
          title: Fids mentioned in the cast
          type: array
          items:
            type: integer
            format: uint64
            example: 2
        parentCastId:
          $ref: '#/components/schemas/CastId'
        parentUrl:
          title: Parent URL
          type: string
          example: chain://eip155:1/erc721:0x39d89b649ffa044383333d297e325d42d31329b2
        text:
          title: Text of the cast
          type: string
        mentionsPositions:
          title: Positions of the mentions in the text
          type: array
          items:
            type: integer
            format: int64
        embeds:
          title: URLs or cast IDs to be embedded in the cast
          type: array
          items:
            $ref: '#/components/schemas/Embed'
      required:
        - embedsDeprecated
        - mentions
        - text
        - mentionsPositions
        - embeds
    ReactionBody:
      description: >-
        Specifies the details of a reaction to content on Farcaster. A reaction
        must specify its type (like/recast) and either a target cast ID or URL
        to react to. Only one target (either castId or URL) should be specified
        per reaction.
      type: object
      properties:
        type:
          $ref: '#/components/schemas/ReactionType'
        targetCastId:
          description: >-
            The unique identifier of the cast being reacted to. Must be a valid
            CastId containing the creator's FID and the cast's hash.
          allOf:
            - $ref: '#/components/schemas/CastId'
        targetUrl:
          title: URL to react to
          description: >-
            The URL being reacted to. Used when reacting to external content or
            when the cast ID is not available.
          type: string
          example: https://www.example.com/article
      required:
        - type
    LinkBody:
      description: >-
        Defines a social connection between users in the Farcaster network.
        Currently used to establish following relationships, allowing users to
        curate their content feed.
      type: object
      properties:
        type:
          $ref: '#/components/schemas/LinkType'
        displayTimestamp:
          title: Original Timestamp
          description: >-
            User-defined timestamp that preserves the original creation time
            when message.data.timestamp needs to be updated for compaction.
            Useful for maintaining chronological order in user feeds.
          type: integer
          format: int64
          example: 48994466
        targetFid:
          $ref: '#/components/schemas/FidSchema'
      required:
        - type
        - targetFid
    VerificationAddEthAddressBody:
      description: >-
        Contains the data required to verify ownership of an Ethereum or Solana
        address. The verification process requires a cryptographic signature
        from the blockchain address and includes the block hash at the time of
        signing for timestamp verification.
      type: object
      properties:
        address:
          title: Blockchain Address
          description: >-
            The Ethereum (0x-prefixed) or Solana address that the user is
            claiming ownership of. Must match the address that produced the
            signature.
          pattern: ^(?:0x[a-fA-F0-9]{40}|[1-9A-HJ-NP-Za-km-z]{32,44})$
          type: string
          example: '0x1234567890123456789012345678901234567890'
        ethSignature:
          title: Cryptographic Signature
          description: >-
            Base64-encoded signature produced by the blockchain address, proving
            ownership. For Ethereum, this is an ECDSA signature of a specific
            message format.
          pattern: ^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$
          type: string
          format: byte
          example: >-
            4mGN6TACFqXUVU9RpwLDGCqgqiV1GidEFk9eKF0L0h6JNqmN3kRM9NMPnjUnkh8oL6+jFeQJ9YVuKX4F9EqGiAE=
        blockHash:
          title: Block Hash
          description: >-
            The hash of the most recent block when the signature was created.
            Used to verify the approximate time of signature creation.
          pattern: ^(0x[a-fA-F0-9]{64}|[1-9A-HJ-NP-Za-km-z]{44})$
          type: string
          example: '0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef'
      required:
        - address
        - ethSignature
        - blockHash
    VerificationRemoveBody:
      description: >-
        Contains the data required to remove a previously added blockchain
        address verification from a user's profile. This operation permanently
        removes the verification until explicitly re-added.
      type: object
      properties:
        address:
          title: Blockchain Address
          description: >-
            The Ethereum address (0x-prefixed) for which the verification should
            be removed. Must match a previously verified address in the user's
            profile.
          pattern: ^0x[A-Za-z0-9]{40}$
          type: string
          example: '0x1234567890123456789012345678901234567890'
      required:
        - address
    UserDataBody:
      description: >-
        Contains the data for updating a specific field of a user's profile
        metadata. Each update operation modifies one profile field at a time,
        allowing granular control over profile information.
      type: object
      properties:
        type:
          description: >-
            Specifies which profile field is being updated (e.g., profile
            picture, display name, bio).
          allOf:
            - $ref: '#/components/schemas/UserDataType'
        value:
          title: Profile Field Value
          description: >-
            The new value for the specified profile field. The format depends on
            the type: URLs for profile pictures, plain text for display names
            and bios, etc.
          type: string
          example: https://i.imgur.com/123abc.jpg
      required:
        - type
        - value
    UserNameProof:
      type: object
      properties:
        timestamp:
          description: Seconds since Unix Epoch which began on Jan 1, 1970 00:00:00 UTC
          type: integer
          format: uint64
        name:
          type: string
          example: neynar
        owner:
          pattern: ^0x[0-9a-fA-F]{40}$
          type: string
        signature:
          pattern: ^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$
          type: string
          format: byte
        fid:
          description: The FID of the user who owns this username proof
          allOf:
            - $ref: '#/components/schemas/FidSchema'
        type:
          $ref: '#/components/schemas/UserNameType'
      required:
        - timestamp
        - name
        - owner
        - signature
        - fid
        - type
    FrameActionBody:
      description: >-
        Contains the data for a user's interaction with a Farcaster Frame.
        Frames are interactive elements within casts that can have up to 4
        clickable buttons, allowing users to engage with content in predefined
        ways.
      type: object
      properties:
        url:
          description: >-
            The URL associated with the frame action. This typically points to
            the frame's content or the destination that handles the interaction.
          type: string
          format: uri
          example: https://frames.farcaster.xyz/frame/123
        buttonIndex:
          description: >-
            Identifies which button the user clicked in the frame. Frames can
            have up to 4 buttons, numbered from 1 to 4.
          title: Button Index
          type: integer
          format: int32
          minimum: 1
          maximum: 4
          example: 1
        castId:
          description: >-
            The unique identifier of the cast containing the frame that was
            interacted with.
          allOf:
            - $ref: '#/components/schemas/CastId'
      required:
        - url
        - buttonIndex
        - castId
    HashScheme:
      type: string
      description: >
        Type of hashing scheme used to produce a digest of MessageData. -
        HASH_SCHEME_BLAKE3: Default scheme for hashing MessageData
      default: HASH_SCHEME_BLAKE3
      enum:
        - HASH_SCHEME_BLAKE3
    SignatureScheme:
      type: string
      description: |-
        Type of signature scheme used to sign the Message hash
        - SIGNATURE_SCHEME_ED25519: Ed25519 signature (default)
        - SIGNATURE_SCHEME_EIP712: ECDSA signature using EIP-712 scheme
      default: SIGNATURE_SCHEME_ED25519
      enum:
        - SIGNATURE_SCHEME_ED25519
        - SIGNATURE_SCHEME_EIP712
    MessageType:
      type: string
      description: >-
        Type of the MessageBody.

        - MESSAGE_TYPE_CAST_ADD: Add a new Cast

        - MESSAGE_TYPE_CAST_REMOVE: Remove an existing Cast

        - MESSAGE_TYPE_REACTION_ADD: Add a Reaction to a Cast

        - MESSAGE_TYPE_REACTION_REMOVE: Remove a Reaction from a Cast

        - MESSAGE_TYPE_LINK_ADD: Add a new Link

        - MESSAGE_TYPE_LINK_REMOVE: Remove an existing Link

        - MESSAGE_TYPE_VERIFICATION_ADD_ETH_ADDRESS: Add a Verification of an
        Ethereum Address

        - MESSAGE_TYPE_VERIFICATION_REMOVE: Remove a Verification

        - MESSAGE_TYPE_USER_DATA_ADD: Add metadata about a user

        - MESSAGE_TYPE_USERNAME_PROOF: Add or replace a username proof

        - MESSAGE_TYPE_FRAME_ACTION: A Farcaster Frame action
      default: MESSAGE_TYPE_CAST_ADD
      enum:
        - MESSAGE_TYPE_CAST_ADD
        - MESSAGE_TYPE_CAST_REMOVE
        - MESSAGE_TYPE_REACTION_ADD
        - MESSAGE_TYPE_REACTION_REMOVE
        - MESSAGE_TYPE_LINK_ADD
        - MESSAGE_TYPE_LINK_REMOVE
        - MESSAGE_TYPE_VERIFICATION_ADD_ETH_ADDRESS
        - MESSAGE_TYPE_VERIFICATION_REMOVE
        - MESSAGE_TYPE_USER_DATA_ADD
        - MESSAGE_TYPE_USERNAME_PROOF
        - MESSAGE_TYPE_FRAME_ACTION
    FarcasterNetwork:
      type: string
      description: |-
        Farcaster network the message is intended for.
        - FARCASTER_NETWORK_MAINNET: Public primary network
        - FARCASTER_NETWORK_TESTNET: Public test network
        - FARCASTER_NETWORK_DEVNET: Private test network
      default: FARCASTER_NETWORK_MAINNET
      enum:
        - FARCASTER_NETWORK_MAINNET
        - FARCASTER_NETWORK_TESTNET
        - FARCASTER_NETWORK_DEVNET
    CastId:
      description: >-
        A unique identifier for a cast (post) in the Farcaster network,
        consisting of the creator's FID and a hash of the cast's content. This
        combination ensures global uniqueness across all casts.
      required:
        - fid
        - hash
      type: object
      properties:
        fid:
          title: Fid of the user who created the cast
          description: >-
            The Farcaster ID (FID) of the user who created the cast. Required to
            uniquely identify the cast's author in the network.
          type: integer
          format: uint64
          example: 2
        hash:
          $ref: '#/components/schemas/CastHash'
    Embed:
      oneOf:
        - $ref: '#/components/schemas/CastEmbed'
        - $ref: '#/components/schemas/UrlEmbed'
    ReactionType:
      type: string
      description: >-
        Type of interaction a user can have with content on the Farcaster
        network.

        - Like: Express appreciation for the target content. Similar to "likes"
        or "favorites" on other platforms.

        - Recast: Share the target content with the user's followers, similar to
        a "retweet" or "reblog". Helps increase content visibility.
      default: Like
      enum:
        - Like
        - Recast
      example: Like
    LinkType:
      type: string
      description: >-
        Defines the type of social connection between users.

        - follow: Establishes a following relationship where the user will
        receive updates from the target user in their feed
      default: follow
      enum:
        - follow
      example: follow
    FidSchema:
      type: integer
      format: uint64
      minimum: 1
      description: >
        Farcaster ID (FID). A unique identifier assigned to each user in the
        Farcaster network. This number is permanent and cannot be changed. FIDs
        are assigned sequentially when users register on the network.
      example: 1
    UserDataType:
      type: string
      description: |-
        Specifies which field of a user's profile is being updated.
        - USER_DATA_TYPE_PFP: Profile Picture URL for the user's avatar
        - USER_DATA_TYPE_DISPLAY: Display Name shown on the user's profile
        - USER_DATA_TYPE_BIO: Biography or description of the user
        - USER_DATA_TYPE_URL: Website or social media link for the user
        - USER_DATA_TYPE_USERNAME: Preferred username for the user
      default: USER_DATA_TYPE_PFP
      enum:
        - USER_DATA_TYPE_PFP
        - USER_DATA_TYPE_DISPLAY
        - USER_DATA_TYPE_BIO
        - USER_DATA_TYPE_URL
        - USER_DATA_TYPE_USERNAME
    UserNameType:
      type: string
      default: USERNAME_TYPE_FNAME
      enum:
        - USERNAME_TYPE_FNAME
        - USERNAME_TYPE_ENS_L1
    CastHash:
      description: >-
        A unique hash that identifies a specific cast within the creator's
        posts. Generated using HASH_SCHEME_BLAKE3 of the cast's content.
      pattern: ^0x[0-9a-fA-F]{40}$
      type: string
      example: '0x03aff391a6eb1772b20b4ead9a89f732be75fe27'
    CastEmbed:
      type: object
      properties:
        castId:
          $ref: '#/components/schemas/CastId'
      required:
        - castId
    UrlEmbed:
      type: object
      properties:
        url:
          type: string
          format: uri
      required:
        - url
  responses:
    ErrorResponse:
      description: An unexpected error response.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: API key to authorize requests
      x-default: NEYNAR_API_DOCS

````