{"title":"Bookey API","version":"v1","base_url":"https://bookeypro.com","authentication":{"schemes":["session Bearer","API token Bearer"],"api_token_prefix":"bey_","header":"Authorization: Bearer <token>"},"scopes":["sales.read","sales.write","inventory.read","inventory.write","receipts.read","receipts.ingest","banking.read","banking.write"],"scope_catalog":[{"id":"sales.read","label":"Sales read","detail":"List tickets and hourly sales. Does not post tickets or sync Clover."},{"id":"sales.write","label":"Sales write","detail":"Create sales tickets. Includes sales.read. Never syncs Clover or loads sample data."},{"id":"inventory.read","label":"Inventory read","detail":"Read stock, locations, and movement. Does not receive, transfer, or waste."},{"id":"inventory.write","label":"Inventory write","detail":"Create items and post receive / transfer / waste. Includes inventory.read."},{"id":"receipts.read","label":"Receipts read","detail":"List and fetch expense receipts and images. Does not upload or approve."},{"id":"receipts.ingest","label":"Receipts ingest","detail":"Upload JPEG / PNG / PDF and poll the OCR job. Includes receipts.read. Never approve, reject, or post to QuickBooks."},{"id":"banking.read","label":"Banking feed read","detail":"List bac_ accounts and btx_ feed transactions. Not the QBO ledger."},{"id":"banking.write","label":"Banking feed write","detail":"Register accounts, ingest feed lines, match or ignore. Includes banking.read. Unchecked by default. Never a QBO Banking Match write."}],"expiry_choices":[30,90,365],"sections":[{"id":"authentication","title":"Authentication","body":"Send `Authorization: Bearer <token>` on every JSON call. A user session from `/api/v1/auth/login` works for people. Unattended POS and warehouse clients must use a Bookey API token that starts with `bey_`. Cookie sessions still need `X-CSRF-Token`; Bearer skips CSRF. API tokens work only on `/api/v1/…` — they cannot open Settings or mint other tokens."},{"id":"issuance","title":"Issuance","body":"Owner or admin issues a token from Settings → API or `POST /api/v1/developer/tokens` with a name, scopes, and expiry (30 / 90 / 365 days). Bookey shows the secret once. Copy it into the POS or vault immediately. At most 20 active tokens per workspace."},{"id":"roles","title":"Roles and scopes","body":"People keep Bookey roles (owner, admin, accountant, member). Tokens do not inherit a human role. Each token has scopes only — sales.read / sales.write / inventory.read / inventory.write / receipts.read / receipts.ingest / banking.read / banking.write. Write or ingest implies the matching read. A stolen sales or ingest token cannot open QuickBooks, billing, Team, or approve receipts."},{"id":"revoke","title":"Revoke","body":"Revoke from Settings → API or `POST /api/v1/developer/tokens/{id}/revoke`. The secret stops working on the next request. Revoke immediately if a device is lost or a contractor leaves. The row is archived and leaves Settings → API. Bookey never shows the secret again."},{"id":"renew","title":"Renew","body":"Renew rotates the secret in place (`POST /api/v1/developer/tokens/{id}/renew`). The old secret dies immediately. The same token id and scopes stay. Expiry restarts from now using 90 days unless you pass another allowed value. Update the POS before you renew, then paste the new secret."},{"id":"expiry","title":"Expiry","body":"Every token expires. Allowed lifetimes are 30, 90, or 365 days — there is no forever token. Expired secrets return 401. Renew before the date, or issue a replacement and revoke the old one."}],"endpoints":[{"method":"GET","path":"/api/v1/developer","scope":"session · owner/admin","accepts":"No body. Session Bearer only — API tokens cannot mint tokens.","detail":"Specification plus the token list (prefix only).","example_label":"curl","example":"curl -s https://bookeypro.com/api/v1/developer \\\n  -H \"Authorization: Bearer $SESSION\""},{"method":"POST","path":"/api/v1/developer/tokens","scope":"session · owner/admin","accepts":"JSON: name, scopes[] (sales / inventory / receipts), expires_in_days (30 / 90 / 365).","detail":"Issue a token. Secret returned once.","example_label":"JSON body","example":"{\n  \"name\": \"Kitchen POS\",\n  \"scopes\": [\"sales.write\", \"receipts.ingest\"],\n  \"expires_in_days\": 90\n}"},{"method":"POST","path":"/api/v1/developer/tokens/{id}/renew","scope":"session · owner/admin","accepts":"path id. Optional JSON expires_in_days. Session Bearer only.","detail":"Rotate the secret. Old Bearer dies immediately."},{"method":"POST","path":"/api/v1/developer/tokens/{id}/revoke","scope":"session · owner/admin","accepts":"path id. No body. Session Bearer only.","detail":"Revoke immediately. The secret dies; the row is archived and leaves the Tokens list."},{"method":"POST","path":"/api/v1/receipts/upload","scope":"receipts.ingest","accepts":"multipart field file — JPEG, PNG, or PDF. One file per request.","detail":"Store the image, start OCR, land in pending_review. Returns a job. Poll GET /api/v1/jobs/{id}. SHA256 duplicate is not a new receipt. Not JSON. Does not approve or post to QBO.","example_label":"curl","example":"curl -s https://bookeypro.com/api/v1/receipts/upload \\\n  -H \"Authorization: Bearer $BOOKEY_TOKEN\" \\\n  -F \"file=@lunch.jpg;type=image/jpeg\""},{"method":"GET","path":"/api/v1/jobs/{id}","scope":"receipts.ingest","accepts":"path id from the upload response. No body.","detail":"Poll upload/OCR progress. When done, the receipt is in the expense queue.","example_label":"curl","example":"curl -s https://bookeypro.com/api/v1/jobs/{id} \\\n  -H \"Authorization: Bearer $BOOKEY_TOKEN\""},{"method":"GET","path":"/api/v1/receipts","scope":"receipts.read","accepts":"query state (all, pending_review, …) and limit (1–100). No body.","detail":"Expense queue. Not sales tickets. Filter with state=pending_review.","example_label":"curl","example":"curl -s \"https://bookeypro.com/api/v1/receipts?state=pending_review&limit=20\" \\\n  -H \"Authorization: Bearer $BOOKEY_TOKEN\""},{"method":"GET","path":"/api/v1/receipts/{id}","scope":"receipts.read","accepts":"path id. No body.","detail":"One receipt after OCR: vendor, amounts, tax, lines, state.","example_label":"curl","example":"curl -s https://bookeypro.com/api/v1/receipts/{id} \\\n  -H \"Authorization: Bearer $BOOKEY_TOKEN\""},{"method":"GET","path":"/api/v1/receipts/evidence","scope":"receipts.read","accepts":"optional query from and to (YYYY-MM-DD). Omit both for every stored file.","detail":"Stored JPEG / PNG / PDF files. One file downloads as itself. Two or more are a zip that Bookey deletes after the download.","example_label":"curl","example":"curl -sO -J \"https://bookeypro.com/api/v1/receipts/evidence\" \\\n  -H \"Authorization: Bearer $BOOKEY_TOKEN\""},{"method":"GET","path":"/api/v1/receipts/{id}/image","scope":"receipts.read","accepts":"path id. Returns the stored file bytes, not JSON.","detail":"Original JPEG / PNG / PDF. Use after list or get.","example_label":"curl","example":"curl -sO https://bookeypro.com/api/v1/receipts/{id}/image \\\n  -H \"Authorization: Bearer $BOOKEY_TOKEN\""},{"method":"POST","path":"/api/v1/sales/tickets","scope":"sales.write","accepts":"JSON object. Decimal strings. amount is pre-tax.","detail":"Create one sales ticket. Same external_id + body is idempotent. Never the expense queue.","example_label":"JSON body","example":"{\n  \"external_id\": \"pos-123\",\n  \"occurred_at\": \"2026-09-08T14:32:00Z\",\n  \"currency\": \"CAD\",\n  \"amount\": \"10.00\",\n  \"tax\": \"1.50\",\n  \"tip\": \"2.00\",\n  \"tender\": \"card\",\n  \"store\": \"Store 1\",\n  \"pos\": \"2\",\n  \"lines\": [\n    {\"external_id\": \"line-1\", \"name\": \"Latte\", \"quantity\": \"2\", \"unit_price\": \"5.00\", \"line_total\": \"10.00\"}\n  ]\n}"},{"method":"GET","path":"/api/v1/sales","scope":"sales.read","accepts":"query from and to (YYYY-MM-DD). No body.","detail":"List tickets for a date range.","example_label":"curl","example":"curl -s \"https://bookeypro.com/api/v1/sales?from=2026-09-01&to=2026-09-30\" \\\n  -H \"Authorization: Bearer $BOOKEY_TOKEN\""},{"method":"GET","path":"/api/v1/inventory","scope":"inventory.read","accepts":"No body. Feature flag inventory must be on.","detail":"Stock snapshot, locations, and movement.","example_label":"curl","example":"curl -s https://bookeypro.com/api/v1/inventory \\\n  -H \"Authorization: Bearer $BOOKEY_TOKEN\""},{"method":"POST","path":"/api/v1/inventory/items","scope":"inventory.write","accepts":"JSON: sku, name. Optional item_type, base_uom, reorder_point. Not a stock movement.","detail":"Create a catalog item.","example_label":"JSON body","example":"{\n  \"sku\": \"BEANS-1KG\",\n  \"name\": \"Coffee beans\",\n  \"base_uom\": \"KG\"\n}"},{"method":"POST","path":"/api/v1/inventory/receive","scope":"inventory.write","accepts":"JSON. idempotency_key required. sku or item_id, quantity, location_id or location_slug.","detail":"Receive stock. Replay of the same key does not double qty.","example_label":"JSON body","example":"{\n  \"idempotency_key\": \"recv-2026-09-08-1\",\n  \"sku\": \"BEANS-1KG\",\n  \"quantity\": \"12\",\n  \"location_slug\": \"central_kitchen\"\n}"},{"method":"POST","path":"/api/v1/inventory/transfers","scope":"inventory.write","accepts":"JSON. idempotency_key, from_location_id or from_location_slug, to_*, lines[] with sku or item_id and quantity.","detail":"Transfer between locations.","example_label":"JSON body","example":"{\n  \"idempotency_key\": \"xfer-2026-09-08-1\",\n  \"from_location_slug\": \"central_kitchen\",\n  \"to_location_slug\": \"store_1\",\n  \"lines\": [{\"sku\": \"BEANS-1KG\", \"quantity\": \"2\"}]\n}"},{"method":"POST","path":"/api/v1/inventory/adjust","scope":"inventory.write","accepts":"JSON. idempotency_key, sku or item_id, quantity, location_id or location_slug, reason.","detail":"Record waste.","example_label":"JSON body","example":"{\n  \"idempotency_key\": \"waste-2026-09-08-1\",\n  \"sku\": \"BEANS-1KG\",\n  \"quantity\": \"0.25\",\n  \"location_slug\": \"central_kitchen\",\n  \"reason\": \"spill\"\n}"},{"method":"POST","path":"/api/v1/banking/accounts","scope":"banking.write","accepts":"JSON: name, account_kind (bank or card). Optional currency, last4, institution, nickname.","detail":"Register a bac_ bank or card account. last4 only — never a full PAN.","example_label":"JSON body","example":"{\n  \"name\": \"Visa ops\",\n  \"account_kind\": \"card\",\n  \"currency\": \"CAD\",\n  \"last4\": \"9195\"\n}"},{"method":"GET","path":"/api/v1/banking/accounts","scope":"banking.read","accepts":"query active=1, limit, offset. No body.","detail":"List Bookey feed accounts. Not QBO ledger accounts.","example_label":"curl","example":"curl -s https://bookeypro.com/api/v1/banking/accounts \\\n  -H \"Authorization: Bearer $BOOKEY_TOKEN\""},{"method":"POST","path":"/api/v1/banking/feed/transactions","scope":"banking.write","accepts":"JSON. account_id plus transactions[]. amount is a signed decimal string.","detail":"Batch upsert btx_ lines. Same external_id + body is exists. Different body is conflict. Soft lookalikes stay and are flagged.","example_label":"JSON body","example":"{\n  \"account_id\": \"bac_…\",\n  \"transactions\": [{\n    \"external_id\": \"visa-1001\",\n    \"booked_on\": \"2026-09-08\",\n    \"amount\": \"-42.50\",\n    \"currency\": \"CAD\",\n    \"payee\": \"Costco\",\n    \"last4\": \"9195\"\n  }]\n}"},{"method":"GET","path":"/api/v1/banking/feed/transactions","scope":"banking.read","accepts":"query from, to, account_id, unmatched=1, duplicate, limit, offset.","detail":"List API-feed rows. Do not send these to GET /api/v1/banking/transactions.","example_label":"curl","example":"curl -s \"https://bookeypro.com/api/v1/banking/feed/transactions?from=2026-09-01&to=2026-09-30&unmatched=1\" \\\n  -H \"Authorization: Bearer $BOOKEY_TOKEN\""},{"method":"POST","path":"/api/v1/banking/feed/transactions/{id}/match","scope":"banking.write","accepts":"JSON: receipt_id. Session or banking.write token.","detail":"Link a btx_ line to a receipt and stamp Banking cleared (API feed). Not Bank matched.","example_label":"JSON body","example":"{\n  \"receipt_id\": \"RECEIPT_ID\"\n}"}],"errors":[{"status":400,"meaning":"Validation failed"},{"status":401,"meaning":"Missing, expired, or revoked token"},{"status":403,"meaning":"Scope or role cannot do that"},{"status":404,"meaning":"Add-on off, or unknown id"},{"status":409,"meaning":"Idempotency or id conflict"}],"rules":["Never log the full token or store the plaintext after issuance.","Partners post Bookey JSON, not BFDP envelopes.","Tickets never enter the expense receipt queue.","Receipt upload is a file, not JSON. Approve / reject / QBO post stay human.","Clover sync stays a Clover connection — API tokens cannot call /sales/sync."],"quickstart":"curl -s https://bookeypro.com/api/v1/sales \\\n  -H \"Authorization: Bearer $BOOKEY_TOKEN\"","json_example":"{\n  \"external_id\": \"pos-123\",\n  \"occurred_at\": \"2026-09-08T14:32:00Z\",\n  \"currency\": \"CAD\",\n  \"amount\": \"10.00\",\n  \"tax\": \"1.50\",\n  \"tip\": \"2.00\",\n  \"tender\": \"card\",\n  \"store\": \"Store 1\",\n  \"pos\": \"2\",\n  \"lines\": [\n    {\"external_id\": \"line-1\", \"name\": \"Latte\", \"quantity\": \"2\", \"unit_price\": \"5.00\", \"line_total\": \"10.00\"}\n  ]\n}","browse":[{"id":"receipts","title":"Receipts","blurb":"Upload a picture, poll OCR, list the expense queue."},{"id":"sales","title":"Sales","blurb":"Post tickets and list a day. Never the expense queue."},{"id":"inventory","title":"Inventory","blurb":"Items, receive, transfer, and waste with idempotency keys."},{"id":"banking","title":"Banking feed","blurb":"bac_ accounts and btx_ card/bank lines. Not QBO For review."},{"id":"authentication","title":"Tokens","blurb":"bey_ Bearer, scopes, and 30 / 90 / 365 day expiry."}],"groups":[{"id":"developer","title":"Developer","prefixes":["/api/v1/developer"],"endpoints":[{"method":"GET","path":"/api/v1/developer","scope":"session · owner/admin","accepts":"No body. Session Bearer only — API tokens cannot mint tokens.","detail":"Specification plus the token list (prefix only).","example_label":"curl","example":"curl -s https://bookeypro.com/api/v1/developer \\\n  -H \"Authorization: Bearer $SESSION\""},{"method":"POST","path":"/api/v1/developer/tokens","scope":"session · owner/admin","accepts":"JSON: name, scopes[] (sales / inventory / receipts), expires_in_days (30 / 90 / 365).","detail":"Issue a token. Secret returned once.","example_label":"JSON body","example":"{\n  \"name\": \"Kitchen POS\",\n  \"scopes\": [\"sales.write\", \"receipts.ingest\"],\n  \"expires_in_days\": 90\n}"},{"method":"POST","path":"/api/v1/developer/tokens/{id}/renew","scope":"session · owner/admin","accepts":"path id. Optional JSON expires_in_days. Session Bearer only.","detail":"Rotate the secret. Old Bearer dies immediately."},{"method":"POST","path":"/api/v1/developer/tokens/{id}/revoke","scope":"session · owner/admin","accepts":"path id. No body. Session Bearer only.","detail":"Revoke immediately. The secret dies; the row is archived and leaves the Tokens list."}]},{"id":"receipts","title":"Receipts","prefixes":["/api/v1/receipts","/api/v1/jobs"],"endpoints":[{"method":"POST","path":"/api/v1/receipts/upload","scope":"receipts.ingest","accepts":"multipart field file — JPEG, PNG, or PDF. One file per request.","detail":"Store the image, start OCR, land in pending_review. Returns a job. Poll GET /api/v1/jobs/{id}. SHA256 duplicate is not a new receipt. Not JSON. Does not approve or post to QBO.","example_label":"curl","example":"curl -s https://bookeypro.com/api/v1/receipts/upload \\\n  -H \"Authorization: Bearer $BOOKEY_TOKEN\" \\\n  -F \"file=@lunch.jpg;type=image/jpeg\""},{"method":"GET","path":"/api/v1/jobs/{id}","scope":"receipts.ingest","accepts":"path id from the upload response. No body.","detail":"Poll upload/OCR progress. When done, the receipt is in the expense queue.","example_label":"curl","example":"curl -s https://bookeypro.com/api/v1/jobs/{id} \\\n  -H \"Authorization: Bearer $BOOKEY_TOKEN\""},{"method":"GET","path":"/api/v1/receipts","scope":"receipts.read","accepts":"query state (all, pending_review, …) and limit (1–100). No body.","detail":"Expense queue. Not sales tickets. Filter with state=pending_review.","example_label":"curl","example":"curl -s \"https://bookeypro.com/api/v1/receipts?state=pending_review&limit=20\" \\\n  -H \"Authorization: Bearer $BOOKEY_TOKEN\""},{"method":"GET","path":"/api/v1/receipts/{id}","scope":"receipts.read","accepts":"path id. No body.","detail":"One receipt after OCR: vendor, amounts, tax, lines, state.","example_label":"curl","example":"curl -s https://bookeypro.com/api/v1/receipts/{id} \\\n  -H \"Authorization: Bearer $BOOKEY_TOKEN\""},{"method":"GET","path":"/api/v1/receipts/evidence","scope":"receipts.read","accepts":"optional query from and to (YYYY-MM-DD). Omit both for every stored file.","detail":"Stored JPEG / PNG / PDF files. One file downloads as itself. Two or more are a zip that Bookey deletes after the download.","example_label":"curl","example":"curl -sO -J \"https://bookeypro.com/api/v1/receipts/evidence\" \\\n  -H \"Authorization: Bearer $BOOKEY_TOKEN\""},{"method":"GET","path":"/api/v1/receipts/{id}/image","scope":"receipts.read","accepts":"path id. Returns the stored file bytes, not JSON.","detail":"Original JPEG / PNG / PDF. Use after list or get.","example_label":"curl","example":"curl -sO https://bookeypro.com/api/v1/receipts/{id}/image \\\n  -H \"Authorization: Bearer $BOOKEY_TOKEN\""}]},{"id":"sales","title":"Sales","prefixes":["/api/v1/sales"],"endpoints":[{"method":"POST","path":"/api/v1/sales/tickets","scope":"sales.write","accepts":"JSON object. Decimal strings. amount is pre-tax.","detail":"Create one sales ticket. Same external_id + body is idempotent. Never the expense queue.","example_label":"JSON body","example":"{\n  \"external_id\": \"pos-123\",\n  \"occurred_at\": \"2026-09-08T14:32:00Z\",\n  \"currency\": \"CAD\",\n  \"amount\": \"10.00\",\n  \"tax\": \"1.50\",\n  \"tip\": \"2.00\",\n  \"tender\": \"card\",\n  \"store\": \"Store 1\",\n  \"pos\": \"2\",\n  \"lines\": [\n    {\"external_id\": \"line-1\", \"name\": \"Latte\", \"quantity\": \"2\", \"unit_price\": \"5.00\", \"line_total\": \"10.00\"}\n  ]\n}"},{"method":"GET","path":"/api/v1/sales","scope":"sales.read","accepts":"query from and to (YYYY-MM-DD). No body.","detail":"List tickets for a date range.","example_label":"curl","example":"curl -s \"https://bookeypro.com/api/v1/sales?from=2026-09-01&to=2026-09-30\" \\\n  -H \"Authorization: Bearer $BOOKEY_TOKEN\""}]},{"id":"inventory","title":"Inventory","prefixes":["/api/v1/inventory"],"endpoints":[{"method":"GET","path":"/api/v1/inventory","scope":"inventory.read","accepts":"No body. Feature flag inventory must be on.","detail":"Stock snapshot, locations, and movement.","example_label":"curl","example":"curl -s https://bookeypro.com/api/v1/inventory \\\n  -H \"Authorization: Bearer $BOOKEY_TOKEN\""},{"method":"POST","path":"/api/v1/inventory/items","scope":"inventory.write","accepts":"JSON: sku, name. Optional item_type, base_uom, reorder_point. Not a stock movement.","detail":"Create a catalog item.","example_label":"JSON body","example":"{\n  \"sku\": \"BEANS-1KG\",\n  \"name\": \"Coffee beans\",\n  \"base_uom\": \"KG\"\n}"},{"method":"POST","path":"/api/v1/inventory/receive","scope":"inventory.write","accepts":"JSON. idempotency_key required. sku or item_id, quantity, location_id or location_slug.","detail":"Receive stock. Replay of the same key does not double qty.","example_label":"JSON body","example":"{\n  \"idempotency_key\": \"recv-2026-09-08-1\",\n  \"sku\": \"BEANS-1KG\",\n  \"quantity\": \"12\",\n  \"location_slug\": \"central_kitchen\"\n}"},{"method":"POST","path":"/api/v1/inventory/transfers","scope":"inventory.write","accepts":"JSON. idempotency_key, from_location_id or from_location_slug, to_*, lines[] with sku or item_id and quantity.","detail":"Transfer between locations.","example_label":"JSON body","example":"{\n  \"idempotency_key\": \"xfer-2026-09-08-1\",\n  \"from_location_slug\": \"central_kitchen\",\n  \"to_location_slug\": \"store_1\",\n  \"lines\": [{\"sku\": \"BEANS-1KG\", \"quantity\": \"2\"}]\n}"},{"method":"POST","path":"/api/v1/inventory/adjust","scope":"inventory.write","accepts":"JSON. idempotency_key, sku or item_id, quantity, location_id or location_slug, reason.","detail":"Record waste.","example_label":"JSON body","example":"{\n  \"idempotency_key\": \"waste-2026-09-08-1\",\n  \"sku\": \"BEANS-1KG\",\n  \"quantity\": \"0.25\",\n  \"location_slug\": \"central_kitchen\",\n  \"reason\": \"spill\"\n}"}]},{"id":"banking","title":"Banking feed","prefixes":["/api/v1/banking/accounts","/api/v1/banking/feed"],"endpoints":[{"method":"POST","path":"/api/v1/banking/accounts","scope":"banking.write","accepts":"JSON: name, account_kind (bank or card). Optional currency, last4, institution, nickname.","detail":"Register a bac_ bank or card account. last4 only — never a full PAN.","example_label":"JSON body","example":"{\n  \"name\": \"Visa ops\",\n  \"account_kind\": \"card\",\n  \"currency\": \"CAD\",\n  \"last4\": \"9195\"\n}"},{"method":"GET","path":"/api/v1/banking/accounts","scope":"banking.read","accepts":"query active=1, limit, offset. No body.","detail":"List Bookey feed accounts. Not QBO ledger accounts.","example_label":"curl","example":"curl -s https://bookeypro.com/api/v1/banking/accounts \\\n  -H \"Authorization: Bearer $BOOKEY_TOKEN\""},{"method":"POST","path":"/api/v1/banking/feed/transactions","scope":"banking.write","accepts":"JSON. account_id plus transactions[]. amount is a signed decimal string.","detail":"Batch upsert btx_ lines. Same external_id + body is exists. Different body is conflict. Soft lookalikes stay and are flagged.","example_label":"JSON body","example":"{\n  \"account_id\": \"bac_…\",\n  \"transactions\": [{\n    \"external_id\": \"visa-1001\",\n    \"booked_on\": \"2026-09-08\",\n    \"amount\": \"-42.50\",\n    \"currency\": \"CAD\",\n    \"payee\": \"Costco\",\n    \"last4\": \"9195\"\n  }]\n}"},{"method":"GET","path":"/api/v1/banking/feed/transactions","scope":"banking.read","accepts":"query from, to, account_id, unmatched=1, duplicate, limit, offset.","detail":"List API-feed rows. Do not send these to GET /api/v1/banking/transactions.","example_label":"curl","example":"curl -s \"https://bookeypro.com/api/v1/banking/feed/transactions?from=2026-09-01&to=2026-09-30&unmatched=1\" \\\n  -H \"Authorization: Bearer $BOOKEY_TOKEN\""},{"method":"POST","path":"/api/v1/banking/feed/transactions/{id}/match","scope":"banking.write","accepts":"JSON: receipt_id. Session or banking.write token.","detail":"Link a btx_ line to a receipt and stamp Banking cleared (API feed). Not Bank matched.","example_label":"JSON body","example":"{\n  \"receipt_id\": \"RECEIPT_ID\"\n}"}]}]}