Skip to content

Rate limits and errors

~4 min · Operations

Error shape

Errors return a JSON body:

{ "status": "error", "message": "Human-readable summary.", "error": "Detail or code." }

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