> For the complete documentation index, see [llms.txt](https://docs.tradevest.ai/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.tradevest.ai/release-notes/v.2.8.0-test-environment.md).

# v.2.8.0 - Test Environment

**2026-07-21 - Planned deployment to Live**

**2026-07-09 - Test Environment**

***

**Added**

**eWP - DeFi Yield Kryptowertpapier (`TVDY`)**

A new tokenized asset class, the Tradevest DeFi Yield Kryptowertpapier (symbol `TVDY`, `assetType: eWP`), is now tradable through the existing WAWEX surface. The platform detects the eWP symbol and routes it internally; orders accumulate into an Ops-closed subscription (BUY) or redemption (SELL) batch and settle at a uniform clearing price.

* **Documentation Location:** API REFERENCE → Trading → [Tokenized Assets](/api-reference/asset-management/wawex-tokenized-assets/tokenized-assets.md)
* **Endpoint:** `POST /wawex/orders/market` - place an eWP order on the same endpoint used for other tokenized assets
* **Endpoint:** `DELETE /wawex/orders/{orderId}` - cancel a still-pending eWP order until its batch is closed by Ops; the cancellation releases the EUR (BUY) or unit (SELL) block
* **Endpoint:** `GET /wawex/assets` - now lists `TVDY` with `assetType: eWP`, description **"Tradevest DeFi Yield Kryptowertpapiere"**, and `assetRiskScore: "3"`
* **Endpoint:** `POST /wawex/ex-ante` - supports an eWP cost-disclosure preview, priced from the indicative NAV→EUR feed (eWP has no ISIN, so no ISIN lookup is performed)
* **New enum value:** `QuantityTypeEnum` → `AMOUNT` (a EUR cash amount to invest), enabled alongside the existing `UNIT`
* **New enum value:** `AssetTypeEnum` → `eWP`; `DigitalAssetTypeEnum` → `eWP`
* **Note:** BUY is amount-based (`quantityType: AMOUNT`, EUR amount in `quantity`, min **1.000 €** / max **8.000.000 €** per order); SELL is unit-based (`quantityType: UNIT`, no min/max). There are **no partial fills**; order status moves `RECEIVED → PENDING → FILLED`.
* **Note:** A **mandatory** MiFID ex-ante cost disclosure is generated **server-side** on every order and linked to it - the partner never passes an `exAnteId`. Retrieve it via `GET /wawex/orders/{orderId}` (`exAnteId`) and download the PDF at `GET /wawex/ex-ante/{exAnteId}/receipt`.
* **Note:** BUY orders must pass an **eligibility gate** - declared free available assets ≥ **100.000 €** *or* order amount ≤ 2× the customer's average monthly net income; a failing gate rejects the order. SELL/redemptions are exempt.

**Wallet Account Statements**

Partners can now generate an on-demand Wallet Account Statement (Walletauszug) over a customer wallet's tokenized stock positions, valued as of the current date or a requested historical `snapshotDate` (using SIX end-of-day pricing). The document is produced asynchronously: `POST` returns an ID and the `GET` returns the PDF once ready.

* **Documentation Location:** API REFERENCE → [Products](/documentation/products.md)
* **New Endpoint:** `POST /products/{customerProductId}/documents/wallet-account-statement` - returns a `walletAccountStatementId`
* **New Endpoint:** `GET /products/{customerProductId}/documents/wallet-account-statement/{walletAccountStatementId}` - returns the statement as `application/pdf`, or `202 Accepted` (with a `Retry-After` header) while generation is still in progress
* **Payload includes:** request body `CreateWalletAccountStatementRequest` with optional `snapshotDate` (`YYYY-MM-DD`) and `language` (defaults to `DE`, the only language currently supported)
* **New document type:** `WALLET_ACCOUNT_STATEMENT`
* **Note:** `snapshotDate` must not be in the future and not before the wallet product's creation date, otherwise `400`. A historical date values positions as of that date; if no price exists exactly on the date, the previous available SIX price is used.
* **Note:** The endpoint is rate-limited to **10 requests per minute** per partner (`429 Too Many Requests` with a `Retry-After` header). Identical requests within the 24-hour retention window are idempotent and return the same statement ID; after retention the `GET` returns `404`.

**Tokenized Asset Order-Update Webhook**

A new dedicated webhook delivers event-based order-status updates for tokenized assets (tracker certificates and eWP), so partners no longer need to poll. The payload follows the Traditional-asset schema because tokenized assets are KapESt-relevant securities.

* **Documentation Location:** API REFERENCE → [Webhooks](/api-reference/webhooks.md)
* **New Endpoint (partner-implemented):** `POST /tokenized-asset-order-notification` - delivered for event `TOKENIZED_ASSET_ORDER_NOTIFICATION`
* **New enum value:** `EventTypeEnum` → `TOKENIZED_ASSET_ORDER_NOTIFICATION`
* **Payload includes:** `orderId`, `walletCustomerProductId` and `cashCustomerProductId` (a WAWEX order spans two customer products), `status`, `notificationType`, `externalId`; `exAnteId` (returned for `RECEIVED`), `executionId` (returned for `FILLED` / `PARTIALLY_FILLED`), an `executionData` block (quantity, price, amount, `germanCit`, `solidaritySurcharge`, `churchTax`, fee), and a `validationError` block on rejection
* **Note:** Tax fields are populated only after the tax engine has processed the trade (`FILLED` and terminal partials); intermediate `PARTIALLY_FILLED` slices carry execution data but no tax block. Mint/burn settlement steps are internal and never surfaced. Authentication, signing, and retry/delivery are identical to the existing order webhooks.

**Corporate Action Foreign Tax Fields (Dividends)**

The corporate-action transaction in Transaction History now carries the foreign withholding tax collected by the custodian on a cash dividend (DVCA), so partners can display the full tax breakdown.

* **Documentation Location:** API REFERENCE → [Transaction History](/api-reference/transaction-history.md)
* **Endpoint:** the corporate-action transaction response (`taxData` object)
* **Added field:** `foreignTaxCountryCode` - ISO country code of the withholding jurisdiction
* **Added field:** `foreignTaxAmount` - decimal, foreign tax collected by the custodian
* **Note:** both fields sit alongside the existing `germanCit`, `solidaritySurcharge`, and `churchTax`; they are returned as `null` when no foreign tax applies (they are not omitted).

**Savings Plan - Requestor Authorization Error Code**

The savings-plan exit flow now validates the `requestor-id` against both linked products before processing, and a dedicated error code surfaces an unauthorized requestor.

* **Documentation Location:** API REFERENCE → [Webhooks](/api-reference/webhooks.md)
* **Added enum value:** the savings-plan notification error code enum → `REQUESTOR_ID_NOT_VALID`
* **Note:** returned when the `requestor-id` header is not authorized to act on behalf of the customer that owns the savings plan's liquidity and savings products.

**Savings Plan Execution Details**

Partners can now retrieve the individual orders of a savings plan - each periodic BUY execution and the SELL exit - in an order-like shape aligned with Traditional trading, exposing the fractional quantity, unified fill price, and venue of each order.

* **Documentation Location:** API REFERENCE → Trading → [Savings Plans](/api-reference/asset-management/savings-plans.md)
* **New Endpoint:** `GET /savings-plans/{savingsPlanId}/executions` - paginated list of a plan's orders; supports `status`, `executionDateFrom`, `executionDateTo` filters and cursor pagination
* **New Endpoint:** `GET /savings-plans/{savingsPlanId}/executions/{executionId}` - a single order by ID
* **Payload includes:** `executionId`, `savingsPlanId`, `status`, `tradeSide`, `isin`, `savingsAmount`, `exchangeCode`, `executionDatePlanned`, and an `execution` block (`executionPrice`, `executionQuantity`, `amount`, `transactionTime`, `germanCit`, `solidaritySurcharge`, `churchTax`, `feeAmount`)
* **New enums:** `SavingsPlansOrderStatusEnum` (`PENDING`, `PLACED`, `FILLED`, `REJECTED`, `EXPIRED`, `CANCELLED`) and `SavingsPlansExchangeCodeEnum` (`TGAT`, `XOFF`)
* **Note:** the `execution` block is populated once `status` is `FILLED`; `amount` = `executionQuantity` × `executionPrice` rounded to 2 decimal places. `exchangeCode` is `TGAT` when the batch touched the exchange and `XOFF` for a pure internal (FIFO) allocation (rare edge case).
* **Note:** for BUY executions the tax fields (`germanCit`, `solidaritySurcharge`, `churchTax`) are always `0` - there is no tax event on a purchase; they carry values only for SELL exits.

**Savings Plan Order-Update Webhook**

A new webhook pushes savings-plan order status changes (BUY executions and SELL exits) to partners on every transition, so they no longer need to poll the execution endpoints.

* **Documentation Location:** API REFERENCE → [Webhooks](/api-reference/webhooks.md)
* **New Endpoint (partner-implemented):** `POST /savings-plans-order-notification` - delivered for event `SAVINGS_PLANS_ORDER_NOTIFICATION`
* **New enum value:** `EventTypeEnum` → `SAVINGS_PLANS_ORDER_NOTIFICATION`
* **Payload includes:** `savingsPlanId`, `executionId`, `customerId`, `tradeSide`, `status`, `notificationType`, `isin`, `savingsAmount`, `exchangeCode`, `externalId`, and an `execution` block (quantity, price, amount, tax fields, fee)
* **Note:** fires on every status transition. For SELL exits the tax fields are populated on a later `UPDATED` notification once the tax engine has computed them.

***

**Changed**

**Corporate Action Cash-Dividend Tax Handling (DVCA)**

The corporate-action publish endpoints have been extended so pre-withheld German tax and foreign withholding tax on cash dividends can be routed correctly to the tax engine before reporting to WARP. This finalizes the DVCA (cash dividend) data contract.

* **Documentation Location:** API REFERENCE → Trading → [Corporate Actions](/api-reference/asset-management/corporate-actions.md)
* **Endpoint:** `publishMT564` (request body `PublishMT564Request`) and `publishMT566` (request body `PublishMT566Request`)
* **Changed field:** `grossAmount` renamed to `grossAmountPerShare` on `PublishMT564Request` and `PublishMT566Request` (the per-share gross dividend; `grossAmount` on `PublishMT566Request` now denotes the total cash for the entire CA)
* **Added field:** `originalCurrency` (new `CorporateActionCurrencyEnum`, ISO 4217; required for DVCA) on both requests
* **Added field (`PublishMT566Request`):** `taxPercent` (custodian tax %), `netAmount`, `postedCashAmount`, and `exchangeRate` (foreign currency per 1 EUR; required when `originalCurrency` is not `EUR`)
* **New enum:** `CorporateActionCurrencyEnum` - the set of currencies accepted for a corporate action
* **Note:** the corporate-action DVCA flow is a new capability - the `grossAmount` → `grossAmountPerShare` rename is part of finalizing its data contract and requires no partner action.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.tradevest.ai/release-notes/v.2.8.0-test-environment.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
