Skip to content

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

ParameterTypeDescription
locationstringLocation 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

FieldTypeDescription
location_idstringUnique location identifier
namestringDisplay name
addressobjectPhysical address
coordinatesobjectLatitude/longitude for mapping
phonestringContact phone number
timezonestringIANA timezone identifier
statusstringactive or inactive
order_typesarraySupported order types
prep_time_minutesintegerDefault preparation time
minimum_orderdecimalMinimum order amount
delivery_settingsobjectDelivery configuration

Get Operating Hours

Retrieve the operating hours for a location.

GET /v1/ecommerce/locations/{location}/hours

Authentication: 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

FieldTypeDescription
regular_hoursobjectWeekly operating hours
holiday_hoursobjectSpecial hours by date
temporary_closuresarrayScheduled closures
timezonestringLocation timezone
is_open_nowbooleanCurrent open status
next_openstringNext opening time (if closed)
next_closestringNext closing time (if open)

Get Concepts

List all restaurant concepts available at a location.

GET /v1/ecommerce/locations/{location}/concepts

Authentication: 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

FieldTypeDescription
concept_idstringUnique concept identifier
namestringDisplay name
descriptionstringMarketing description
concept_typestringType of concept
logo_urlstringLogo image URL
hero_urlstringHero/banner image URL
gallery_urlsarrayAdditional images
statusstringactive 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

ParameterTypeDescription
slugstringConcept 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

FieldTypeDescription
concept_idstringUnique concept identifier
slugstringURL-friendly slug
namestringDisplay name
descriptionstringMarketing description
taglinestringShort tagline (nullable)
brand_identityobjectBrand description and tagline
logoobjectLogo image with url and responsive srcset
hero_imageobjectHero banner with url and responsive srcset
locationsarrayActive 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-config

Authentication: None (Public)

Rate Limit: 100/min per IP

Path Parameters

ParameterTypeDescription
locationstringLocation hashkey (e.g., loc_xxxxx)
conceptstringConcept hashkey (e.g., con_xxxxx)

Query Parameters

ParameterTypeRequiredDescription
order_typestringNoFilter 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

FieldTypeDescription
enabledbooleanWhether order scheduling is enabled
order_ahead_daysintegerHow many days ahead orders can be scheduled
minimum_lead_time_minutesintegerMinimum minutes before a scheduled order
time_slot_interval_minutesintegerInterval between available time slots
enabled_order_typesarrayOrder types that support scheduling
available_datesarrayDates 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-slots

Authentication: None (Public)

Rate Limit: 100/min per IP

Path Parameters

ParameterTypeDescription
locationstringLocation hashkey (e.g., loc_xxxxx)
conceptstringConcept hashkey (e.g., con_xxxxx)

Query Parameters

ParameterTypeRequiredDescription
datestringYesDate in YYYY-MM-DD format
order_typestringYespickup, 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

FieldTypeDescription
datestringThe requested date
timezonestringIANA timezone for the location
slotsarrayAvailable time slots
slots[].timestringSlot time in HH:MM format (location timezone)
slots[].availablebooleanWhether the slot can accept orders
slots[].remaining_capacityintegerHow 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_minutes window are excluded
  • If scheduling is disabled, slots will be empty and enabled will be false

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
DateChange
2026-06-17Corrected response ID fields to the _id convention (location_id, concept_id).
2026-03-14Added e-commerce API endpoints.
2026-01-15Initial publication.

ShopHero CommerceCore Platform