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

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.