yield.plan
A ranked menu of 3 to 6 yield options for an amount, with expected USD yield, exit cost, risk and steps; with build: true, the unsigned transactions to do it, checked.
Details
- Endpoint
- POST /v1/yield/plan
- Credits
- varies
- Pricing
- Depends on the input and the size of the result. The description says how.
- Rate class
- Light. Counts against your light requests per second.
Give an amount in USD and optionally the coin you hold, a target APY, the highest risk tier you accept and a horizon in days. Returns 3 to 6 options from the yield map, ranked: options that reach the target first, then lowest risk tier, then closest to the target. Each option has the realized APY used (never the advertised one), token rewards apart, expected USD over the horizon, the cost to get in and out at this size, the risk tier with its reasons, plain steps, a link to the protocol and a tide.ad link to the evidence. At most two options per protocol. With build: true and sender, tide also builds the transaction for the top option (or the ranks in build_ranks, up to 3): one unsigned transaction per option that swaps into the option's coin when the wallet holds another (Aftermath router, slippage enforced on chain) and then supplies, mints the liquid staking coin or stakes, gassed and dry-run on current mainnet state with the pre-sign check, like tx.build. An option that would fail or that tide cannot build (liquidity pools, vaults) comes back with the reason instead of bytes. tide never signs. 3 credits, plus 15 per transaction built.
Parameters
| Name | Type | Description |
|---|---|---|
| amount_usdrequired | number | How much to put to work, in USD.At least 1. |
| asset | string | The coin you hold: a symbol (USDC, SUI) or a coin type. Pools that pair it count too (they need half swapped). |
| target_apy | number | The APY you are after, in percent (6 means 6%).At least 0. |
| max_risk_tier | integer | Highest risk tier to include (1 is the lowest risk). Default 5.From 1 to 5. |
| horizon_days | integer | How long you plan to stay, for the expected USD. Default 365.From 1 to 3650. |
| build | boolean | Also build the unsigned transactions for the chosen options (needs sender). Default false. |
| sender | string | With build: the wallet that holds asset and will sign. |
| pass | string | With build: an Agent Pass id instead of sender. Each option is built for the pass's agent from the owner's budget (NAVI supply or stake as the pass allows), prechecked against the pass, with a signed receipt; an option the pass does not allow says why. |
| amount | number or string | With build: the amount of asset to put in, whole coins. Default amount_usd at the current price. |
| build_ranks | array of integer | With build: which options to build, by rank. Default [1]; at most 3. |
| slippage_pct | number | With build: slippage for any swap into the option's coin, percent. Default 0.5. |
Request
Send your key in the x-api-key header, or leave it out to use the keyless tier.
curl -X POST "https://api.tide.ad/v1/yield/plan" \
-H "x-api-key: YOUR_API_KEY" \
-H "content-type: application/json" \
-d '{
"amount_usd": 5000,
"asset": "USDC",
"target_apy": 6,
"max_risk_tier": 2
}'const res = await fetch("https://api.tide.ad/v1/yield/plan", {
method: "POST",
headers: {
"x-api-key": process.env.TIDE_API_KEY!,
"content-type": "application/json",
},
body: JSON.stringify({
"amount_usd": 5000,
"asset": "USDC",
"target_apy": 6,
"max_risk_tier": 2
}),
});
const data = await res.json();Response
{
"options": [
{
"rank": 1,
"id": "lend:navi:usdc:10",
"name": "USDC supply on NAVI",
"kind": "lending",
"protocol": {
"id": "navi",
"name": "NAVI",
"url": "https://app.naviprotocol.io"
},
"apy": {
"used": 5.6,
"realized7d": 6.25,
"realized30d": 5.6,
"rewards": 0.33,
"total": 5.93
},
"expected": {
"horizonDays": 365,
"usd": 296.5,
"perYearUsd": 280,
"rewardsUsd": 16.5
},
"exit": {
"costUsd": 0,
"costPct": 0,
"withdrawableUsd": 2804337,
"window": "Instant, up to the reserve's idle cash",
"note": "Withdraw any time: $2,804,337 is idle in the market now."
},
"risk": {
"tier": 1,
"reasons": [
"Utilization is 89%: withdrawals can queue when borrowers do not repay"
],
"upgrade": "Upgradable by a multisig.",
"packageAgeDays": 1207,
"oracles": [
"Supra"
]
},
"why": "Paid 5.60% over the last 30 days, plus about 0.33% in token rewards, risk tier 1 of 5, $25,106,801 deposited.",
"steps": [
"Open NAVI at app.naviprotocol.io and connect your wallet.",
"Choose USDC in the supply (lend) list and enter the amount.",
"Approve the transaction. You get a deposit receipt that grows as borrowers pay interest."
],
"appUrl": "https://app.naviprotocol.io",
"link": "https://tide.ad/yield?row=lend%3Anavi%3Ausdc%3A10"
},
{
"rank": 2,
"id": "lend:suilend:usdc:d388bc07",
"name": "USDC supply on Suilend",
"kind": "lending",
"protocol": {
"id": "suilend",
"name": "Suilend",
"url": "https://suilend.fi"
},
"apy": {
"used": 4.41,
"realized7d": 4.31,
"realized30d": 4.41,
"rewards": 0.45,
"total": 4.86
},
"expected": {
"horizonDays": 365,
"usd": 243,
"perYearUsd": 220.5,
"rewardsUsd": 22.5
},
"exit": {
"costUsd": 0,
"costPct": 0,
"withdrawableUsd": 5624525,
"window": "Instant, up to the market's idle cash",
"note": "Withdraw any time: $5,624,525 is idle in the market now."
},
"risk": {
"tier": 1,
"reasons": [
"One key can upgrade the code at any time"
],
"upgrade": "Upgradable by a single key address.",
"packageAgeDays": 968,
"oracles": [
"Pyth"
]
},
"why": "Paid 4.41% over the last 30 days, plus about 0.45% in token rewards, risk tier 1 of 5, $28,369,918 deposited.",
"steps": [
"Open Suilend at suilend.fi and connect your wallet.",
"Choose USDC in the supply (lend) list and enter the amount.",
"Approve the transaction. You get a deposit receipt that grows as borrowers pay interest."
],
"appUrl": "https://suilend.fi/dashboard",
"link": "https://tide.ad/yield?row=lend%3Asuilend%3Ausdc%3Ad388bc07"
},
{
"rank": 3,
"id": "lend:scallop:usdc:dba34672",
"name": "USDC supply on Scallop",
"kind": "lending",
"protocol": {
"id": "scallop",
"name": "Scallop",
"url": "https://app.scallop.io"
},
"apy": {
"used": 4.35,
"realized7d": 4.81,
"realized30d": 4.35,
"rewards": null,
"total": 4.35
},
"expected": {
"horizonDays": 365,
"usd": 217.5,
"perYearUsd": 217.5,
"rewardsUsd": 0
},
"exit": {
"costUsd": 0,
"costPct": 0,
"withdrawableUsd": 410993,
"window": "Instant, up to the market's idle cash",
"note": "Withdraw any time: $410,993 is idle in the market now."
},
"risk": {
"tier": 1,
"reasons": [
"No risk signal found in exit, contract, holders or history"
],
"upgrade": "Upgradable by a multisig (3 of 5 keys).",
"packageAgeDays": 1206,
"oracles": [
"own oracle package 0x1478a432…"
]
},
"why": "Paid 4.35% over the last 30 days, risk tier 1 of 5, $1,553,413 deposited.",
"steps": [
"Open Scallop at app.scallop.io and connect your wallet.",
"Choose USDC in the supply (lend) list and enter the amount.",
"Approve the transaction. You get a deposit receipt that grows as borrowers pay interest."
],
"appUrl": "https://app.scallop.io",
"link": "https://tide.ad/yield?row=lend%3Ascallop%3Ausdc%3Adba34672"
}
],
"considered": 12,
"summary": "For $5,000 in USDC: 6 options. Best fit is USDC supply on NAVI at 5.93% (risk tier 1), about $297 over 365 days.",
"notes": [
"Rates are what each option actually paid on chain over the last 7 and 30 days, not a promise. Token rewards are counted separately and end when their program ends."
],
"builtAt": "2026-11-05T13:37:11.435Z",
"asOf": {
"checkpoint": 341930046,
"timestamp": "2026-11-05T13:37:11.435Z",
"lagMs": null
}
}Long lists are cut to a few items here.