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

# Transport

> Confirm pickup and delivery, upload CMR documents, reverse mistakes with explicit revoke.

Transport is the proof-of-cross-border-movement module — the artifact the
tax authority cares most about for VAT-exempt transactions. Two
milestones (pickup + delivery), each backed by documents.

## Pickup confirmation

Call once, when the vehicle leaves the seller's premises:

```bash theme={null}
curl -X POST "https://api.novatrade24.com/v1/partners/${SELLER_ID}/orders/${ORDER_UUID}/transport/pickup" \
  -H "Authorization: Bearer ${ACCESS_TOKEN}" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
    "type": "COMPANY_TRANSPORT",
    "pickupDate": "2026-04-22",
    "driverIdentification": "DE-FR-2026-1234",
    "collectionAddress": {
      "street": "Hauptstraße 42",
      "postCode": "10115",
      "city": "Berlin",
      "country": "DE"
    }
  }'
```

`type` is one of:

* `SELF_PICKUP` — buyer or their agent picks up personally. CMR not
  applicable; upload a `TRANSPORT_PICKUP_DECLARATION` signed by the buyer.
* `COMPANY_TRANSPORT` — transport company moves the vehicle. CMR required.

<Warning>
  **Pickup is immutable once set.** A second POST returns `409` with the
  current state. If you confirmed incorrectly, use the explicit
  `POST /transport/pickup/revoke` endpoint — revocation is auditable and
  requires a reason.
</Warning>

## Upload pickup documents

```bash theme={null}
curl -X POST "https://api.novatrade24.com/v1/partners/${SELLER_ID}/orders/${ORDER_UUID}/transport/documents" \
  -H "Authorization: Bearer ${ACCESS_TOKEN}" \
  -H "Idempotency-Key: $(uuidgen)" \
  -F "type=TRANSPORT_CMR" \
  -F "documentDate=2026-04-22" \
  -F "file=@/path/to/cmr-unsigned.pdf"
```

Allowed types:

| Type                             | When                                        |
| -------------------------------- | ------------------------------------------- |
| `TRANSPORT_CMR`                  | Company transport — CMR waybill at pickup   |
| `TRANSPORT_PICKUP_DECLARATION`   | Self-pickup — signed declaration            |
| `TRANSPORT_PICTURE_OF_TRANSPORT` | Supporting photo (vehicle on trailer, etc.) |

## Revoke pickup

For corrections before delivery has happened:

```bash theme={null}
curl -X POST "https://api.novatrade24.com/v1/partners/${SELLER_ID}/orders/${ORDER_UUID}/transport/pickup/revoke" \
  -H "Authorization: Bearer ${ACCESS_TOKEN}" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{ "reason": "Wrong pickup date entered — driver did not arrive until 2026-04-23" }'
```

After revocation, you can call `POST /transport/pickup` again with the
corrected data.

## Delivery confirmation

Call when the vehicle arrives at the destination (buyer's premises):

```bash theme={null}
curl -X POST "https://api.novatrade24.com/v1/partners/${SELLER_ID}/orders/${ORDER_UUID}/transport/delivery" \
  -H "Authorization: Bearer ${ACCESS_TOKEN}" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
    "arrivalDate": "2026-04-24",
    "arrivalConfirmation": "Received at buyer address; driver signature captured"
  }'
```

Immutable once set. Same revoke pattern applies if needed.

## Upload delivery documents

```bash theme={null}
curl -X POST "https://api.novatrade24.com/v1/partners/${SELLER_ID}/orders/${ORDER_UUID}/transport/documents" \
  -H "Authorization: Bearer ${ACCESS_TOKEN}" \
  -H "Idempotency-Key: $(uuidgen)" \
  -F "type=TRANSPORT_CMR_DELIVERY" \
  -F "documentDate=2026-04-24" \
  -F "signedWet=true" \
  -F "file=@/path/to/cmr-signed.pdf"
```

Allowed types:

| Type                                | When                                      |
| ----------------------------------- | ----------------------------------------- |
| `TRANSPORT_CMR_DELIVERY`            | Signed CMR from the buyer / consignee     |
| `TRANSPORT_CONFIRMATION_OF_ARRIVAL` | Self-pickup — signed arrival confirmation |

## Daily VIES re-check

Once you mark payment ready-for-pickup, NT24 re-runs VIES on the buyer's
VAT number **every 24 hours** until delivery is confirmed. A failing
check fires `kyc.vies_check_failed` and flips the compliance rollup to
`INVALID` unless resolved within the transport window.

This is the mandatory continuous validation mentioned in the EU VAT
directive — NT24 implements it on your behalf.

## Per-VIN transport in multi-VIN orders

Single-VIN (Phase 1 default): transport fields are order-level.

Multi-VIN (requires `allowMultiVinOrders` capability): the transport
rollup has a `vins[]` array with per-VIN pickup/delivery state. Some VINs
may be delivered while others are still in transit; overall transport
status becomes `PARTIAL` until all VINs reach `DELIVERED`.

Per-VIN CMR uploads are a Phase 2+ feature.

## Compliance impact

After delivery confirmed + all required documents uploaded:

* `transport.status` becomes `DELIVERED`.
* `cmrUploaded` becomes `true`.
* Compliance rollup evaluates: if all modules green → `VALID` + Export File
  generates.

## Next

<CardGroup cols={2}>
  <Card title="Finalization" icon="file-signature" href="/guides/finalization">
    Final invoice and Export File download.
  </Card>

  <Card title="Compliance rollup" icon="gauge" href="/concepts/compliance-rollup">
    Track transport module state.
  </Card>
</CardGroup>
