Endpoints
API Usage
Once you have access to the Staking API with a validated user and existing API keys, you can start using this service.
Try it live
Every endpoint on this page can be executed from the interactive Swagger console, using your own X-API-KEY.
The machine-readable OpenAPI schema is available at:
Authentication
In order to use the Staking API endpoints you need to include your API KEY.
Heads up! To obtain a valid API key required for authentication, please refer to the Authentication > Create API keys section of the documentation.
Header:
| Name | Description | Example value | Required |
|---|---|---|---|
X-API-KEY | Your api key value | <API_KEY_VALUE> | ✅ |
X-NETWORK | Blockchain network identifier | 143 | ⚪ |
X-IDENTITY | Caller-defined identity stored in the audit log | user-1234 | ⚪ |
X-NETWORK header
Use the X-NETWORK header to select the Monad network (currently 143 for Monad Mainnet).
If you omit the header the API falls back to the default Monad network configured for your account.
Need another Monad environment exposed? Let us know at [email protected].
X-IDENTITY header
Use the X-IDENTITY header to attribute a request to the end user or account acting through your integration. The value is caller-defined and is stored with the request in the audit log, so activity can be traced back to it later.
The header is optional and does not change the response. Prefer an opaque internal identifier such as a user ID or account reference over personal data like emails or names. If you omit it, the request is attributed only to your API key.
List available networks
Use this helper endpoint to obtain the list of Monad staking networks that are currently enabled for your API key.
- Endpoint:
/api/v1/monad/native/networks
Response payload fields:
| Field | Type | Required | Description |
|---|---|---|---|
name | string | ✅ | Internal blockchain entry name |
type | string | ✅ | Blockchain type string (always ETHEREUM) |
chain_id | string | ✅ | Chain identifier (currently 143) |
is_default | boolean | ✅ | true when this network is used as fallback |
Example
curl "https://staking-api.stakely.io/api/v1/monad/native/networks" \
-H "X-API-KEY: $STAKELY_API_KEY" \
-H "X-NETWORK: 143"
Response:
[
{
"name": "monad",
"type": "ETHEREUM",
"chain_id": "143",
"is_default": true
}
]
Staking information
Get the staking parameters of this protocol:
- Endpoint:
/api/v1/monad/native/staking-info
Description
Staking parameters for Monad native staking: activation, deactivation and withdrawal times in minutes, fees, current APR/APY, slashing risk and stake limits. Served from an in-memory snapshot refreshed hourly.
Returned
| Field | Type | Required | Description |
|---|---|---|---|
stake_activation_max_time | number | ✅ | Maximum time, in minutes, for a new stake to become active and start accruing rewards. 0 means it is effective immediately. |
stake_deactivation_max_time | number | ✅ | Maximum time, in minutes, for an unstake request to complete the unbonding/exit period. 0 means the stake is released immediately. |
withdrawal_max_time | number | ✅ | Maximum time, in minutes, between a completed deactivation and the funds being spendable again. 0 means the funds are available as soon as the deactivation completes. |
staking_reward_fee | number | ✅ | Aggregate fee charged on staking rewards, as a percentage of the rewards generated (validator commission plus any protocol fee). |
withdrawal_fee | number | ✅ | Fee charged when withdrawing the stake, as a percentage of the withdrawn amount. Network transaction (gas) costs are not included. |
staking_apr | number | ✅ | Current annual percentage rate (rewards without compounding), as a percentage. |
staking_apy | number | ✅ | Current annual percentage yield (rewards with compounding), as a percentage. |
max_slashing_percentage | number | ✅ | Maximum percentage of the staked amount that the protocol can slash. 0 means the protocol implements no slashing. |
min_stake_amount | string | ✅ | Minimum amount that can be staked, as a decimal string in the native token of the chain. |
max_stake_amount | string | ✅ | Maximum amount that can be staked, as a decimal string in the native token of the chain. null means the protocol enforces no upper limit. |
users | number | ✅ | Number of addresses currently staking with Stakely on this chain. Live figure, refreshed hourly. null on protocol-scoped endpoints (liquid staking, vaults), because the feed only publishes this per chain and the chain-wide figure is not that protocol's. |
tvl_usd | number | ✅ | Total value staked with Stakely on this chain, in USD. Live figure, refreshed hourly. null on protocol-scoped endpoints, for the same reason as users. |
tvl_token | number | ✅ | Total value staked with Stakely on this chain, in the native token of the chain. Live figure, refreshed hourly. null on protocol-scoped endpoints, for the same reason as users. |
Example
curl "https://staking-api.stakely.io/api/v1/monad/native/staking-info" \
-H "X-API-KEY: $STAKELY_API_KEY" \
-H "X-NETWORK: 143"
Response:
{
"stake_activation_max_time": 330,
"stake_deactivation_max_time": 660,
"withdrawal_max_time": 0,
"staking_reward_fee": 15,
"withdrawal_fee": 0,
"staking_apr": 14.65,
"staking_apy": 15.77,
"max_slashing_percentage": 0,
"min_stake_amount": "0.000000001",
"max_stake_amount": null,
"users": 23,
"tvl_usd": 1115685.17,
"tvl_token": 53127865.086
}
Delegate action
Craft a delegate transaction:
- Endpoint:
/api/v1/monad/native/action/delegate
Description
This endpoint will craft a delegate transaction ready to be signed. The transaction will delegate the specified amount to the validator.
Request body parameters
| Field | Type | Required | Description |
|---|---|---|---|
address | string | ✅ | Address that will perform the staking action |
amount | number | ✅ | Amount to delegate in ether units |
Returned
| Field | Type | Required | Description |
|---|---|---|---|
serialized_tx_hex | string | ✅ | Serialized transaction hex string ready to be signed |
unsigned_tx_hash_hex | string | ✅ | Unsigned tx hash hex string used for offline signing integrations |
payload | object | ✅ | Transaction payload object |
Example
curl -X POST "https://staking-api.stakely.io/api/v1/monad/native/action/delegate" \
-H "X-API-KEY: $STAKELY_API_KEY" \
-H "X-NETWORK: 143" \
-H "Content-Type: application/json" \
-d '{
"address": "0xb794f5ea0ba39494ce839613fffba74279579268",
"amount": 0.5
}'
Response:
{
"serialized_tx_hex": "03b8ef9558b9a2d9f2d4c1f4f8bafce1a6df628d6c521474d6823b6e3223d9e8af",
"unsigned_tx_hash_hex": "1a6edb7358323bafca52b1755f3ad985754dc23887110b65429373ed83321500",
"payload": {
"type": "0x0",
"nonce": "0x5fe08",
"gasLimit": "0x30d40",
"to": "0x169856275ddca01b2fcdc63c4f1b0adf72a4cf10",
"value": "0x16345785d8a0000",
"data": "0x18f72950...",
"gasPrice": "0x2887734d"
}
}
Undelegate action
Craft an undelegate transaction:
- Endpoint:
/api/v1/monad/native/action/undelegate
Description
This endpoint will craft an undelegate transaction ready to be signed. The undelegated amount will be placed in a withdrawal slot and can be withdrawn after the withdrawal epoch.
Request body parameters
| Field | Type | Required | Description |
|---|---|---|---|
address | string | ✅ | Address that will perform the undelegation |
amount | number | ✅ | Amount to undelegate in ether units |
withdrawId | number | ✅ | Withdrawal slot identifier (0-255) |
Returned
| Field | Type | Required | Description |
|---|---|---|---|
serialized_tx_hex | string | ✅ | Serialized transaction hex string ready to be signed |
unsigned_tx_hash_hex | string | ✅ | Unsigned tx hash hex string used for offline signing integrations |
payload | object | ✅ | Transaction payload object |
Example
curl -X POST "https://staking-api.stakely.io/api/v1/monad/native/action/undelegate" \
-H "X-API-KEY: $STAKELY_API_KEY" \
-H "X-NETWORK: 143" \
-H "Content-Type: application/json" \
-d '{
"address": "0xb794f5ea0ba39494ce839613fffba74279579268",
"amount": 0.5,
"withdrawId": 0
}'
Response:
{
"serialized_tx_hex": "03b8ef9558b9a2d9f2d4c1f4f8bafce1a6df628d6c521474d6823b6e3223d9e8af",
"unsigned_tx_hash_hex": "1a6edb7358323bafca52b1755f3ad985754dc23887110b65429373ed83321500",
"payload": {
"type": "0x0",
"nonce": "0x5fe08",
"gasLimit": "0x30d40",
"to": "0x169856275ddca01b2fcdc63c4f1b0adf72a4cf10",
"value": "0x16345785d8a0000",
"data": "0x18f72950...",
"gasPrice": "0x2887734d"
}
}
Withdraw action
Craft a withdraw transaction:
- Endpoint:
/api/v1/monad/native/action/withdraw
Description
Once the withdrawal is available (after the withdrawal epoch), you can claim it. This action will craft a withdraw transaction for the specified withdrawal slot.
Request body parameters
| Field | Type | Required | Description |
|---|---|---|---|
address | string | ✅ | Address requesting the withdrawal |
withdrawId | number | ✅ | Withdrawal slot identifier to claim from (0-255) |
Returned
| Field | Type | Required | Description |
|---|---|---|---|
serialized_tx_hex | string | ✅ | Serialized transaction hex string ready to be signed |
unsigned_tx_hash_hex | string | ✅ | Unsigned tx hash hex string used for offline signing integrations |
payload | object | ✅ | Transaction payload object |
Example
curl -X POST "https://staking-api.stakely.io/api/v1/monad/native/action/withdraw" \
-H "X-API-KEY: $STAKELY_API_KEY" \
-H "X-NETWORK: 143" \
-H "Content-Type: application/json" \
-d '{
"address": "0xb794f5ea0ba39494ce839613fffba74279579268",
"withdrawId": 0
}'
Response:
{
"serialized_tx_hex": "03b8ef9558b9a2d9f2d4c1f4f8bafce1a6df628d6c521474d6823b6e3223d9e8af",
"unsigned_tx_hash_hex": "1a6edb7358323bafca52b1755f3ad985754dc23887110b65429373ed83321500",
"payload": {
"type": "0x0",
"nonce": "0x5fe08",
"gasLimit": "0x30d40",
"to": "0x169856275ddca01b2fcdc63c4f1b0adf72a4cf10",
"value": "0x16345785d8a0000",
"data": "0x18f72950...",
"gasPrice": "0x2887734d"
}
}
Claim rewards action
Craft a claim rewards transaction:
- Endpoint:
/api/v1/monad/native/action/claim-rewards
Description
This endpoint will craft a claim rewards transaction ready to be signed. It allows you to claim accumulated staking rewards.
Request body parameters
| Field | Type | Required | Description |
|---|---|---|---|
address | string | ✅ | Address that will claim rewards |
Returned
| Field | Type | Required | Description |
|---|---|---|---|
serialized_tx_hex | string | ✅ | Serialized transaction hex string ready to be signed |
unsigned_tx_hash_hex | string | ✅ | Unsigned tx hash hex string used for offline signing integrations |
payload | object | ✅ | Transaction payload object |
Example
curl -X POST "https://staking-api.stakely.io/api/v1/monad/native/action/claim-rewards" \
-H "X-API-KEY: $STAKELY_API_KEY" \
-H "X-NETWORK: 143" \
-H "Content-Type: application/json" \
-d '{
"address": "0xb794f5ea0ba39494ce839613fffba74279579268"
}'
Response:
{
"serialized_tx_hex": "03b8ef9558b9a2d9f2d4c1f4f8bafce1a6df628d6c521474d6823b6e3223d9e8af",
"unsigned_tx_hash_hex": "1a6edb7358323bafca52b1755f3ad985754dc23887110b65429373ed83321500",
"payload": {
"type": "0x0",
"nonce": "0x5fe08",
"gasLimit": "0x30d40",
"to": "0x169856275ddca01b2fcdc63c4f1b0adf72a4cf10",
"value": "0x16345785d8a0000",
"data": "0x18f72950...",
"gasPrice": "0x2887734d"
}
}
Compound action
Craft a compound rewards transaction:
- Endpoint:
/api/v1/monad/native/action/compound
Description
This endpoint will craft a compound rewards transaction ready to be signed. It automatically reinvests your accumulated rewards back into your stake position.
Request body parameters
| Field | Type | Required | Description |
|---|---|---|---|
address | string | ✅ | Address that will compound rewards |
Returned
| Field | Type | Required | Description |
|---|---|---|---|
serialized_tx_hex | string | ✅ | Serialized transaction hex string ready to be signed |
unsigned_tx_hash_hex | string | ✅ | Unsigned tx hash hex string used for offline signing integrations |
payload | object | ✅ | Transaction payload object |
Example
curl -X POST "https://staking-api.stakely.io/api/v1/monad/native/action/compound" \
-H "X-API-KEY: $STAKELY_API_KEY" \
-H "X-NETWORK: 143" \
-H "Content-Type: application/json" \
-d '{
"address": "0xb794f5ea0ba39494ce839613fffba74279579268"
}'
Response:
{
"serialized_tx_hex": "03b8ef9558b9a2d9f2d4c1f4f8bafce1a6df628d6c521474d6823b6e3223d9e8af",
"unsigned_tx_hash_hex": "1a6edb7358323bafca52b1755f3ad985754dc23887110b65429373ed83321500",
"payload": {
"type": "0x0",
"nonce": "0x5fe08",
"gasLimit": "0x30d40",
"to": "0x169856275ddca01b2fcdc63c4f1b0adf72a4cf10",
"value": "0x16345785d8a0000",
"data": "0x18f72950...",
"gasPrice": "0x2887734d"
}
}
Prepare action
Gathers signature and unsigned tx:
- Endpoint:
/api/v1/monad/native/action/prepare
Description
Prepare a signed transaction by gathering the provided signatures (r, s, v) with the unsigned transaction hex string:
Request body parameters
| Field | Type | Required | Description |
|---|---|---|---|
serialized_tx_hex | string | ✅ | Unsigned serialized transaction hex string ready to be signed |
r | string | ✅ | r part of the ECDSA signature in hex |
s | string | ✅ | s part of the ECDSA signature in hex |
v | number | ✅ | v part of the ECDSA signature |
Returned
| Field | Type | Required | Description |
|---|---|---|---|
signed_tx_hex | string | ✅ | Signed transaction hex string ready to be broadcasted |
Example
curl -X POST "https://staking-api.stakely.io/api/v1/monad/native/action/prepare" \
-H "X-API-KEY: $STAKELY_API_KEY" \
-H "X-NETWORK: 143" \
-H "Content-Type: application/json" \
-d '{
"serialized_tx_hex": "03b8ef9558b9a2d9f2d4c1f4f8bafce1a6df628d6c521474d6823b6e3223d9e8af",
"r": "6da2b6fe309b629720bc3d1d3a8befb3f461e3b53ccee85c55d10b11d3a3d263",
"s": "085fe4bb8ff0c04e4e41a2ba44609f894b9a70f4330de726d1403ee21b65e685",
"v": 34035
}'
Response:
{
"signed_tx_hex": "0xf9014b1f8455bd900c83030d4094169856275d...ad908c2b5b15"
}
Broadcast action
Broadcast a signed transaction:
- Endpoint:
/api/v1/monad/native/action/broadcast
Description
Broadcast a signed transaction. Usually you will broadcast the signed transaction returned in prepare previous step:
Request body parameters
| Field | Type | Required | Description |
|---|---|---|---|
signed_tx_hex | string | ✅ | Signed transaction hex string ready to be broadcasted |
Returned
| Field | Type | Required | Description |
|---|---|---|---|
tx_hash | string | ✅ | Transaction hash of the broadcasted transaction |
Example
curl -X POST "https://staking-api.stakely.io/api/v1/monad/native/action/broadcast" \
-H "X-API-KEY: $STAKELY_API_KEY" \
-H "X-NETWORK: 143" \
-H "Content-Type: application/json" \
-d '{
"signed_tx_hex": "0xf9014b1f8455bd900c83030d4094169856275d...ad908c2b5b15"
}'
Response:
{
"tx_hash": "0x23273dacef9d64fdb2c790e9f9f4c13574125078a272059dac2473bc8bfba163"
}
Unified staking balance
Get the staking balance for the given address in the unified cross-protocol shape:
- Endpoint:
/api/v1/monad/native/staking-balance/{address}
Description
Staking balance for an address in the unified cross-protocol shape, in MON. Pending stake deltas are reported as activation, and withdrawal requests are split into deactivating and withdrawable against the current epoch. Each withdrawal request is listed as a staking object whose id is the withdrawId the withdraw endpoint takes; those ids are also the slots already in use, so an undelegate must pick a withdrawId in 0-255 that is not listed.
Amounts are in MON. The field names are the same on every protocol Stakely supports, so a single integration can read a position on any of them; a bucket that does not apply here is null. The withdrawals and withdrawal endpoints below still expose the raw withdrawal slots.
Request parameters
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
address | path | string | ✅ | Delegator address to query |
Returned
| Field | Type | Required | Description |
|---|---|---|---|
staked_amount | number | ✅ | Stake that is currently active and earning rewards, in native token units. |
stake_activation_amount | number | ✅ | Stake that has been delegated but is still warming up, in native token units. null when the protocol activates stake immediately. |
stake_deactivation_amount | number | ✅ | Stake that is unbonding and has not completed its deactivation period yet, in native token units. null when the protocol has no unbonding period. |
stake_withdrawing_amount | number | ✅ | Stake that finished deactivating and is waiting for a withdrawal transaction, in native token units. null when the protocol releases the funds automatically. |
stake_rewards_amount | number | ✅ | Rewards that can be claimed, in native token units. null when the protocol compounds rewards into staked_amount instead of accruing them separately. |
staking_objects | StakingObjectDto[] | ✅ | Individually addressable units that make up the position, normalised across protocols. The amounts above are the aggregate; these are the handles needed to act on the position, because protocols such as Solana and Sui require an object id to craft an unstake or withdraw transaction. null means the protocol exposes no addressable objects at all and every action is amount-based; an empty array means it does expose them and the address currently holds none. An object is only listed when the protocol publishes a real identifier for it, so the listed objects do not necessarily add up to the totals above. |
Each item in staking_objects is a StakingObjectDto:
| Field | Type | Required | Description |
|---|---|---|---|
id | string | ✅ | Identifier of this object on its protocol, passed back to the action endpoints of that protocol (see below). |
type | StakingObjectType | ✅ | Whether the object holds stake (delegation) or represents an exit already requested (withdrawal_request). |
status | StakingObjectStatus | ✅ | Lifecycle phase of the object. Objects sharing a status add up to the matching amount bucket of the response. |
amount | number | ✅ | Principal held by this object, in native token units. null when it could not be read. |
rewards_amount | number | ✅ | Rewards accrued by this object on top of its principal, in native token units. null when the protocol reports rewards only at address level, compounds them into the principal, or when they could not be derived. |
validator_address | string | ✅ | Validator this object is delegated to, in the protocol native format (a vote account on Solana, a validator address on Sui). null when the protocol does not attribute the object to a single validator. |
activation_epoch | number | ✅ | Epoch at which this object starts earning rewards. null on protocols that do not track activation per object. |
withdrawable_epoch | number | ✅ | Epoch from which this object can be withdrawn. null on protocols whose withdrawal is time-based or that release funds automatically. |
withdrawable_at | string | ✅ | ISO-8601 instant from which this object can be withdrawn. null on protocols whose withdrawal is epoch-based or that release funds automatically. |
On Monad native the id is the withdrawal slot id (0-255) that the withdraw action takes as withdrawId. Those ids are also the slots already in use, so an undelegate must pick a withdrawId in 0-255 that is not listed here.
type values:
| Value | Description |
|---|---|
delegation | The object holds stake. |
withdrawal_request | The object represents an exit that has already been requested. |
status values:
| Value | Description |
|---|---|
activating | Warming up, not earning rewards yet. Adds up to stake_activation_amount. |
active | Live and earning rewards. Adds up to staked_amount. |
deactivating | Unbonding, deactivation period not finished. Adds up to stake_deactivation_amount. |
withdrawable | Deactivated and waiting for a withdrawal transaction. Adds up to stake_withdrawing_amount. |
unknown | The lifecycle phase could not be derived from the protocol data. |
Example
curl "https://staking-api.stakely.io/api/v1/monad/native/staking-balance/0xb794f5ea0ba39494ce839613fffba74279579268" \
-H "X-API-KEY: $STAKELY_API_KEY" \
-H "X-NETWORK: 143"
Response:
{
"staked_amount": 0.02899999999999488,
"stake_activation_amount": 0,
"stake_deactivation_amount": 0,
"stake_withdrawing_amount": 0.001,
"stake_rewards_amount": 0.000734768136568025,
"staking_objects": [
{
"id": "1",
"type": "withdrawal_request",
"status": "withdrawable",
"amount": 0.001,
"rewards_amount": null,
"validator_address": null,
"activation_epoch": null,
"withdrawable_epoch": 1453,
"withdrawable_at": null
}
]
}
Withdrawal requests
Get withdrawal requests for the given address:
- Endpoint:
/api/v1/monad/native/withdrawals/{address}
Description
Get withdrawal requests for the given delegator address. You can optionally filter by withdrawal ID range using query parameters. All values are returned in ether units.
Request parameters
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
address | path | string | ✅ | Delegator address to query withdrawal requests for |
startWithdrawId | query | number | ⚪ | Start withdrawal id (defaults to 0) |
endWithdrawId | query | number | ⚪ | End withdrawal id (defaults to 255) |
Returned
| Field | Type | Required | Description |
|---|---|---|---|
validatorId | number | ✅ | Validator ID |
delegator | string | ✅ | Delegator address |
startWithdrawId | number | ✅ | Start withdrawal ID in the range |
endWithdrawId | number | ✅ | End withdrawal ID in the range |
validRequests | GetWithdrawalRequestResponseDto[] | ✅ | List of valid withdrawal requests with converted values |
errors | MonadWithdrawalRequestErrorDto[] | ✅ | List of errors encountered during withdrawal request retrieval |
Each errors item:
| Field | Type | Required | Description |
|---|---|---|---|
withdrawId | number | ✅ | |
message | string | ✅ |
Example
curl "https://staking-api.stakely.io/api/v1/monad/native/withdrawals/0xb794f5ea0ba39494ce839613fffba74279579268" \
-H "X-API-KEY: $STAKELY_API_KEY" \
-H "X-NETWORK: 143"
Response:
{
"validatorId": 66,
"delegator": "0xb794f5ea0ba39494ce839613fffba74279579268",
"startWithdrawId": 0,
"endWithdrawId": 255,
"validRequests": [
{
"withdrawId": 0,
"withdrawalAmount": 10.5,
"accRewardPerToken": 0.000123456,
"withdrawEpoch": 123
}
],
"errors": [
{
"withdrawId": null,
"message": null
}
]
}
Withdrawal request
Get a single withdrawal request:
- Endpoint:
/api/v1/monad/native/withdrawal/{address}/{withdrawId}
Description
Get a single withdrawal request for the given delegator address and withdrawal slot ID. All values are returned in ether units.
Request parameters
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
address | path | string | ✅ | Delegator address |
withdrawId | path | number | ✅ | Withdrawal slot identifier (0-255) |
Returned
| Field | Type | Required | Description |
|---|---|---|---|
withdrawId | number | ✅ | Withdrawal slot identifier |
withdrawalAmount | number | ✅ | Withdrawal amount in ether units (converted from wei) |
accRewardPerToken | number | ✅ | Accumulated reward per token in ether units (converted from wei) |
withdrawEpoch | number | ✅ | Epoch number when withdrawal becomes available |
Example
curl "https://staking-api.stakely.io/api/v1/monad/native/withdrawal/0xb794f5ea0ba39494ce839613fffba74279579268/0" \
-H "X-API-KEY: $STAKELY_API_KEY" \
-H "X-NETWORK: 143"
Response:
{
"withdrawId": 0,
"withdrawalAmount": 10.5,
"accRewardPerToken": 0.000123456,
"withdrawEpoch": 123
}