Rate limits and errors¶
~4 min · Operations
Error shape¶
Errors return a JSON body:
Always read message/error — for a 400, it names the field or rule that failed.
Rate limits (429)¶
If you exceed the allowed request rate you'll get 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 solve 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