Infura · AsyncAPI Specification

Infura (MetaMask Developer) WebSocket Subscription API

Version 1.0.0

AsyncAPI specification for Infura's (now MetaMask Developer Services) Ethereum-compatible WebSocket JSON-RPC subscription interface. Infura now defers its Ethereum reference documentation to the MetaMask Developer docs site. Subscription methods (`eth_subscribe`, `eth_unsubscribe`) are exposed exclusively over WebSocket (WSS) and enable real-time, stateful notifications driven by the `eth_subscription` JSON-RPC notification envelope. Per the official documentation, Ethereum exposes three subscription types: `newHeads`, `logs`, and `newPendingTransactions`. The `syncing` subscription type is not enumerated in Infura/MetaMask Developer Ethereum reference docs and therefore is not modeled here. Sourced from: - https://docs.metamask.io/services/reference/ethereum/json-rpc-methods/subscription-methods/eth_subscribe - https://docs.metamask.io/services/reference/ethereum/json-rpc-methods/subscription-methods/eth_unsubscribe - https://docs.metamask.io/services/concepts/websockets/

View Spec View on GitHub Web3BlockchainRPCInfrastructureMetaMaskConsenSysAsyncAPIWebhooksEvents

Channels

/
publish sendJsonRpcRequest
Client-to-server JSON-RPC request
Root WebSocket channel for the selected Infura network. All JSON-RPC requests (`eth_subscribe`, `eth_unsubscribe`, plus any standard Ethereum JSON-RPC method) are sent as text frames on this single connection, and asynchronous `eth_subscription` notifications stream back over the same connection.

Messages

EthSubscribeRequest
eth_subscribe request
Create a new subscription for a particular event.
EthSubscribeResponse
eth_subscribe response
JSON-RPC response containing the newly created subscription ID.
EthUnsubscribeRequest
eth_unsubscribe request
Cancel an existing subscription by its subscription ID.
EthUnsubscribeResponse
eth_unsubscribe response
Boolean flag indicating whether unsubscription succeeded.
NewHeadsNotification
newHeads subscription notification
Emitted each time a new header is appended to the chain.
LogsNotification
logs subscription notification
Emitted when matching event logs are included in new blocks.
NewPendingTransactionsNotification
newPendingTransactions subscription notification
Emitted as new transactions enter the pending pool.
JsonRpcErrorResponse
JSON-RPC error response
Standard JSON-RPC 2.0 error envelope.

Servers

wss
production wss://{network}.infura.io/ws/v3/{projectId}
Infura WebSocket endpoint. The `network` path segment selects the target chain and the `projectId` (also referred to as the API key) authenticates the request. Per the MetaMask Developer "WebSockets" concepts page, the following networks support WebSocket subscriptions: Arbitrum, Avalanche (C-Chain), Base, Binance Smart Chain, Blast, Ethereum, Linea, Mantle, opBNB, Optimism, Polygon, Scroll, and ZKsync Era. WebSocket support is in public beta for Arbitrum, Avalanche (C-Chain), BNB, opBNB, and Optimism.

AsyncAPI Specification

Raw ↑
asyncapi: '2.6.0'
info:
  title: Infura (MetaMask Developer) WebSocket Subscription API
  version: '1.0.0'
  description: |
    AsyncAPI specification for Infura's (now MetaMask Developer Services)
    Ethereum-compatible WebSocket JSON-RPC subscription interface.

    Infura now defers its Ethereum reference documentation to the MetaMask
    Developer docs site. Subscription methods (`eth_subscribe`,
    `eth_unsubscribe`) are exposed exclusively over WebSocket (WSS) and
    enable real-time, stateful notifications driven by the
    `eth_subscription` JSON-RPC notification envelope.

    Per the official documentation, Ethereum exposes three subscription
    types: `newHeads`, `logs`, and `newPendingTransactions`. The
    `syncing` subscription type is not enumerated in Infura/MetaMask
    Developer Ethereum reference docs and therefore is not modeled here.

    Sourced from:
      - https://docs.metamask.io/services/reference/ethereum/json-rpc-methods/subscription-methods/eth_subscribe
      - https://docs.metamask.io/services/reference/ethereum/json-rpc-methods/subscription-methods/eth_unsubscribe
      - https://docs.metamask.io/services/concepts/websockets/
  contact:
    name: MetaMask Developer
    url: https://docs.metamask.io/services/reference/
  license:
    name: Documentation reference
    url: https://docs.metamask.io/services/
  tags:
    - name: WebSocket
    - name: JSON-RPC
    - name: Ethereum
    - name: Subscriptions

defaultContentType: application/json

servers:
  production:
    url: 'wss://{network}.infura.io/ws/v3/{projectId}'
    protocol: wss
    description: |
      Infura WebSocket endpoint. The `network` path segment selects the
      target chain and the `projectId` (also referred to as the API key)
      authenticates the request.

      Per the MetaMask Developer "WebSockets" concepts page, the
      following networks support WebSocket subscriptions: Arbitrum,
      Avalanche (C-Chain), Base, Binance Smart Chain, Blast, Ethereum,
      Linea, Mantle, opBNB, Optimism, Polygon, Scroll, and ZKsync Era.
      WebSocket support is in public beta for Arbitrum, Avalanche
      (C-Chain), BNB, opBNB, and Optimism.
    variables:
      network:
        description: Network identifier path segment.
        default: mainnet
        examples:
          - mainnet
          - linea-mainnet
          - polygon-mainnet
          - arbitrum-mainnet
          - optimism-mainnet
          - base-mainnet
          - avalanche-mainnet
          - bnbsmartchain-mainnet
          - blast-mainnet
          - mantle-mainnet
          - opbnb-mainnet
          - scroll-mainnet
          - zksync-mainnet
      projectId:
        description: |
          Infura project ID / API key. Issued from the Infura dashboard
          at https://app.infura.io/. Passed as a path segment - not as a
          query parameter or header.
        default: YOUR-API-KEY

channels:
  /:
    description: |
      Root WebSocket channel for the selected Infura network. All
      JSON-RPC requests (`eth_subscribe`, `eth_unsubscribe`, plus any
      standard Ethereum JSON-RPC method) are sent as text frames on this
      single connection, and asynchronous `eth_subscription`
      notifications stream back over the same connection.
    publish:
      operationId: sendJsonRpcRequest
      summary: Client-to-server JSON-RPC request
      description: |
        Send any JSON-RPC 2.0 request frame. Subscription-related
        methods are `eth_subscribe` and `eth_unsubscribe`. The server
        replies with a single JSON-RPC response addressed to the same
        `id`, followed (for `eth_subscribe`) by a stream of
        `eth_subscription` notifications addressed to the returned
        subscription ID.
      message:
        oneOf:
          - $ref: '#/components/messages/EthSubscribeRequest'
          - $ref: '#/components/messages/EthUnsubscribeRequest'
    subscribe:
      operationId: receiveJsonRpcFrames
      summary: Server-to-client frames (responses and notifications)
      description: |
        The server emits two kinds of frames: synchronous JSON-RPC
        responses to client requests (carrying the original `id`), and
        asynchronous `eth_subscription` notifications (no `id`, the
        subscription ID is carried in `params.subscription`).
      message:
        oneOf:
          - $ref: '#/components/messages/EthSubscribeResponse'
          - $ref: '#/components/messages/EthUnsubscribeResponse'
          - $ref: '#/components/messages/NewHeadsNotification'
          - $ref: '#/components/messages/LogsNotification'
          - $ref: '#/components/messages/NewPendingTransactionsNotification'
          - $ref: '#/components/messages/JsonRpcErrorResponse'

components:
  messages:
    EthSubscribeRequest:
      name: eth_subscribe
      title: eth_subscribe request
      summary: Create a new subscription for a particular event.
      description: |
        `eth_subscribe` creates a new subscription. The first parameter
        names the subscription type (`newHeads`, `logs`, or
        `newPendingTransactions`). The optional second parameter carries
        type-specific filters (currently only used by `logs`).
      contentType: application/json
      payload:
        $ref: '#/components/schemas/EthSubscribeRequest'
      examples:
        - name: newHeads
          summary: Subscribe to new block headers
          payload:
            jsonrpc: '2.0'
            id: 1
            method: eth_subscribe
            params:
              - newHeads
        - name: logs
          summary: Subscribe to filtered logs
          payload:
            jsonrpc: '2.0'
            id: 1
            method: eth_subscribe
            params:
              - logs
              - address: '0x8320fe7702b96808f7bbc0d4a888ed1468216cfd'
                topics:
                  - '0xd78a0cb8bb633d06981248b816e7bd33c2a35a6089241d099fa519e361cab902'
        - name: newPendingTransactions
          summary: Subscribe to pending transaction hashes
          payload:
            jsonrpc: '2.0'
            id: 1
            method: eth_subscribe
            params:
              - newPendingTransactions

    EthSubscribeResponse:
      name: eth_subscribe_response
      title: eth_subscribe response
      summary: JSON-RPC response containing the newly created subscription ID.
      description: |
        Synchronous reply to a successful `eth_subscribe` call. The
        `result` field is the subscription ID, which is the value the
        server will populate in `params.subscription` on every
        notification for this subscription.
      contentType: application/json
      payload:
        $ref: '#/components/schemas/EthSubscribeResponse'
      examples:
        - name: success
          payload:
            id: 1
            jsonrpc: '2.0'
            result: '0x9cef478923ff08bf67fde6c64013158d'

    EthUnsubscribeRequest:
      name: eth_unsubscribe
      title: eth_unsubscribe request
      summary: Cancel an existing subscription by its subscription ID.
      contentType: application/json
      payload:
        $ref: '#/components/schemas/EthUnsubscribeRequest'
      examples:
        - name: cancel
          payload:
            jsonrpc: '2.0'
            id: 1
            method: eth_unsubscribe
            params:
              - '0x9cef478923ff08bf67fde6c64013158d'

    EthUnsubscribeResponse:
      name: eth_unsubscribe_response
      title: eth_unsubscribe response
      summary: Boolean flag indicating whether unsubscription succeeded.
      contentType: application/json
      payload:
        $ref: '#/components/schemas/EthUnsubscribeResponse'
      examples:
        - name: success
          payload:
            id: 1
            jsonrpc: '2.0'
            result: true

    NewHeadsNotification:
      name: newHeads
      title: newHeads subscription notification
      summary: Emitted each time a new header is appended to the chain.
      description: |
        Subscribing to `newHeads` returns a notification each time a new
        header is appended to the chain, including chain reorganizations.
        During a reorg the subscription emits all new headers for the new
        chain, so the subscription may emit multiple headers at the same
        height.
      contentType: application/json
      payload:
        $ref: '#/components/schemas/NewHeadsNotification'
      examples:
        - name: newBlockHeader
          payload:
            jsonrpc: '2.0'
            method: eth_subscription
            params:
              subscription: '0x9ce59a13059e417087c02d3236a0b1cc'
              result:
                difficulty: '0x15d9223a23aa'
                extraData: '0xd983010305844765746887676f312e342e328777696e646f7773'
                gasLimit: '0x47e7c4'
                gasUsed: '0x38658'
                logsBloom: '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
                miner: '0xf8b483dba2c3b7176a3da549ad41a48bb3121069'
                nonce: '0x084149998194cc5f'
                number: '0x1348c9'
                parentHash: '0x7736fab79e05dc611604d22470dadad26f56fe494421b5b333de816ce1f25701'
                receiptRoot: '0x2fab35823ad00c7bb388595cb46652fe7886e00660a01e867824d3dceb1c8d36'
                sha3Uncles: '0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347'
                stateRoot: '0xb3346685172db67de536d8765c43c31009d0eb3bd9c501c9be3229203f15f378'
                timestamp: '0x56ffeff8'
                transactionsRoot: '0x0167ffa60e3ebc0b080cdb95f7c0087dd6c0e61413140e39d94d3468d7c9689f'

    LogsNotification:
      name: logs
      title: logs subscription notification
      summary: Emitted when matching event logs are included in new blocks.
      description: |
        Returns logs that are included in new imported blocks and match
        the supplied filter criteria. In case of a chain reorganization,
        previously sent logs that are on the old chain are re-sent with
        the `removed` property set to `true`, and logs from transactions
        that ended up in the new chain are emitted. A subscription can
        therefore emit logs for the same transaction multiple times.

        Infura strongly recommends specifying a filter (`address`,
        `topics`, or both) when subscribing to `logs`.
      contentType: application/json
      payload:
        $ref: '#/components/schemas/LogsNotification'
      examples:
        - name: logEvent
          payload:
            jsonrpc: '2.0'
            method: eth_subscription
            params:
              subscription: '0x4a8a4c0517381924f9838102c5a4dcb7'
              result:
                address: '0x8320fe7702b96808f7bbc0d4a888ed1468216cfd'
                blockHash: '0x61cdb2a09ab99abf791d474f20c2ea89bf8de2923a2d42bb49944c8c993cbf04'
                blockNumber: '0x29e87'
                data: '0x00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003'
                logIndex: '0x0'
                topics:
                  - '0xd78a0cb8bb633d06981248b816e7bd33c2a35a6089241d099fa519e361cab902'
                transactionHash: '0xe044554a0a55067caafd07f8020ab9f2af60bdfe337e395ecd84b4877a3d1ab4'
                transactionIndex: '0x0'

    NewPendingTransactionsNotification:
      name: newPendingTransactions
      title: newPendingTransactions subscription notification
      summary: Emitted as new transactions enter the pending pool.
      description: |
        Returns the hash for all transactions that are added to the
        pending state. When a transaction that was previously part of
        the canonical chain isn't part of the new canonical chain after
        a reorganization, it's emitted again.

        Per the Infura concepts page, an event is generated roughly
        every 700-800ms aggregating pending transactions collected
        during that window. The `newPendingTransactions` subscription
        type is not available on all supported networks.
      contentType: application/json
      payload:
        $ref: '#/components/schemas/NewPendingTransactionsNotification'
      examples:
        - name: pendingTxHash
          payload:
            jsonrpc: '2.0'
            method: eth_subscription
            params:
              subscription: '0xc3b33aa549fb9a60e95d21862596617c'
              result: '0xd6fdc5cc41a9959e922f30cb772a9aef46f4daea279307bc5f7024edc4ccd7fa'

    JsonRpcErrorResponse:
      name: jsonrpc_error
      title: JSON-RPC error response
      summary: Standard JSON-RPC 2.0 error envelope.
      contentType: application/json
      payload:
        $ref: '#/components/schemas/JsonRpcErrorResponse'

  schemas:
    JsonRpcId:
      description: |
        Client-supplied identifier echoed back in the matching response.
        Notifications (`eth_subscription`) omit `id`.
      oneOf:
        - type: integer
        - type: string
        - type: 'null'

    JsonRpcVersion:
      type: string
      const: '2.0'
      description: JSON-RPC protocol version. Always `"2.0"`.

    HexQuantity:
      type: string
      pattern: '^0x[0-9a-fA-F]+$'
      description: Hex-encoded quantity, prefixed with `0x`.

    HexData:
      type: string
      pattern: '^0x[0-9a-fA-F]*$'
      description: Hex-encoded byte data, prefixed with `0x`.

    Address:
      type: string
      pattern: '^0x[0-9a-fA-F]{40}$'
      description: 20-byte Ethereum address, hex-encoded with `0x` prefix.

    Hash32:
      type: string
      pattern: '^0x[0-9a-fA-F]{64}$'
      description: 32-byte hash (e.g. block hash, transaction hash, topic).

    SubscriptionId:
      type: string
      pattern: '^0x[0-9a-fA-F]+$'
      description: Subscription identifier returned by `eth_subscribe`.

    LogsFilter:
      type: object
      description: |
        Optional second parameter of `eth_subscribe` when the
        subscription type is `logs`. Either `address`, `topics`, or both
        should be supplied per Infura's recommendation.
      properties:
        address:
          description: A single address or array of addresses to filter on.
          oneOf:
            - $ref: '#/components/schemas/Address'
            - type: array
              items:
                $ref: '#/components/schemas/Address'
        topics:
          description: |
            Array of topic filters. Each entry is a topic hash, `null`
            (wildcard), or an array of topic hashes (OR-match).
          type: array
          items:
            oneOf:
              - $ref: '#/components/schemas/Hash32'
              - type: 'null'
              - type: array
                items:
                  $ref: '#/components/schemas/Hash32'

    SubscriptionType:
      type: string
      enum:
        - newHeads
        - logs
        - newPendingTransactions
      description: |
        Subscription event type. Enumerated per the official Infura /
        MetaMask Developer Ethereum subscription-methods documentation.

    EthSubscribeRequest:
      type: object
      required: [jsonrpc, method, id, params]
      properties:
        jsonrpc:
          $ref: '#/components/schemas/JsonRpcVersion'
        id:
          $ref: '#/components/schemas/JsonRpcId'
        method:
          type: string
          const: eth_subscribe
        params:
          type: array
          minItems: 1
          maxItems: 2
          description: |
            Tuple of `[subscriptionType]` or
            `[subscriptionType, filterObject]`. The optional
            `filterObject` is currently only used by the `logs`
            subscription type.
          items:
            oneOf:
              - $ref: '#/components/schemas/SubscriptionType'
              - $ref: '#/components/schemas/LogsFilter'

    EthSubscribeResponse:
      type: object
      required: [jsonrpc, id, result]
      properties:
        jsonrpc:
          $ref: '#/components/schemas/JsonRpcVersion'
        id:
          $ref: '#/components/schemas/JsonRpcId'
        result:
          $ref: '#/components/schemas/SubscriptionId'

    EthUnsubscribeRequest:
      type: object
      required: [jsonrpc, method, id, params]
      properties:
        jsonrpc:
          $ref: '#/components/schemas/JsonRpcVersion'
        id:
          $ref: '#/components/schemas/JsonRpcId'
        method:
          type: string
          const: eth_unsubscribe
        params:
          type: array
          minItems: 1
          maxItems: 1
          items:
            $ref: '#/components/schemas/SubscriptionId'

    EthUnsubscribeResponse:
      type: object
      required: [jsonrpc, id, result]
      properties:
        jsonrpc:
          $ref: '#/components/schemas/JsonRpcVersion'
        id:
          $ref: '#/components/schemas/JsonRpcId'
        result:
          type: boolean
          description: '`true` if the subscription was canceled successfully.'

    BlockHeader:
      type: object
      description: Ethereum block header as emitted on `newHeads` notifications.
      properties:
        difficulty:
          $ref: '#/components/schemas/HexQuantity'
        extraData:
          $ref: '#/components/schemas/HexData'
        gasLimit:
          $ref: '#/components/schemas/HexQuantity'
        gasUsed:
          $ref: '#/components/schemas/HexQuantity'
        logsBloom:
          $ref: '#/components/schemas/HexData'
        miner:
          $ref: '#/components/schemas/Address'
        nonce:
          type: string
          description: 8-byte nonce, hex-encoded.
        number:
          $ref: '#/components/schemas/HexQuantity'
        parentHash:
          $ref: '#/components/schemas/Hash32'
        receiptRoot:
          $ref: '#/components/schemas/Hash32'
        sha3Uncles:
          $ref: '#/components/schemas/Hash32'
        stateRoot:
          $ref: '#/components/schemas/Hash32'
        timestamp:
          $ref: '#/components/schemas/HexQuantity'
        transactionsRoot:
          $ref: '#/components/schemas/Hash32'

    LogEntry:
      type: object
      description: |
        Ethereum log entry. The `removed` property is `true` when this
        log was emitted on the old chain after a reorg.
      properties:
        address:
          $ref: '#/components/schemas/Address'
        blockHash:
          $ref: '#/components/schemas/Hash32'
        blockNumber:
          $ref: '#/components/schemas/HexQuantity'
        data:
          $ref: '#/components/schemas/HexData'
        logIndex:
          $ref: '#/components/schemas/HexQuantity'
        topics:
          type: array
          items:
            $ref: '#/components/schemas/Hash32'
        transactionHash:
          $ref: '#/components/schemas/Hash32'
        transactionIndex:
          $ref: '#/components/schemas/HexQuantity'
        removed:
          type: boolean
          description: '`true` if this log was removed due to a chain reorganization.'

    NotificationEnvelope:
      type: object
      required: [jsonrpc, method, params]
      description: |
        Common JSON-RPC envelope for asynchronous `eth_subscription`
        notifications. Subtypes refine `params.result` for the specific
        subscription type.
      properties:
        jsonrpc:
          $ref: '#/components/schemas/JsonRpcVersion'
        method:
          type: string
          const: eth_subscription

    NewHeadsNotification:
      allOf:
        - $ref: '#/components/schemas/NotificationEnvelope'
        - type: object
          properties:
            params:
              type: object
              required: [subscription, result]
              properties:
                subscription:
                  $ref: '#/components/schemas/SubscriptionId'
                result:
                  $ref: '#/components/schemas/BlockHeader'

    LogsNotification:
      allOf:
        - $ref: '#/components/schemas/NotificationEnvelope'
        - type: object
          properties:
            params:
              type: object
              required: [subscription, result]
              properties:
                subscription:
                  $ref: '#/components/schemas/SubscriptionId'
                result:
                  $ref: '#/components/schemas/LogEntry'

    NewPendingTransactionsNotification:
      allOf:
        - $ref: '#/components/schemas/NotificationEnvelope'
        - type: object
          properties:
            params:
              type: object
              required: [subscription, result]
              properties:
                subscription:
                  $ref: '#/components/schemas/SubscriptionId'
                result:
                  $ref: '#/components/schemas/Hash32'

    JsonRpcErrorResponse:
      type: object
      required: [jsonrpc, id, error]
      properties:
        jsonrpc:
          $ref: '#/components/schemas/JsonRpcVersion'
        id:
          $ref: '#/components/schemas/JsonRpcId'
        error:
          type: object
          required: [code, message]
          properties:
            code:
              type: integer
            message:
              type: string
            data: {}