Skip to main content
All requests require an API key via the X-API-Key header. See API Keys for details.

Overview

The Opportunities API is how you discover what a user can deposit into. Each opportunity carries its accepted tokens, chain, estimated APR, current TVL, incentives, and which deposit modes it supports. This page is the canonical reference for the Opportunity object; every other endpoint that returns one links here. There are three read endpoints:
  • GET /v2/opportunities/ lists the full catalog, with optional filters.
  • GET /v2/opportunities/{id} returns one opportunity by ID.
  • GET /v2/opportunities/distributors/{distributorId} returns the set configured for a distributor.
For the product context (what configuration is and why you’d scope a set), see Turtle Earn.

Get All Opportunities

Retrieve all available opportunities with simplified token information.
Query Parameters
chainIds
string
Comma-separated list of chain IDs to filter by. Example: 1,8453,42161 for Ethereum, Base, and Arbitrum.
depositToken
string
Filter by deposit token in the format address-chainId. Example: 0xb31f66aa3c1e785363f0875a1b74e27b85fd66c7-43114.
tvlMin
number
Return only opportunities with TVL at or above this USD value. Example: 1000000 returns opportunities above $1M.
tvlMax
number
Return only opportunities with TVL at or below this USD value.
Response

Get Opportunity by ID

Retrieve a single opportunity by its unique identifier.
Path Parameters
id
uuid
required
Opportunity unique identifier.
Response Returns a single Opportunity object directly, using the structure documented under Response Fields.

Get Distributor Opportunities

Every distributor has a set of opportunities configured in the Client Portal. This endpoint returns only that set: the opportunities your users should see. Use it instead of the full catalog when you want to serve exactly what you have selected for your integration.
Path Parameters
distributorId
string
required
Your distributor ID. Find it under Distribution in the Client Portal.
Response Same shape as Get All Opportunities (a data array plus a pagination object), filtered to the configured set. An empty data array means no opportunities have been configured yet; that is a 200, not an error. Which endpoint to use How configuration works: select opportunities in the Client Portal, which stores them in the distributor’s earn-details configuration, and this endpoint returns that selection. For the concept and how attribution ties to it, see Distributor Model.

Response Fields

The same Opportunity object is returned by all three endpoints above.

Opportunity Object

id
uuid
required
Opportunity unique identifier.
name
string
required
Opportunity display name.
slug
string
URL-friendly identifier for the opportunity.
description
string
Opportunity detailed description.
type
string
Opportunity type, for example vault or lending.
tvl
number
Total Value Locked in USD.
estimatedApr
number
Estimated annual percentage rate.
Whether the opportunity is featured.
minDepositAmountUsd
number
Minimum deposit amount in USD. Deposits below this value are rejected.
meta
OpportunityMeta
Interaction and availability flags for the opportunity. See Meta Object.
depositTokens
Token[]
Tokens accepted for deposit.
baseToken
Token
Base token for the opportunity.
receiptToken
Token
Token received as a receipt for deposits.
curator
Curator
Curator organization for the opportunity.
incentives
Incentive[]
Incentives available on this opportunity.

Token Object

symbol
string
Token symbol, for example USDC or ETH.
address
string
Token contract address.
chainId
integer
Numeric chain ID the token belongs to.
decimals
integer
ERC20 decimals.
logoUrl
string
Token logo image URL.

Meta Object

directInteractionEnabled
boolean
Whether direct interaction with the opportunity is available. When true, the user can deposit the vault’s native token directly with mode=direct.
routedSwapEnabled
boolean
Whether entering via a routed swap is supported. When true, the user can deposit a different input token with mode=swap and the API routes through a DEX. See Deposit Modes.
depositEnabled
boolean
Whether deposits are currently enabled.
withdrawEnabled
boolean
Whether withdrawals are currently enabled.
asyncDeposit
boolean
Whether deposits settle asynchronously and require a follow-up claim.
asyncWithdraw
boolean
Whether withdrawals settle asynchronously.
isSecondaryMarket
boolean
Whether the opportunity can only be entered via a secondary market.
depositDisabledReason
string
Reason deposits are disabled, if any.
withdrawalDisabledReason
string
Reason withdrawals are disabled, if any.

Curator Object

id
uuid
Curator organization ID.
name
string
Curator name.
description
string
Curator description.
iconUrl
string
Curator icon image URL.
landingUrl
string
Curator website URL.

Incentive Object

id
uuid
Incentive unique identifier.
name
string
Incentive name.
description
string
Incentive description.
iconUrl
string
Incentive icon URL.
rewardType
string
Type of reward: points, tokens, yield, or vesting.
rewardTypeName
string
Human-readable reward type name.
apr
number
Annual percentage rate. May be null.
minApr
number
Minimum annual percentage rate. May be null.
maxApr
number
Maximum annual percentage rate. May be null.
fdvEstimate
number
Fully diluted valuation estimate. May be null.
tokenSupplyAllocation
number
Token supply allocation percentage. May be null.
estPriceUsd
number
Estimated price in USD. May be null.
indexed
boolean
Whether the incentive is indexed.

Operational Notes

Some vaults settle deposits instantly; others (such as Mellow and Lagoon) are asynchronous and require a follow-up claim. In v2, the meta.asyncDeposit flag signals this: when true, the deposit settles asynchronously and the user must submit a follow-up claim. The meta.asyncWithdraw flag signals the same for withdrawals.
GET /v2/opportunities/distributors/{distributorId} returns { "data": [], "pagination": { "page": 1, "limit": 20, "total": 0, "totalPages": 0 } } when nothing is configured. Treat this as a prompt to configure the set in the Client Portal, not as a failure.

Error Handling

Status Code: 401 UnauthorizedSolution: Pass a valid X-API-Key header. See API Keys.
Status Code: 404 Not Found
Solution: Verify the opportunity ID or distributor ID is correct and active.
Status Code: 500 Internal Server ErrorSolution: Retry with exponential backoff and contact support if it persists.