OpenPOS API

Connect AI agents, POS clients, and integrations to restaurant data. Browse menus, place orders, and manage inventory through simple APIs.

REST

REST API

Standard HTTP endpoints. Use from any language, framework, or tool.

MCP

AI Agent Protocol

Tool-based access for Claude, ChatGPT, and other AI agents.

Quick Start

Get up and running in under a minute. No API key needed for public endpoints.

1. Browse Stores

bash
curl https://your-domain.com/api/v1/stores

2. Get a Menu

bash
curl https://your-domain.com/api/v1/stores/demo-restaurant/menu

3. Place an Order

bash
curl -X POST https://your-domain.com/api/v1/orders \
  -H "Content-Type: application/json" \
  -d '{
    "storeSlug": "demo-restaurant",
    "items": [{ "itemId": "item_xxx", "quantity": 2 }],
    "orderType": "pickup",
    "customer": { "name": "Alice", "phone": "555-1234" }
  }'

4. Check Order Status

bash
curl https://your-domain.com/api/v1/orders/DT-001

Want more access? Create an API key in your Dashboard > Settings > API to access customers, reservations, waitlist, campaigns, and more.

Authentication

Public endpoints (stores, menus, ordering) work without authentication. For admin-level access, use an API key.

Creating an API Key

  1. Go to Dashboard > Settings > API
  2. Click Create API Key
  3. Choose a name and access level (Read Only or Read & Write)
  4. Copy the key — it's only shown once

Using Your Key

Pass the key in the Authorization header:

bash
curl -H "Authorization: Bearer sk_abc123..." \
  https://your-domain.com/api/v1/customers?query=alice

Scopes

API keys have scopes that control what they can access:

ScopeAccess
readBrowse stores, menus, orders, customers. Default scope.
writePlace orders, update inventory (86 items), modify data. Must be explicitly granted.
orders:readRead order data only.
orders:writeCreate and modify orders.
menu:readRead menu data only.
menu:writeUpdate menu items, 86/un-86 items.
customers:readSearch and read customer data.

Security: API keys are hashed server-side (SHA-256). We never store the raw key. If you lose a key, revoke it and create a new one.

Rate Limits

Default limits are 60 requests/minute and 10,000 requests/day. Response headers tell you where you stand:

HeaderDescription
X-RateLimit-LimitRequests allowed per window
X-RateLimit-RemainingRequests remaining in current window
X-RateLimit-ResetUnix timestamp when the window resets
Retry-AfterSeconds to wait (only included on 429 responses)

When rate limited, you'll receive a 429 Too Many Requests response. Wait for the Retry-After duration before retrying.

REST API

Standard HTTP endpoints. All responses are JSON. Prices are in cents.

Public Endpoints

No authentication required.

List all restaurant locations.

Store details: hours, address, order types, and policies.

Full menu with prices, categories, dietary info, and modifiers.

Place a new order.

Get order status and details.

Authenticated Endpoints

Require an API key with appropriate scope.

Search customers by name, phone, or email.

List reservations for a location.

Get the current waitlist queue.

List restaurant tables and their status.

List marketing campaigns.

List customer segments.

Get AI-generated business insights.

MCP (AI Agent Protocol)

The Model Context Protocol endpoint lets AI agents call tools directly. Claude, ChatGPT, and other LLMs can connect to OpenPOS as a tool provider.

Endpoint

POST /api/mcpAuthorization: Bearer sk_xxx

How It Works

Send JSON-RPC style requests. Two methods are supported:

List Tools

bash
curl -X POST https://your-domain.com/api/mcp \
  -H "Authorization: Bearer sk_abc123..." \
  -H "Content-Type: application/json" \
  -d '{ "method": "tools/list" }'

Call a Tool

bash
curl -X POST https://your-domain.com/api/mcp \
  -H "Authorization: Bearer sk_abc123..." \
  -H "Content-Type: application/json" \
  -d '{
    "method": "tools/call",
    "params": {
      "name": "get_menu",
      "arguments": { "storeSlug": "demo-restaurant" }
    }
  }'

Discovery (No Auth)

GET the MCP endpoint to discover available tools without authentication:

bash
curl https://your-domain.com/api/mcp

Available Tools

get_storesread

List all available restaurant locations. Returns store slugs needed for other operations.

get_store_inforead

Get detailed info for a store: hours, address, order types, policies.

storeSlugStore slug (from get_stores)
get_menuread

Full menu with items, prices, categories, dietary info, and modifiers.

storeSlugStore slug
category(optional) Filter by category
inStock(optional) Only available items
create_orderwrite

Place a new order with items, modifiers, and customer info.

storeSlugStore slug
items[{ itemId, quantity, modifiers }]
orderType"pickup" | "delivery" | "dine_in"
get_orderread

Check the status of an order by ID or order number.

orderIdOrder ID or number (e.g., "DT-001")
86_itemwrite

Mark a menu item as unavailable (sold out). Restaurant term: '86' means out of stock.

locationIdLocation ID
itemIdMenu item ID
un86_itemwrite

Restore a menu item to available (back in stock).

locationIdLocation ID
itemIdMenu item ID

Connect from Claude Desktop

Add this to your claude_desktop_config.json:

json
{
  "mcpServers": {
    "openpos": {
      "url": "https://your-domain.com/api/mcp",
      "headers": {
        "Authorization": "Bearer sk_your_api_key_here"
      }
    }
  }
}

Data Formats

FormatDetails
PricesAll prices in cents (integer). $14.99 = 1499. Responses include { cents, dollars, display } for convenience.
TimestampsISO 8601 with timezone, e.g., 2026-02-09T12:30:00Z
IDsPrefixed IDs: loc_xxx, item_xxx, order_xxx. Some endpoints also accept UUIDs.
DietaryArray of strings: vegetarian, vegan, gluten-free, dairy-free, etc.
AllergensArray of strings: dairy, nuts, gluten, shellfish, soy, eggs, etc.

Errors

All errors return JSON with an error field:

json
{ "error": "Missing or invalid API key" }
StatusMeaning
400Bad request — missing or invalid parameters
401Unauthorized — missing or invalid API key
403Forbidden — insufficient scope or location access
404Not found — resource doesn't exist
429Rate limited — too many requests. Check Retry-After header.
500Server error — please retry

OpenPOS API v1.0 — Built for AI agents, POS clients, and developers.