Recurring Orders API
v1Create and manage recurring order templates that auto-generate real orders on a schedule, expressed as iCalendar RRule sets.
Overview
Recurring orders are templates that auto-generate real orders on a schedule. Schedules are expressed as RRule sets (the iCalendar recurrence-rule format).
GET /v1/recurring_orders
POST /v1/recurring_orders
GET /v1/recurring_orders/{recurringOrderId}
PUT /v1/recurring_orders/{recurringOrderId}
DELETE /v1/recurring_orders/{recurringOrderId}Recurring templates generate orders asynchronously. Don’t expect generated orders to exist immediately after creating a template.
Authentication
Authorization: apikey YOUR_API_KEY_HEREBase URLs
- Production:
https://app.zenderatms.com/api/ - Staging:
https://staging.zenderatms.com/api/
List recurring orders
GET /v1/recurring_orders?limit=50&offset=0Results are paginated with limit and offset.
Optional filters:
| Query param | Type | Notes |
|---|---|---|
limit | int32 | Page size. |
offset | int32 | Number of records to skip. |
isActive | bool | Only show active or inactive templates. |
customerId | int32 | Only templates for this customer. |
startDateFrom / startDateTo | datetime | Templates whose start date falls in the range. |
Response:
{
"recurringOrders": [ { "...": "RecurringOrder..." } ],
"total": 42,
"limit": 50,
"offset": 0
}Create a recurring order template
POST /v1/recurring_orders{
"name": "Daily Acme Oslo run",
"customerId": 1234,
"orderTypeId": 5,
"vehicleTypeId": 2,
"pickupLocationId": 999,
"deliveryLocationId": 1000,
"orderTemplate": {
"...": "an ImportOrderRequest — same shape as in /v3/orders/import"
},
"rruleset": "DTSTART:20260419T060000Z\nRRULE:FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR",
"startDate": "2026-04-19T00:00:00Z",
"endDate": null,
"daysToGenerateAhead": 14,
"isActive": true
}| Field | Notes |
|---|---|
name | Display name. |
orderTemplate | Required. The “shape” of the orders to generate — the same fields as a single import order (ImportOrderRequest). See Orders Import API. |
rruleset | Required. iCalendar RRULE / RRULESET string. Defines when the template fires. |
startDate | Required. Earliest generation date. |
endDate | Optional. Latest generation date (null = forever). |
daysToGenerateAhead | How far in advance Zendera generates orders. E.g. 14 = always keep at least two weeks of orders generated. |
isActive | If false, the template exists but doesn’t generate. |
Response: a RecurringOrder object with recurringOrderId, the validated rruleset, and (if the template is active) generationStats.
Get a recurring order template
GET /v1/recurring_orders/{recurringOrderId}Returns the full RecurringOrder object for the given ID.
Update a recurring order template
PUT /v1/recurring_orders/{recurringOrderId}Send only the fields you want to change.
{
"name": "Daily Acme Oslo run (renamed)",
"isActive": false,
"updateExistingOrders": false
}The updateExistingOrders flag controls whether already-generated orders are regenerated to reflect the changes:
true: Regenerate already-generated orders to match the updated template.false: Leave already-generated orders alone; only future generation uses the new template.
Delete a recurring order template
DELETE /v1/recurring_orders/{recurringOrderId}DELETE deactivates the template rather than hard-deleting it. Already-generated orders are not removed.
What’s next
- For the order shape used in
orderTemplate, see the Orders Import API. - For authentication details, see Authentication.