Skip to main content

Quickstart

1. Create an API key​

  1. Sign in to the Seamless backoffice.
  2. Go to Settings, then System Settings, and find API keys.
  3. Choose Create API key. Give it a name, pick the sites it covers and tick what it can read.
  4. 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
}
}
}

Try it in the explorer

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.

Node.js 18 or later
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);
Python
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.