> ## Documentation Index
> Fetch the complete documentation index at: https://developers.zerion.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Zerion API changelog and release notes

> Track Zerion API updates, new endpoints, breaking changes, bug fixes, and documentation improvements across wallet, portfolio, and chart data.

<Update label="June 8, 2026" description="Documentation" tags={["Docs"]}>
  ## Chart point granularity documented for balance & price charts

  Documented the sampling interval (spacing between `points`) for each `chart_period` on the chart endpoints. This is a documentation-only clarification — the cadence has always been emitted by these endpoints; it simply wasn't described in the reference.

  Each period samples its time window at a fixed interval: `hour` → 10s, `day` → 5m, `week` → 30m, `month` → 2h, `3months` → 6h, `6months` → 12h, `year` → 1d, `5years` → 4d. For `max`, the interval is derived from available history (so it varies by wallet or asset).

  **Affected endpoints:**

  * `GET /v1/wallets/{address}/charts/{chart_period}`
  * `GET /v1/wallet-sets/charts/{chart_period}`
  * `GET /v1/fungibles/{fungible_id}/charts/{chart_period}`
  * `GET /v1/fungibles/by-implementation/charts/{chart_period}`
</Update>

<Update label="June 4, 2026" description="New feature" tags={["Feature"]}>
  ## Wallet balance charts — include DeFi protocol positions

  Added `filter[positions]` to the wallet and wallet-sets balance chart endpoints, letting you include complex DeFi protocol positions (liquidity pools, vaults) alongside plain token balances:

  * `only_simple` (default) — token and native-coin balances held directly in the wallet. Matches previous behavior, so existing integrations are unaffected.
  * `only_complex` — complex DeFi protocol positions only.
  * `no_filter` — both.

  **Uniswap V2 LP positions are supported today**, and support for more protocols is rolling out over time. Positions from protocols that aren't yet supported are omitted from the chart.

  **Affected endpoints:**

  * `GET /v1/wallets/{address}/charts/{chart_period}`
  * `GET /v1/wallet-sets/charts/{chart_period}`

  ```bash theme={null}
  curl -u "YOUR_API_KEY:" \
    "https://api.zerion.io/v1/wallets/0xd8da6bf26964af9d7eed9e03e53415d37aa96045/charts/day?filter[positions]=no_filter"
  ```
</Update>

<Update label="June 1, 2026" description="Solana raw amounts" tags={["Feature", "Breaking"]}>
  ## Raw on-chain amounts for Token-2022 ScaledUiAmount assets

  For Token-2022 ScaledUiAmount (rebasing) assets such as SPYx, `quantity.int` is now the objective on-chain **raw** amount in base units. Use this value to build correct on-chain transactions, including max-balance (send-max) transfers, which fail on-chain when built from the scaled display amount.

  * `quantity.int` — objective on-chain raw amount in base units.
  * `quantity.float` / `quantity.numeric` — ready-to-display value = `int / 10^decimals`. For ScaledUiAmount assets, the display value is `int × multiplier / 10^decimals`.

  Non-ScaledUiAmount assets are unaffected: their `int` already equals the on-chain amount.

  **Affected endpoints:**

  * `GET /v1/wallets/{address}/positions/`
  * `GET /v1/wallet-sets/positions/`

  **Breaking change:** For ScaledUiAmount assets, `quantity.int` previously carried the scaled display amount and now carries the raw on-chain amount. Read the display value from `quantity.float` or `quantity.numeric`.
</Update>

<Update label="May 29, 2026" description="Limit increase" tags={["Improvement"]}>
  ## Wallet NFT positions — page size cap raised to 500

  `GET /v1/wallets/{address}/nft-positions/` now accepts `page[size]` values up to **500** (previously capped at 100). This lets you fetch large NFT wallets in significantly fewer requests. Existing requests are unaffected — this only raises the maximum; the default page size is **50**.

  **Affected endpoint:**

  * `GET /v1/wallets/{address}/nft-positions/`

  ```bash theme={null}
  curl -u "YOUR_API_KEY:" \
    "https://api.zerion.io/v1/wallets/0x.../nft-positions/?page[size]=500"
  ```

  **Migration:** No client changes required. To reduce round-trips on large wallets, raise `page[size]` up to 500 and keep following the `links.next` cursor to paginate.
</Update>

<Update label="May 19, 2026" description="Limit increase" tags={["Improvement"]}>
  ## Find wallets within subscription — page size cap raised to 2000

  `GET /v1/tx-subscriptions/{subscription_id}/wallets` now accepts `page[size]` values up to **2000** (previously capped at 100). The default page size remains 100, so existing clients are unaffected.

  **Affected endpoint:**

  * `GET /v1/tx-subscriptions/{subscription_id}/wallets`

  ```bash theme={null}
  curl -u "YOUR_API_KEY:" \
    "https://api.zerion.io/v1/tx-subscriptions/77e77447-1586-40e8-a75b-467ef939a0b1/wallets?page[size]=2000"
  ```
</Update>

<Update label="May 13, 2026" description="New feature" tags={["Feature"]}>
  ## Wallet balance charts — exclude fungibles

  Added `filter[exclude_fungible_ids]` to the wallet and wallet-sets balance chart endpoints — drop a small set of tokens from the chart instead of enumerating everything you want to keep. Same shape as `filter[fungible_ids]`: comma-separated, capped at 25 ids. Combining it with `filter[fungible_ids]` returns `400` — pick one.

  **Affected endpoints:**

  * `GET /v1/wallets/{address}/charts/{chart_period}`
  * `GET /v1/wallet-sets/charts/{chart_period}`

  ```bash theme={null}
  curl -u "YOUR_API_KEY:" \
    "https://api.zerion.io/v1/wallets/0xd8da6bf26964af9d7eed9e03e53415d37aa96045/charts/day?filter[exclude_fungible_ids]=eth,usd-coin"
  ```
</Update>

<Update label="May 13, 2026" description="Endpoint deprecation" tags={["Deprecation"]}>
  ## Swap Offers API — deprecated

  `GET /v1/swap/offers/` is now deprecated and has been hidden from the API reference. Use `GET /v1/swap/quotes/` instead, which covers the same use cases and adds native support for Solana and EVM ↔ Solana bridges.

  **Sunset date:** the endpoint will be permanently disabled on **July 1, 2026**. Requests after that date will fail.

  **Migration:**

  * Switch calls from `GET /v1/swap/offers/` to `GET /v1/swap/quotes/`.
  * The response body shape differs: transactions are wrapped in chain-agnostic `evm` / `solana` envelopes, and fees are split into separate `protocol_fee` / `bridge_fee` / `network_fee` blocks. See the Swap Quotes reference for the full schema.
  * Quotes are returned best-first (sorted by `output_amount_after_fees`), matching the ordering you already get from `/v1/swap/offers/`.
</Update>

<Update label="May 8, 2026" description="Documentation clarifications" tags={["Fix"]}>
  ## Reference docs — clarifications across PnL, swap, and wallet endpoints

  Refreshed several reference-doc descriptions to better match how the API actually behaves. **No behavior changes** — every update describes behavior that's already live in production.

  **Clarifications:**

  * **PnL `since` / `till` is a hard limit, not a guideline** (`GET /wallets/{address}/pnl`, `GET /wallet-sets/pnl`). PnL is pre-computed at standard marks (`now`, `1 day ago`, `1 week ago`, `1 month ago`, `1 year ago`, `beginning of the year`); other timestamps are accepted only when fewer than 3,000 transactions sit between your timestamp and the nearest mark, otherwise the request errors out.
  * **Swap endpoints rewritten** (`GET /v1/swap/offers/`, `GET /v1/swap/fungibles/`). `/v1/swap/offers/` returns ready-to-sign transaction data in a single call (0.8% Zerion fee included in the quoted amounts) — not a multi-step quote-then-execute flow as previously documented. `/v1/swap/fungibles/` is a token-picker helper for cross-chain swaps only.
  * **Swap section reordered** to `quotes` → `offers` → `fungibles`, surfacing `/v1/swap/quotes/` as the modern primary endpoint.
  * **Wallet address validation documented** (`WalletAddress` parameter, `GET /wallets/{address}/transactions/`). Addresses must be valid EVM or Solana; untracked addresses return `400` (API-1903).
  * **`filter[operation_types]` duplicated enum removed** (`GET /wallets/{address}/transactions/`, `GET /wallets/transactions/`, `GET /wallet-sets/transactions/`). The bulleted list was rendered twice and the inline copy was stale (missing `bid`); the schema `$ref` is now the single source of truth.
  * **`PATCH /v1/tx-subscriptions/{id}/wallets` 100-address batch cap documented**. The `add` and `remove` arrays accept at most 100 addresses per request; `maxItems: 100` is now in the schema.

  **Migration:** No client changes required. API responses and error behavior are unchanged — these updates only correct the reference documentation to match the limits the API has already been enforcing.
</Update>

<Update label="May 6, 2026" description="Documentation fix" tags={["Fix"]}>
  ## Webhooks — payload example fix

  Fixed two errors in the example payloads on the [Webhooks](/webhooks) page. **No breaking changes** — the production webhook payload format is unchanged; only the documentation examples were wrong.

  **Corrections:**

  * `data.type` is `"callback"` (the docs incorrectly showed `"transaction_notification"`).
  * The rollback indicator `deleted: true` is on the transaction resource at `included[0].attributes.deleted` (the docs incorrectly showed it on `data.attributes.deleted`).

  **Migration:** No client changes required. Verify your webhook handler reads the rollback flag from the transaction resource inside `included`, not from `data.attributes`.
</Update>

<Update label="May 5, 2026" description="New feature" tags={["Feature"]}>
  ## Swap Quotes API — new endpoint

  Added `GET /v1/swap/quotes/` — returns swap quotes from multiple liquidity sources for both same-chain swaps and cross-chain bridges. Supports EVM chains and Solana, including EVM ↔ Solana bridges.

  ```bash theme={null}
  curl -u "YOUR_API_KEY:" \
    "https://api.zerion.io/v1/swap/quotes/?input[chain_id]=base&input[fungible_id]=0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2&input[amount]=0.001&output[fungible_id]=0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48&from=0xd8da6bf26964af9d7eed9e03e53415d37aa96045&to=0xd8da6bf26964af9d7eed9e03e53415d37aa96045"
  ```

  **Differences from `/v1/swap/offers/`:**

  * Native support for Solana wallets and bridges between EVM and Solana chains.
  * The response body has been restructured: transactions are wrapped in chain-agnostic `evm`/`solana` envelopes, fees are split into separate `protocol_fee` / `bridge_fee` / `network_fee` blocks.

  The legacy `/v1/swap/offers/` endpoint remains for backward compatibility.
</Update>

<Update label="April 21, 2026" description="New feature" tags={["Feature"]}>
  ## Transactions API — fee acts

  Transactions and acts may now carry the type `fee`, and a new `fee_kind` field on `Act` classifies fee acts. **No breaking changes** — this is an additive change.

  **New `fee` type value:**
  Both the transaction-level `type` enum and the per-act `type` (`ActType`) enum now include `fee`. A `fee`-typed act represents a fee charge that appears alongside existing acts in the transaction's `acts` array; a transaction whose primary operation is a fee charge will surface `type: fee` at the top level.

  **New `fee_kind` field on `Act`:**
  Optional string that classifies a fee act. Only present on acts of type `fee`.

  * **`ui`** — fee charged by the UI / client application (e.g., a wallet or dApp frontend)
  * **`jito`** — Jito tip paid on Solana for priority inclusion

  **Affected endpoints:**

  * `GET /wallets/{address}/transactions/`
  * `GET /wallet-sets/transactions/`

  **Migration:** No client changes required. Clients that enumerate transaction or act types should be prepared to receive `fee` in addition to the previously documented values; unknown types should be handled gracefully. To surface fee acts to end users, render acts with `type: fee` and optionally distinguish them by `fee_kind`.
</Update>

<Update label="March 30, 2026" description="New feature" tags={["Feature"]}>
  ## Wallet Sets API — new endpoints

  Added five new endpoints for wallet sets — aggregated portfolio data across up to one EVM and one Solana address simultaneously.

  Pass one or two addresses via the `addresses` query parameter (at most one EVM and one Solana address):

  ```bash theme={null}
  curl -u "YOUR_API_KEY:" \
    "https://api.zerion.io/v1/wallet-sets/portfolio?addresses=0x42b9df65b219b3dd36ff330a4dd8f327a6ada990,8BH9pjtgyZDC4iAQH5ZiYDZ1MDWC98xki2V8NzqqKW3K"
  ```

  **New endpoints:**

  * `GET /wallet-sets/portfolio`
  * `GET /wallet-sets/positions/`
  * `GET /wallet-sets/transactions/`
  * `GET /wallet-sets/charts/{chart_period}`
  * `GET /wallet-sets/pnl`
</Update>

<Update label="March 20, 2026" description="New feature" tags={["Feature"]}>
  ## Fungibles API — sort by trading volume

  Added 24-hour trading volume as a new sort option for `GET /fungibles/`.

  * **`-market_data.trading_volumes.volume_1d`** — highest volume first
  * **`market_data.trading_volumes.volume_1d`** — lowest volume first

  ```bash theme={null}
  curl -u "YOUR_API_KEY:" \
    "https://api.zerion.io/v1/fungibles/?sort=-market_data.trading_volumes.volume_1d"
  ```
</Update>

<Update label="March 11, 2026" description="New feature" tags={["Feature"]}>
  ## Fungibles API — new fields

  Added trading volume and deployment date fields to fungible data. **No breaking changes.**

  **New fields in `FungibleAttributes.market_data`:**

  * `trading_volumes.volume_1d` — total 24-hour trading volume across all chains

  **New fields in `AttributesImplementation`** (new dedicated type for `implementations` array, backward compatible with all existing fields):

  * `market_data.trading_volumes.volume_1d` — 24-hour trading volume on this chain
  * `deployment_date` — ISO 8601 datetime when the token contract was deployed
</Update>

<Update label="February 9, 2026" description="Documentation fix" tags={["Fix"]}>
  ## Transactions API — OpenAPI documentation fix

  Fixed OpenAPI schema inconsistencies between documentation and implementation for the `/transactions` endpoints. **No breaking changes** — API responses remain unchanged, only the OpenAPI spec was corrected.

  **Nullable fields corrected:**

  * **Fee**: `fungible_info`, `price`, `value` marked as nullable
  * **Refund**: `fungible_info`, `price`, `value` marked as nullable
  * **Transfer**: `price`, `value` marked as nullable
  * **Fungible Info**: `icon` marked as nullable

  **Missing fields documented:**

  * Transaction attributes: `address`, `refund`, `delegations`
  * Fungible Info: `id`

  **Migration:** No client changes required. Clients using generated models should ensure they handle `null` values, as these were already nullable in practice.
</Update>

<Update label="February 4, 2026" description="New feature" tags={["Feature"]}>
  ## Chart periods — new time values

  Added two new time period values to the `chart_period` parameter:

  * **`6months`** — 6-month chart period
  * **`5years`** — 5-year chart period

  These complement the existing options: `hour`, `day`, `week`, `month`, `3months`, `year`, and `max`.

  **Affected endpoints:**

  * `GET /wallets/{address}/charts/{chart_period}`
  * `GET /fungibles/{fungible_id}/charts/{chart_period}`
  * `GET /fungibles/by-implementation/charts/{chart_period}`

  ```bash theme={null}
  curl -u "YOUR_API_KEY:" \
    "https://api.zerion.io/v1/wallets/0xd8dA.../charts/6months"
  ```
</Update>

<Update label="January 7, 2026" description="New feature" tags={["Feature"]}>
  ## Portfolio API — sync parameter

  Added new `sync` query parameter to the `/wallets/{address}/portfolio` endpoint.

  * **`true`**: Triggers a position sync and waits up to 30 seconds for fresh portfolio data before responding.
  * **`false`** (default): Returns immediately with cached data.

  ```bash theme={null}
  curl -u "YOUR_API_KEY:" \
    "https://api.zerion.io/v1/wallets/0xd8dA.../portfolio?sync=true"
  ```

  Clients should configure appropriate timeout settings when using `sync=true`.
</Update>

<Update label="November 19, 2025" description="New feature" tags={["Feature"]}>
  ## Positions API — sync parameter

  Added new `sync` query parameter to the `/wallets/{address}/positions` endpoint.

  * **`true`**: Waits up to 30 seconds for protocol positions to be updated and returns fresh data.
  * **`false`** (default): Returns immediately with available position data.

  ```bash theme={null}
  curl -u "YOUR_API_KEY:" \
    "https://api.zerion.io/v1/wallets/0xd8dA.../positions?sync=true"
  ```

  Clients should configure appropriate timeout settings when using `sync=true`.
</Update>
