Skip to main content
Yield sources are the underlying yield opportunities your portfolio wallet allocates into. A strategy is a weighted allocation across one or more yield sources.

Available yield sources

Fetch the current catalog with GET /v2/portfolio-wallets/yield-sources:
curl -X GET "$BASE_URL/v2/portfolio-wallets/yield-sources" \
  -H "Authorization: Bearer $BRAID_API_TOKEN"
{
  "yieldSources": [
    {
      "positionKey": "usdz",
      "asset": "usdz",
      "yieldSourceType": "stablecoinYield",
      "chain": "arbitrum",
      "maxProcessingTime": "PT0H",
      "currentRateBps": 450,
      "rateUpdatedAt": "2026-02-05T10:00:00.000Z"
    },
    {
      "positionKey": "syrupUsdc",
      "asset": "syrupUSDC",
      "yieldSourceType": "overcollateralizedLending",
      "chain": "ethereum",
      "maxProcessingTime": "PT0H",
      "currentRateBps": 510,
      "rateUpdatedAt": "2026-02-05T10:00:00.000Z"
    },
    {
      "positionKey": "rlp",
      "asset": "rlp",
      "yieldSourceType": "deltaNeutralStrategy",
      "chain": "ethereum",
      "maxProcessingTime": "PT24H",
      "currentRateBps": 850,
      "rateUpdatedAt": "2026-02-05T10:00:00.000Z"
    }
  ]
}
Position keyTypeChainLiquidityDescription
usdzstablecoinYieldArbitrumInstant (PT0H)USDZ — an M0 wM extension token collateralized by T-bills
syrupUsdcovercollateralizedLendingEthereumInstant (PT0H)Maple Syrup overcollateralized lending
rlpdeltaNeutralStrategyEthereumUp to 24h (PT24H)Resolv delta-neutral strategy

Rate semantics

  • currentRateBps is a best-effort 30-day APR (simple annualization) derived from the yield source’s oracle NAV/share history.
  • rateUpdatedAt is when the server last refreshed the computed rate.
  • usdz is currently treated as a static rate (3.3%) until a dedicated rate oracle is introduced.
  • syrupUsdc is valued from an onchain ERC-4626 conversion read at request time, so displayed value is typically as fresh as the latest Ethereum block.
  • rlp is valued from Resolv’s oracle feed; fundamental oracle values update every ~24 hours, so displayed NAV can be up to ~24 hours old.
  • Neither source should be treated as a guaranteed 1:1 USDC peg at every instant; small valuation differences can occur from oracle/NAV timing.

maxProcessingTime and ISO 8601 durations

Braid represents liquidity speed as ISO 8601 duration strings. These are durations (how long something may take), not timestamps and not an SLA.
DurationMeaning
PT0HImmediate (0 hours)
PT0SZero seconds (step-level timing)
PT20S~20 seconds
PT2M~2 minutes
PT1H~1 hour
PT1H30M~1 hour 30 minutes
PT24HUp to ~24 hours
P1D1 day
Format rules: uppercase, units are D, H, M, S. No calendar-ambiguous units (months/years). maxProcessingTime describes yield-source unwind time only. End-to-end time-to-receive can be longer when cross-chain delivery (e.g. CCTP) is involved. Use withdrawal time estimates for end-to-end planning.

Quote a strategy

Use the quote endpoint to generate a suggested allocation given your constraints.
curl -X POST "$BASE_URL/v2/portfolio-wallets/quote" \
  -H "Authorization: Bearer $BRAID_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "requestId": "c3353fff-87cf-4c7c-b68c-2700139dd4e6",
    "minApyTargetBps": 500,
    "liquidityConstraints": [
      { "maxProcessingTime": "PT1H", "minWeightBps": 5000 }
    ],
    "yieldSourceTypes": ["deltaNeutralStrategy", "overcollateralizedLending", "stablecoinYield"],
    "exclusions": [],
    "withdrawalDestination": {
      "destinationToken": "usdc",
      "destinationChain": "ethereum"
    }
  }'

Request fields

FieldRequiredDescription
requestIdYesUUID v4 idempotency key
minApyTargetBpsNoMinimum blended APY in basis points
liquidityConstraintsNoArray of { maxProcessingTime, minWeightBps } — treated as “up to” constraints
yieldSourceTypesNoFilter by yield source type
exclusionsNoExclude specific yield sources by positionKey
withdrawalDestinationNoAttach end-to-end withdrawal time estimates to results

Response

[
  {
    "strategyConfig": {
      "positions": [
        {
          "positionKey": "usdz",
          "targetWeightBps": 5000,
          "maxProcessingTime": "PT0H",
          "currentApy": 450
        },
        {
          "positionKey": "rlp",
          "targetWeightBps": 5000,
          "maxProcessingTime": "PT24H",
          "currentApy": 850
        }
      ]
    },
    "blendedRateBps": 650,
    "constraintsSatisfied": true,
    "withdrawalTimeEstimates": {
      "computedAt": "2026-02-12T18:20:00.000Z",
      "destinationToken": "usdc",
      "destinationChain": "ethereum",
      "positionEstimates": [
        {
          "positionKey": "usdz",
          "asset": "usdz",
          "sourceChain": "arbitrum",
          "supported": true,
          "fullSettlementTime": { "p50": "PT1H0M40S", "p90": "PT1H34M", "max": "PT3H20M" },
          "steps": [
            { "kind": "unwind_liquidity", "maxProcessingTime": "PT0H", "time": { "p50": "PT0S", "p90": "PT0S", "max": "PT0S" } },
            { "kind": "convert_to_usdc", "chain": "arbitrum", "time": { "p50": "PT20S", "p90": "PT2M", "max": "PT10M" } },
            { "kind": "bridge_cctp", "fromChain": "arbitrum", "toChain": "ethereum", "token": "usdc", "external": true, "time": { "p50": "PT1H", "p90": "PT1H30M", "max": "PT3H" } },
            { "kind": "payout_transfer_and_finality", "chain": "ethereum", "token": "usdc", "time": { "p50": "PT20S", "p90": "PT2M", "max": "PT10M" } }
          ],
          "assumptions": [
            "Estimates are best-effort and not an SLA.",
            "Times exclude customer approval / signing delays.",
            "Cross-chain delivery uses CCTP; attestation time is operated externally and can vary."
          ]
        }
      ]
    }
  }
]
  • strategyConfig.positions is returned ordered from lowest currentApy to highest for stable client rendering.
  • Use the returned strategyConfig.positions as the positions input to POST /v2/portfolio-wallets.
  • If withdrawalDestination is provided, the response includes withdrawalTimeEstimates with per-position end-to-end estimates.

Estimate withdrawal times

If you already know which positions you want, estimate end-to-end withdrawal times directly:
curl -X POST "$BASE_URL/v2/portfolio-wallets/withdrawal-time-estimates" \
  -H "Authorization: Bearer $BRAID_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "destinationToken": "usdc",
    "destinationChain": "ethereum",
    "positions": [
      { "positionKey": "usdz", "targetWeightBps": 6000 },
      { "positionKey": "rlp", "targetWeightBps": 4000 }
    ]
  }'

Request fields

FieldRequiredDescription
destinationTokenYesDestination token (only usdc today)
destinationChainYesDestination chain (ethereum, arbitrum, base, polygon, optimism, avalanche)
positionsYesArray of positions (same shape as POST /v2/portfolio-wallets)

Response

{
  "computedAt": "2026-02-12T18:20:00.000Z",
  "destinationToken": "usdc",
  "destinationChain": "ethereum",
  "positionEstimates": [
    {
      "positionKey": "usdz",
      "asset": "usdz",
      "sourceChain": "arbitrum",
      "supported": true,
      "fullSettlementTime": { "p50": "PT1H0M40S", "p90": "PT1H34M", "max": "PT3H20M" },
      "steps": [
        { "kind": "unwind_liquidity", "maxProcessingTime": "PT0H", "time": { "p50": "PT0S", "p90": "PT0S", "max": "PT0S" } },
        { "kind": "convert_to_usdc", "chain": "arbitrum", "time": { "p50": "PT20S", "p90": "PT2M", "max": "PT10M" } },
        { "kind": "bridge_cctp", "fromChain": "arbitrum", "toChain": "ethereum", "token": "usdc", "external": true, "time": { "p50": "PT1H", "p90": "PT1H30M", "max": "PT3H" } },
        { "kind": "payout_transfer_and_finality", "chain": "ethereum", "token": "usdc", "time": { "p50": "PT20S", "p90": "PT2M", "max": "PT10M" } }
      ]
    },
    {
      "positionKey": "rlp",
      "asset": "rlp",
      "sourceChain": "ethereum",
      "supported": true,
      "fullSettlementTime": { "p50": "PT40S", "p90": "PT24H4M", "max": "PT24H20M" },
      "steps": [
        { "kind": "unwind_liquidity", "maxProcessingTime": "PT24H", "time": { "p50": "PT0S", "p90": "PT24H", "max": "PT24H" } },
        { "kind": "convert_to_usdc", "chain": "ethereum", "time": { "p50": "PT20S", "p90": "PT2M", "max": "PT10M" } },
        { "kind": "payout_transfer_and_finality", "chain": "ethereum", "token": "usdc", "time": { "p50": "PT20S", "p90": "PT2M", "max": "PT10M" } }
      ]
    }
  ]
}
Each estimate breaks the withdrawal into steps (unwind_liquidity, convert_to_usdc, bridge_cctp, payout_transfer_and_finality) with p50, p90, and max durations. fullSettlementTime is the aggregate. Reading an estimate: "p90": "PT1H30M" means “90th percentile is about 1 hour 30 minutes”. These are best-effort estimates, not an SLA.