Getting Started

📘

The Pooled Staking API is currently available with exclusive access.

Public availability will be announced soon. To request access or discuss integration, please contact us.

Staking via the Pooled Staking API enables enterprise partners to offer secure, seamless ETH staking to their users, without 32 ETH minimum. The process consists of the following steps:

  1. Get the list of available vaults.
  2. Prepare a deposit transaction.
  3. Sign and broadcast the transaction.

You can also track the staking rewards, as well as monitor historical balance and APY.

Below, a lifecycle diagram of the process is provided.

sequenceDiagram
    participant USER as User (wallet/app)
    participant PARTNER as Partner Backend
    participant API as Pooled Staking API
    participant ETH as Ethereum Network

    %% --- DEPOSIT FLOW ---
    USER->>PARTNER: Stake ETH (<32 ETH)
    PARTNER->>API: POST /staking/deposit
    API-->>PARTNER: Unsigned deposit transaction
    PARTNER->>USER: User signs transaction
    USER-->>PARTNER: Signed deposit transaction
    PARTNER->>API: POST /transaction/send
    API-->>ETH: Broadcast to Ethereum

    %% --- WITHDRAWAL FLOW ---
    USER->>PARTNER: Unstake (withdraw) ETH
    PARTNER->>API: POST /staking/withdraw
    API-->>PARTNER: Unsigned withdrawal transaction
    PARTNER->>USER: User signs transaction
    USER-->>PARTNER: Signed withdrawal transaction
    PARTNER->>API: POST /transaction/send
    API-->>ETH: Broadcast to Ethereum

    %% --- OPTIONAL: STATUS/CLAIM ---
    Note over USER,PARTNER: ETH claimable after 1–4 days.
    PARTNER->>API: POST /staking/claim (when claimable)
    API-->>PARTNER: Unsigned claim transaction
    PARTNER->>USER: User signs transaction
    USER-->>PARTNER: Signed claim transaction
    PARTNER->>API: POST /transaction/send
    API-->>ETH: Broadcast to Ethereum
    ETH-->>USER: ETH returned to user wallet

Get an authentication token to start using Pooled Staking API.

Request examples are provided using cURL.

1. Get List Vaults

Retrieve the list of vaults available to your integration on the target network by sending a GET request to /api/v1/staking/pool/[network]/staking/vaults.

Example request (for hoodi network):

curl --request GET \
     --url https://api-test.p2p.org/api/v1/staking/pool/hoodi/staking/vaults \
     --header 'accept: application/json' \
     --header 'authorization: Bearer <token>' \
     --header 'content-type: application/json' \
     --data '
{
    "delegatorAddress": "0x092Af80778ff3c3D27Fd2744C39f6e9326d9AaEe",
    "vaultAddress": "0xba447498dc4c169f2b4f427b2c4d532320457e89",
    "amount": 0.01
}'
  • delegatorAddress — account address of the user initiating the staking transaction.
  • vaultAddress — Ethereum address of the vault. Mind to specify the correct vaultAddress for all staking operations.
  • amount — amount of tokens in ETH. The value must be decimal, e.g., 0.01.

Example response:

{
  "error": null,
  "result": {
        "network": "hoodi",
        "vaults": [
            {
                "vaultAddress": "0xba447498DC4c169f2b4f427B2c4D532320457E89",
                "displayName": "Genesis Vault",
                "apy": 2.183411246189064,
                "baseApy": 2.183411246189064,
								"capacity": 1000000.0,
                "totalAssets": 1565.298221320626932191,
                "feePercent": 5,
                "isPrivate": false,
                "isGenesis": true,
                "isSmoothingPool": true,
                "isErc20": false,
                "tokenName": null,
                "tokenSymbol": null,
                "createdAt": 1743445116000
            },
            {
                "vaultAddress": "0x2b3eB77e5cbde5DEb70c928E1E2814F8A6f143e0",
                "displayName": "NodeSet Hoodi Test Vault",
                "apy": 0.11080513448983267,
                "baseApy": 0.11080513448983267,
								"capacity": 1000000.0,
                "totalAssets": 12015.065998077636066564,
                "feePercent": 10,
                "isPrivate": false,
                "isGenesis": false,
                "isSmoothingPool": true,
                "isErc20": false,
                "tokenName": null,
                "tokenSymbol": null,
                "createdAt": 1744827492000
            }
        ]
    }
}
  • network — network name: mainnet or hoodi.
  • vaults — detailed information on each vault available to integration:
    • vaultAddress — Ethereum address of the vault.
    • displayName — vault name.
    • apy — current annual percentage yield (APY) of the vault.
    • baseApy — average weekly base APY of the vault (without extra incentives).
    • capacity — vault maximum total value locked (TVL).
    • totalAssets — current amount of funds staked on the vault.
    • feePercent — amount of fee in percents charged by the vault.
    • isPrivate — parameter indicating if this vault is exclusive to current integration: true means the vault is private, false means the vault is public or shared.
    • isGenesis — parameter indicating if this vault is a StakeWise vault.
    • isSmoothingPool — parameter indicating if this vault is a Smoothing Pool or a Vault Escrow.
    • isErc20 — parameter indicating if this vault has its own ERC-20 token.
    • tokenName — name of the ERC-20 token that represents ETH staked by delegators in the vault.
    • tokenSymbol — symbol of the vault's ERC-20 token.
    • createAt — timestamp of the creation of the vault in the ISO 8601 format.

2. Prepare Deposit Transaction

To create an unsigned deposit transaction for the selected vault, send a POST request to /api/v1/staking/pool/[network]/staking/deposit.

Example request (for hoodi network):

curl --request POST \
     --url https://api-test.p2p.org/api/v1/staking/pool/hoodi/staking/deposit \
     --header 'accept: application/json' \
     --header 'authorization: Bearer <token>' \
     --header 'content-type: application/json' \
     --data '
{
    "delegatorAddress": "0x092Af80778ff3c3D27Fd2744C39f6e9326d9AaEe",
    "vaultAddress": "0xba447498dc4c169f2b4f427b2c4d532320457e89",
    "amount": 0.07
}
  • delegatorAddress — account address of the user initiating the staking transaction.
  • vaultAddress — Ethereum address of the vault to which the deposit is being made.
  • amount — amount of tokens in ETH to deposit. The value must be decimal, e.g., 0.01.

Example response:


    "error": null,
    "result": {
        "amount": 0.07,
        "vaultAddress": "0xba447498dc4c169f2b4f427b2c4d532320457e89",
        "delegatorAddress": "0x092Af80778ff3c3D27Fd2744C39f6e9326d9AaEe",
        "unsignedTransaction": {
            "serializeTx": "0x02f87683088bb0168459682f0084d16be71082d54e94ba447498dc4c169f2b4f427b2c4d532320457e8987f8b0a10e470000b844f9609f08000000000000000000000000092af80778ff3c3d27fd2744c39f6e9326d9aaee0000000000000000000000000000000000000000000000000000000000000000c0",
            "to": "0xba447498dc4c169f2b4f427b2c4d532320457e89",
            "data": "0xf9609f08000000000000000000000000092af80778ff3c3d27fd2744c39f6e9326d9aaee0000000000000000000000000000000000000000000000000000000000000000",
            "value": "70000000000000000",
            "nonce": 22,
            "chainId": 560048,
            "gasLimit": "54606",
            "type": 2,
            "maxFeePerGas": "3513509648",
            "maxPriorityFeePerGas": "1500000000"
        },
        "createdAt": "2025-07-21T12:05:59.015Z"
    }
}
  • amount — amount of tokens in ETH to deposit.
  • vaultAddress — Ethereum address of the vault to which the deposit is being made.
  • delegatorAddress — account address of the user initiating the staking transaction.
  • unsignedTransaction — unsigned transaction in Base64 encrypted format. Sign the transaction and submit it to the blockchain to perform the called action.
    • serializeTx — serialized unsigned transaction.
    • to — recipient address for this transaction.
    • data — transaction data payload in the hexadecimal format.
    • value — amount this transaction is sending in Wei.
    • nonce — nonce of the transaction.
    • chainId — chain ID this transaction is authorized on, as specified by EIP-155.
    • gasLimit — maximum gas limit for this block.
    • type — EIP-2718 type of this transaction envelope.
    • maxFeePerGas — maximum price per unit of gas this transaction will pay for the combined EIP-1559 block's base fee and this transaction's priority fee in Wei.
    • maxPriorityFeePerGas — price per unit of gas in Wei, which is added to the EIP-1559 block's base fee. This added fee is used to incentivize miners to prioritize this transaction.
  • createdAt — timestamp of the transaction in the ISO 8601 format.

3. Sign and Send Transaction

Use unsignedTransaction from the previous step to sign and send the signed transaction to the Ethereum network.

By broadcasting this transaction, you're initiating the staking operation on the Ethereum vault.

Additional operations

Get Account Info

To track delegator balances, staking status, and withdrawal eligibility, send a GET request to /api/v1/staking/pool/[network]/account/[delegatorAddress]/vault/[vaultAddress]/.

Example request (for hoodi network):

curl --request GET \
     --url https://api-test.p2p.org/api/v1/staking/pool/hoodi/account/0x092Af80778ff3c3D27Fd2744C39f6e9326d9AaEe/vault/0xba447498dc4c169f2b4f427b2c4d532320457e89/ \
     --header 'accept: application/json' \
     --header 'authorization: Bearer <token>' \
     --header 'content-type: application/json' \
  • delegatorAddress — account address of the user initiated the staking transaction.
  • vaultAddress — Ethereum address of the vault.

Example response:

 {
    "error": null,
    "result": {
        "delegatorAddress": "0x092Af80778ff3c3D27Fd2744C39f6e9326d9AaEe",
        "vaultAddress": "0xba447498dc4c169f2b4f427b2c4d532320457e89",
        "stake": {
            "assets": 0.40002974751806797,
            "totalEarnedAssets": 0.000086455591795945
        },
        "availableToUnstake": 0.3199920635199524,
        "availableToWithdraw": 0.010034115368561011,
        "exitQueue": {
            "total": 0.09007179878300194,
            "requests": [
                {
                    "ticket": "14550213999915345334",
                    "totalAssets": 0.010034115368561011,
                    "timestamp": 1749747696000,
                    "withdrawalTimestamp": 0,
                    "isClaimable": true
                },
                {
                    "ticket": "23001870415343779687",
                    "totalAssets": 0.010000509804222077,
                    "timestamp": 1752413688000,
                    "withdrawalTimestamp": 1752500088000,
                    "isClaimable": false
                },
                {
                    "ticket": "23011815987815344974",
                    "totalAssets": 0.06000305882533247,
                    "timestamp": 1752413796000,
                    "withdrawalTimestamp": 1752500196000,
                    "isClaimable": false
                }
            ]
        }
    }
}
  • delegatorAddress — account address of the user initiated the staking transaction.
  • vaultAddress — Ethereum address of the vault.
  • stake — detailed information about the current stake:
    • assets — amount of tokens in the stake in Wei.
    • totalEarnedAssets — total amount of rewards received in Wei.
  • availableToUnstake — amount of tokens in Wei available to unstake.
  • availableToWithdraw — amount of tokens in Wei available to withdraw from the vault.
  • exitQueue — detailed information on the tokens locked for the waiting period.
    • total — total amount of tokens in Wei in the exit queue.
    • requests — detailed information on the unstaking requests initiated by the delegator:
      • ticket — position of the unstaking request in a special format required for claiming.
      • totalAssets — total amount of tokens in Wei queued for unstaking.
      • timestamp — timestamp of the unstaking request creation in the ISO 8601 format.
      • withdrawalTimestamp — estimated timestamp in the ISO 8601 format indicating when the tokens become withdrawable.
      • isClaimable — parameter indicating if this amount of tokens is available to withdraw.

Get Rewards History

To retrieve daily balance and reward history, as well as current APY, send a GET request to /api/v1/staking/pool/[network]/account/[delegatorAddress]/vault/[vaultAddress]/rewards

Example request (for hoodi network):

curl --request GET \
     --url https://api-test.p2p.org/api/v1/staking/pool/hoodi/account/0x092Af80778ff3c3D27Fd2744C39f6e9326d9AaEe/vault/0xba447498dc4c169f2b4f427b2c4d532320457e89\rewards / \
     --header 'accept: application/json' \
     --header 'authorization: Bearer <token>' \
     --header 'content-type: application/json' \
  • delegatorAddress — account address of the user initiated the staking transaction.
  • vaultAddress — Ethereum address of the vault.

Example response:

{
    "error": null,
    "result": {
        "delegatorAddress": "0x092Af80778ff3c3D27Fd2744C39f6e9326d9AaEe",
        "vaultAddress": "0xba447498dc4c169f2b4f427b2c4d532320457e89",
        "rewards": [
            {
                "date": "2025-07-13T00:00:00.000Z",
                "apy": 2.1705144753973515,
                "balance": 0.4000192848063124,
                "rewards": 0.23001511006385378
            },
            {
                "date": "2025-07-12T00:00:00.000Z",
                "apy": 0.6728186791771593,
                "balance": 0.1700041747424586,
                "rewards": 0.000003202086219675
            },
            {
                "date": "2025-07-11T00:00:00.000Z",
                "apy": 1.8252614817398076,
                "balance": 0.04000089425699653,
                "rewards": 0.000001960880296672
            },
            {
                "date": "2025-07-10T00:00:00.000Z",
                "apy": 1.806864874160972,
                "balance": 0.0399988582881249,
                "rewards": 0.000003918771522507
            },
            {
                "date": "2025-07-08T00:00:00.000Z",
                "apy": 2.889941328415176,
                "balance": 0.03999476781018422,
                "rewards": 0.000005056349354517
            },
            {
                "date": "2025-07-06T00:00:00.000Z",
                "apy": 1.7762765993571947,
                "balance": 0.03998953257364396,
                "rewards": 0.000001989611942596
            },
            {
                "date": "2025-07-05T00:00:00.000Z",
                "apy": 1.878205919278462,
                "balance": 0.03998746377580935,
                "rewards": 0.000001995075528891
            },
            {
                "date": "2025-07-04T00:00:00.000Z",
                "apy": 1.6840977946143212,
                "balance": 0.03998539531683224,
                "rewards": 0.000001903591244608
            },
            {
                "date": "2025-07-03T00:00:00.000Z",
                "apy": 2.9042127452251387,
                "balance": 0.039983395559925,
                "rewards": 0.000003130564053543
            },
            {
                "date": "2025-07-02T00:00:00.000Z",
                "apy": 1.8025197659824885,
                "balance": 0.03998016066470251,
                "rewards": 0.000002004548585118
            },
            {
                "date": "2025-07-01T00:00:00.000Z",
                "apy": 2.9738768552591783,
                "balance": 0.039978033387643545,
                "rewards": 0.000003155011811334
            },
            {
                "date": "2025-06-30T00:00:00.000Z",
                "apy": 1.8162541709061624,
                "balance": 0.039974802212567426,
                "rewards": 0.00000201347365414
            },
            {
                "date": "2025-06-29T00:00:00.000Z",
                "apy": 1.8075625838524545,
                "balance": 0.03997270942400358,
                "rewards": 0.000001992735938527
            },
            {
                "date": "2025-06-28T00:00:00.000Z",
                "apy": 3.5107177909087954,
                "balance": 0.03997061537620456,
                "rewards": 0.0000038755055009
            },
            {
                "date": "2025-06-27T00:00:00.000Z",
                "apy": 1.8759957590284255,
                "balance": 0.03996661168951173,
                "rewards": 0.000002013656908218
            },
            {
                "date": "2025-06-26T00:00:00.000Z",
                "apy": 1.7944579365558677,
                "balance": 0.039964522307306544,
                "rewards": 0.000001965603707971
            },
            {
                "date": "2025-06-25T00:00:00.000Z",
                "apy": 1.7550488747436979,
                "balance": 0.03996248113678149,
                "rewards": 0.000001944488887432
            },
            {
                "date": "2025-06-24T00:00:00.000Z",
                "apy": 1.8379157842851654,
                "balance": 0.039960459210225195,
                "rewards": 0.000001972758389168
            },
            {
                "date": "2025-06-23T00:00:00.000Z",
                "apy": 1.7928563914758289,
                "balance": 0.03995841203163699,
                "rewards": 0.000003915092206271
            },
            {
                "date": "2025-06-21T00:00:00.000Z",
                "apy": 2.8871373517191192,
                "balance": 0.03995432882638032,
                "rewards": 0.000003123063599167
            },
            {
                "date": "2025-06-20T00:00:00.000Z",
                "apy": 2.828933988702405,
                "balance": 0.03995108713916603,
                "rewards": 0.000003060285847402
            },
            {
                "date": "2025-06-19T00:00:00.000Z",
                "apy": 1.7454148564582386,
                "balance": 0.0399479201945625,
                "rewards": 0.000001900741504801
            },
            {
                "date": "2025-06-18T00:00:00.000Z",
                "apy": 2.788462639348563,
                "balance": 0.0399458996835444,
                "rewards": 0.000003144115598416
            },
            {
                "date": "2025-06-17T00:00:00.000Z",
                "apy": 1.8359009572035467,
                "balance": 0.03994267570940807,
                "rewards": 0.000001986181925313
            },
            {
                "date": "2025-06-16T00:00:00.000Z",
                "apy": 1.8726943585624019,
                "balance": 0.03994061341223341,
                "rewards": 0.000002023036371899
            },
            {
                "date": "2025-06-15T00:00:00.000Z",
                "apy": 1.8306555099791324,
                "balance": 0.039938512940331676,
                "rewards": 0.000001986143112602
            },
            {
                "date": "2025-06-14T00:00:00.000Z",
                "apy": 1.7559323566628742,
                "balance": 0.03993645014333918,
                "rewards": 0.000001984760250822
            },
            {
                "date": "2025-06-13T00:00:00.000Z",
                "apy": 2.350308909342375,
                "balance": 0.03993438526261774,
                "rewards": 0.000002537884144973
            }
        ]
    }
}
  • delegatorAddress — account address of the user initiated the staking transaction.
  • vaultAddress — Ethereum address of the vault.
  • rewards — list of daily snapshots:
    • date — timestamp of each data point in the ISO 8601 format.
    • apy — delegator current annual percentage yield (APY) based on time, rewards, and balance.
    • balance — total amount of tokens in Wei staked by the delegator on the vault.
    • rewards — amount of tokens in Wei received as rewards.

What's Next?