Rate limits and errors¶
~4 min read · Operations
Error format¶
Errors return a JSON body:
Always read message/error — for a 400, it names the field or rule that failed.
Rejections worth knowing about¶
Two 400s account for most first-run failures, and neither is obvious from the field list.
| What you see | What it means |
|---|---|
Cannot read property 'timeRange' of undefined |
A task has no serviceWindows. Every task needs at least one — use the vehicle's shift window if the stop is genuinely unconstrained. |
Error 10405 — "This trip's pickup window has already passed" |
You submitted a window that closed before the current time. The response reports Current_Time in HHMM. Date the problem ahead of the clock. |
The second one is quiet and expensive: if you build a problem for today out of a full day of stops, every stop earlier than the moment you press send is discarded, and you get back a solution that looks fine but covers a fraction of the work. Anything measured that way is not a real result.
Rate limits (429)¶
If you exceed the allowed request rate you'll get a 429. When it happens:
- Stop and wait before retrying — back off (e.g. double the delay each time).
- Poll less aggressively — a too-tight poll loop is the usual cause.
- Spread bursts of submissions out rather than firing them all at once.
Server errors (5xx)¶
Transient. Retry with backoff; if a 500 persists for the same payload, capture the request id (if any) and contact DDS Wireless support.
"Successful but empty" — unassigned jobs¶
A 200 with items in unassigned is not an error — the optimization succeeded, but some work couldn't be placed. This is almost always a problem-definition issue, not an API issue. Common reasons:
| Reason code | Likely fix |
|---|---|
TIME_WINDOW |
Widen the window, or add capacity/vehicles to reach it in time. |
CAPACITY |
Increase vehicle capacities, or split the demand. |
SKILL |
Give a vehicle the required skill, or relax the task's skill. |
NO_VEHICLE / reachability |
Check depot/shift start location and times. |
Turn on the diagnostics you need
Set configuration.unassignedTasks: true to get reasons, and statistics: true to see vehicles used vs. unused. They make "why didn't this route the way I expected?" answerable.
Related: Status codes · Polling and backoff · The Solution object