List time slots for last mile delivery
POST /v2/fulfillment/users/{user_id}/service_options/cart/last_mile
Lists the available last mile delivery service options for the customer's location and cart details. In this context, service options are time slots, such as Today 4pm-6pm or Friday 9am-11am. Availability is based on current and anticipated shopper availability for the relevant store and delivery location.
By default, the time slots returned are immediate and scheduled time slots. If ETA options are enabled in your retailer configuration, you can retrieve ETA time slots instead of immediate time slots. To get a standard ETA time slot with the scheduled time slots, set the with_eta_options
field to true
. To also retrieve a priority ETA time slot, set the with_priority_eta_options
field to true
. For more information, see Retrieve an ETA time slot.
If the customer address is more than 30 minutes away from the selected store, the long_distance_delivery
flag is set to true
. You can deliver to this address if long distance delivery is enabled for the store. For more information, see Service areas for delivery.
After a time slot is selected, save the service_option_id
. You specify the ID when reserving the time slot.
This operation differs from preview service options in that the service enforces all the parameters necessary to return accurate, complete service options. Use this operation when the customer is ready to check out.
Security
Name | In | Description |
---|---|---|
Authorization | header | The Authorization header with the bearer token acquired during authentication. |
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
user_id | path | string | The ID of the user. |
Request
Field | Type | Required | Description |
---|---|---|---|
address | Address | The address of the user. | |
location_code | string | Location code of the store where the delivery driver picks up the order. | |
cart_total_cents | integer | The total value of all items for the order in cents. | |
items_count | integer | The number of different types of items in the order. | |
units_count | number | The number of all items, including multiples of an item, in the order. | |
earliest_option_start_at | string | The earliest time that an order can be ready for delivery. Only time slots that start after this time are retrieved. | |
with_eta_options | boolean | Returns ETA options instead of immediate options when true. For more information, contact your Instacart Representative. Defaults to false. | |
with_priority_eta_options | boolean | Returns Priority ETA options instead of immediate options when true. For more information, contact your Instacart Representative. Defaults to false. | |
with_handoff_time | boolean | Indicator whether the handoff time is calculated when fetching service option. Defaults to false. | |
desired_windows | Array(DesiredWindow) | The desired windows for service options. |
Address Object
Field | Type | Required | Description |
---|---|---|---|
address_line_1 | string | The first address line. | |
address_line_2 | string | The second address line. | |
address_type | string | The type of address, e.g., "residential". | |
postal_code | string | The postal/zip code of the address. |
DesiredWindow Object
Field | Type | Required | Description |
---|---|---|---|
starts_at | string | Start time of the desired window in ISO 8601 format. | |
ends_at | string | End time of the desired window in ISO 8601 format. |
Request examples
- cURL
- Java
- Python
- Go
curl --request POST \
--url 'https://connect.instacart.com/v2/fulfillment/users/{user_id}/service_options/cart/last_mile' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{
"address": {
"address_line_1": "string",
"address_line_2": "string",
"address_type": "string",
"postal_code": "string"
},
"location_code": "string",
"cart_total_cents": 1,
"items_count": 1,
"units_count": 1,
"earliest_option_start_at": "string",
"with_eta_options": true,
"with_priority_eta_options": true,
"with_handoff_time": true,
"desired_windows": [
{
"starts_at": "string",
"ends_at": "string"
}
]
}'
HttpResponse<String> response = Unirest.post("https://connect.instacart.com/v2/fulfillment/users/{user_id}/service_options/cart/last_mile")
.header("Accept", "application/json")
.header("Content-Type", "application/json")
.header("Authorization", "Bearer <token>")
.body("{\n \"address\": {\n \"address_line_1\": \"string\",\n \"address_line_2\": \"string\",\n \"address_type\": \"string\",\n \"postal_code\": \"string\"\n },\n \"location_code\": \"string\",\n \"cart_total_cents\": 1,\n \"items_count\": 1,\n \"units_count\": 1,\n \"earliest_option_start_at\": \"string\",\n \"with_eta_options\": true,\n \"with_priority_eta_options\": true,\n \"with_handoff_time\": true,\n \"desired_windows\": [\n {\n \"starts_at\": \"string\",\n \"ends_at\": \"string\"\n }\n ]\n}")
.asString();
import http.client
conn = http.client.HTTPSConnection("connect.instacart.com")
payload = "{\n \"address\": {\n \"address_line_1\": \"string\",\n \"address_line_2\": \"string\",\n \"address_type\": \"string\",\n \"postal_code\": \"string\"\n },\n \"location_code\": \"string\",\n \"cart_total_cents\": 1,\n \"items_count\": 1,\n \"units_count\": 1,\n \"earliest_option_start_at\": \"string\",\n \"with_eta_options\": true,\n \"with_priority_eta_options\": true,\n \"with_handoff_time\": true,\n \"desired_windows\": [\n {\n \"starts_at\": \"string\",\n \"ends_at\": \"string\"\n }\n ]\n}"
headers = {
'Accept': "application/json",
'Content-Type': "application/json",
'Authorization': "Bearer <token>"
}
conn.request("POST", "/v2/fulfillment/users/{user_id}/service_options/cart/last_mile", payload, headers)
res = conn.getresponse()
data = res.read()
print(data.decode("utf-8"))
package main
import (
"fmt"
"strings"
"net/http"
"io/ioutil"
)
func main() {
url := "https://connect.instacart.com/v2/fulfillment/users/{user_id}/service_options/cart/last_mile"
payload := strings.NewReader("{\n \"address\": {\n \"address_line_1\": \"string\",\n \"address_line_2\": \"string\",\n \"address_type\": \"string\",\n \"postal_code\": \"string\"\n },\n \"location_code\": \"string\",\n \"cart_total_cents\": 1,\n \"items_count\": 1,\n \"units_count\": 1,\n \"earliest_option_start_at\": \"string\",\n \"with_eta_options\": true,\n \"with_priority_eta_options\": true,\n \"with_handoff_time\": true,\n \"desired_windows\": [\n {\n \"starts_at\": \"string\",\n \"ends_at\": \"string\"\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Accept", "application/json")
req.Header.Add("Content-Type", "application/json")
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := ioutil.ReadAll(res.Body)
fmt.Println(res)
fmt.Println(string(body))
}
Response
Field | Type | Required | Description |
---|---|---|---|
service_options | Array(ServiceOption) | The returned service options. |
ServiceOption Object
Field | Type | Required | Description |
---|---|---|---|
id | integer | The ID of the service option. | |
service_option_reference | string | The reference of the service option. | |
date | string | The date the service will take place in ISO 8601 format. | |
handoff_time | string | The ETA for shopper to arrive at store. | |
window | Window | The time window when the service will take place. | |
availability | OptionAvailability | The availability of this service option. |
OptionAvailability Object
Field | Type | Required | Description |
---|---|---|---|
available | boolean | Indicates if this service option is available for the user. | |
reasons | Array(string) | The reasons for unavailability of a service option. Currently, the reasons are related to the laws governing the sale of alcohol. For example, restrictions on quantity, delivery time, pickup, and matched city and county of stores and customers. The reasons are subject to change without notice. | |
item_codes | Array(string) | The item codes which caused the option to be unavailable. |
Window Object
One of the following:
Field | Type | Required | Description |
---|---|---|---|
start_at | string | The start of the delivery window in ISO 8601 format. | |
end_at | string | The end of the delivery window in ISO 8601 format. | |
type | string | The type of service option. One of 'scheduled', 'eta' (contact your Instacart Connect representative), or 'asap' (contact your Instacart Connect representative). | |
asap | boolean | Indicates if delivery will happen as soon as possible. Only true when type is asap. |
or
Field | Type | Required | Description |
---|---|---|---|
immediate_hour | integer | Indicates the number of hours after order creation that delivery will occur. | |
type | string | Indicates this is an immediate option. Defaults to immediate. |
Reasons for unavailability of a service option
Reason | Description |
---|---|
Unmatched city and county | The city and county of the store and customer must match. |
Response examples
200 Success
200
Service options returned by attributes200
Handoff time is returned for ETA option
{
"service_options": [
{
"id": 40,
"service_option_reference": "ezppZD0-NDAsIDp0eXBlPT4iU2NoZWR1bGVkRGVsaXZlcnlPcHRpb24iLCA6d2luZG93PT48SW5zdGFjYXJ0OjpFbnRlcnByaXNlOjpCb2JhOjpDb3JlOjpUeXBlczo6VjE6OlNlcnZpY2VPcHRpb25TY2hlZHVsZWRXaW5kb3c6IGRlc2NyaXB0b3I6ICIiLCBzdGFydF9hdDogPEdvb2dsZTo6UHJvdG9idWY6OlRpbWVzdGFtcDogc2Vjb25kczogMTUxOTI1NzYwMCwgbmFub3M6IDA-LCBlbmRfYXQ6IDxHb29nbGU6OlByb3RvYnVmOjpUaW1lc3RhbXA6IHNlY29uZHM6IDE1MTkyNjQ4MDAsIG5hbm9zOiAwPj59",
"date": "2018-02-22",
"window": {
"start_at": "2018-02-22T00:00:00Z",
"end_at": "2018-02-22T02:00:00Z",
"type": "scheduled",
"asap": false
},
"availability": {
"available": true,
"reasons": [],
"item_codes": []
}
}
]
}
{
"service_options": [
{
"id": 41,
"service_option_reference": "ezppZD0-NDEsIDp0eXBlPT4iRXRhRGVsaXZlcnlPcHRpb24iLCA6d2luZG93PT48SW5zdGFjYXJ0OjpFbnRlcnByaXNlOjpCb2JhOjpDb3JlOjpUeXBlczo6VjE6OlNlcnZpY2VPcHRpb25TY2hlZHVsZWRXaW5kb3c6IGRlc2NyaXB0b3I6ICIiLCBlbmRfYXQ6IDxHb29nbGU6OlByb3RvYnVmOjpUaW1lc3RhbXA6IHNlY29uZHM6IDE1MTkyNjQ4MDAsIG5hbm9zOiAwPj59",
"date": "2018-02-22",
"handoff_time": "2018-02-22T00:30:00Z",
"window": {
"start_at": "2018-02-22T00:00:00Z",
"end_at": "2018-02-22T02:00:00Z",
"type": "eta",
"asap": false
},
"availability": {
"available": true,
"reasons": [],
"item_codes": []
}
}
]
}
4XX Errors
Error responses return either a single error or multiple errors.
HTTP Code | Cause | Error Message | Error Code | Error Meta |
---|---|---|---|---|
400 | Handoff time is requested but not configured | "Handoff time calculation is not configured for this retailer." | 1001 | {"key":"with_handoff_time"} |
400 | Invalid location code | "Specified store is not available for lastmile." | 1001 | {"key":"location_code"} |
400 | No stores found | "No store location found for given address." | 1001 | Not applicable |
400 | Cannot deliver to address | "Unfortunately, we cannot deliver to that area." | 1001 | {"key":"address"} |
400 | Store does not support delivery to address | "We do not currently support delivery from this store to the selected address." | 1001 | {"key":"address"} |
404 | Resource not found | "Resource not found" | 4000 | Not applicable |