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

# 💎 Transaction Deposits

> Returns the deposits that an execution layer transaction made through the deposit contract, identified by its hash: each with the validator it is for, its withdrawal credentials, its amount and sender, what the consensus layer did with it and the slots that did it.

A transaction can make many deposits, for example through a contract that deposits for a batch of validators. Results are ordered by the deposit's position in the transaction and paginated.

What the consensus layer did with a deposit shows here once the slot that did it is finalized. Until then the deposit is `queued` with `queued_slot` and `processed_slot` both null.

| Deposit | `status` | `queued_slot` | `processed_slot` |
|---|---|---|---|
| Not picked up yet, or picked up in a slot that is not finalized yet | `queued` | null | null |
| Waiting in the pending deposit queue | `queued` | the slot that queued it | null |
| Processed | `completed` | the slot that queued it, or that last put it back at the end of the queue for a postponed deposit | the slot that processed it |
| Rejected | `rejected` | the slot that queued it | the slot that rejected it |
| Moved into the builder registry by the Glamsterdam fork upgrade | `onboarded` | the slot that queued it | the last slot before the fork |
| Included before Electra | `completed` or `rejected` | null | the slot whose block included it |
| Made before genesis, processed by the genesis state | `completed` or `rejected` | null | `0` |

`validator.index` is null until the consensus layer processes the first valid deposit of the public key, which creates its validator.

Once every entry of a response is `finalized`, its outcomes and slots no longer change; `validator.index` can still appear later, when the public key of a rejected deposit gets a validator, and `is_contract` follows each address's current state.

You can combine this endpoint with:
- The signature, type, validity and reject reason of a deposit: [v2/ethereum/slot/deposits](/api-reference/ethereum/deposits) at `processed_slot` with the public key as `validator`, or for a deposit in the queue at `queued_slot` with `stage: consensus_layer_queued`
- The validator's status, balance and activation: [v2/ethereum/validators](/api-reference/ethereum/validators), once it has an index
- When a deposit in the queue is estimated to be processed, also for a public key without an index: [v2/ethereum/validators/queues](/api-reference/ethereum/validators/queues). A postponed deposit has no estimate there: it waits until its exiting validator can withdraw
- The block that included the transaction: [v2/ethereum/block](/api-reference/ethereum/block/overview)
- The slots that queued and processed the deposits: [v2/ethereum/slot](/api-reference/ethereum/slot/overview)

The response is `404` when the transaction made no deposit, or when it is not indexed yet, as for a short time after its block.

**Premium Endpoint:** This endpoint requires a Scale or Enterprise plan.




## OpenAPI

````yaml /v3/bundled.yaml post /api/v2/ethereum/transaction/deposits
openapi: 3.0.4
info:
  title: External Service API
  version: 1.0.3
servers:
  - url: https://beaconcha.in
    description: Production API
security:
  - ApiKeyAuth: []
paths:
  /api/v2/ethereum/transaction/deposits:
    post:
      tags:
        - Block
      summary: 💎 Transaction Deposits
      description: >
        Returns the deposits that an execution layer transaction made through
        the deposit contract, identified by its hash: each with the validator it
        is for, its withdrawal credentials, its amount and sender, what the
        consensus layer did with it and the slots that did it.


        A transaction can make many deposits, for example through a contract
        that deposits for a batch of validators. Results are ordered by the
        deposit's position in the transaction and paginated.


        What the consensus layer did with a deposit shows here once the slot
        that did it is finalized. Until then the deposit is `queued` with
        `queued_slot` and `processed_slot` both null.


        | Deposit | `status` | `queued_slot` | `processed_slot` |

        |---|---|---|---|

        | Not picked up yet, or picked up in a slot that is not finalized yet |
        `queued` | null | null |

        | Waiting in the pending deposit queue | `queued` | the slot that queued
        it | null |

        | Processed | `completed` | the slot that queued it, or that last put it
        back at the end of the queue for a postponed deposit | the slot that
        processed it |

        | Rejected | `rejected` | the slot that queued it | the slot that
        rejected it |

        | Moved into the builder registry by the Glamsterdam fork upgrade |
        `onboarded` | the slot that queued it | the last slot before the fork |

        | Included before Electra | `completed` or `rejected` | null | the slot
        whose block included it |

        | Made before genesis, processed by the genesis state | `completed` or
        `rejected` | null | `0` |


        `validator.index` is null until the consensus layer processes the first
        valid deposit of the public key, which creates its validator.


        Once every entry of a response is `finalized`, its outcomes and slots no
        longer change; `validator.index` can still appear later, when the public
        key of a rejected deposit gets a validator, and `is_contract` follows
        each address's current state.


        You can combine this endpoint with:

        - The signature, type, validity and reject reason of a deposit:
        [v2/ethereum/slot/deposits](/api-reference/ethereum/deposits) at
        `processed_slot` with the public key as `validator`, or for a deposit in
        the queue at `queued_slot` with `stage: consensus_layer_queued`

        - The validator's status, balance and activation:
        [v2/ethereum/validators](/api-reference/ethereum/validators), once it
        has an index

        - When a deposit in the queue is estimated to be processed, also for a
        public key without an index:
        [v2/ethereum/validators/queues](/api-reference/ethereum/validators/queues).
        A postponed deposit has no estimate there: it waits until its exiting
        validator can withdraw

        - The block that included the transaction:
        [v2/ethereum/block](/api-reference/ethereum/block/overview)

        - The slots that queued and processed the deposits:
        [v2/ethereum/slot](/api-reference/ethereum/slot/overview)


        The response is `404` when the transaction made no deposit, or when it
        is not indexed yet, as for a short time after its block.


        **Premium Endpoint:** This endpoint requires a Scale or Enterprise plan.
      operationId: GetTransactionDeposits
      requestBody:
        $ref: '#/components/requestBodies/transactionDepositsRequest'
      responses:
        '200':
          $ref: '#/components/responses/TransactionDeposit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '405':
          $ref: '#/components/responses/MethodNotAllowed'
        '429':
          $ref: '#/components/responses/RateLimitExceeded'
        '500':
          $ref: '#/components/responses/InternalServerError'
        default:
          $ref: '#/components/responses/DefaultError'
components:
  requestBodies:
    transactionDepositsRequest:
      description: '`cursor` and `page_size` are optional in this request body'
      content:
        application/json:
          schema:
            type: object
            properties:
              tx_hash:
                $ref: '#/components/schemas/transactionHash'
                description: >-
                  Hash of the execution layer transaction that made the
                  deposits, as a 0x-prefixed hex string.
              chain:
                $ref: '#/components/schemas/Chain'
              cursor:
                $ref: '#/components/schemas/Cursor'
              page_size:
                $ref: '#/components/schemas/PageSize'
            required:
              - tx_hash
              - chain
          example:
            tx_hash: '0x5ddaf424a46ab378967ce45c72b8532386cbd558ddb3b5ddb8a828000ad57895'
            chain: mainnet
  responses:
    TransactionDeposit:
      description: Successful response.
      content:
        application/json:
          schema:
            allOf:
              - $ref: '#/components/schemas/TransactionDeposit.ContainerList'
              - $ref: '#/components/schemas/PagingTemplate'
            description: >-
              Response containing the deposits of an execution layer
              transaction.
    BadRequest:
      description: Bad Request
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error: Bad request. Please check your input and try again.
    Unauthorized:
      description: Unauthorized
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error: Unauthorized. Please provide a valid API key.
    Forbidden:
      description: Forbidden
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error: >-
              endpoint not allowed for your subscription tier. upgrade your
              subscription at https://beaconcha.in/pricing.
    NotFound:
      description: Not Found
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error: The requested resource was not found.
    MethodNotAllowed:
      description: Method Not Allowed
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error: 'method not allowed: GET. all public API endpoints use POST.'
    RateLimitExceeded:
      description: Rate Limit Exceeded
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error: Rate limit exceeded. Please try again later.
    InternalServerError:
      description: Internal Server Error
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error: internal server error. please try again later.
    DefaultError:
      description: An unexpected error response.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error: An unexpected error occurred.
  schemas:
    transactionHash:
      type: string
      pattern: ^0x[a-fA-F0-9]{64}$
    Chain:
      type: string
      enum:
        - mainnet
        - hoodi
      default: mainnet
      description: The Ethereum chain to query.
    Cursor:
      type: string
      description: >-
        Cursor value for pagination. See our [pagination guide](/api/pagination)
        for more details.
      default: ''
    PageSize:
      type: integer
      description: The number of items to return per page.
      minimum: 1
      maximum: 10
      default: 10
    TransactionDeposit.ContainerList:
      type: object
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/TransactionDeposit.Data'
      required:
        - data
    PagingTemplate:
      type: object
      properties:
        paging:
          $ref: '#/components/schemas/Paging'
    Error:
      type: object
      properties:
        error:
          type: string
    TransactionDeposit.Data:
      type: object
      description: A deposit the transaction made through the deposit contract.
      properties:
        validator:
          allOf:
            - $ref: '#/components/schemas/validator'
          description: >-
            The validator the deposit is for, by public key. `index` is null
            while no validator has this public key, which lasts until the
            consensus layer processes the first valid deposit of the key. An
            `onboarded` deposit creates no validator, so it does not set
            `index`.
        withdrawal_credentials:
          allOf:
            - $ref: '#/components/schemas/withdrawalCredential'
          description: >-
            The withdrawal credentials the deposit names. The first valid
            deposit of a public key sets the credentials of its validator; the
            credentials of a later deposit are ignored.
        amount:
          allOf:
            - $ref: '#/components/schemas/wei'
          description: The amount of the deposit, in wei.
        tx_from:
          allOf:
            - $ref: '#/components/schemas/ExecutionLayerAddressDetails'
          description: >
            The address that originally initiated the transaction (`tx.origin`).
            This is always the externally owned account (EOA) that signed the
            transaction, typically the user's wallet.

            When the user sends the transaction directly, `tx_from` and
            `tx_msg_sender` are the same. When the user interacts through a
            contract (e.g. a multisig, smart wallet, or staking service),
            `tx_from` is the user's wallet while `tx_msg_sender` is the
            contract.
        tx_msg_sender:
          allOf:
            - $ref: '#/components/schemas/ExecutionLayerAddressDetails'
          description: >
            The address that directly called the deposit contract
            (`msg.sender`). This is the immediate caller: either the user's
            wallet (EOA) or an intermediary contract.

            When the user sends the transaction directly, this equals `tx_from`.
            When the user interacts through a contract (e.g. a multisig, smart
            wallet, or staking service), this is the contract address, not the
            user's wallet.
        status:
          allOf:
            - $ref: '#/components/schemas/ConsensusLayerEventStatus'
          description: >
            What the consensus layer did with the deposit:


            - `queued`: waiting in the pending deposit queue (`queued_slot`
            set), also when the consensus layer postponed it because its
            validator was exiting, or not picked up yet, or picked up in a slot
            that is not finalized yet (`queued_slot` null).

            - `completed`: processed. The amount was added to the validator's
            balance; the first valid deposit of a public key creates its
            validator.

            - `onboarded`: applied to the builder registry by the Glamsterdam
            hard fork. The amount funds a builder, and no validator is created.
            `processed_slot` is the last slot before the fork.

            - `rejected`: dropped when the consensus layer processed it.
            [v2/ethereum/slot/deposits](/api-reference/ethereum/deposits) at
            `processed_slot` returns the reason.


            Experimental: `onboarded` is set only on chains past the Glamsterdam
            hard fork, which Hoodi reaches first, and may change before the
            mainnet release. See [Glamsterdam API](/api/glamsterdam).
        block:
          allOf:
            - $ref: '#/components/schemas/Block'
          description: >-
            The execution layer block that included the transaction; see
            [v2/ethereum/block](/api-reference/ethereum/block/overview).
        queued_slot:
          allOf:
            - $ref: '#/components/schemas/Slot'
          nullable: true
          description: >-
            The slot that added the deposit to the pending deposit queue, or for
            a postponed deposit the slot that put it back at the end of the
            queue. Null for a deposit the consensus layer processed before
            Electra, which had no deposit queue, and until the slot that queued
            the deposit is finalized.
        processed_slot:
          allOf:
            - $ref: '#/components/schemas/Slot'
          nullable: true
          description: >-
            The slot in which the consensus layer processed the deposit, adding
            it to the balance, rejecting it, or moving it into the builder
            registry; before Electra, the slot whose block included the deposit,
            and `0` for a deposit made before genesis that the genesis state
            processed. Null while the deposit is `queued`.
        finality:
          allOf:
            - $ref: '#/components/schemas/FinalityParams'
          description: >-
            `finalized` once `processed_slot` is finalized, after which the
            outcome and the slots no longer change; `validator.index` can still
            appear later, when the public key gets a validator. A `queued`
            deposit is `not_finalized`.
      required:
        - validator
        - withdrawal_credentials
        - amount
        - tx_from
        - tx_msg_sender
        - status
        - block
        - queued_slot
        - processed_slot
        - finality
    Paging:
      type: object
      properties:
        next_cursor:
          description: >-
            Cursor to the next page of results. See our [pagination
            guide](/api/pagination) for more details. If empty, there are no
            more pages to fetch.
          type: string
          example: eyJfc2FtcGxlX2N1cnNvciI6MTIzNDU2Nzg5MH0
    validator:
      type: object
      properties:
        index:
          allOf:
            - $ref: '#/components/schemas/validatorIndex'
          nullable: true
        public_key:
          $ref: '#/components/schemas/validatorPublicKey'
    withdrawalCredential:
      type: object
      properties:
        type:
          $ref: '#/components/schemas/withdrawalCredentialType'
        prefix:
          $ref: '#/components/schemas/withdrawalCredentialPrefix'
        credential:
          $ref: '#/components/schemas/withdrawalCredentialPrimitive'
        address:
          allOf:
            - $ref: '#/components/schemas/ExecutionLayerAddress'
          nullable: true
          description: >-
            The execution address that receives the withdrawals, for the type
            `execution_address`; null for `bls` and `unknown`.
      required:
        - type
        - prefix
        - credential
        - address
    wei:
      type: string
      description: Amount in wei (1 ETH = 10^18 wei)
      pattern: ^(0|-?[1-9][0-9]*)$
      example: '32000000000000000000'
    ExecutionLayerAddressDetails:
      type: object
      properties:
        address:
          $ref: '#/components/schemas/ExecutionLayerAddress'
        is_contract:
          type: boolean
      required:
        - address
        - is_contract
    ConsensusLayerEventStatus:
      type: string
      enum:
        - queued
        - completed
        - rejected
        - onboarded
      example: completed
      nullable: true
    Block:
      type: integer
      minimum: 0
      description: Block by number.
    Slot:
      type: integer
      minimum: 0
      description: Slot by number.
    FinalityParams:
      type: string
      description: |
        Indicates the finality status of the data provided. 
          - Finalized data cannot be changed without slashing at least one-third of all validators, providing strong economic guarantees.
          - Data marked as not_finalized does not have this guarantee and may still change.
      enum:
        - not_finalized
        - finalized
      example: finalized
    validatorIndex:
      description: Validator Index
      type: integer
      minimum: 0
    validatorPublicKey:
      type: string
      description: Public key of a validator
      pattern: ^0x[a-fA-F0-9]{96}$
      example: >-
        0xab6b6d826c14b6141e3406c5227ead15b133993195e96edc05fdeba998d0e0fd96e4ec5f47f6c9eec1558a59042c03d1
    withdrawalCredentialType:
      type: string
      description: >
        Specifies whether the withdrawal credential is a BLS withdrawal
        credential (`0x00`) or an execution address withdrawal credential
        (`0x01`, `0x02`). `unknown` is any other first byte, which a deposit can
        carry but a validator cannot withdraw to.
      enum:
        - bls
        - execution_address
        - unknown
      x-enum-varnames:
        - Bls
        - ExecutionAddress
        - WithdrawalCredentialTypeUnknown
      example: execution_address
    withdrawalCredentialPrefix:
      type: string
      pattern: ^0x[0-9a-f]{2}$
      example: '0x01'
      description: >
        Hexadecimal first byte of the withdrawal credential, which names its
        type:

        - "0x00": BLS withdrawal credential

        - "0x01": Execution address withdrawal credential

        - "0x02": Execution address withdrawal credential with consolidation
        support (Electra Fork)


        A deposit can carry any first byte. One that a validator cannot withdraw
        to, such as "0x03", has the type `unknown`.


        Credentials can be upgraded in one direction only:

        - From "0x00" (BLS) to "0x01" (execution address)

        - From "0x01" to "0x02" (consolidation-enabled execution address)

        Downgrades are not permitted.
    withdrawalCredentialPrimitive:
      type: string
      pattern: ^(0x)?[0-9a-fA-F]{64}$
      description: >-
        A full 32-byte withdrawal credential represented as a hex string with 0x
        prefix. Its first byte is the prefix, which can be any value (see
        `prefix`).
      example: '0x010000000000000000000000388c818ca8b9251b393131c08a736a67ccb19297'
    ExecutionLayerAddress:
      type: string
      pattern: ^0x[a-fA-F0-9]{40}$
      description: A standard Ethereum address (20-byte hex string with 0x prefix).
      example: '0x388C818CA8B9251b393131C08a736A67ccB19297'
  securitySchemes:
    ApiKeyAuth:
      type: http
      scheme: bearer
      description: >-
        Authorization header with value: Bearer YOUR_TOKEN. Refer to the [API
        Keys](/api/overview#api-keys) section to create your API key.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.