Skip to main content

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:

ParameterTypeDescription
limitIntMax records to return (default 100, max 1000)
whereFilterEntity-specific filter criteria (see each section below)
orderByStringColumn to sort by (default: primary key)
orderDirectionString"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.

FilterTypeDescription
idBigIntPool ID
centrifugeIdStringCentrifuge-specific pool identifier
nameStringPool name (supports _contains, _starts_with)
isActiveBooleanWhether the pool is currently active
POSThttps://api.centrifuge.io
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.

FilterTypeDescription
idStringToken address
poolIdBigIntPool the token belongs to
nameStringToken name
symbolStringToken symbol
POSThttps://api.centrifuge.io
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.

FilterTypeDescription
idStringVault contract address
centrifugeIdStringCentrifuge chain identifier
poolIdBigIntPool the vault belongs to
tokenIdStringShare class token ID
isActiveBooleanWhether the vault is currently active
assetAddressStringDeposit asset contract address
POSThttps://api.centrifuge.io
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.

FilterTypeDescription
poolIdBigIntPool the escrow belongs to
centrifugeIdStringCentrifuge chain identifier
tokenIdStringShare class token ID
assetIdBigIntAsset identifier
assetAddressStringAsset contract address
POSThttps://api.centrifuge.io
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.

FilterTypeDescription
accountStringInvestor wallet address
centrifugeIdStringCentrifuge chain identifier
typeInvestorTransactionTypeTransaction type (e.g. DEPOSIT_REQUEST_UPDATED, REDEEM_CLAIMED, TRANSFER_IN)
poolIdBigIntPool ID
tokenIdStringShare class token ID
POSThttps://api.centrifuge.io
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.

FilterTypeDescription
accountAddressStringInvestor wallet address
centrifugeIdStringCentrifuge chain identifier
tokenIdStringShare class token ID
isFrozenBooleanWhether the position is frozen
balanceBigIntToken balance (supports _gt, _lt)
POSThttps://api.centrifuge.io
query GetPositionsByInvestor {
tokenInstancePositions(
where: {
accountAddress: "0xeaafba6ae4f1c428546706d4b3b6a72fda4bac98"
balance_gt: "0"
}
) {
items {
tokenId
centrifugeId
accountAddress
balance
isFrozen
tokenInstance {
address
blockchain {
centrifugeId
name
}
}
}
}
}

Yield

Token snapshots include yield metrics computed from the token's price history. Yield values are expressed as decimal returns (e.g. 0.05 = 5%). Use the most recent snapshot for current yields, or query a time series to chart yield over time.

FieldDescription
yieldSinceInceptionTotal return since the token was first issued
yieldYtdYear-to-date return
yieldTtmTrailing twelve months return
yield7d / yield30dSimple return over the trailing 7 / 30 days
yield7d360 / yield7d3657-day return annualized on a 360 / 365 day basis
yield30d36030-day return annualized on a 360 day basis
yield30dComp360 / yield30dComp36530-day return compounded and annualized on a 360 / 365 day basis
FilterTypeDescription
idStringShare class token ID
timestampStringSnapshot timestamp (supports _gt, _lt, _gte, _lte)
POSThttps://api.centrifuge.io
query GetTokenYields {
tokenSnapshots(
where: { id: "0x00010000000000060000000000000001" }
orderBy: "timestamp"
orderDirection: "desc"
limit: 1
) {
items {
id
timestamp
tokenPrice
yieldSinceInception
yieldYtd
yieldTtm
yield30d
yield30d360
yield7d
yield7d360
yield7d365
yield30dComp360
yield30dComp365
}
}
}

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.

EntityDescription
PoolSnapshotPool state at a point in time
TokenSnapshotToken details at a specific moment
TokenInstanceSnapshotToken instance status on a spoke chain
HoldingSnapshotPool asset positions across chains
HoldingEscrowSnapshotEscrow asset amounts and prices over time
POSThttps://api.centrifuge.io
{
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

EntityDescription
BlockchainAll blockchains the indexer is currently tracking
DeploymentProtocol contracts and addresses deployed to a blockchain
PoolSpokeBlockchainMapping of pools to their spoke chain deployments

Protocol hub resources

EntityDescription
HoldingPool-level asset position with quantity and valuation
HoldingAccountCategorized asset account for a pool (asset, equity, liability, etc.)
AssetRegistrationSuccessful registration of an asset on a hub chain
OnOffRampManagerCross-chain asset movement for pools
OfframpRelayerAuthorized services that process withdrawal requests
OnRampAssetToken types investors can deposit for pool shares
OffRampAddressPre-approved withdrawal destinations
PolicyMerkle tree root representing allowed operations for a strategist
MerkleProofManagerEnables strategists to execute multi-call operations on behalf of pools

Protocol spoke resources

EntityDescription
AssetAn asset on a spoke chain
TokenInstanceInstance of a share class token on a spoke chain
EscrowCustodial wallet for pool assets on a spoke chain

Cross-chain communication

EntityDescription
CrosschainPayloadData content sent from one blockchain to another
CrosschainMessageStructured communication between blockchains
AdapterBridges that relay payloads between networks
AdapterWiringConfiguration linking adapter addresses across chains
AdapterParticipationTracks adapter involvement in cross-chain transfers

Transactional data

EntityDescription
OutstandingInvestPending invest order awaiting fulfillment
OutstandingRedeemPending redeem order awaiting fulfillment
PendingInvestOrderPending invest order with queued and pending amounts
PendingRedeemOrderPending redeem order with queued and pending amounts
InvestOrderApproved invest order (tracks approval to claim)
RedeemOrderApproved redeem order (tracks approval to claim)
VaultInvestOrderCross-chain invest order via a vault
VaultRedeemOrderCross-chain redeem order via a vault
EpochOutstandingInvestAggregated outstanding invest orders (epoch-level)
EpochOutstandingRedeemAggregated outstanding redeem orders (epoch-level)
EpochInvestOrderApproved invest order at epoch level
EpochRedeemOrderApproved redeem order at epoch level
TokenInstancePositionInvestor position holding a share class token

Actors and participants

EntityDescription
AccountUser-owned address (UOA) in the protocol
PoolManagerManager of a pool (hub or spoke)
WhitelistedInvestorInvestor 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 suffixColumn typesMatches records where column...
(none)Allequals the value
_notAlldoes not equal the value
_inPrimitives, enumsis one of the values
_not_inPrimitives, enumsis not one of the values
_gt / _ltNumericis greater / less than the value
_gte / _lteNumericis greater/less than or equal to the value
_containsStringcontains the substring
_not_containsStringdoes not contain the substring
_starts_with / _ends_withStringstarts / ends with the substring
_not_starts_with / _not_ends_withStringdoes not start / end with the substring
_hasListshas the value as an element
_not_hasListsdoes 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:

ArgumentDefaultOptions
orderByPrimary keyAny 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.

POSThttps://api.centrifuge.io
{
tokenInstanceSnapshots(
orderBy: "timestamp"
orderDirection: "asc"
where: {
tokenId: "0x00010000000000060000000000000001"
trigger_starts_with: "ethereum"
}
limit: 5
) {
items {
tokenId
trigger
timestamp
totalIssuance
tokenPrice
}
}
}

Limits and performance

LimitValue
Max page size1000 records per page
Request timeout30 seconds

Performance tips:

  1. Limit query depth: each nested level adds a sequential database query. Keep queries to 2 levels deep or fewer.
  2. 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

FieldDescription
addressToken contract address on any supported network

Response

StatusDescription
200Token price returned
404Token address not found, or price not set
GET

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

FieldDescription
addressToken contract address on any supported network

Response

StatusDescription
200Total issuance returned
404Token address not found, decimals not set, or total issuance not set
GET

Bridge REST API

The Bridge REST API is the offchain interface for moving Centrifuge tokens across chains. It exposes route discovery, quoting, and transfer-status endpoints that bridges and aggregators use to integrate Centrifuge token transfers, following the conventions those integrators expect.

All endpoints are served under https://api.centrifuge.io/bridge and return JSON. No authentication required.

Centrifuge share class tokens are natively multichain: the same token is deployed on several chains and moves between them through the protocol's own messaging layer rather than a wrapped-asset bridge. Transfers are 1:1. The amount received equals the amount sent, and the bridge fee is paid separately in the source chain's native token. Routes are available where the token bridge is deployed (currently Ethereum and Base).

Routes

Returns every available cross-chain transfer route. Each entry is a directional pair: a token on a source chain that can be moved to the same token on a destination chain.

GET /bridge/routes

Response

The response is an object with a routes array. Each route contains:

FieldTypeDescription
tokenIdStringShare class token identifier
tokenNameStringHuman-readable token name
fromAddressStringToken contract address on the source chain
toAddressStringToken contract address on the destination chain
fromChainIdStringEVM chain ID of the source chain
fromChainNameStringName of the source chain
toChainIdStringEVM chain ID of the destination chain
toChainNameStringName of the destination chain
minTransferSizeStringMinimum transfer amount, in the token's smallest unit
maxTransferSizeStringMaximum transfer amount, in the token's smallest unit (uint128 max means unlimited)
decimalsIntToken decimals
estimatedDurationIntEstimated transfer time, in seconds
estimatedGasIntEstimated gas for the destination-chain execution
standardStringTransfer standard, CentrifugeV31
GET

Quote

Prices a single transfer along a route and returns the parameters needed to execute it.

GET /bridge/quote

Query parameters

ParameterRequiredDescription
fromChainyesEVM chain ID of the source chain
toChainyesEVM chain ID of the destination chain
fromTokenyesToken contract address on the source chain
fromAmountyesAmount to transfer, in the token's smallest unit
toAddressyesRecipient address on the destination chain
fromAddressnoSender address; used as the native-fee refund address on the source chain
toTokennoToken address on the destination chain (must resolve to the same share class)
slippagenoAccepted for compatibility; ignored, since transfers are 1:1

Response

toAmount equals fromAmount (1:1 transfer). Fees are returned in estimate.feeCosts and paid in the source chain's native token (included: false), not deducted from the amount.

FieldTypeDescription
toolStringBridge identifier, centrifuge
standardStringTransfer standard, CentrifugeV31
fromChainIdIntEVM chain ID of the source chain
toChainIdIntEVM chain ID of the destination chain
fromTokenObjectSource token: address, chainId, symbol, name, decimals
toTokenObjectDestination token: address, chainId, symbol, name, decimals
fromAmountStringAmount sent, in the token's smallest unit
toAmountStringAmount received, in the token's smallest unit (equals fromAmount)
estimateObjectPricing: toAmountMin, approvalAddress, executionDuration (seconds), feeCosts (array), gasEstimate
parametersObjectDecoded arguments for the token bridge send call to submit onchain, or null
GET

Transfer status

Returns the status of a transfer, given its source-chain transaction hash. The endpoint responds with 200 and a NOT_FOUND status even before the transaction is indexed, so it is safe to poll.

GET /bridge/status?txHash=:txHash
GET /bridge/transaction/:txHash

Response

FieldTypeDescription
transactionIdStringCross-chain transfer identifier
toolStringcentrifuge
statusStringNOT_FOUND, PENDING, or DONE
substatusStringWAIT_SOURCE_CONFIRMATIONS, WAIT_DESTINATION_TRANSACTION, COMPLETED, or PARTIAL
substatusMessageStringHuman-readable detail, or null
toAddressStringRecipient address on the destination chain
sendingObjectSource-chain leg: txHash, txLink, chainId, amount, token, gasPrice, timestamp
receivingObjectDestination-chain leg once delivered: txHash, txLink, chainId, tokenAddress, tokenAmount, timestamp; null until then
GET