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 asigningRequest. 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 whenstockPriceToleranceBps 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 includedenominationCurrency; 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 400tempo_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 includesgroundCreditsUsd 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. UsedepositAddresses.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. Usestellar_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. Usestellar_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 independentusdt: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 optionalcurrentApy 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 changePOST /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-levelwalletId. 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 returnsground-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 fromground-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 We completed the response-pattern migration introduced on July 9. The following endpoints now return list items only underdata and pagination only through nextCursor:
GET /v2/wallets/yield-sourcesGET /v2/activityGET /v2/webhooksGET /v2/webhooks/eventsGET /v2/webhooks/{id}/events
List envelope migration
All affected list responses now use this shape:
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 nestedlatestEmission object now use camelCase exclusively. Update clients to read:
registrationId,eventType,attemptCount,deliveredAt,lastError,createdAt, andupdatedAton each event;eventId,attemptNumber,requestedAt,completedAt,responseStatus,responseMs, anderrorMessagefromlatestEmission.
Required client changes
- Read every affected list from
response.data. - Replace
response.hasMorechecks withresponse.nextCursor !== null. - Replace snake_case webhook event and delivery-attempt field access with the camelCase names above.