Skip to main content

Overview

Key concepts

  • Minimum stake: 2 SOL.
  • Validator selection: provide either a validator address or a providerName.
    • Provide one or the other, not both.
  • Multiple stake requests: staking multiple times to the same validator address will create multiple stakingPositionId values.
  • Unstake timing: unstake requires about one epoch (~2–3 days) to complete.
  • Collect timing and stake-account reserve: to maximize rewards and avoid unexpected stake-account closure:
    • Prefer waiting 1 epoch after an unstake completes before collecting, or
    • Leave a minimum reserve of 2,282,880 lamports (0.00228288 SOL) in the stakingPositionId to prevent the stake account from being destroyed.



Endpoint summary




Workflows

Stake (Solana)

Endpoint POST /v2/transactions/stake

Request rules

  • assetType must be "SOL".
  • amount must be at least "2".
  • Include parameters with either:
    • address (validator public identifier), or
    • providerName (provider name)

Example: Stake using validator address

{
  "source": {
    "type": "WALLET",
    "id": "1c920f4241b78a1d483a29f3c24b6c4c"
  },
  "amount": "5",
  "assetType": "SOL",
  "description": "Internal 9876543210",
  "idempotentId": "9876543210",
  "parameters": {
    "address": "FuS3FPfJDKSNot99ECLXtp3rueq36hMNStJkPJwWodLh"
  }
}

Example: Stake using provider name

{
  "source": {
    "type": "WALLET",
    "id": "1c920f4241b78a1d483a29f3c24b6c4c"
  },
  "amount": "5",
  "assetType": "SOL",
  "description": "Internal 9876543210",
  "idempotentId": "9876543211",
  "parameters": {
    "providerName": "figment"
  }
}

Response

A successful request returns 201 Created with a transaction id.


Unstake (Solana)

Endpoint POST /v2/transactions/unstake

Request rules

  • stakingPositionId and amount are required.
  • After the unstake completes (about ~1 epoch), funds are inactive but not yet available for use.
  • Use the Collect endpoint (below) to move inactive SOL back to the wallet.

Example: Unstake

{
  "source": {
    "type": "WALLET",
    "id": "1c920f4241b78a1d483a29f3c24b6c4c"
  },
  "amount": "5",
  "assetType": "SOL",
  "idempotentId": "123456789",
  "description": "Unstake 5 SOL",
  "stakingPositionId": "FuS3FPfJDKSNot99ECLXtp3rueq36hMNStJkPJwWodLh"
}

Response

A successful request returns 201 OK with a transaction id.


Collect (Solana-specific)

The collect action moves inactive SOL from a stake account back to the wallet’s available balance. Endpoint POST /v2/transactions/collect

Request rules

  • stakingPositionId is required.
  • amount is required.
  • assetType must be "SOL".

Example: Collect

{
  "stakingPositionId": "FuS3FPfJDKSNot99ECLXtp3rueq36hMNStJkPJwWodLh",
  "amount": "2",
  "assetType": "SOL"
}

Possible failure reasons

  • 400 Invalid request: unsupported assetType, not enough available balance.
  • 404 Not found: staking position not found.



Get staking positions

This endpoint retrieves the staking positions (stake accounts) associated with a wallet. Endpoint GET /v2/wallets/{walletId}/staking/positions

Expected behavior

  • Accepts SOL as a valid asset type to retrieve positions.
  • Returns SOL staking positions, including stakingPositionId values.



Get staking rewards

This endpoint is used to query rewards generated by staking and assigned to a wallet. Endpoint GET /v2/wallets/{walletId}/staking/rewards

Expected behavior

  • Accepts SOL as a valid asset type.
  • Includes address as an optional filtering argument.



List available validators (delegation addresses)

A new endpoint is introduced to retrieve the list of available validators for delegation. Endpoint GET /v2/delegation-addresses/{assetType}

Request parameters

  • assetType: must be SOL for Solana validators.
  • limit: pagination size.
  • afterId: pagination cursor.

Example request

GET /v2/delegation-addresses/SOL?limit=10&afterId=XXXXXX

Example response

{
  "data": [
    {
      "address": "FuS3FPfJDKSNot99ECLXtp3rueq36hMNStJkPJwWodLh",
      "ownerAddress": "",
      "destination": "",
      "name": "Delegator name",
      "description": "some description",
      "anchorageValidator": false
    }
  ],
  "page": {
    "next": "XXXXXY"
  }
}



Common pitfalls

  • For POST /v2/transactions/stake, provide either parameters.address or parameters.providerName (not both).
  • Do not expect unstaked SOL to be immediately available. Plan for epoch timing, then call collect.
  • If you want to keep the stake account alive (for rewards or operational reasons), leave the minimum reserve in the stake account when collecting.