Centrifuge API
The Centrifuge API is a public, read-only GraphQL endpoint for querying onchain data from the Centrifuge protocol across multiple networks. Send any GraphQL-compliant POST request to https://api.centrifuge.io. No authentication required. For interactive exploration, open the GraphiQL UI and use Ctrl + Space to trigger autocomplete.
All queries accept these standard parameters:
| Parameter | Type | Description |
|---|---|---|
limit | Int | Max records to return (default 100, max 1000) |
where | Filter | Entity-specific filter criteria (see each section below) |
orderBy | String | Column to sort by (default: primary key) |
orderDirection | String | "asc" or "desc" (default: "asc") |
Pools
A pool is the top-level entity that groups together share classes (tokens), vaults, and holdings across multiple networks. Each pool can issue several tokens, deploy vaults on different chains, and manage assets through a unified on-chain structure.
| Filter | Type | Description |
|---|---|---|
id | BigInt | Pool ID |
centrifugeId | String | Centrifuge-specific pool identifier |
name | String | Pool name (supports _contains, _starts_with) |
isActive | Boolean | Whether the pool is currently active |
query GetActivePools {pools( where: { isActive: true, name_not: null } limit: 5) { items { id name centrifugeId isActive tokens { items { id name symbol totalIssuance tokenPrice } } }}}Tokens
A token (or share class) represents ownership in a pool. TVL per token can be calculated as totalIssuance * tokenPrice, adjusted for decimals.
| Filter | Type | Description |
|---|---|---|
id | String | Token address |
poolId | BigInt | Pool the token belongs to |
name | String | Token name |
symbol | String | Token symbol |
query GetTokenById {tokens( where: { id: "0x00010000000000060000000000000001" }) { items { id name totalIssuance tokenPrice pool { asset { decimals } } }}}Vaults
A vault is the entry point for investors on a specific chain. Each vault connects a pool's share class token to a deposit asset on a spoke chain, handling deposits, redemptions, and token conversions for that particular network.
| Filter | Type | Description |
|---|---|---|
id | String | Vault contract address |
centrifugeId | String | Centrifuge chain identifier |
poolId | BigInt | Pool the vault belongs to |
tokenId | String | Share class token ID |
isActive | Boolean | Whether the vault is currently active |
assetAddress | String | Deposit asset contract address |
query GetVaultsByPool {vaults( where: { poolId: "281474976710659" } limit: 10) { items { id centrifugeId poolId tokenId assetAddress isActive status blockchain { centrifugeId name } }}}Holdings
Holding escrows track the custodial asset positions for each pool on spoke chains. Each escrow holds a specific asset amount and price, linked to the on-chain asset contract.
| Filter | Type | Description |
|---|---|---|
poolId | BigInt | Pool the escrow belongs to |
centrifugeId | String | Centrifuge chain identifier |
tokenId | String | Share class token ID |
assetId | BigInt | Asset identifier |
assetAddress | String | Asset contract address |
query GetHoldingEscrowsByPool {holdingEscrows( where: { poolId: "281474976710659" } limit: 5) { items { centrifugeId assetAmount assetPrice asset { name symbol decimals address } }}}Investor transactions
Investor transactions record every invest, redeem, and claim action executed by investors in the protocol.
| Filter | Type | Description |
|---|---|---|
account | String | Investor wallet address |
centrifugeId | String | Centrifuge chain identifier |
type | InvestorTransactionType | Transaction type (e.g. DEPOSIT_REQUEST_UPDATED, REDEEM_CLAIMED, TRANSFER_IN) |
poolId | BigInt | Pool ID |
tokenId | String | Share class token ID |
query GetTransactionsByInvestor {investorTransactions( where: { account: "0xa2da14a5012b67c609e52f5e6f7372853c2eb5aa" } limit: 5 orderBy: "createdAt" orderDirection: "desc") { items { txHash centrifugeId type account poolId tokenId currencyAmount tokenAmount tokenPrice createdAt blockchain { centrifugeId name } }}}Investor positions
Token instance positions represent an investor's share class token balance on a specific chain. Query by account address to see all holdings across networks.
| Filter | Type | Description |
|---|---|---|
accountAddress | String | Investor wallet address |
centrifugeId | String | Centrifuge chain identifier |
tokenId | String | Share class token ID |
isFrozen | Boolean | Whether the position is frozen |
balance | BigInt | Token balance (supports _gt, _lt) |
query GetPositionsByInvestor {tokenInstancePositions( where: { accountAddress: "0xeaafba6ae4f1c428546706d4b3b6a72fda4bac98" balance_gt: "0" }) { items { tokenId centrifugeId accountAddress balance isFrozen tokenInstance { address blockchain { centrifugeId name } } }}}Snapshots
Snapshots capture entity state at specific points in time. Available for pools, tokens, token instances, and holdings. All snapshots share common fields: timestamp, blockNumber, trigger, triggerTxHash, and triggerChainId.
| Entity | Description |
|---|---|
PoolSnapshot | Pool state at a point in time |
TokenSnapshot | Token details at a specific moment |
TokenInstanceSnapshot | Token instance status on a spoke chain |
HoldingSnapshot | Pool asset positions across chains |
HoldingEscrowSnapshot | Escrow asset amounts and prices over time |
{tokenInstanceSnapshots( orderBy: "timestamp" orderDirection: "asc" where: { tokenId: "0x00010000000000060000000000000001" trigger_starts_with: "ethereum" }) { items { tokenId triggerChainId trigger timestamp totalIssuance tokenPrice }}}Other entities
Beyond the main entities above, the API exposes a full set of indexed resources:
Infrastructure
| Entity | Description |
|---|---|
Blockchain | All blockchains the indexer is currently tracking |
Deployment | Protocol contracts and addresses deployed to a blockchain |
PoolSpokeBlockchain | Mapping of pools to their spoke chain deployments |
Protocol hub resources
| Entity | Description |
|---|---|
Holding | Pool-level asset position with quantity and valuation |
HoldingAccount | Categorized asset account for a pool (asset, equity, liability, etc.) |
AssetRegistration | Successful registration of an asset on a hub chain |
OnOffRampManager | Cross-chain asset movement for pools |
OfframpRelayer | Authorized services that process withdrawal requests |
OnRampAsset | Token types investors can deposit for pool shares |
OffRampAddress | Pre-approved withdrawal destinations |
Policy | Merkle tree root representing allowed operations for a strategist |
MerkleProofManager | Enables strategists to execute multi-call operations on behalf of pools |
Protocol spoke resources
| Entity | Description |
|---|---|
Asset | An asset on a spoke chain |
TokenInstance | Instance of a share class token on a spoke chain |
Escrow | Custodial wallet for pool assets on a spoke chain |
Cross-chain communication
| Entity | Description |
|---|---|
CrosschainPayload | Data content sent from one blockchain to another |
CrosschainMessage | Structured communication between blockchains |
Adapter | Bridges that relay payloads between networks |
AdapterWiring | Configuration linking adapter addresses across chains |
AdapterParticipation | Tracks adapter involvement in cross-chain transfers |
Transactional data
| Entity | Description |
|---|---|
OutstandingInvest | Pending invest order awaiting fulfillment |
OutstandingRedeem | Pending redeem order awaiting fulfillment |
PendingInvestOrder | Pending invest order with queued and pending amounts |
PendingRedeemOrder | Pending redeem order with queued and pending amounts |
InvestOrder | Approved invest order (tracks approval to claim) |
RedeemOrder | Approved redeem order (tracks approval to claim) |
VaultInvestOrder | Cross-chain invest order via a vault |
VaultRedeemOrder | Cross-chain redeem order via a vault |
EpochOutstandingInvest | Aggregated outstanding invest orders (epoch-level) |
EpochOutstandingRedeem | Aggregated outstanding redeem orders (epoch-level) |
EpochInvestOrder | Approved invest order at epoch level |
EpochRedeemOrder | Approved redeem order at epoch level |
TokenInstancePosition | Investor position holding a share class token |
Actors and participants
| Entity | Description |
|---|---|
Account | User-owned address (UOA) in the protocol |
PoolManager | Manager of a pool (hub or spoke) |
WhitelistedInvestor | Investor allowed to invest in a pool |
Filtering, sorting, and pagination
Filters
Use the where argument to filter records. Filter options are available for every column:
| Filter suffix | Column types | Matches records where column... |
|---|---|---|
| (none) | All | equals the value |
_not | All | does not equal the value |
_in | Primitives, enums | is one of the values |
_not_in | Primitives, enums | is not one of the values |
_gt / _lt | Numeric | is greater / less than the value |
_gte / _lte | Numeric | is greater/less than or equal to the value |
_contains | String | contains the substring |
_not_contains | String | does not contain the substring |
_starts_with / _ends_with | String | starts / ends with the substring |
_not_starts_with / _not_ends_with | String | does not start / end with the substring |
_has | Lists | has the value as an element |
_not_has | Lists | does not have the value as an element |
Compose filters using the AND and OR operators, which accept an array of filter objects.
Sorting
Use orderBy and orderDirection to sort results:
| Argument | Default | Options |
|---|---|---|
orderBy | Primary key | Any column name |
orderDirection | "asc" | "asc" or "desc" |
Pagination
The API uses cursor-based pagination. For details, see the Ponder.sh pagination docs.
Filter example
This query combines filtering, sorting, and pagination: it fetches token instance snapshots for a specific token, filtered to Ethereum triggers, sorted chronologically.
{tokenInstanceSnapshots( orderBy: "timestamp" orderDirection: "asc" where: { tokenId: "0x00010000000000060000000000000001" trigger_starts_with: "ethereum" } limit: 5) { items { tokenId trigger timestamp totalIssuance tokenPrice }}}Limits and performance
| Limit | Value |
|---|---|
| Max page size | 1000 records per page |
| Request timeout | 30 seconds |
Performance tips:
- Limit query depth: each nested level adds a sequential database query. Keep queries to 2 levels deep or fewer.
- Use pagination: fetch records in smaller chunks with cursor-based pagination to reduce database load.
Supported networks
See the Deployments page for the full list of supported networks and contract addresses.
Data freshness
Data is typically available within 1-2 minutes of onchain confirmation. Historical snapshots are maintained at daily intervals, with some entities also snapshotted on specific trigger events.
Token REST API
The API also exposes REST endpoints for simple token lookups. All endpoints return JSON responses.
Token price
Returns the current price of a token by its contract address, formatted as a decimal string.
GET /tokens/:address/price
Parameters
| Field | Description |
|---|---|
address | Token contract address on any supported network |
Response
| Status | Description |
|---|---|
200 | Token price returned |
404 | Token address not found, or price not set |
Token total issuance
Returns the total issuance (supply) of a token by its contract address, formatted as a decimal string adjusted for the token's decimals.
GET /tokens/:address/total-issuance
Parameters
| Field | Description |
|---|---|
address | Token contract address on any supported network |
Response
| Status | Description |
|---|---|
200 | Total issuance returned |
404 | Token address not found, decimals not set, or total issuance not set |