Skip to main content
The Bahn Customer API lets businesses arrange vehicle transport between a pickup location and a delivery location. Dealers, marketplaces, auction platforms, and leasing companies use it to place orders and follow each transport through delivery. Most integrations create an order flow, an operations view, or a tracking page. You can also use webhooks to automate customer messages and collect the photos, documents, and inspection reports for each transport.

Create a sandbox order

Get a token and create your first order with one complete request.

Understand the lifecycle

See how orders, webhooks, tracking, and files fit together.

Build tracking

Show ETAs, pickup progress, and a map marker for each vehicle.

Order as a platform

Place orders for other businesses with an ordering-channel credential.

The standard integration

A typical integration follows one simple loop. A price check is optional. The order is not.
  1. Get an OAuth access token.
  2. Check the price if your product needs to show one before checkout.
  3. Create the order and store the Bahn order ID.
  4. Receive webhooks for meaningful changes.
  5. Read the current order or related resource after a webhook.
The order is the main resource. It contains the accepted price, current status, vehicles, timing, and the actions that are currently available. Tracking, files, inspection reports, and report rows are separate resources because products use them in different ways.

Timing has four meanings

Customer products often make timing confusing. Keep these values separate in your data model and UI:
  • A requested window is the time the customer asked for.
  • An agreed window is the time range Bahn agreed to target.
  • An ETA is the latest arrival estimate.
  • An actual time records when pickup or delivery completed.
Use the actual time after completion. Before completion, prefer the ETA, then the agreed window, then the requested time.

Production and sandbox

Each environment has separate credentials and data.
A production order starts real operational work. Complete the full order and webhook flow in the sandbox first.

A few rules prevent most integration bugs

Use a new idempotency key for each logical write. Store the revision from every order response, and send it in If-Match when you update or cancel an order. Check allowed_actions before you offer those actions in your UI. Treat webhooks as change notifications. Verify the signature, deduplicate the event, and read data.resource_url when you need the latest resource. Start with the Quickstart. Use the API Reference tab for complete field definitions and interactive requests. For credentials or integration support, contact support@bahnexpress.com.