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

<AgentInstructions>

## Submitting Feedback

If you encounter incorrect, outdated, or confusing documentation on this page, submit feedback:

POST https://developers.fireblocks.com/feedback

```json
{
  "path": "/api-reference/staking/initiate-or-add-to-existing-stake",
  "feedback": "Description of the issue"
}
```

Only submit feedback when you have something specific and actionable to report.

</AgentInstructions>

# Initiate or add to existing stake

> Creates a new staking position and returns its unique ID. For Ethereum compounding validator (EIP-7251): when the 'id' of an existing compounding validator position is provided, adds to that position; otherwise creates a new position. For Ethereum legacy validator: creates a new position regardless of existing delegations. For Cosmos chains and Ethereum liquid staking (Lido): automatically add to existing positions for the same validator provider and same vault account if one exists, otherwise create a new position. For Solana and Polygon (MATIC/POL): always create new positions regardless of existing delegations.



## OpenAPI

````yaml https://docs.fireblocks.com/api/v1/swagger.yaml post /staking/chains/{chainDescriptor}/stake
openapi: 3.0.0
info:
  title: Fireblocks API
  description: >
    Fireblocks provides a suite of applications to manage digital asset
    operations and a complete development platform to build your business on the
    blockchain.


    - Visit our website for more information: [Fireblocks
    Website](https://fireblocks.com)

    - Visit our developer docs: [Fireblocks
    DevPortal](https://developers.fireblocks.com)
  version: 1.6.2
  contact:
    email: developers@fireblocks.com
servers:
  - url: https://api.fireblocks.io/v1
    description: Fireblocks Production Environment Base URL
  - url: https://sandbox-api.fireblocks.io/v1
    description: Fireblocks Sandbox Environment Base URL
security: []
paths:
  /staking/chains/{chainDescriptor}/stake:
    post:
      tags:
        - Staking
      summary: Initiate or add to existing stake
      description: >-
        Creates a new staking position and returns its unique ID. For Ethereum
        compounding validator (EIP-7251): when the 'id' of an existing
        compounding validator position is provided, adds to that position;
        otherwise creates a new position. For Ethereum legacy validator: creates
        a new position regardless of existing delegations. For Cosmos chains and
        Ethereum liquid staking (Lido): automatically add to existing positions
        for the same validator provider and same vault account if one exists,
        otherwise create a new position. For Solana and Polygon (MATIC/POL):
        always create new positions regardless of existing delegations.
      operationId: stake
      parameters:
        - name: chainDescriptor
          required: true
          in: path
          description: >-
            Protocol identifier for the stake staking operation (e.g.,
            ATOM_COS/AXL/CELESTIA).
          schema:
            $ref: '#/components/schemas/ChainDescriptor'
        - $ref: '#/components/parameters/X-Idempotency-Key'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/StakeRequest'
      responses:
        '201':
          description: Stake request accepted and created.
          headers:
            X-Request-ID:
              $ref: '#/components/headers/X-Request-ID'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StakeResponse'
        '400':
          description: >-
            Bad request: missing/invalid fields, unsupported amount, or
            malformed payload.
          headers:
            X-Request-ID:
              $ref: '#/components/headers/X-Request-ID'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorSchema'
        '403':
          description: >-
            Forbidden: insufficient permissions, disabled feature, or restricted
            provider/validator.
          headers:
            X-Request-ID:
              $ref: '#/components/headers/X-Request-ID'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorSchema'
        '404':
          description: >-
            Not found: requested resource does not exist (e.g., position,
            validator, provider, or wallet).
          headers:
            X-Request-ID:
              $ref: '#/components/headers/X-Request-ID'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorSchema'
        '429':
          description: 'Rate limit exceeded: slow down and retry later.'
          headers:
            X-Request-ID:
              $ref: '#/components/headers/X-Request-ID'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorSchema'
        '500':
          description: Internal error while processing the request.
          headers:
            X-Request-ID:
              $ref: '#/components/headers/X-Request-ID'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorSchema'
        default:
          $ref: '#/components/responses/Error'
      x-codeSamples:
        - lang: TypeScript
          source: >-
            const response: Promise<FireblocksResponse<StakeResponse>> =
            fireblocks.staking.stake(stakingApiStakeRequest);
        - lang: Java
          source: >-
            CompletableFuture<ApiResponse<StakeResponse>> response =
            fireblocks.staking().stake(stakeRequest, chainDescriptor,
            idempotencyKey);
        - lang: Python
          source: >-
            response = fireblocks.staking.stake(stake_request, chain_descriptor,
            idempotency_key);
components:
  schemas:
    ChainDescriptor:
      type: string
      description: Protocol identifier for the staking operation.
      enum:
        - ATOM_COS
        - AXL
        - AXL_TEST
        - CELESTIA
        - DYDX_DYDX
        - ETH
        - ETH_TEST6
        - ETH_TEST_HOODI
        - INJ_INJ
        - MANTRA
        - MATIC
        - OSMO
        - POL
        - POL_TEST
        - SOL
        - SOL_TEST
        - STETH_ETH
        - STETH_ETH_TEST6_DZFA
        - STETH_ETH_TEST_HOODI
    StakeRequest:
      type: object
      example:
        id: b70701f4-d7b1-4795-a8ee-b09cdb5b850d
        vaultAccountId: '22'
        providerId: kiln
        stakeAmount: '32'
        chainDescriptor: ETH
        txNote: stake request of 32ETH created on 02.04.23
        feeLevel: MEDIUM
      properties:
        vaultAccountId:
          type: string
          example: '22'
          description: >-
            The Fireblocks vault account ID that will source the funds for
            staking.
        providerId:
          $ref: '#/components/schemas/StakingProvider'
        stakeAmount:
          type: string
          example: '32'
          description: >-
            The amount of tokens to stake. The amount may be truncated to match
            the chain's decimal precision requirements.
        txNote:
          type: string
          example: stake request of 32ETH created on 02.04.23
          description: >-
            Optional note or comment to associate with the stake transaction.
            This note will be included in transaction records and can be used
            for tracking or audit purposes.
        fee:
          type: string
          example: '7'
          description: >-
            Optional transaction fee. Controls the priority and cost of the
            blockchain transaction. Only one of 'fee' or 'feeLevel' should be
            provided; if both are specified, 'feeLevel' takes precedence.
        feeLevel:
          $ref: '#/components/schemas/FeeLevel'
        chainDescriptor:
          type: string
          example: ETH
          description: Protocol identifier for the staking operation
        id:
          type: string
          example: b70701f4-d7b1-4795-a8ee-b09cdb5b850d
          description: >-
            Applies only to Ethereum compounding validator staking
            (Pectra/EIP-7251). The ID of an existing staking position to add
            additional stake to. When provided, adds stake to the specified
            position instead of creating a new one. Requires
            'isCompoundingValidator' to be true.
        isCompoundingValidator:
          type: boolean
          example: true
          description: >-
            Applies only to Ethereum staking. Indicates whether to use a
            compounding validator (see Pectra/EIP-7251). When true, creates a
            position that supports adding additional stake via the 'id'
            parameter. If not provided, defaults to false and a legacy
            (non-compounding) validator will be used.
      required:
        - vaultAccountId
        - providerId
        - stakeAmount
    StakeResponse:
      type: object
      example:
        id: afedfd2e4-e3c9-4b70-90d6-eb0f74bfd4sd8
      properties:
        id:
          type: string
          example: afedfd2e4-e3c9-4b70-90d6-eb0f74bfd4sd8
          description: The unique identifier of the staking position
      required:
        - id
    ErrorSchema:
      type: object
      properties:
        message:
          type: string
        code:
          type: number
    StakingProvider:
      description: The unique identifier of the staking provider
      type: string
      example: kiln
      enum:
        - kiln
        - figment
        - lido
        - p2p
        - blockdaemon
        - galaxy
        - pierTwo
        - kraken
    FeeLevel:
      type: string
      example: MEDIUM
      description: >-
        Represents the fee level for a transaction, which can be set as slow,
        medium, or fast. Only one of fee/feeLevel is required.
      enum:
        - LOW
        - MEDIUM
        - HIGH
  parameters:
    X-Idempotency-Key:
      name: Idempotency-Key
      in: header
      description: >-
        A unique identifier for the request. If the request is sent multiple
        times with the same idempotency key, the server will return the same
        response as the first request. The idempotency key is valid for 24
        hours.
      required: false
      schema:
        type: string
  headers:
    X-Request-ID:
      schema:
        type: string
      description: >-
        Unique ID correlated to the API request. Please provide it in any
        support ticket you create or on Github issues related to Fireblocks SDKs
  responses:
    Error:
      description: Error Response
      headers:
        X-Request-ID:
          $ref: '#/components/headers/X-Request-ID'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorSchema'

````