---
title: "test"
description: "A pragmatic REST API for running a fleet of delightful hot dog stands: menus, orders, payments, inventory, loyalty, and webhooks."
url: "https://kongair.terwilligar.com/apis/hot-diggity-dog/docs/test"
image: "https://kongair.terwilligar.com/_og/d/c_Ocean.takumi,title_test,description_~QSBwcmFnbWF0aWMgUkVTVCBBUEkgZm9yIHJ1bm5pbmcgYSBmbGVldCBvZiBkZWxpZ2h0ZnVsIGhvdCBkb2cgc3RhbmRzOiBtZW51cywgb3JkZXJzLCBwYXltZW50cywgaW52ZW50b3J5LCBsb3lhbHR5LCBhbmQgd2ViaG9va3Mu,props_eyJ0aGVtZSI6eyJtb2RlIjoibGlnaHQiLCJjb2xvcnMiOnsicHJpbWFyeSI6IiNGRjAwMDAifX19,p_Ii9hcGlzL2hvdC1kaWdnaXR5LWRvZy9kb2NzL3Rlc3Qi,s_gBSoRZ8NmnVNcRJ7.png"
---

# Hot Dog Stand API

A pragmatic REST API for running a fleet of delightful hot dog stands: menus, orders, payments, inventory, loyalty, and webhooks.

## [Base URL](#base-url)

-   Production: `https://api.franks.io/v1`
-   Sandbox: `https://sandbox.api.franks.io/v1`

All requests use HTTPS. JSON only.

## [Versioning](#versioning)

-   URI based versioning. Example: `/v1/orders`
-   Backward compatible changes include new optional fields and new endpoints.

## [Authentication](#authentication)

-   Header: `Authorization: Bearer <api_key>`
-   Keys are scoped to an organization. Rotate keys regularly.
-   401 means the key is missing or invalid. 403 means the key is valid but lacks scope.

### [OAuth 2.0 (optional)](#oauth-20-optional)

-   Grant types: Client Credentials, Authorization Code with PKCE
-   Scopes: `orders:read`, `orders:write`, `menu:read`, `menu:write`, `payments:write`, `inventory:write`, `loyalty:write`

## [Idempotency](#idempotency)

-   Header: `Idempotency-Key: <uuid>` for POST, PUT, PATCH that modify state.
-   The server returns the same result for the same key within 24 hours.

## [Rate Limits](#rate-limits)

-   Default: 120 requests per minute per API key.
-   Response headers: `X-RateLimit-Limit`, `X-RateLimit-Remaining`, `X-RateLimit-Reset`.

## [Pagination](#pagination)

-   Cursor based.
-   Query params: `limit` (1..200), `cursor`.
-   Response fields: `next_cursor`, `previous_cursor`.

## [Errors](#errors)

```json
{
  "error": {
    "type": "validation_error",
    "message": "Quantity must be positive",
    "code": "QTY_POSITIVE",
    "docs_url": "https://api.franks.io/docs/errors#QTY_POSITIVE",
    "param": "items[0].quantity"
  }
}
```

-   Common types: `validation_error`, `authentication_error`, `authorization_error`, `rate_limit_error`, `conflict_error`, `not_found`.

---

## [Resources](#resources)

### [1) Stands](#_1-stands)

Represents a physical cart or kiosk.

**Object**

```json
{
  "id": "std_9xXk8",
  "name": "Union Square Cart",
  "status": "open",
  "timezone": "America/New_York",
  "address": {
    "line1": "14th St and Broadway",
    "city": "New York",
    "region": "NY",
    "postal_code": "10003",
    "country": "US"
  },
  "hours": [
    {"day": "mon", "open": "10:00", "close": "18:00"}
  ],
  "created_at": "2025-02-18T15:23:11Z",
  "updated_at": "2025-07-01T11:02:45Z"
}
```

**List stands**

```text
GET /stands?status=open&limit=50&cursor=...
```

**Retrieve a stand**

```text
GET /stands/{stand_id}
```

**Update a stand**

```text
PATCH /stands/{stand_id}
Content-Type: application/json
```

Body example:

```json
{"status":"closed"}
```

---

### [2) Menu Items](#_2-menu-items)

Individual products that can be ordered.

**Object**

```json
{
  "id": "mi_classic_dog",
  "stand_id": "std_9xXk8",
  "name": "Classic Dog",
  "description": "Beef hot dog in a toasted bun",
  "price": 450,
  "currenc
```