Skip to main content
API contract changes are listed newest first. Breaking entries include the fields and client updates required to migrate.

November 2, 2026

Yield period reports use both boundary prices

GET /v2/accounting/yield/period-summary now loads source prices at both the opening and closing boundaries. Reports for positions already held at the opening boundary no longer show incomplete merely because a newer closing price exists. unrealizedPerformanceUsd, investmentPerformanceUsd, grossYieldGeneratedUsd, netYieldEarnedUsd, and source return rates now exclude appreciation that predates the selected period. Portal statement CSV exports reflect the corrected values after the API deployment. Response fields and CSV columns are unchanged.

Public stock performance

GET /v2/public/yield-sources stock rows now include priceReturn30dBps, priceReturnUpdatedAt, depositToken, and sourceUrl. Display the signed return as the Ondo token’s 30-day USD price change. It is not APY and can be null when price history is insufficient. Yield-source apyBps remains annualized yield.

October 28, 2026

Transaction approval progress

Prepare returns a signingRequest. Pending activities and vote responses report progress toward the required customer approvals. Existing integrations remain supported. See Transaction Approvals.

October 27, 2026

Stock max slippage defaults to 1%

Manual stock allocation and explicit stock withdrawal requests now use a 100 bps (1%) price limit when stockPriceToleranceBps is omitted. Allocation preview returns HTTP 400 validation_error with requiredStockPriceToleranceBps when an indicative stock quote needs a higher limit within the route ceiling. Show that higher percentage to the customer and obtain confirmation before retrying the allocation preview with the selected limit. Send the same limit with the allocation request. Execution still checks a fresh quote against the selected limit.

October 22, 2026

CETES order recovery

CETES orders that fail before transaction preparation can now recover automatically once using the same order. Continue tracking the existing rebalance or withdrawal. Orders that cannot recover remain pending for review. Concurrent CETES swaps from the same Stellar wallet wait their turn for transaction preparation. Request and response formats are unchanged.

CETES denomination APY and timing

Source catalog and wallet positions now include denominationCurrency; apyBps uses MXN for CETES and USD for existing USD sources. Label displayed APY with its currency. Source responses no longer include localApy or indicative fees. USD wallet yield/accounting reports and risk apy_bps remain USD-based. CETES deposit and redemption both return zero estimated seconds with Instant (subject to liquidity). TVL uses mainnet Stellar supply and USD prices in both environments.

October 21, 2026

Tempo beta transfer limits

Breaking change: New withdrawals to Tempo are limited to 100 USDC.e per request, before fees. Allocation plans may spend at most 100 USDC.e of Tempo cash in total across their legs. Preview and create return HTTP 400 tempo_beta_transfer_limit_exceeded above the limit. Automatic rebalancing skips oversized plans without splitting them. Deposits, committed workflows, and identical request-ID replays are unchanged.

October 20, 2026

Ground credit reporting removed

Breaking change: The yield period-summary response no longer includes groundCreditsUsd in summary or in yieldSources rows. Remove those fields from response schemas and calculations. Current wallet balances and other performance fields retain their values. Statement CSV exports no longer include ground_credits_usd in yield_summary.csv or yield_sources.csv. Update any CSV imports that expect that column.

October 18, 2026

Tempo USDC.e

Portfolio Wallets support USDC.e deposits and withdrawals on Tempo mainnet. Use depositAddresses.tempo after it appears; it can differ from the Ethereum address. Withdraw with destinationChain: "tempo" and token: "usdc". Tempo is production-only. See Supported Chains.

Automatic Stellar setup

New wallets prepare Stellar deposit addresses automatically in the background. Use stellar_testnet in sandbox and stellar in production. Poll GET /v2/wallets/{id} until the address appears; other returned addresses remain usable during setup. Stellar setup and cross-chain allocations require no customer approval. External payouts retain customer approval. Breaking change: POST /v2/wallets/{id}/deposit-addresses/{chain}/enable has been removed. Remove this call from your integration. For an older wallet without Stellar setup, contact Ground.

October 9, 2026

Stellar USDC beta

Portfolio Wallets support Stellar Testnet USDC in sandbox. Stellar mainnet is available in beta for enabled production environments. Use stellar_testnet in sandbox and stellar in production. Stellar deposit addresses use a one-time setup flow. Configure an organization signer, subscribe to portfolio_wallet.approval.status_changed, and call POST /v2/wallets/{id}/deposit-addresses/{chain}/enable. After the setup activity is approved, the Stellar G-address appears in the wallet’s depositAddresses. Withdrawals can deliver USDC to Stellar Testnet and to beta-enabled Stellar mainnet environments. Use the matching chain key and a valid G-address, then process approval activities and track the withdrawal until completion.

October 6, 2026

Automatic TRON deposit addresses

Every Portfolio Wallet receives a TRON USDT address automatically. Wait for address readiness before depositing. Ground funds activation and gas when an outgoing transaction needs them. Breaking change: PATCH /v2/wallets/{id} now accepts only label. Remove enabledChains from update requests; it returns HTTP 400. Address setup requires no enable request.

October 4, 2026

TRON Portfolio Wallets and JustLend V1 USDT

Portfolio Wallets support native TRON USDT in production and Shasta test USDT in sandbox. TRON addresses are provisioned automatically; poll the wallet for readiness before depositing. TRON uses the independent usdt:tron allocation group; Ethereum USDT remains in usdt. USDT does not bridge between them. JustLend V1 USDT (justlend-v1-usdt) is available through the environment-specific catalog. Its underlying allocation represents 100% exposure to the USDT lending market. Shasta uses a simulated market with test assets. Ground pays the transaction resource costs for Ground-managed operations.

JustLend current APY preview

JustLend V1 yield-source responses now include an optional currentApy preview with apyBps, asOf, and validUntil. Label this value Current APY and stop displaying it at validUntil; it expires two hours after observation. It is a variable supply-rate estimate excluding rewards, using JustLend’s annualization and display precision without additional compounding. The existing apyBps remains the historical 30-day rate and stays null until enough history is available. Responses also include a link to JustLend’s USDT market overview.

September 1, 2026

Strategy optimization endpoint removed

Breaking change POST /v2/wallets/strategy/optimize is no longer available. Fetch the current yield-source catalog from GET /v2/wallets/yield-sources, apply your allocation policy in your application, and submit explicit allocations through POST /v2/wallets or PATCH /v2/wallets/{id}/strategy.

August 14, 2026

Cash-to-cash allocations are rejected

POST /v2/wallets/{id}/allocate-preview and POST /v2/wallets/{id}/allocate now reject movements whose source and destination are both cash positions. Allocate between cash and a yield source, or between two yield sources.

August 10, 2026

Portfolio wallet webhooks identify their wallet

Portfolio wallet deposit, withdrawal, payout, strategy, and rebalance webhooks now include a top-level walletId. USD amounts in deposit activity and webhooks are returned with exactly six decimal places. Retrying a workflow no longer emits a rebalance event solely because its worker claim changed.

August 9, 2026

Allocation responses include accepted instructions

POST /v2/wallets/{id}/allocate now returns the allocation’s requestId, createdAt, and accepted allocations alongside its rebalanceId and current status. Allocation create and preview responses return dollar strings with exactly six decimal places.

July 21, 2026

JAAA USDT available in production

Production now returns ground-jaaa-usdt-vault from GET /v2/wallets/yield-sources. Put this source under strategy.allocations.usdt; continue using ground-jaaa-usdc-vault under strategy.allocations.usdc for the USDC-funded lane. This availability update does not change the response schema or introduce new identifiers. The JAAA-USDT metadata now correctly describes its AAA-rated collateralized loan obligation exposure.

July 20, 2026

Stablecoin-explicit JAAA yield source IDs

Breaking change The existing USDC-funded JAAA source moved from ground-jaaa-vault to ground-jaaa-usdc-vault. Update stored strategy templates and API clients to use the stablecoin-explicit USDC ID. Sandbox also exposes ground-jaaa-usdt-vault for the USDT-funded JAAA lane. Place it under strategy.allocations.usdt only when it is present in the live environment-specific response from GET /v2/wallets/yield-sources. Production clients must not assume the USDT row is available until the production catalog returns it. Historical completed JAAA-USDC transactions retain their economics and remain readable after the identity migration.

July 17, 2026

Canonical list responses and webhook event casing

Breaking change
Update clients that read the removed response aliases before calling the affected endpoints after this release.
We completed the response-pattern migration introduced on July 9. The following endpoints now return list items only under data and pagination only through nextCursor:
  • GET /v2/wallets/yield-sources
  • GET /v2/activity
  • GET /v2/webhooks
  • GET /v2/webhooks/events
  • GET /v2/webhooks/{id}/events

List envelope migration

All affected list responses now use this shape:
When nextCursor is non-null, pass it as the next request’s cursor query parameter. A null value means there are no more pages.

Webhook event field migration

Webhook event feed items and their nested latestEmission object now use camelCase exclusively. Update clients to read:
  • registrationId, eventType, attemptCount, deliveredAt, lastError, createdAt, and updatedAt on each event;
  • eventId, attemptNumber, requestedAt, completedAt, responseStatus, responseMs, and errorMessage from latestEmission.
The equivalent snake_case fields are no longer returned.

Required client changes

  1. Read every affected list from response.data.
  2. Replace response.hasMore checks with response.nextCursor !== null.
  3. Replace snake_case webhook event and delivery-attempt field access with the camelCase names above.