Quickstart
1. Create an API key
- Sign in to the Seamless backoffice.
- Go to Settings, then System Settings, and find API keys.
- Choose Create API key. Give it a name, pick the sites it covers and tick what it can read.
- Copy the key. It is shown once and cannot be retrieved later.
Keys start with k_live_. A key is as sensitive as a password, so keep it on your server and out of web pages and mobile apps.
2. Make a request
Send a POST with a JSON body containing your query. Replace YOUR_API_KEY with your key.
curl https://api.seamlesspos.com/graphql \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"query": "{ sites { id name currency timezone } }"}'
You get back the sites the key covers:
{
"data": {
"sites": [
{
"id": "66159dbc4cd289f22a12a7ba",
"name": "The Harbour Cafe",
"currency": "GBP",
"timezone": "Europe/London"
}
]
}
}
You can also paste your key into the API explorer and run queries from the browser.
3. Read some sales
All data is read through a site. If your key covers one site you can leave the site id out:
{
site {
name
orders(from: "2026-11-01T00:00:00Z", to: "2026-11-02T00:00:00Z") {
nodes {
number
businessDate
closedAt
total
items { name price }
payments { type amount }
}
nextCursor
}
}
}
If the key covers several sites, name the one you want: site(id: "66159dbc4cd289f22a12a7ba").
From code
The API needs no client library, so any HTTP client can call it.
const res = await fetch("https://api.seamlesspos.com/graphql", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.SEAMLESS_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
query: `query Orders($from: DateTime!, $to: DateTime!) {
site { orders(from: $from, to: $to) { nodes { number total } nextCursor } }
}`,
variables: { from: "2026-11-01T00:00:00Z", to: "2026-11-02T00:00:00Z" },
}),
});
const { data, errors } = await res.json();
if (errors) throw new Error(errors[0].message);
console.log(data.site.orders.nodes);
import os, requests
res = requests.post(
"https://api.seamlesspos.com/graphql",
headers={"Authorization": f"Bearer {os.environ['SEAMLESS_API_KEY']}"},
json={
"query": """query Orders($from: DateTime!, $to: DateTime!) {
site { orders(from: $from, to: $to) { nodes { number total } nextCursor } }
}""",
"variables": {"from": "2026-11-01T00:00:00Z", "to": "2026-11-02T00:00:00Z"},
},
)
body = res.json()
if body.get("errors"):
raise RuntimeError(body["errors"][0]["message"])
print(body["data"]["site"]["orders"]["nodes"])
Next
Conventions explains why amounts are in pence and what a business date is. Pagination covers reading more than one page, and orders and refunds describes the sales data in detail.