Draft · not yet live · implementation phase F5

DAExport Public API

⇩ OpenAPI 3.1 spec (openapi.yaml)

Order and track independent pre-purchase vehicle inspections in Belgium, the Netherlands, Germany and France — from your own system. Available on Trade Pro and DAExport Enterprise plans. Machine-readable contract: openapi.yaml (OpenAPI 3.1).

Base URL   https://api.daexport.com/v1/public
Auth       X-DAE-Key: <your API key>          # account-level, issued for your account, shown once
Content    application/json · UTF-8 · EUR · priceEur, vatEur and negotiationAddonEur incl. VAT (21%); netEur, breakdown, planPricing and negotiationAddonNetEur net (+ VAT)

Ground rules

RuleDetail
Rate limitsTwo clocks, both counted per key (not per IP): a rolling minute window of 120 req/min — GET /vin/{vin} has its own, lower bucket of 30 req/min — and a daily quota: Trade Pro 1,000 req/day, Enterprise 10,000 req/day, sandbox keys 500 req/day (reset 00:00 UTC). On excess: 429 + Retry-After + X-DAE-RateLimit-Limit/-Remaining/-Reset.
VersioningBreaking change ⇒ new prefix (/v2/). The old version keeps working for 12 months after the announcement.
IdempotencyEvery POST requires Idempotency-Key (any unique string). Retrying after a timeout with the same key returns the original result — an order can never be created twice.
PricingBinding amounts are computed server-side only and signed (HMAC, 15-minute validity). The API never accepts a client-supplied price. Quotes issued before the 2026-10 price list are rejected with 402 quote_invalid — request a fresh one.
Prices (2026-10)A quote follows the plan of the account that owns the key. Every inspection is a Full inspection with the VIN history report included. Net, + VAT: Trade Pro €210 (a further car the same day in the same town €172, applied on the invoice); DAExport Enterprise €220 / €210 / €200 / €190 by the cars per month in your contract (1–7 / 8–19 / 20–49 / 50+); other plans €230. Round-trip km included: Trade and Trade Pro 50, Enterprise 30 (1–19 cars/month) or 50 (20+), other plans 30 — 50 on every plan for a car 150 km or more away one way; every further km €0.47 net. VAT is charged once on the net sum. Optional add-on Negotiation and closing the deal with the seller: €81.82 net (€99 incl. VAT), ordered with "addons":["negotiation"]. The 48 h scheduling SLA is DAExport Enterprise only.
SandboxA separate key issued for your account: dae_test_… (every paid plan) next to dae_live_… (Trade Pro and DAExport Enterprise). Same endpoints, but nothing is created and nobody is charged — sandbox orders don't dispatch inspectors and reports are samples. Integrate end-to-end before a real order.

Quickstart

# 1. Quote a car from a listing URL
curl -H "X-DAE-Key: $KEY" \
  "https://api.daexport.com/v1/public/quotes/inspection?listingUrl=https://suchen.mobile.de/...."

# → Trade Pro key, car 75 km from Antwerp (150 km round trip, 50 km included):
#   { "quoteId":"q_8fk2…", "priceEur":310.97,              # charged amount, incl. VAT (21%)
#     "netEur":257, "vatRatePct":21, "vatEur":53.97,
#     "breakdown":{ "package":"standard", "packageEur":210,  # Full inspection, net, as on the invoice
#                   "travelKm":150, "includedKm":50, "ratePerKm":0.47, "travelEur":47,
#                   "appliedBenefit":"plan_price" },
#     "negotiationAddonEur":99, "negotiationAddonNetEur":81.82,   # optional add-on, not in priceEur
#     "vinAddonEur":0,                                       # deprecated: VIN history is included
#     "expiresAt":"2026-10-11T14:32:00Z", "signature":"hm_…" }

# 2. Order it (with the negotiation add-on: VAT once on 257 + 81.82 net → €409.97)
curl -X POST -H "X-DAE-Key: $KEY" -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"quoteId":"q_8fk2…","signature":"hm_…","addons":["negotiation"],"reference":"PO-2026-114"}' \
  https://api.daexport.com/v1/public/orders/inspection

# 3. Follow progress (or just listen to webhooks)
curl -H "X-DAE-Key: $KEY" https://api.daexport.com/v1/public/orders/ord_31xk…

# 4. When status = report_ready → fetch a signed PDF link (valid 15 min)
curl -H "X-DAE-Key: $KEY" https://api.daexport.com/v1/public/orders/ord_31xk…/report

Endpoints — phase 1

EndpointWhat it does
GET /quotes/inspectionSigned quote from listingUrl, city or lat+lng. Shows package, travel km/€, applied subscriber benefit and the add-on price.
POST /orders/inspectionCreates the order from a quote. Optional: scheduledAt, addons (["negotiation"]; any other value → 400), reference (your ID, echoed in payloads and webhooks). vinAddon is deprecated: accepted and ignored, the VIN history report is part of every inspection.
GET /ordersPaginated list (cursor), filter by status.
GET /orders/{id}Status + full event timeline, incl. every seller-contact attempt with date and time.
GET /orders/{id}/reportSigned, expiring URLs to the PDF report and the media gallery.
GET /vin/{vin}VIN decode (validity, region, manufacturer, model year).
GET /account/usageYour plan's pricing (planPricing: net inspection price, km included, €/km, Enterprise contract tier), prepaid credits (never expire), API usage today.
POST /webhooks · GET /webhooksRegister / list webhook endpoints. The signing secret is returned once at creation.
DELETE /webhooks/{id}Delete an endpoint — deliveries stop at once. Only in the key's own mode (a sandbox key can't delete a live webhook); the delivery history stays. Returns 204.
GET /webhooks/deliveriesDelivery history with status codes and attempts — debug integrations without asking us.

Order lifecycle

created ──▶ awaiting_seller ──▶ scheduled ──▶ in_progress ──▶ report_ready ──▶ completed
                 │                  ▲ Enterprise: 48 h SLA starts here (order.scheduled)
                 └──────────────────┴──────────────▶ cancelled (with refund rules)

Webhooks

Events: order.created, order.scheduled (DAExport Enterprise: SLA clock starts), order.in_progress, report.ready, order.completed, order.cancelled. Payload = the full Order object. Three delivery attempts with growing back-off (immediate, then +1 min and +5 min), so the attempt field runs 1–3; history in /webhooks/deliveries. A webhook registered with a sandbox key also receives a ping event on registration, so you can verify your endpoint and signature check before the first real order; ping never goes to a live key. Remove an endpoint with DELETE /webhooks/{id}; the company owner can also list and delete the account's webhooks (live and sandbox) in the DAExport partner panel.

Verifying a signature

X-DAE-Signature-Timestamp: 1765465632
X-DAE-Signature: hex( HMAC-SHA256( secret, timestamp + "." + rawBody ) )
// Node.js
import { createHmac, timingSafeEqual } from "node:crypto";
function verify(secret, ts, rawBody, signature) {
  if (Math.abs(Date.now() / 1000 - Number(ts)) > 300) return false; // replay window 5 min
  const mac = createHmac("sha256", secret).update(`${ts}.${rawBody}`).digest("hex");
  return timingSafeEqual(Buffer.from(mac), Buffer.from(signature));
}

Phase 2 (planned): GET /listings (BE/NL/DE/FR market listings), GET /listings/{id}/price-history, POST /searches (saved searches with matches delivered by webhook — Radar for systems, not for people).

Errors

{ "code": "quote_invalid", "message": "Quote expired — request a fresh quote" }
HTTPcodeWhen
400bad_requestMalformed parameters or body
401unauthorizedMissing/revoked X-DAE-Key
402quote_invalidStale or tampered quote — request a fresh one (one code for both cases; the message says which)
404not_foundResource missing or owned by another account
409idempotency_conflict / conflict / not_readyKey reused with a different body / the first call with that key is still running / report still being produced
422unprocessableVIN fails format or checksum
429rate_limitedSee Retry-After

DAExport · Uitbreidingstraat 510, 2600 Berchem, Antwerp, Belgium · VAT BE 1038.259.789 · contact@daexport.com