> For the complete documentation index, see [llms.txt](https://docs.live-eo.com/tradeaware/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.live-eo.com/tradeaware/using-the-tradeaware-api/manage-your-transactions.md).

# Manage your transactions

Use the Transactions API to file Due Diligence Statements (DDS) in the EU Information System (TRACES) straight from your ERP. You send one transaction per DDS, list the product lines in it, and say where the goods come from: your suppliers' plots, your own plots, or a DDS another operator already filed. TradeAware assembles the geolocation, submits the statement to TRACES and returns its reference and verification numbers.

All requests go to `https://api.tradeaware.live-eo.com` and need a bearer token. See [Authentication](https://docs.live-eo.com/tradeaware/using-the-tradeaware-api/authentication).

🆕 **November 2026:** components now take their production period and Timber species from their plots. See [Production period and species](https://docs.live-eo.com/tradeaware/using-the-tradeaware-api/manage-your-transactions#production-period-and-species) and [What changed](https://docs.live-eo.com/tradeaware/using-the-tradeaware-api/manage-your-transactions#what-changed).

***

### Before you start

* **Transactions enabled.** Transaction Management is a premium feature. If it isn't enabled on your account, contact your Customer Success Manager.
* **A legal entity that can file.** Each DDS is filed in the name of a legal entity on your account. Import and export need an EORI; domestic accepts a VAT number. See [Legal entity](https://docs.live-eo.com/tradeaware/using-the-tradeaware-api/manage-your-transactions#legal-entity).
* **Plots for the commodity.** Each component needs plots of its commodity, from a connected supplier or from your own account, or a reference to an existing DDS instead.
* **Test on ACCEPTANCE first.** Accounts file to the TRACES ACCEPTANCE environment by default, where nothing is legally binding. Contact your Customer Success Manager when you're ready to move to PRODUCTION.

***

### How it works

#### Transactions and components

A **transaction** becomes one DDS. It holds the activity type, the country of activity and the legal entity that files the statement.

A **component** is one product line in that DDS: an HS code, a quantity, a unit and a description. A transaction can hold several components, for example when one shipment contains several products.

Each component also says where its goods come from:

<table><thead><tr><th width="207.6796875">Where the goods come from</th><th width="241.546875">What to send on the component</th><th>Use it when</th></tr></thead><tbody><tr><td>One supplier</td><td><code>supplierBusinessId</code>, optionally <code>plotIds</code></td><td>Your supplier is connected in TradeAware. Without <code>plotIds</code>, all of the supplier's plots of that commodity are included.</td></tr><tr><td>Several suppliers (mixed origin)</td><td><code>supplierBusinessIds</code>, optionally <code>plotIds</code></td><td>One product line mixes inputs from several suppliers.</td></tr><tr><td>Products</td><td><code>productIds</code> with <code>supplierBusinessId(s)</code></td><td>Your suppliers linked plots to your products. See <a href="https://docs.live-eo.com/tradeaware/using-the-tradeaware-api/manage-products-and-plot-links">Manage products and plot links</a>.</td></tr><tr><td>Your own plots (self-managed)</td><td>Your own business ID as <code>supplierBusinessId</code>, plus <code>plotIds</code></td><td>You manage the plots in your own account.</td></tr><tr><td>An existing DDS</td><td><code>ddsReferences</code></td><td>The goods are already covered by a DDS another operator filed.</td></tr><tr><td>Mixed (hybrid)</td><td><code>ddsReferences</code> plus supplier or plot fields</td><td>The product mixes inputs that are covered by a DDS and inputs that aren't.</td></tr></tbody></table>

#### Activity types

| `activityType` | When to use it                                                        | Typical source on the components                          |
| -------------- | --------------------------------------------------------------------- | --------------------------------------------------------- |
| `IMPORT`       | Placing goods from outside the EU on the EU market for the first time | Supplier plots, optionally narrowed with `plotIds`        |
| `EXPORT`       | Shipping goods from the EU to a non-EU country                        | `ddsReferences`, or supplier plots in hybrid cases        |
| `DOMESTIC`     | Placing goods produced in the EU on the EU market                     | Supplier or own plots, or `ddsReferences` in hybrid cases |

`TRADE` is no longer accepted. See [What changed](https://docs.live-eo.com/tradeaware/using-the-tradeaware-api/manage-your-transactions#what-changed).

💡 Only the operator who first places goods on the EU market, or exports them, files a DDS. Companies further down the supply chain don't file their own: they keep the DDS references they received and pass them on.

#### Transaction statuses

| Status                     | What it means                                                                                      | Can you edit it?               |
| -------------------------- | -------------------------------------------------------------------------------------------------- | ------------------------------ |
| `DRAFT`                    | Being prepared, not submitted yet.                                                                 | Yes                            |
| `TO_SUBMIT`                | Queued for submission to TRACES.                                                                   | No                             |
| `SUBMITTED` (`PROCESSING`) | Sent to TRACES and waiting for validation. Reference and verification numbers aren't assigned yet. | No                             |
| `AVAILABLE`                | Accepted by TRACES. The DDS reference and verification numbers are on the transaction.             | No (amend or withdraw instead) |
| `ERROR` (`REJECTED`)       | Rejected by TRACES or not processed. The reason is under `dds.errors`.                             | Yes                            |
| `WITHDRAWN`                | Withdrawn from TRACES. No reference or verification number is assigned.                            | No                             |
| `DEPRECATED`               | A former `TRADE` transaction. Readable, but can't be updated or submitted.                         | No                             |

Editing a transaction or component that isn't in `DRAFT` or `ERROR` returns `409 Conflict`. To correct a statement that's already `AVAILABLE`, see [Amend or withdraw a submitted transaction](https://docs.live-eo.com/tradeaware/using-the-tradeaware-api/manage-your-transactions/amend-or-withdraw-a-submitted-transaction).

#### Legal entity

TRACES needs the exact legal entity responsible for the statement, so the right name, address and EORI or VAT number appear on the DDS.

* `businessId` is your TradeAware account.
* `legalEntityId` is a registered legal entity on that account that can file to TRACES. One account can have several, for example a German GmbH and an Italian S.p.A.

Set `legalEntityId` when you create the transaction, or later with `PATCH /transactions/{id}`. It's optional: if you don't set it, TradeAware uses the oldest legal entity on your account at submission.

```shellscript
# List your legal entities
curl -X GET "https://api.tradeaware.live-eo.com/legal-entities" \
  -H "Authorization: Bearer <token>"
```

```shellscript
# Create one if you don't have any yet
curl -X POST "https://api.tradeaware.live-eo.com/legal-entities" \
  -H "Authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Example Timber GmbH",
    "email": "compliance@example.com",
    "addressLine1": "Hafenstrasse 12",
    "addressCity": "Hamburg",
    "addressPostcode": "20457",
    "addressCountryCode": "DE",
    "eori": "DE123456789012345",
    "vat": "DE123456789"
  }'
```

Use the `id` from the response as `legalEntityId`.

***

### Quick start: file your first DDS

This walks through one import from one supplier, from creation to the DDS numbers.

**1. Find your supplier's ID**

```shellscript
curl -X GET "https://api.tradeaware.live-eo.com/business-connections/suppliers" \
  -H "Authorization: Bearer <token>"
```

Each item in the response is a connection. Your supplier's ID is `targetBusiness.id`. To match suppliers to your ERP records, use their EORI, VAT number or email, and fall back to `customData` only if none of those fit.

**2. Create the transaction**

```shellscript
curl -X POST "https://api.tradeaware.live-eo.com/transactions" \
  -H "Authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d '{
    "activityType": "IMPORT",
    "countryOfActivity": "DE",
    "legalEntityId": "123e4567-e89b-12d3-a456-426614174000",
    "customId": "PO-2026-00418",
    "components": [
      {
        "hsn": "440111",
        "quantity": 24000,
        "unit": "KGM",
        "description": "Coniferous fuel wood",
        "supplierBusinessId": "589df451-a064-48e6-a715-1315a3f6180a"
      }
    ]
  }'
```

The API returns `201` with the transaction in `DRAFT`.

**3. Submit it**

```shellscript
curl -X PUT "https://api.tradeaware.live-eo.com/transactions/{id}/submit" \
  -H "Authorization: Bearer <token>"
```

The API returns `202` with the transaction in `TO_SUBMIT`.

**4. Wait, then check the status**

```shellscript
curl -X GET "https://api.tradeaware.live-eo.com/transactions/{id}" \
  -H "Authorization: Bearer <token>"
```

Submission is asynchronous. The status moves `TO_SUBMIT` → `SUBMITTED` → `AVAILABLE`, and the DDS reference and verification numbers appear once it's `AVAILABLE`. The Commission advises waiting at least 30 minutes before polling; it can take a few hours, depending on TRACES. If TRACES rejects the statement, the status becomes `ERROR` and the reason is under `dds.errors`.

**5. Retrieve the DDS from TRACES (optional)**

```shellscript
curl -X GET "https://api.tradeaware.live-eo.com/dds/fetch-dds-data?referenceNumber={ref}&verificationNumber={ver}" \
  -H "Authorization: Bearer <token>"
```

This endpoint is limited to 2 requests per 10 seconds per client. Responses carry `X-RateLimit-Limit`, `X-RateLimit-Remaining` and `X-RateLimit-Reset` headers.

📘 The `status` object on this response is present but its values are `null` (`"status": { "status": null, "date": null }`): the EU API doesn't return a status for a DDS looked up this way. Use `GET /transactions/{id}` for the status of statements you filed yourself.

***

### Build your components

Every component needs `hsn`, `quantity`, `unit` and `description`, plus at least one of `supplierBusinessId`, `supplierBusinessIds` or `ddsReferences`. For the full field list, see the [API reference](https://docs.live-eo.com/tradeaware/using-the-tradeaware-api/api-reference/transactions).

#### Choose the plots

* **All plots of a supplier:** send `supplierBusinessId` and leave out `plotIds`. All of the supplier's plots of the component's commodity are included.
* **Specific plots:** add `plotIds`. Find the IDs with `GET /businesses/{businessId}/plots`.
* Don't send an empty list. `"plotIds": []` returns `400`. Leave the field out instead.

📘 Plot selection is up to you. TradeAware doesn't exclude plots automatically, so you can match the plots to shipment documents, harvest batches or your own sourcing policy. To review non-compliant plots before you select them, filter with `filter.riskAssessmentStatus=$eq:EUDR_Non_Compliant`.

#### Several suppliers on one line (mixed origin)

Use `supplierBusinessIds` when one product line mixes inputs from several suppliers. This is different from a composite product, which has several components, one per HS code.

#### Products instead of plots

If your suppliers linked plots to your products, send `productIds` together with the supplier ID(s). At submission, TradeAware adds the plots each listed supplier linked to each product, together with any `plotIds` you send.

⚠️ Before you submit, check that every supplier on the component has linked plots to the product (`GET /products/{productId}/plots`). A supplier without linked plots adds no plots to the DDS, and the API returns no error.

#### Your own plots (self-managed)

If you manage plots in your own account, send **your own business ID** as `supplierBusinessId`, together with `plotIds`. Find your business ID with `GET /businesses/me`.

```json
{
  "hsn": "440323",
  "quantity": 12000,
  "unit": "KGM",
  "description": "Spruce logs",
  "supplementaryUnit": 18,
  "supplementaryUnitQualifier": "MTQ",
  "supplierBusinessId": "<your own businessId>",
  "plotIds": ["a78c1a68-d326-4217-a131-893f3c47a064"]
}
```

A component with `plotIds` but no supplier ID returns `400`.

#### Reference an existing DDS

Send `ddsReferences` when the goods are already covered by a DDS another operator filed. Each reference is a pair of the DDS reference number (`id`) and its `verificationNumber`.

Before submission, TradeAware checks that each reference resolves to a DDS in TRACES. An invalid reference returns:

```json
{
  "message": "One or more DDS references are not valid. Invalid DDS references: {dds_id}",
  "error": "Bad Request",
  "statusCode": 400
}
```

If TRACES is unavailable, transactions that use DDS references are rejected with a message to try again later.

📘 The check confirms that the DDS exists, not that it's still valid: the EU API doesn't return a status for a DDS looked up by reference and verification number. A reference that has since been withdrawn or replaced passes the check, then TRACES rejects the submission and the transaction ends in `ERROR`.

#### Quantities and supplementary units

`quantity` with `unit` is the net mass. Some HS codes also need a second quantity:

* `supplementaryUnit` (number): the quantity. Must be positive.
* `supplementaryUnitQualifier` (string): the unit code, for example `NAR`, `MTQ` or `KSD`. Required when you send `supplementaryUnit` for an HS code without a default qualifier. For the Annex I codes below, it’s filled in from the HS code. An invalid value returns `400` with the list of accepted codes.

For `IMPORT` and `EXPORT`, the HS code determines the qualifier:

* `NAR`: 010221, 010229, 4011, 4013, 4104
* `MTQ`: 4403, 4406, 4408, 4410, 4411, 4412, 4413
* `KSD`: 4701, 4702, 4703, 4704, 4705

Matching is on the first four digits, except 010221 and 010229, which must match in full. TRACES rejects the submission for these HS codes when the supplementary unit is missing.

⚠️ `percentageEstimationOrDeviation` (the expected weight variation of the net mass, in percent) is for `DOMESTIC` transactions only. The API accepts it on `IMPORT` and `EXPORT`, but TRACES rejects the submission and the transaction ends in `ERROR`. Once set, the field can't be cleared, so check it before you submit.

#### Production period and species

`dateOfProduction`, `endDateOfProduction` and, for Timber, `namePairs` describe when and from which species the goods were produced. You can send them on the component, or set them once on your plots and let TradeAware fill them in.

**Set them on the plot**

| Plot field            | Description                                                                                                             |
| --------------------- | ----------------------------------------------------------------------------------------------------------------------- |
| `productionDateStart` | Start of the plot's production or harvest period. ISO 8601 date, for example `2026-01-01`. All commodities.             |
| `productionDateEnd`   | End of the period. Must be on or after `productionDateStart`.                                                           |
| `species`             | Timber only. A list of `{ scientificName, commonName }` pairs. Each pair must be unique on the plot (case-insensitive). |

```json
{
  "commodities": ["timber"],
  "name": "Stand 12",
  "description": "Spruce stand, northern block",
  "geometry": { "type": "Polygon", "coordinates": [[[...], [...], [...], [...]]] },
  "productionDateStart": "2026-01-01",
  "productionDateEnd": "2026-03-31",
  "species": [
    { "scientificName": "Picea abies", "commonName": "Norway spruce" }
  ]
}
```

To set or change them on an existing plot, send `PATCH /plots/{plotId}`. Sending `species` replaces the plot’s list. The plot’s owner sets these values, so for your suppliers’ plots, ask the supplier. To check a supplier’s plots before you build a component, use `GET /businesses/{supplierId}/plots?includes=suppliers`: each plot returns `species`, `productionDateStart` and `productionDateEnd`.

💡 The names differ: a plot's `productionDateStart` and `productionDateEnd` become a component's `dateOfProduction` and `endDateOfProduction`.

**Which plots are used**

TradeAware uses the component's own plots: the plots in `plotIds` plus the plots your suppliers linked to its `productIds`. The production period comes only from plots of the component's commodity, and species only from Timber plots.

⚠️ Nothing is derived when a component has neither `plotIds` nor `productIds`, for example a component with only `supplierBusinessId`. Send `dateOfProduction`, `endDateOfProduction` and, for Timber, `namePairs` yourself. A Timber component without `namePairs` then returns `400 Timber components must include at least one namePair with commonName and scientificName`.

⚠️ With `productIds`, the values come from the plots linked to the product **when you create the component**. If a supplier changes its links before you submit, the values aren’t updated, but the DDS files the plots linked at submission. Right before you submit, read `GET /products/{productId}/plots` again. If the plots changed, send `dateOfProduction`, `endDateOfProduction` and `namePairs` with `PATCH /components/{id}`.

**Production period**

* Derived only when you send neither `dateOfProduction` nor `endDateOfProduction`.
* `dateOfProduction` is the earliest `productionDateStart` and `endDateOfProduction` the latest `productionDateEnd` across those plots, at 00:00 UTC.
* To use your own period, send the dates. They replace the derived ones.
* A `dateOfProduction` without `endDateOfProduction` is valid (production still ongoing). An end equal to the start is a one-day production. The start can't be after the end.

**Species (Timber)**

* Species from the plots that aren't in `namePairs` yet are added. A pair you send is never replaced.
* `namePairs` is required for Timber only when the component's plots carry no species.
* On update, sending `namePairs` replaces the list exactly as sent. This is the only way to remove a species.

**When you update a component** (`PATCH /components/{id}`)

* Values are derived again only when `plotIds`, `supplierBusinessId(s)` or `productIds` change. Resending the same IDs changes nothing.
* An empty production period is filled from all plots. An existing one is only widened to cover the newly added plots. Species from newly added plots are added to `namePairs`.
* Removing plots doesn’t narrow the values: the period stays as it was, and the removed plots’ species stay in `namePairs`. If you remove plots, send `dateOfProduction`, `endDateOfProduction` and `namePairs` in the same request.
* Changing the HS code to another commodity derives the values again from that commodity's plots, and clears any date or `namePairs` you don't send.
* Sending `null` clears a date, and nothing is derived in its place. To clear both dates, send `null` for both in the same request.

Read the values back with `GET /components/{id}`. The response doesn't show whether a value was derived or sent.

#### Your own references: `customId` and `customData`

* `customId` on the transaction is your own reference, for example a purchase or sales order number. It isn't checked for uniqueness.
* `customData` holds any other metadata you want to keep with the transaction, for example linked orders or a batch number. Rules:
  * at most 50 keys
  * keys up to 255 characters, and no `proto`, `constructor` or `prototype` in them
  * values are strings (up to 255 characters), numbers or booleans

***

### Common workflows

#### **Timber: take species and production period from your plots**

Use this when you file timber and the species are recorded on the plots.

**1. Check that the plots carry species**

```shellscript
curl -X GET 'https://api.tradeaware.live-eo.com/businesses/{supplierId}/plots?includes=suppliers&filter.commodities=$contains:timber&limit=500' \
  -H "Authorization: Bearer <token>"
```

Each plot returns `species`, `productionDateStart` and `productionDateEnd`. A plot with `"species": []` has none yet: its owner adds them with `PATCH /plots/{plotId}`, so for your suppliers' plots, ask the supplier.

**2. Create the transaction with `plotIds` and without `namePairs`**

```shellscript
curl -X POST "https://api.tradeaware.live-eo.com/transactions" \
  -H "Authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d '{
    "activityType": "IMPORT",
    "countryOfActivity": "DE",
    "components": [
      {
        "hsn": "440323",
        "quantity": 12000,
        "unit": "KGM",
        "supplementaryUnit": 18,
        "supplementaryUnitQualifier": "MTQ",
        "description": "Spruce logs",
        "supplierBusinessId": "02c36247-1ad8-41ba-ad49-f11ac44c263f",
        "plotIds": [
          "a78c1a68-d326-4217-a131-893f3c47a064",
          "e8d2e3e6-2c7c-4c4e-98a9-3e3f4e2c1a68"
        ]
      }
    ]
  }'
```

TradeAware fills `namePairs` with the species of those plots, without duplicates, and the production period with their dates.

⚠️ Always send `plotIds` or `productIds`. With only `supplierBusinessId`, nothing is filled in and a timber component returns `400 Timber components must include at least one namePair with commonName and scientificName`.

**3. Check what will be filed**

```shellscript
curl -X GET "https://api.tradeaware.live-eo.com/components/{componentId}" \
  -H "Authorization: Bearer <token>"
```

`namePairs` is the species list in the DDS, and `dateOfProduction` and `endDateOfProduction` are its production period.

**4. Submit**

```shellscript
curl -X PUT "https://api.tradeaware.live-eo.com/transactions/{id}/submit" \
  -H "Authorization: Bearer <token>"
```

**If you need a different species list**

| You want to                                       | Do this                                                                                                                                                                                                                                     |
| ------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Add a species that isn't on the plots             | Send `namePairs` when you create the component. Your pairs are kept and the plots' species are added to them.                                                                                                                               |
| File an exact list, for example to drop a species | Send the full list with `PATCH /components/{id}` and `namePairs`. It replaces the list exactly as sent.                                                                                                                                     |
| Add plots to the component                        | Send the new `plotIds`. The new plots' species are added automatically.                                                                                                                                                                     |
| Remove plots from the component                   | Send `plotIds` together with the full `namePairs` list (and the dates) in the same `PATCH`. Otherwise the removed plots' species stay.                                                                                                      |
| Use products instead of `plotIds`                 | The species come from the plots linked to the product when you create the component. Right before step 4, read `GET /products/{productId}/plots` again. If the plots changed, send the full `namePairs` list with `PATCH /components/{id}`. |

#### Mixed origin: several suppliers on one line

```shellscript
curl -X POST "https://api.tradeaware.live-eo.com/transactions" \
  -H "Authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d '{
    "activityType": "IMPORT",
    "countryOfActivity": "DE",
    "components": [
      {
        "hsn": "120190",
        "quantity": 123.45,
        "unit": "KGM",
        "description": "Soya beans, not for sowing",
        "dateOfProduction": "2026-03-01T00:00:00.000Z",
        "endDateOfProduction": "2026-05-31T00:00:00.000Z",
        "supplierBusinessIds": [
          "02c36247-1aad-41ba-aa49-f114ca4c263f",
          "1f7e2c11-9d0a-4b65-9df9-1d5d6a3b1111"
        ],
        "plotIds": [
          "a78c1a68-d326-4217-a131-893f3c47a064",
          "e8d2e3e6-2c7c-4c4e-98a9-3e3f4e2c1a68"
        ]
      }
    ]
  }'
```

#### Use products instead of selecting plots

```shellscript
curl -X POST "https://api.tradeaware.live-eo.com/transactions/{transaction_id}/components" \
  -H "Authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d '{
    "hsn": "1801",
    "quantity": 24000,
    "unit": "KGM",
    "description": "Raw cocoa beans, Grade A",
    "productIds": ["5f0c2a4e-8b1d-4c7a-9e3f-2d6b8a1c4e70"],
    "supplierBusinessIds": ["c1dbc78d-a127-454a-961b-ef30becf37fd"]
  }'
```

To create products, share them with suppliers and track their linked plots, see [Manage products and plot links](https://docs.live-eo.com/tradeaware/using-the-tradeaware-api/manage-products-and-plot-links).

#### Composite products: several product lines in one DDS

Send one component per HS code.

```shellscript
curl -X POST "https://api.tradeaware.live-eo.com/transactions" \
  -H "Authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d '{
    "activityType": "IMPORT",
    "countryOfActivity": "DE",
    "legalEntityId": "123e4567-e89b-12d3-a456-426614174000",
    "components": [
      {
        "hsn": "1803",
        "quantity": 5000,
        "unit": "KGM",
        "description": "Cocoa paste",
        "supplierBusinessId": "589df451-a064-48e6-a715-1315a3f6180a"
      },
      {
        "hsn": "1804",
        "quantity": 2000,
        "unit": "KGM",
        "description": "Cocoa butter",
        "supplierBusinessId": "589df451-a064-48e6-a715-1315a3f6180a"
      }
    ]
  }'
```

To add a line to an existing transaction, use `POST /transactions/{id}/components` with the same component fields.

#### Export goods covered by an existing DDS

```shellscript
curl -X POST "https://api.tradeaware.live-eo.com/transactions" \
  -H "Authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d '{
    "activityType": "EXPORT",
    "countryOfActivity": "DE",
    "components": [
      {
        "hsn": "401519",
        "quantity": 100,
        "unit": "KGM",
        "description": "Rubber gloves",
        "ddsReferences": [
          { "id": "25DE8TQS813235", "verificationNumber": "ZYKKDTFT" }
        ]
      }
    ]
  }'
```

#### Link a transaction to your ERP records

Use `customId` for your main reference and `customData` for anything else you want to find the transaction by later.

```shellscript
curl -X POST "https://api.tradeaware.live-eo.com/transactions" \
  -H "Authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d '{
    "activityType": "IMPORT",
    "countryOfActivity": "DE",
    "customId": "SO-2026-1187",
    "customData": {
      "linkedOrders": "PO-2026-00418",
      "batch": "B-7741",
      "salesRegion": "DACH"
    },
    "components": [
      {
        "hsn": "1801",
        "quantity": 24000,
        "unit": "KGM",
        "description": "Raw cocoa beans",
        "supplierBusinessId": "589df451-a064-48e6-a715-1315a3f6180a"
      }
    ]
  }'
```

#### Update a draft

While a transaction is in `DRAFT` or `ERROR`, you can change it and its components.

```shellscript
# Update the transaction
curl -X PATCH "https://api.tradeaware.live-eo.com/transactions/{transaction_id}" \
  -H "Authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d '{ "customData": { "batch": "B-7742" } }'
```

```shellscript
# Update one component
curl -X PATCH "https://api.tradeaware.live-eo.com/components/{id}" \
  -H "Authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d '{ "quantity": 125.45, "unit": "KGM" }'
```

#### List your transactions

```shellscript
curl -X GET "https://api.tradeaware.live-eo.com/transactions?includes=components" \
  -H "Authorization: Bearer <token>"
```

***

### Errors and how to fix them

**Rejected by the API (the request fails)**

| Response                                                                                                                  | Cause                                                         | Fix                                                                                                |
| ------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------- | -------------------------------------------------------------------------------------------------- |
| `400` `At least one of the following properties must be provided: ddsReferences, supplierBusinessId, supplierBusinessIds` | The component has no source.                                  | Add a supplier ID, or your own business ID for self-managed plots, or `ddsReferences`.             |
| `400` `At least one plot must be provided.`                                                                               | `"plotIds": []` was sent.                                     | Leave `plotIds` out to include all of the supplier's plots.                                        |
| `400` `Timber components must include at least one namePair with commonName and scientificName`                           | A Timber component has no species, sent or derived.           | Send `namePairs`, or set `species` on the plots and reference them with `plotIds` or `productIds`. |
| `400` `dateOfProduction cannot be cleared while endDateOfProduction is set`                                               | Only the start date was cleared.                              | Send `null` for both dates in the same request.                                                    |
| `400` `One or more DDS references are not valid`                                                                          | A reference or verification number doesn't resolve in TRACES. | Check both values with your supplier.                                                              |
| `409 Conflict`                                                                                                            | The transaction isn't in `DRAFT` or `ERROR`.                  | Amend or withdraw the submitted statement instead.                                                 |

**Rejected by TRACES (the transaction ends in `ERROR`)**

| Cause                                                             | Fix                                                       |
| ----------------------------------------------------------------- | --------------------------------------------------------- |
| Supplementary unit missing for an HS code that requires one       | Add `supplementaryUnit` and `supplementaryUnitQualifier`. |
| `percentageEstimationOrDeviation` sent on an `IMPORT` or `EXPORT` | Only send it on `DOMESTIC`.                               |
| A referenced DDS was withdrawn or replaced                        | Ask your supplier for the current reference.              |

The reason is under `dds.errors` on `GET /transactions/{id}`. Fix the transaction and submit it again.

**No error, but the DDS is incomplete**

| Cause                                                                  | Fix                                                        |
| ---------------------------------------------------------------------- | ---------------------------------------------------------- |
| A supplier listed with `productIds` hasn't linked plots to the product | Check `GET /products/{productId}/plots` before you submit. |

***

### What changed

#### November 2026

* Components take their production period and Timber species from their plots. If you don't send `dateOfProduction` and `endDateOfProduction`, TradeAware derives them from the component's plots. For Timber, species set on those plots are added to `namePairs`. See [Production period and species](https://docs.live-eo.com/tradeaware/using-the-tradeaware-api/manage-your-transactions#production-period-and-species).
* `namePairs` is no longer required for Timber when the component's plots carry species.
* Plots accept `productionDateStart`, `productionDateEnd` and `species`.

#### October 2026

* Components accept `productIds` to reference products you own. At submission, TradeAware adds the plots your suppliers linked to those products. See [Manage products and plot links](https://docs.live-eo.com/tradeaware/using-the-tradeaware-api/manage-products-and-plot-links).
* New endpoints under `/products` to create products (also in batch), share them with suppliers and read their linked plots.

#### September 2026

* `TRADE` is no longer accepted as an activity type. Transactions created as `TRADE` earlier now have the status `DEPRECATED`: they stay readable through `GET /transactions` and `GET /transactions/{id}`, but can't be updated or submitted.
* Components accept `supplementaryUnit` and `supplementaryUnitQualifier`. Some HS codes require them.
* `percentageEstimationOrDeviation` applies to `DOMESTIC` transactions only.
* On `GET /dds/fetch-dds-data`, the `status` values are now `null`.

If your integration predates September 2026, check that you:

* no longer send `activityType: "TRADE"`
* send a supplementary unit for the HS codes that require one
* only send `percentageEstimationOrDeviation` on `DOMESTIC` transactions
* accept `status.status` being `null` on `/dds/fetch-dds-data`


---

# 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 by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://docs.live-eo.com/tradeaware/using-the-tradeaware-api/manage-your-transactions.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

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.
