Copy page
Every hand-written page on this site has a plain-Markdown twin. You can copy the page you are reading with one click, fetch it by URL from a script, or hand the whole endpoint contract to an API client — no key required for any of it.
The Copy page button
Section titled “The Copy page button”At the top of each guide, next to the breadcrumb, there is a Copy page button. It fetches that page’s Markdown and puts it on your clipboard; the label turns into Copied when it lands. Paste it into a chat with an assistant, a ticket, or a design document.
What you get is the page’s own source: headings, tables, lists and every code sample, with a title and a one-line summary at the top. A few structural markers come through as written — tab groups and callouts keep their markup — which reads fine to a person and perfectly well to a model.
Markdown URLs
Section titled “Markdown URLs”The button is a convenience; the URL is the interface. Take the page’s path, put
/md in front and .md on the end:
| Page | Markdown |
|---|---|
/get-started/quickstart/ |
/md/get-started/quickstart.md |
/before-you-go-live/go-live-checklist/ |
/md/before-you-go-live/go-live-checklist.md |
/ (the home page) |
/md/index.md |
/th/get-started/quickstart/ |
/md/th/get-started/quickstart.md |
The Thai pages have twins too, at the same path under th/.
# One pagecurl -s https://api.scanfood.co/md/get-started/pagination-and-sync.md
# Save a few pages next to your projectfor page in get-started/quickstart get-started/errors before-you-go-live/go-live-checklist; do curl -s --create-dirs -o "docs/$page.md" "https://api.scanfood.co/md/$page.md"doneconst page = async (slug) => (await fetch(`https://api.scanfood.co/md/${slug}.md`)).text();
const context = ( await Promise.all([ page('get-started/authentication'), page('get-started/rate-limits'), page('before-you-go-live/go-live-checklist'), ])).join('\n\n---\n\n');import requests
def page(slug: str) -> str: res = requests.get(f"https://api.scanfood.co/md/{slug}.md", timeout=30) res.raise_for_status() return res.text
context = "\n\n---\n\n".join( page(slug) for slug in ( "get-started/authentication", "get-started/rate-limits", "before-you-go-live/go-live-checklist", ))Need everything at once rather than page by page? That is what llms.txt is for.
Importing the spec
Section titled “Importing the spec”The OpenAPI document behind the API Reference is public and needs no key:
https://api.scanfood.co/ext/v1/openapi.jsonIt is the same document the reference pages are generated from, which means an import gives you every endpoint, parameter and response field exactly as they are implemented.
Postman — Import → Link → paste the URL → Continue → Import. You get
a collection with all six endpoints. Then open the collection’s Authorization
tab, choose Bearer Token, and set the token to your key — Postman will send
Authorization: Bearer … on every request in the collection.
Insomnia — Import → URL → paste the URL → Scan → Import. Do the same for the key: set a Bearer token on the request group so every request inherits it.
Anything else that reads OpenAPI 3.1 — tools that build client code, API gateways, schema-aware editors — the URL is all they need.
Pasting into an assistant
Section titled “Pasting into an assistant”A prompt that works well:
Documentation for the API I am integrating with follows.Answer only from it; if it does not say, tell me it does not say.
<paste the Markdown here>
Question: how do I fetch every bill for one shop for last monthwithout exceeding the 31-day range limit?Two habits that save time:
- Give it the pages that matter, not everything. Authentication, pagination and the endpoint you are working on beats the whole site — a smaller context gets a sharper answer.
- Add the spec when field names are involved. The guides explain behaviour;
openapi.jsonis the authority on exactly what a response contains. Assistants that only get the prose will confidently invent a field.