Skip to Content
Welcome to Zendera Knowledge Hub
For DevelopersOverview

API Documentation

Welcome to the Zendera API documentation. Here you'll find comprehensive guides for integrating with our transportation management system.

Getting Started with the Zendera API

This guide is for developers building integrations against Zendera — the Transportation Management System used by transport operators to plan, dispatch, and bill deliveries. If you’re building an ERP, OMS, WMS, marketplace, or partner tool that needs to push orders into Zendera and read order status back, you’re in the right place.

This article covers the basics: environments, your first call, the data model in plain English, the typical wholesale order lifecycle, and the cross-cutting conventions used across every endpoint.

Quick Start by Use Case

Order Management

Import and track orders programmatically

Product Integration

Manage hierarchical product relationships

Notification Management

Access and search SMS & email notification logs

Environments

EnvironmentBase URLWhen to use
Productionhttps://app.zenderatms.com/api/Live customers, real money.
Staginghttps://staging.zenderatms.com/api/Integration testing. Same code as prod, separate data.

Treat staging and production as separate organizations with separate API keys. All endpoint paths in this guide are relative to the base URL. For example, POST /v3/orders/importhttps://app.zenderatms.com/api/v3/orders/import.

How to make your first API call

Get an API key

Ask your Zendera admin to create an API key in the Zendera UI (Settings → Integrations → API keys). They’ll see the key once and copy it to you. Store it in your secrets manager.

List orders for today

Expected response: 200 OK with an orders array (possibly empty) plus date, timezone, and statusFilters echo.

If you get 401 Unauthorized, jump to Authentication — it’s almost always a header-format issue.

Push your first order

For any real volume — even a single order — use the import endpoint:

POST /v3/orders/import

See Importing and recurring orders for the full request shape.

Core concepts (plain English)

You’ll see these terms throughout the API. Knowing them upfront saves time.

Organization

The tenant. An API key is scoped to a single organization — it can only see and modify that org’s data.

Customer and Department

A customer is the company being billed. A department is an optional sub-unit of a customer with its own address and contacts. When you import an order, you target either a customer or a specific department.

Customer/department CRUD is admin-only — managed in the Zendera UI, not via the integration API. From the API you reference customers by their existing id or by an externalId you’ve matched on import.

Order

The transport job. An order has:

  • A customer (and optionally a department)
  • An order type (e.g., “Standard delivery”)
  • A vehicle type required (e.g., “Van”, “Truck > 3.5t”)
  • Pickup and delivery (each is a stop)
  • One or more products
  • An internalOrderNumber — your unique ID within the organization. Used for dedup on import.
  • A serial code (Zendera-assigned, displayed in the UI)

Orders are created via /v3/orders/import, never via a single-order POST. There is no supported single-order update endpoint — updates happen via per-area endpoints (vehicle type, products upsert, atoms tree, custom field values, etc.).

Stop (Order Location)

One physical action at one location: a pickup or a delivery. An order with one pickup and one delivery has two stops.

In the API, stops are usually modelled as OrderLocations and referenced via orderLocationId.

Location

A reusable record for a physical place (an address). Locations can have contacts (people to notify) and time windows (recurring opening hours, expressed as RRule). See Locations.

Driver, Vehicle

A driver is a person; a vehicle is a vehicle. Drivers can be managed via the API — create, update, deactivate/reactivate, and schedule workdays through /v1/drivers. Vehicles are managed in the Zendera UI; there is no vehicle CRUD in the integration API.

Product (and Atoms)

A product is a line item on an order — name, quantity, unit, weight, volume, barcode.

With the atoms feature, products are hierarchical: a parent product can contain children, and children can contain grandchildren. This mirrors how goods are physically packed:

Pallet (parent) ├── Carton 1 (child) │ ├── Unit 1.1 (grandchild) │ └── Unit 1.2 └── Carton 2 └── Unit 2.1

The hierarchy is expressed via parentId on each product. A product with no parentId is a top-level item.

When a wholesale order arrives, the products often describe the requested goods at SKU level. After the warehouse picks and packs, the actual physical hierarchy is sent back. Both views live on the same order, distinguished by parentId.

See Products and atoms for the endpoints.

Plan and dispatch

Once an order exists, Zendera’s dynamic route optimizer assigns it to a driver and sequences the stops automatically. There is no API call you have to make to “plan” an order — it happens continuously in the background. Dispatchers can override decisions in the UI (lock a stop to a driver, freeze a route), but as an integrator you do not need to drive planning.

Your responsibilities are typically:

  • Push orders in (via import).
  • Read status changes back (via the status feed).
  • Optionally update specific fields (vehicle type, products, custom field values) when your business state changes.

Status feed

A polling endpoint (GET /v2/orders/summary/orderstatusfeed) that returns order status changes since a saved token. The recommended way to keep your downstream system in sync — much more efficient than re-reading the orders list. See Order Summary → status feed. For per-product status changes at each stop, there is a companion Product Status Feed.

Documentation (driver events)

A documentation is an event the driver records on an order during execution: damage (with photos), “no one there”, waiting time, comments, returned goods, signatures. Dispatchers see them on the order’s Documentation card; your integration reads them via Order Documentations — including whether a dispatcher has marked each deviation as solved.

Custom fields

Organization-defined fields used to record info beyond the built-in schema. Definitions are managed via /v1/admin/custom-field-definitions (Custom field definitions); the values themselves are set on locations and order locations (Custom field values).

Cargo carrier

A way of representing returnable equipment (pallets, crates, beer kegs, etc.) that needs to be tracked separately from the goods on the order — including per-location balances and deposit accounting. See Cargo carriers.

The wholesale order lifecycle

Most Zendera integrations follow a similar lifecycle. This is the typical flow for a wholesale customer whose ERP/WMS pushes orders into Zendera and reads status back.

[1] Order created in your ERP [2] Order sent to Zendera ──── POST /v3/orders/import │ (returns: orderCreated / draftCreated / │ orderUpdated / orderMerged) [3] Picking starts (your WMS picks the goods) │ ── you may call POST /v1/order-products/upsert │ to update products as they're picked [4] Packing complete (your WMS records the actual packed hierarchy) │ ── you call PATCH /v1/atoms/{orderId}/tree │ so Zendera knows what physically exists │ (pallets containing cartons, etc.) [5] Zendera optimizer (auto, no API call needed — assigns to a driver, plans the stop sequences the day) [6] Dispatch to driver app (status visible via the status feed) [7] Driver executes the stop (status updates flow through the status feed) [8] Proof of delivery (signature/photos uploaded by driver app; │ read via GET /v2/orders/{orderId}/completion-proof) [9] Order complete (final status visible in the status feed; close in your ERP)

What this means for your integration

StageWhat you do
2. Order inPOST /v3/orders/import. Use internalOrderNumber as your idempotency key.
3. PickingOptionally POST /v1/order-products/upsert to update products as picking progresses.
4. PackingPATCH /v1/atoms/{orderId}/tree to set parent/child relationships (the actual packed hierarchy).
5. OptimizerNothing. Zendera’s optimizer runs continuously and assigns the order to a driver on its own.
6–7. ExecutionPoll GET /v2/orders/summary/orderstatusfeed?token=...&pageSize=... to read changes. Use the empty token on your very first call; subsequent calls use the nextToken returned.
8. PODGET /v2/orders/{orderId}/completion-proof to fetch the signature, signee, comment, and image URLs.
9. CloseWhen the status reaches “completed”, mark the order closed in your ERP.

You can short-circuit any step. Smaller integrations might skip steps 3–4 (push the order, read final status). Larger ones use every step.

Cross-cutting conventions

These conventions apply across every endpoint in the API.

  • JSON casing follows the endpoint generation — v2/v3 endpoints use camelCase (externalId, internalOrderNumber, nextToken), while several v1 endpoints use snake_case (internal_product_number, is_external). Each API page states which convention applies; don’t assume one serializer setting across the whole surface.
  • Timestamps are ISO 8601 UTC: 2026-04-19T08:30:00Z.
  • IDs are integers (e.g. orderId: 12345). Some are int32, some int64 — see the swagger for each.
  • Localized errors — set Accept-Language: nb (or en, da) to control error message language.
  • Pagination varies by endpoint:
    • Cursor-based (status feed, cargo-carrier submissions list): token + pageSize, response carries nextToken.
    • Offset-based (recurring orders, locations paginated, notifications search): page + perPage (or limit + offset), response carries total/totalPages.
  • Idempotency — not built-in. Dedupe on your side. For order imports, dedupe by internalOrderNumber per organization (Zendera will return a clear result for already-existing imports).
  • Rate limits — soft. Contact Zendera if you expect more than 10 requests/second sustained.

Status codes

CodeMeaning
200 / 201Success
400Bad request — validation failed (check the response body)
401Missing/invalid/revoked API key, or wrong header format
403API key valid but the endpoint isn’t in the integration role’s surface
404Resource doesn’t exist (or belongs to another organization)
409Conflict — duplicate internalOrderNumber, illegal state, etc.
422Semantic validation error
429Rate limited
500Unexpected server error (we’ll see it in our error tracker)

Where the API ends and the admin UI begins

The integration API is a deliberately narrow surface. The following are out of scope and managed only in the Zendera admin UI:

  • User accounts and roles
  • Customer / department CRUD (the API can read and search customers, but not create or edit them)
  • Vehicle CRUD (drivers, by contrast, can be managed via the API)
  • Product catalog master data (the API can read the catalogue, but products are created/edited in the UI)
  • Order type, zone, freight-level, and price-list configuration (the API can resolve zones and compute freight levels, but not change the configuration)
  • Single-order create or monolithic update
  • Order status transitions (these happen as a result of driver actions)
  • Feature flags

If you call something outside this surface, you’ll get 403 Forbidden.

Available APIs

The reference is organized by where each API sits in the order flow — the same grouping as the sidebar.

Getting started

PageWhat it covers
AuthenticationHow API keys work, the header format, rotation, and common 401 causes.

Reference data

Look up the master data you’ll reference when importing and enriching orders.

PageWhat it covers
LocationsSearch and list locations, read their contacts and recurring time windows.
ProductsRead the product catalogue and look up products by internal product number.
CustomersList and search customers, resolve their zones and freight levels.
DriversCreate, list, update, deactivate/reactivate drivers, and manage their workdays.
Zones & PricingResolve postal codes to zones, compute freight levels, read price list headers.
Custom Field DefinitionsCreate, list, edit, and delete organization-wide custom field definitions.
Custom Field ValuesSet custom field values on locations and order locations, track driver acknowledgments.

Create orders

PageWhat it covers
Orders ImportThe single endpoint for creating, updating, and merging orders — bulk or single, with hierarchical products.
Order DraftsList, complete, and delete incomplete imported orders waiting for missing data.
Recurring OrdersTemplates (RRule schedules) that auto-generate real orders on a recurring basis.
Route SchedulingManage schedules and bookable intervals, auto-book orders onto slots, adjust capacity.

Manage & enrich orders

PageWhat it covers
OrdersCancel/replan, book on intervals, tracking links, vehicle type, completion proof, external updates, v1 deep reads.
DocumentsCreate document records, upload files, and attach them to orders.
Product UpsertCreate, update, delete, and upsert products on existing orders, with parent/child hierarchies.
AtomsRead and re-shape the actual packed product hierarchy (pallets → cartons → units).
FreightsSearch, read, and update freights — the grouping entity bundling orders under one consignor/consignee pair.
LabelsRender transport labels for products, orders, and containers as ready-to-print PDFs.

Track & sync

PageWhat it covers
Order SummaryOrder lookups by internal number or date, and the order status feed — the recommended sync pattern.
Product Status FeedA cursor-paginated feed of per-product status changes at each pickup and delivery.
Order DocumentationsDriver-recorded order events — deviations, comments, waiting time, photos, signatures.
Orders OverviewThe on-hold backlog, workday gantt and timeline data, and live driver map data.
ERP OrdersLook up ERP order records and audit how they were merged into transport orders.
Notifications LogSearch the email and SMS notifications sent by the platform.

External fulfilment

PageWhat it covers
Orders ExportFetch orders marked for export to an external carrier, acknowledge them, and push pickup/delivery progress back.

Returnables & settlement

PageWhat it covers
Cargo Carrier AccountingCargo carrier deposits, balances, submissions, and per-location configuration.

Resources

PageWhat it covers
Supported IntegrationsThe integration methods Zendera supports (REST, EDI, file-based) and how a custom integration is built.

Interactive API Explorer

Each API page includes an interactive explorer where you can:

  • Browse all available endpoints
  • Test requests directly in your browser
  • View request/response examples
  • Download OpenAPI specifications

Need Help?

Need help with your integration? Contact your system administrator or email our support team at care@zendera.no for assistance, or check our guides section for step-by-step instructions.

Last updated on