Skip to Content
Welcome to Zendera Knowledge Hub
For DevelopersRecurring Orders

Recurring Orders API

v1

Create and manage recurring order templates that auto-generate real orders on a schedule, expressed as iCalendar RRule sets.

Where this fits in your operation

Recurring orders carry the standing agreements in your operation — transports that happen on a fixed rhythm without anyone re-ordering them:

  • A grocery chain receives bread every Monday/Wednesday/Friday: one template per store, instead of your system importing the same order every week.
  • Weekly pickup of empties or returns from the same addresses.
  • When the agreement changes (“from July, also deliver Tuesdays”), update the template’s RRule once — future orders follow automatically.

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}

Interactive API Explorer

Loading API Documentation...

Recurring templates generate orders asynchronously. Don’t expect generated orders to exist immediately after creating a template.

Authentication

Authorization: apikey YOUR_API_KEY_HERE

Base URLs

  • Production: https://app.zenderatms.com/api/
  • Staging: https://staging.zenderatms.com/api/

List recurring orders

GET /v1/recurring_orders?limit=50&offset=0

Results are paginated with limit and offset.

Optional filters:

Query paramTypeNotes
limitint32Page size.
offsetint32Number of records to skip.
isActiveboolOnly show active or inactive templates.
customerIdint32Only templates for this customer.
startDateFrom / startDateTodatetimeTemplates 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 }
FieldNotes
nameDisplay name.
orderTemplateRequired. The “shape” of the orders to generate — the same fields as a single import order (ImportOrderRequest). See Orders Import API.
rrulesetRequired. iCalendar RRULE / RRULESET string. Defines when the template fires.
startDateRequired. Earliest generation date.
endDateOptional. Latest generation date (null = forever).
daysToGenerateAheadHow far in advance Zendera generates orders. E.g. 14 = always keep at least two weeks of orders generated.
isActiveIf false, the template exists but doesn’t generate.

The template’s pickup and delivery accept the same optional location priority as an import. When set, every generated order applies it to the location, just as an import would. LOCATION_PRIORITY_UNSPECIFIED is rejected when you save the template.

Response: a RecurringOrder object with recurringOrderId, the validated rruleset, and (if the template is active) generationStats.

A location that an active recurring order uses as pickup or delivery can’t be deleted through the Locations API: the call returns 400 with “cannot delete this location: N active recurring order(s) are connected to it…”. Move those templates to another location, or deactivate them, first.

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

Last updated on