Appearance
Locations
Locations represent physical restaurant sites where orders can be placed.
Get Location
Retrieve information about a specific location.
GET /v1/ecommerce/locations/{location}Authentication: None (Public)
Rate Limit: 100/min per IP
Path Parameters
| Parameter | Type | Description |
|---|---|---|
location | string | Location hashkey (e.g., loc_xxxxx) |
Response
json
{
"status": "success",
"data": {
"location_id": "loc_00000k1L2m3N4o5",
"name": "Downtown Austin",
"address": {
"street": "123 Main Street",
"city": "Austin",
"state": "TX",
"zip": "78701",
"country": "US"
},
"coordinates": {
"latitude": 30.2672,
"longitude": -97.7431
},
"phone": "(512) 555-0100",
"timezone": "America/Chicago",
"status": "active",
"order_types": ["dine-in", "takeout", "delivery", "drive-thru"],
"prep_time_minutes": 15,
"minimum_order": 10.00,
"delivery_settings": {
"radius_miles": 5,
"fee": 3.99,
"minimum_order": 15.00
}
}
}Response Fields
| Field | Type | Description |
|---|---|---|
location_id | string | Unique location identifier |
name | string | Display name |
address | object | Physical address |
coordinates | object | Latitude/longitude for mapping |
phone | string | Contact phone number |
timezone | string | IANA timezone identifier |
status | string | active or inactive |
order_types | array | Supported order types |
prep_time_minutes | integer | Default preparation time |
minimum_order | decimal | Minimum order amount |
delivery_settings | object | Delivery configuration |
Get Operating Hours
Retrieve the operating hours for a location.
GET /v1/ecommerce/locations/{location}/hoursAuthentication: None (Public)
Rate Limit: 100/min per IP
Response
json
{
"status": "success",
"data": {
"regular_hours": {
"monday": {"open": "06:00", "close": "22:00"},
"tuesday": {"open": "06:00", "close": "22:00"},
"wednesday": {"open": "06:00", "close": "22:00"},
"thursday": {"open": "06:00", "close": "22:00"},
"friday": {"open": "06:00", "close": "23:00"},
"saturday": {"open": "07:00", "close": "23:00"},
"sunday": {"open": "07:00", "close": "21:00"}
},
"holiday_hours": {
"2024-12-25": {"closed": true, "reason": "Christmas Day"},
"2024-12-31": {"open": "06:00", "close": "18:00", "reason": "New Year's Eve"}
},
"temporary_closures": [
{
"start": "2024-01-15T08:00:00Z",
"end": "2024-01-15T12:00:00Z",
"reason": "Staff meeting"
}
],
"timezone": "America/Chicago",
"is_open_now": true,
"next_open": null,
"next_close": "2024-01-15T22:00:00-06:00"
}
}Response Fields
| Field | Type | Description |
|---|---|---|
regular_hours | object | Weekly operating hours |
holiday_hours | object | Special hours by date |
temporary_closures | array | Scheduled closures |
timezone | string | Location timezone |
is_open_now | boolean | Current open status |
next_open | string | Next opening time (if closed) |
next_close | string | Next closing time (if open) |
Get Concepts
List all restaurant concepts available at a location.
GET /v1/ecommerce/locations/{location}/conceptsAuthentication: None (Public)
Rate Limit: 100/min per IP
Response
json
{
"status": "success",
"data": [
{
"concept_id": "con_00000a1B2c3D4e5",
"name": "Bistro Kitchen",
"description": "Fresh American cuisine with locally sourced ingredients",
"concept_type": "restaurant",
"logo_url": "https://cdn.retailsuccessplatform.com/logos/bistro-kitchen.png",
"hero_url": "https://cdn.retailsuccessplatform.com/heroes/bistro-kitchen.jpg",
"gallery_urls": [
"https://cdn.retailsuccessplatform.com/gallery/bistro-1.jpg",
"https://cdn.retailsuccessplatform.com/gallery/bistro-2.jpg"
],
"status": "active"
},
{
"concept_id": "con_00000f5G6h7I8j9",
"name": "Taco Corner",
"description": "Authentic Mexican street tacos",
"concept_type": "restaurant",
"logo_url": "https://cdn.retailsuccessplatform.com/logos/taco-corner.png",
"hero_url": "https://cdn.retailsuccessplatform.com/heroes/taco-corner.jpg",
"status": "active"
}
]
}Concept Fields
| Field | Type | Description |
|---|---|---|
concept_id | string | Unique concept identifier |
name | string | Display name |
description | string | Marketing description |
concept_type | string | Type of concept |
logo_url | string | Logo image URL |
hero_url | string | Hero/banner image URL |
gallery_urls | array | Additional images |
status | string | active or inactive |
Get Concept by Slug
Look up a restaurant concept by its URL-friendly slug.
GET /v1/ecommerce/concepts/by-slug/{slug}Authentication: None (Public)
Rate Limit: 100/min per IP
Path Parameters
| Parameter | Type | Description |
|---|---|---|
slug | string | Concept URL slug (e.g., bistro-kitchen) |
Response
json
{
"status": "success",
"data": {
"concept_id": "con_00000a1B2c3D4e5",
"slug": "bistro-kitchen",
"name": "Bistro Kitchen",
"description": "Fresh American cuisine with locally sourced ingredients",
"tagline": "Farm to table, fast.",
"brand_identity": {
"description": "Fresh American cuisine with locally sourced ingredients",
"tagline": "Farm to table, fast."
},
"logo": {
"url": "https://cdn.retailsuccessplatform.com/logos/bistro-kitchen.png",
"srcset": "https://cdn.retailsuccessplatform.com/logos/bistro-kitchen-400w.png 400w, ..."
},
"hero_image": {
"url": "https://cdn.retailsuccessplatform.com/heroes/bistro-kitchen.jpg",
"srcset": "https://cdn.retailsuccessplatform.com/heroes/bistro-kitchen-800w.jpg 800w, ..."
},
"locations": [
{
"location_id": "loc_00000k1L2m3N4o5",
"name": "Downtown Austin",
"address": "123 Main Street, Austin, TX 78701",
"phone": "(512) 555-0100",
"timezone": "America/Chicago"
}
]
}
}Response Fields
| Field | Type | Description |
|---|---|---|
concept_id | string | Unique concept identifier |
slug | string | URL-friendly slug |
name | string | Display name |
description | string | Marketing description |
tagline | string | Short tagline (nullable) |
brand_identity | object | Brand description and tagline |
logo | object | Logo image with url and responsive srcset |
hero_image | object | Hero banner with url and responsive srcset |
locations | array | Active locations offering this concept |
Error Response (404)
json
{
"status": "error",
"message": "Concept not found"
}Get Scheduling Config
Retrieve the order scheduling configuration for a location and concept. Use this to determine whether order-ahead is available and what dates can be scheduled.
GET /v1/ecommerce/locations/{location}/concepts/{concept}/scheduling-configAuthentication: None (Public)
Rate Limit: 100/min per IP
Path Parameters
| Parameter | Type | Description |
|---|---|---|
location | string | Location hashkey (e.g., loc_xxxxx) |
concept | string | Concept hashkey (e.g., con_xxxxx) |
Query Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
order_type | string | No | Filter available dates by order type (default: pickup) |
Response
json
{
"data": {
"enabled": true,
"order_ahead_days": 3,
"minimum_lead_time_minutes": 30,
"time_slot_interval_minutes": 15,
"enabled_order_types": ["pickup", "delivery"],
"available_dates": [
{
"date": "2024-01-16",
"day_name": "Tuesday",
"display": "Tomorrow",
"open": "10:00",
"close": "22:00"
},
{
"date": "2024-01-17",
"day_name": "Wednesday",
"display": "Wednesday",
"open": "10:00",
"close": "22:00"
}
]
}
}Response Fields
| Field | Type | Description |
|---|---|---|
enabled | boolean | Whether order scheduling is enabled |
order_ahead_days | integer | How many days ahead orders can be scheduled |
minimum_lead_time_minutes | integer | Minimum minutes before a scheduled order |
time_slot_interval_minutes | integer | Interval between available time slots |
enabled_order_types | array | Order types that support scheduling |
available_dates | array | Dates available for scheduling with operating hours |
Get Time Slots
Get available time slots for a specific date. Use this after retrieving the scheduling config to let customers pick a time.
GET /v1/ecommerce/locations/{location}/concepts/{concept}/time-slotsAuthentication: None (Public)
Rate Limit: 100/min per IP
Path Parameters
| Parameter | Type | Description |
|---|---|---|
location | string | Location hashkey (e.g., loc_xxxxx) |
concept | string | Concept hashkey (e.g., con_xxxxx) |
Query Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
date | string | Yes | Date in YYYY-MM-DD format |
order_type | string | Yes | pickup, delivery, dine_in, curbside, or takeout |
Response
json
{
"data": {
"date": "2024-01-16",
"timezone": "America/Chicago",
"slots": [
{
"time": "10:00",
"available": true,
"remaining_capacity": 5
},
{
"time": "10:15",
"available": true,
"remaining_capacity": 3
},
{
"time": "10:30",
"available": false,
"remaining_capacity": 0
}
]
}
}Response Fields
| Field | Type | Description |
|---|---|---|
date | string | The requested date |
timezone | string | IANA timezone for the location |
slots | array | Available time slots |
slots[].time | string | Slot time in HH:MM format (location timezone) |
slots[].available | boolean | Whether the slot can accept orders |
slots[].remaining_capacity | integer | How many more orders the slot can accept |
Notes
- Slots respect operating hours, blackout periods, and capacity limits
- For today's date, slots within the
minimum_lead_time_minuteswindow are excluded - If scheduling is disabled,
slotswill be empty andenabledwill befalse
Example: Display Location Selector
javascript
async function loadLocations(locationIds) {
const locations = await Promise.all(
locationIds.map(async (id) => {
const [info, hours] = await Promise.all([
fetch(`/api/v1/ecommerce/locations/${id}`).then(r => r.json()),
fetch(`/api/v1/ecommerce/locations/${id}/hours`).then(r => r.json()),
]);
return {
...info.data,
hours: hours.data,
};
})
);
return locations.filter(loc =>
loc.status === 'active' && loc.hours.is_open_now
);
}
// Display locations
const openLocations = await loadLocations(['loc_xxxxx', 'loc_yyyyy']);
openLocations.forEach(loc => {
console.log(`${loc.name} - Open until ${loc.hours.next_close}`);
});Changelog
| Date | Change |
|---|---|
| 2026-06-17 | Corrected response ID fields to the _id convention (location_id, concept_id). |
| 2026-03-14 | Added e-commerce API endpoints. |
| 2026-01-15 | Initial publication. |