> ## Documentation Index
> Fetch the complete documentation index at: https://developers.xfaster.net/llms.txt
> Use this file to discover all available pages before exploring further.

# POS-hosted mode

> XFaster calls your POS: we pull your menu and push the full order to you.

In POS-hosted mode **XFaster calls your POS**, like the delivery apps you already know. You host two endpoints, and XFaster does the rest:

| You host | XFaster sends |
| - | - |
| `GET` your menu URL | Every N minutes and once a night, XFaster pulls the whole menu |
| `POST` your webhook URL | Every new or changed order, **with the full order inside** |

You can still call our API for order actions (accept, ready) and store control.

## 1. Your menu URL

Return the menu as JSON, in exactly the body format of [Import the menu](/restaurant/menu/import) (`categories`, `addons`, `items`). XFaster imports it with `mode: "full"`, so items you remove from your menu are switched off on XFaster.

```json theme={null}
{
  "categories": [{ "external_id": "CAT-PIZZA", "name": "פיצות", "position": 1 }],
  "addons": [{ "external_id": "ADD-OLIVES", "name": "זיתים", "price": 400, "available": true }],
  "items": [{ "external_id": "PIZZA-MARG", "category_external_id": "CAT-PIZZA", "name": "מרגריטה",
              "price": 5200, "available": true, "addon_external_ids": ["ADD-OLIVES"] }]
}
```

* **HTTPS only.** Answer `200` within **30 seconds**, at most **10 MB**. No redirects.
* **Interval:** from 15 minutes up, set by XFaster for your key, plus one pull every night.
* A failed pull (timeout, non-`200`, invalid JSON, a menu with no items) **changes nothing**. XFaster sees the error on the store's POS tab.
* Lines with errors are skipped and listed for XFaster. The rest is saved.

## 2. Your order endpoint

This is your [webhook](/basics/webhooks) URL. Each `POST` carries the event and the full `order`, the same object as [Get an order](/restaurant/orders/get), so you don't need a second call. Verify the signature and answer `2xx` within 5 seconds.

## Headers we send

| Header | On | Value |
| - | - | - |
| Your own headers | Menu pull and every webhook | Whatever you give XFaster, for example `Authorization: Bearer <your token>` or your tenant id |
| `X-XFaster-Store` | Menu pull | The XFaster store id |
| `X-XFaster-Event`, `X-XFaster-Event-Id`, `X-XFaster-Signature` | Webhooks | See [Webhooks](/basics/webhooks) |
| `Accept: application/json` | Menu pull | |

Your headers are stored encrypted and never shown again. They cannot replace `X-XFaster-*`, `Host` or `Content-*`.

## One URL for many stores

With an [integrator key](/basics/authentication#integrator-keys), XFaster pulls the menu once per linked store. Put `{store_id}` in your menu URL (`https://pos.example.com/xfaster/{store_id}/menu`) or read the `X-XFaster-Store` header.

## Turn it on

Send XFaster your menu URL, the headers to send and the interval you want. XFaster runs a dry-run pull first, so you see what would change before anything does.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.