Overview
The Errands API is a REST API that lets you create and track delivery orders programmatically. All requests are made over HTTPS and return JSON.
The current API supports creating and tracking orders. Editing or canceling existing orders is not available via API — use the customer portal at app.errands.nyc for that. If you need extended functionality such as callbacks or webhooks, reach out to jay@errands.nyc.
Header:
api_key: YOUR_API_KEYQuery param (GET requests):
?api_key=YOUR_API_KEYTo request an API key, contact us.
Create an Order
Create a new delivery order.
Payload
{
"pickupName": "Pickup Name",
"pickupAddress": {
"street": "908 Driggs Ave",
"streetLine2": "Unit 123",
"city": "Brooklyn",
"state": "NY",
"zipCode": "11205"
},
"pickupPhone": "7185048700",
"dropoffName": "Drop off Name",
"dropoffAddress": {
"street": "907 Driggs Ave",
"streetLine2": "",
"city": "Brooklyn",
"state": "NY",
"zipCode": "11205"
},
"dropoffPhone": "7185048700",
"numberOfPackages": 1,
"packageType": "bag",
// optional
"note": "Sample Note",
"poNumber": "Ref123",
"tripScheduleTime": "2023-11-13T21:47:49.625Z"
}
This will return the full order object including the trip.id to use for status lookups.
Notes
- pickupPhone / dropoffPhone — must be a real US or Canada number, minimum 10 digits. Leading
1or+1is allowed. Only valid area codes are accepted. Always use a mobile number whenever possible — our Pros rely on direct contact to handle details like lock combinations, access codes, and delivery instructions that can make the difference between a successful delivery and a failed one. - numberOfPackages — the total number of individual parcels in the order. For example, if 3 boxes are being delivered to a single recipient, set this to
3. For mixed items (e.g. a box and a bag), use whicheverpackageTypebest describes the contents. Inaccurate values may result in a price adjustment or refusal of delivery on the field. - tripScheduleTime — ISO 8601 datetime in UTC. Leave blank to dispatch the order ASAP. Dates must be in the future or the order will be deleted. Since time is UTC, it's safest to either omit this field entirely, or pass a date only — e.g.
"tripScheduleTime": "2027-11-14"— which will resolve to an appropriate time. If you need a specific time, note that10:00:00Zis 10am UTC (5am ET in winter, 6am ET in summer). - packageType — must be one of the following (all lowercase):
bagboxinvitationluggageenvelopeflowergift_arrangementgarment_bagopen_wrapdelicateother- There are more types for seasonal and customer-specific needs — call us for details
Address Formatting
All addresses are validated against third-party services. Keep the following in mind:
| Rule | Detail |
|---|---|
No unit info in street |
Unit, apt, room, floor, suite, and similar must go in streetLine2 only. Including them in street will cause the address to be rejected. |
| Be specific | A rejected address means no match was found, or multiple matches exist. Providing city, state, and zipCode helps narrow it down. |
Wrong zipCode or city |
Incorrect values can hurt more than help. If you're unsure, omit them and let the street and state carry the match. |
Example Response
{
"id": "clxyz123456",
"orderNumber": "1234567",
"status": "awaiting_driver",
"pickupName": "Pickup Name",
"dropoffName": "Drop off Name",
"numberOfPackages": 1,
"packageType": "bag",
"note": "Sample Note",
"poNumber": "Ref123",
"paymentStatus": "unpaid",
"createdAt": "2024-06-01T14:30:00.000Z"
}
id (UUID) and orderNumber — use either to check trip status later.
Get Trip Status
Look up a trip by its UUID.
Look up a trip by its order number (e.g. 1234567).
api_key can be passed as a query param or as a request header for GET requests.
Example Response
{
"id": "clxyz123456",
"orderNumber": "1234567",
"status": "picked_up",
"numberOfPackages": 1,
"paymentStatus": "unpaid",
...
}
Order Tracking Link
You can provide your customer with a direct tracking link using the order number returned when the order is created:
Example: https://errands.nyc/track/30001
No API key or login is required — customers can open the link directly to see live order status.
Trip Statuses
The status field in the trip response will be one of the following:
| Status | Description |
|---|---|
awaiting_driver | Default state — order received, waiting for a Pro to be assigned. Also set when a driver cancels (order re-enters queue). |
scheduled | Order is scheduled for a future pickup time |
driver_assigned | An Errands Pro has been assigned to the order |
dispatched | The order has been dispatched |
accepted | The Pro has accepted the assignment |
picked_up | Package has been picked up, en route to delivery |
completed | Order successfully delivered (typical success state) |
returning | Package is being returned to sender |
returned | Package has been successfully returned (success state for returns) |
driver_canceled | Driver refused — order automatically re-enters the queue (same as awaiting_driver) |
on_hold | Order is on hold |
quoting | Order is being quoted |
canceled | Order cancelled |
admin_canceled | Order cancelled by admin |
customer_canceled | Order cancelled by customer |
Errors
The API uses standard HTTP status codes.
| Status Code | Meaning |
|---|---|
200 | Success |
400 | Bad request — check required fields and formats |
401 | Unauthorized — missing or invalid API key |
500 | Server error — try again or contact support |
Questions or Access Requests?
To request API access or get help with your integration, reach out to our team.
Contact Us