Order Summary API
v2Retrieve comprehensive order information including status, locations, travel estimates, and emission data.
Interactive API Explorer
Loading API Documentation...
Authentication
Authorization: apikey YOUR_API_KEY_HEREBase URLs
- Production:
https://app.zenderatms.com/api/ - Staging:
https://staging.zenderatms.com/api/
Endpoints
Get Order by Internal Number
Retrieve a specific order using your internal order number.
GET /v2/orders/summary/internal/{internalOrderNumber}Parameters:
internalOrderNumber(path): Your internal order identifier
Example Request:
curl -X GET "https://app.zenderatms.com/api/v2/orders/summary/internal/ORDER_123" \
-H "Authorization: apikey YOUR_API_KEY"Response:
{
"internalOrderNumber": "ORDER_123",
"order": {
"orderId": 12345,
"orderSerial": 67890,
"internalOrderNumber": "ORDER_123",
"orderDetails": {
"organizationId": 1,
"orderId": 12345,
"statusId": 6,
"statusName": "complete",
"customerDetails": {
"id": 123,
"name": "Customer Name"
},
"orderTypeId": 2,
"orderTypeName": "Delivery",
"vehicleTypeId": 5,
"vehicleTypeName": "Van",
"reference": "Customer Reference"
},
"pickup": {
"details": {
"id": 1001,
"name": "Warehouse",
"statusName": "complete",
"earliest": "2024-01-15T08:00:00Z",
"latest": "2024-01-15T10:00:00Z",
"arrivedAt": "2024-01-15T08:30:00Z",
"completedAt": "2024-01-15T09:00:00Z"
},
"address": {
"address1": "Main Street 123",
"city": "Oslo",
"postalCode": "0123",
"country": "Norway",
"latitude": "59.9139",
"longitude": "10.7522"
}
},
"delivery": {
"details": {
"id": 1002,
"name": "Customer Location",
"statusName": "complete",
"completedAt": "2024-01-15T15:30:00Z"
}
},
"driverDetails": {
"id": 456,
"name": "Driver Name",
"internalDriverNumber": "DRV_001"
},
"packageDetails": {
"quantityColli": 2,
"totalWeightKg": 21.0,
"totalVolumeLitre": 30.0
}
}
}List Orders by Date
Get orders filtered by date and status.
GET /v2/orders/summary/listbydateParameters:
date(query): Date filter in “YYYY-MM-DD” format (defaults to today)timezone(query): Timezone (e.g., “Europe/Oslo”, defaults to organization timezone)statuses(query): Comma-separated status list
Available Statuses:
completedeliveredin_transitarriveddispatchedplannedunassignedcancelled
Example Request:
curl -X GET "https://app.zenderatms.com/api/v2/orders/summary/listbydate?date=2024-01-15&statuses=complete,delivered&timezone=Europe/Oslo" \
-H "Authorization: apikey YOUR_API_KEY"Order Status Feed
Get a paginated feed of order status changes for real-time monitoring.
GET /v2/orders/summary/orderstatusfeedParameters:
token(query): Base64 pagination token (empty for first request)pageSize(query): Number of items per page
Example Request:
curl -X GET "https://app.zenderatms.com/api/v2/orders/summary/orderstatusfeed?pageSize=100" \
-H "Authorization: apikey YOUR_API_KEY"With pagination token:
curl -X GET "https://app.zenderatms.com/api/v2/orders/summary/orderstatusfeed?token=eyJ...&pageSize=100" \
-H "Authorization: apikey YOUR_API_KEY"Response Fields Explained
Order Details
orderId: Zendera internal order IDorderSerial: Sequential order numberinternalOrderNumber: Your external order identifierstatusId/statusName: Current order statusreference: Customer reference number
Location Details
earliest/latest: Scheduled time windows (ISO 8601 format)arrivedAt: Actual arrival timestampcompletedAt: Actual completion timestampstatusName: Location-specific status
Address Information
- Standard address fields with optional GPS coordinates
latitude/longitude: GPS coordinates if available
Package Summary
quantityColli: Number of colli/packagestotalWeightKg: Total weight in kilogramstotalVolumeLitre: Total volume in liters
Driver Information
id: Driver ID in Zendera systemname: Driver nameinternalDriverNumber: Your driver identifier
Use Cases
Real-time Order Tracking
Use the Order Status Feed to monitor order changes in real-time:
async function monitorOrderChanges() {
let token = '';
while (true) {
const response = await fetch(
`${API_BASE}/v2/orders/summary/orderstatusfeed?token=${token}&pageSize=50`,
{
headers: { Authorization: `apikey ${API_KEY}` },
}
);
const data = await response.json();
// Process order status changes
for (const order of data.orders) {
console.log(
`Order ${order.internalOrderNumber} status: ${order.statusName}`
);
}
// Update token for next request
token = data.nextToken;
// Wait before next poll
await new Promise(resolve => setTimeout(resolve, 30000));
}
}Daily Order Reports
Generate daily reports using the list by date endpoint:
async function getDailyOrderReport(date) {
const response = await fetch(
`${API_BASE}/v2/orders/summary/listbydate?date=${date}&timezone=Europe/Oslo`,
{
headers: { Authorization: `apikey ${API_KEY}` },
}
);
const data = await response.json();
const report = {
date,
totalOrders: data.orders.length,
statusBreakdown: {},
};
// Count orders by status
for (const order of data.orders) {
const status = order.orderDetails.statusName;
report.statusBreakdown[status] = (report.statusBreakdown[status] || 0) + 1;
}
return report;
}Order Status Processing
Process status changes in your system:
async function processOrderStatusChange(order) {
const statusHandlers = {
complete: async order => {
// Send completion notification
await sendNotification(order.customerDetails.id, 'Order completed');
// Update ERP system
await updateERPStatus(order.internalOrderNumber, 'DELIVERED');
},
in_transit: async order => {
// Send tracking notification with driver info
await sendTrackingUpdate(order.customerDetails.id, {
driverName: order.driverDetails.name,
estimatedArrival: order.delivery.details.earliest,
});
},
};
const handler = statusHandlers[order.orderDetails.statusName];
if (handler) {
await handler(order);
}
}Last updated on