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

  • Production: https://api.franks.io/v1
  • Sandbox: https://sandbox.api.franks.io/v1

All requests use HTTPS. JSON only.

Versioning

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

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)

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

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

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

Pagination

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

Errors

{
  "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

1) Stands

Represents a physical cart or kiosk.

Object

{
  "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

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

Retrieve a stand

GET /stands/{stand_id}

Update a stand

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

Body example:

{"status":"closed"}

2) Menu Items

Individual products that can be ordered.

Object

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