It's easy to integrate delivery into your ecommerce storefront or expand your on-demand offering! Begin by creating a new application in your account dashboard to retrieve your authentication token that grants access to all API resources as outlined on this document.
See our service coverage map to ensure you are within a supported geographic zone, or start your integration today and launch with us as we expand.
Dispatching a courier will incur usage costs that are applied to your account. To request a detailed delivery quote before dispatching a delivery, use our Delivery Quote API.
Rate | Price |
---|---|
Base | $20 pickup |
Express Priority | Variable, min of $10 |
Distance | $1 per mile |
Curbside Wait | $1 per 5 minutes |
Using our HTTP based API, you can make requests to our platform with a variety of languages. All HTTP requests must specify a bearer token in the Authorization
header. You'll find your API key in your account dashboard, where you can create and configure your application.
https://api.ollo.co/v1
Lists all Deliveries for a particular account.
$ curl https://api.ollo.co/v1/deliveries
[ { "id": {Delivery.id}", "created": {Delivery.created}, ...{Delivery} }, { "id": "{Delivery.id}", "created": "{Delivery.created}", ...{Delivery} } ]
Get all known properties for a Delivery.
$ curl https://api.ollo.co/v1/deliveries/{Delivery.id}
{ "id": "{Delivery.id}", "status": "{DeliveryStatus}", "origin": "{Delivery.origin}", "destination": "{Delivery.destination}", "customer_name: "{Customer.name}", "customer_phone": "{Customer.phone}", "customer_email": "{Customer.email}", "created": "{Delivery.created}", "updated": "{Delivery.updated}", "price": "{Delivery.price}", "pickup_eta": "{Delivery.pickup_eta}", "dropoff_eta": "{Delivery.dropoff_eta}", "estimated_duration": "{Delivery.estimated_duration}" }
Get a detailed delivery quote including estimated cost, pickup time, and arrival time, before dispatching a courier . If your integration sends our API multiple requests with matching parameters, note that we may return cached responses for up to 5 minutes.
Property | Description |
---|---|
origin | The pickup address (must fall within service area) |
destination | The dropoff address |
when | (optional) A future timestamp when the pickup should occur |
express | (optional) Express Priority dispatch |
$ curl -X POST https://api.ollo.co/v1/deliveries/quote
{ "origin": "{Delivery.origin}", "destination": "{Delivery.destination}", "express": "{Delivery.express}", "when": "{Delivery.when}" }
{ "id": "{Delivery.quote_id}", "price": "{Delivery.price}" }
Create a new delivery with the parcel origin and destination addresses.
Ensure the specified origin
and destination
are within a supported service zone, otherwise a 403 Forbidden
status is returned. When issuing a Delivery Quote request these parameters will be validated with a successful 2xx
status.
Optionally, a quote_id
can be provided within 1 hour of its creation. Providing an expired quote_id
will result in a 400 Bad Request
response. A valid quote_id
is required to make a "express" delivery request.
Property | Description |
---|---|
origin | The pickup address |
destination | The dropoff address |
quote_id | (optional) Execute a quote provided by a prior request |
express | (optional) Express courier dispatch |
when | (optional) A future timestamp when the pickup should occur |
customer_name | (optional) Customer name to greet the customer |
customer_email | (optional) Customer email address to send updates |
customer_phone | (optional) Customer phone to send updates |
$ curl -X POST https://api.ollo.co/v1/deliveries
{ "quote_id": "{Delivery.quote_id}", "origin": "{Delivery.pickup}", "destination": "{Delivery.destination}", "customer_email": "{Delivery.customer_email}" }
{ "id": "{Delivery.id}", "created": "{Delivery.created}", "price": "{Delivery.price}", "pickup_eta": "{Delivery.pickup_eta}", "dropoff_eta": "{Delivery.dropoff_eta}", "estimated_duration": "{Delivery.estimated_duration}" }
These are type definitions of objects for our API calls, events, and webhooks
Property | Type | |
---|---|---|
id | string | Unique delivery reference ID |
quote_id | string | Unique quote reference ID |
express | boolean | Specifies if this is a express delivery |
express_quote_id | string | Specifies a quote ID of from a previous express quote |
when | ISO Timestamp | Desired time when the courier should reach the pickup location |
created | ISO Timestamp | Time which delivery was created |
pickup_eta | ISO Timestamp | Estimated time which courier will reach specified pickup location |
dropoff_eta | ISO Timestamp | Estimated time which courier will reach specified dropoff location |
estimated_duration | number | Estimated duration of trip (in minutes) |
customer_name | string | (optional) Customer name for friendly greetings |
customer_email | string | (optional) Customer email address to send updates |
customer_phone | string | (optional) Customer phone to send text updates |
Property | Type | |
---|---|---|
elapsed | number | Elapsed wait time |
remaining | number | Remaining wait time |
location | string | Specifies a location [origin|pickup] |
courier_name | string | A friendly identifier prominently visible on the courier |
code | string | The code to unlock the parcel compartment from the courier |
message | string | Additional details provided with the event |
Value | |
---|---|
pending | Delivery is created and awaiting courier assignment |
assigned | A courier has been assigned to fufill the delivery |
pickup_en_route | Courier is en-route to pickup location |
arrived_origin | Courier is waiting at pickup location |
origin_exception | An courier exception occurred at the origin location |
dropoff_en_route | Courier is en-route to destination location |
arrived_destination | Courier is waiting at destination location |
parcel_delivered | Courier is waiting at destination location |
destination_exception | An delivery exception occurred at the destination location |
completed | The delivery is finished at a final price has been billed |
By integrating webhooks, your application can listen for our platform events to trigger additional reactions in real-time, such as communicating with a customer or updating internal records.
Webhook endpoints are configured in your application settings per environment. Although this is a current list of all the events we send, be advised we may add more events at any time, so you should not assume that only these types exist.
Event | Description | Body |
---|---|---|
courier.pending | A delivery request was received and is now awaiting courier assignment | { id: Delivery.id } |
courier.assigned | A courier was assigned to your trip to carry your parcel | { id: Delivery.id, name: DeliveryUpdate.courier_name } |
courier.dispatched | Courier has departed en-route to the pickup location | { id: Delivery.id } |
courier.arriving_origin | Courier is approaching the pickup location within the provided ETA | { id: Delivery.id, eta: DeliveryUpdate.eta } |
courier.arrived_origin | Courier has arrived at the pickup location, unlock with the provided code | { id: Delivery.id, code: DeliveryUpdate.code } |
courier.waiting_announcement | Courier has arrived as is actively waiting (up to 30 minutes) | { id: Delivery.id, location: DeliveryUpdate.location, elapsed: DeliveryUpdate.elapsed, remaining: DeliveryUpdate.remaining } |
courier.departed_origin | Courier has departed the pickup location, now en-route to your destination | { id: Delivery.id } |
courier.arriving_destination | Courier is approaching the dropoff location within the provided ETA | { id: Delivery.id, eta: DeliveryUpdate.eta } |
courier.arrived_destination | Courier has arrived at the dropoff location, unlock with the provided code | { id: Delivery.id, code: DeliveryUpdate.code } |
courier.parcel_delivered | Courier has successfully delivered your parcel | { id: Delivery.id } |
courier.delivery_complete | The delivery is now complete | { id: Delivery.id } |
courier.delivery_failure | The delivery is unable to be completed; see details | { id: Delivery.id, message: DeliveryUpdate.message } |
exception.location_unreachable | A routing issue occurred and the courier is unable to reach the specified location | { id: Delivery.id, location: DeliveryUpdate.location, message: DeliveryUpdate.message } |
exception.destination_unreachable | A routing issue occurred and the courier is unable to reach the location | { id: Delivery.id, message: DeliveryUpdate.message } |
exception.contact_unreachable | Courier was unable to reach a contact for delivery | { id: Delivery.id, location: DeliveryUpdate.location, message: DeliveryUpdate.message } |
exception.delivery_ended | The delivery is unable to continue and the trip has ended; see details | { id: Delivery.id, message: DeliveryUpdate.message } |