Serve Delivery API

Price a delivery, dispatch a sidewalk robot, and track it to the door.

Serve Delivery API

Sidewalk robots, on your order flow

Price a delivery, dispatch a robot, and track it to the door. Three calls, a sandbox full of simulated robots, and no conversation with us required to start building.

The sandbox needs no key and dispatches no real courier.

Quote before you commit

Get a price and an ETA for a route before anything is dispatched. A quote reserves nothing.

Track to the door

Poll a job through pickup and dropoff, and pull the planned route as GeoJSON for your own map.

Rehearse the failures

Force any of the eight named rejections in the sandbox instead of meeting them on a busy night.

What Serve does

Serve operates sidewalk robot couriers. You hand us a pickup, a dropoff, and what is being delivered. We price it, dispatch a robot, and drive it to the door.

The whole integration is three calls.

Quote. Send a pickup and a dropoff, get back a fee in cents and an ETA. Nothing is reserved and nothing is charged.

Create. Turn a quote into a real job by passing its quote_id along with the items and the recipient.

Track. Poll the job until it reaches dropoff_complete, and pull its planned route if you want to draw it on a map.

If you always accept the price you are quoted, one call does the first two together.

Try it before you talk to us

The sandbox runs the full delivery lifecycle against simulated robots. No real courier moves, and nothing you do there can dispatch one.

So an engineer can build and test a complete integration before any commercial conversation happens. It also means you can force the failures on purpose rather than discovering them during a dinner rush.

Becoming a partner

Building against the sandbox needs nothing from us. Dispatching a real robot needs three things.

A service area. Serve robots operate in defined zones, so the first question is whether your pickup and dropoff locations fall inside one.

A production key. Sandbox keys work only against the sandbox. Production credentials are issued separately.

Fleet access. Production deliveries draw on a shared fleet, and your account has to be granted access to it.

Your engineers do not have to wait for any of that. The sandbox is open, and an integration built against it is the same integration that runs in production, with a different base URL and key.

🚧

Partner signup is not self-service yet

Let us know you are interested by filling out our Waitlist Form

Four things that surprise people

A quote expires after five minutes and can only be used once. Reusing a spent quote returns 409 used_quote. Quote when you are ready to commit, not when a customer opens their cart.

couriers_busy is normal. It means no robot is free right now, not that anything is broken. It will happen on your busiest evening, so decide early whether you retry, queue, or fall back to another courier.

Retries need an idempotency key. The instant-job endpoint accepts an Idempotency-Key header, and a repeat under the same key replays the original response rather than creating a second delivery. Rejections replay too, so a genuine retry after a transient failure needs a new key.

The rate limit is 600 requests per minute. A 429 carries a retry-after header in seconds. Polling every job every second finds that ceiling faster than you would expect.

Conventions

Dates are UTC in ISO 8601, 2026-11-09T15:50:38Z. Coordinates are decimal degrees in WGS84. Money is always integer cents, never a float.

Every error shares one shape:

{ "code": "something_went_wrong", "detail": "Description of what went wrong." }

Did this page help you?