Skip to main content

Rate limits

ParameterValue
Max requests100 per 60-second window
Max inputs per request5
ScopePer client
Both walletPositions and poolDetails share the same rate limit. Exceeding the limit returns an error:
{
  "errors": [
    {
      "message": "Rate limit exceeded. Please try again later."
    }
  ]
}

Batch size

Each request accepts up to 5 inputs. This applies to both queries:
# This works (5 inputs)
walletPositions(inputs: [
  { protocol: "morpho", chainId: 1, walletAddress: "0x..." }
  { protocol: "aave", chainId: 1, walletAddress: "0x..." }
  { protocol: "pendle", chainId: 1, walletAddress: "0x..." }
  { protocol: "compound", chainId: 1, walletAddress: "0x..." }
  { protocol: "fluid", chainId: 1, walletAddress: "0x..." }
])

# This is rejected (6+ inputs)
walletPositions(inputs: [
  { protocol: "morpho", chainId: 1, walletAddress: "0x..." }
  { protocol: "aave", chainId: 1, walletAddress: "0x..." }
  { protocol: "pendle", chainId: 1, walletAddress: "0x..." }
  { protocol: "compound", chainId: 1, walletAddress: "0x..." }
  { protocol: "fluid", chainId: 1, walletAddress: "0x..." }
  { protocol: "neutrl", chainId: 1, walletAddress: "0x..." }
])

Other constraints

ConstraintDetails
Query depthMaximum 7 levels of nesting
Request sizeMaximum 100KB per request
Batch queriesDisabled — each HTTP request must contain a single GraphQL operation
IntrospectionDisabled

Best practices

1

Batch protocols into single requests

Query up to 5 protocol/chain/wallet combinations in one request instead of making separate requests for each.
2

Handle partial failures

Always process both data and errors arrays. Don’t discard successful results because one protocol failed.
3

Use exponential backoff

If you hit the rate limit, wait before retrying. Double the wait time on each retry (e.g. 1s, 2s, 4s).
4

Request only the fields you need

GraphQL lets you select specific fields. Smaller responses are faster — don’t request fields you won’t use.