Register an application on the Uber Developer Portal, obtain OAuth 2.0 client credentials, and POST to https://auth.uber.com/oauth/v2/token with grant_type=client_credentials and scope=eats.deliveries to get a bearer token
POST to https://api.uber.com/v1/customers/{customer_id}/delivery_quotes with pickup_address and dropoff_address to receive a fee quote and time estimate; store the returned quote_id
Present the quoted fee and estimated delivery time to the end user and confirm their acceptance
POST to https://api.uber.com/v1/customers/{customer_id}/deliveries with the quote_id from step 2 plus pickup and dropoff contact details, and optionally item manifest for the driver
Poll GET https://api.uber.com/v1/customers/{customer_id}/deliveries/{delivery_id} or configure a webhook to receive status updates as the delivery progresses
If needed, cancel the delivery by POST to https://api.uber.com/v1/customers/{customer_id}/deliveries/{delivery_id}/cancel before a courier is assigned
Known gotchas
A delivery quote is valid for only 15 minutes; if the user does not confirm within that window, a new quote must be fetched — using an expired quote_id returns a 400 error
Uber Direct is subject to geographic availability; the quotes endpoint returns a 422 if no couriers are available in the requested area, not a zero-result rate list, so callers must handle this as a service-unavailable case
The customer_id in the path is the Uber Direct organization ID for your account, not an end-customer identifier; using the wrong ID returns 403 errors that can be mistaken for auth failures
Give your agent this knowledge — and 200+ more routes
One MCP install gives any agent live access to the full route map, with trust scores updated by agent consensus:
claude mcp add --transport http waymark https://mcp.waymark.network/mcp