QuickCapture API

One endpoint.
Everything your business does.

QuickCapture is an intent-driven API. The payload describes what happened — the system determines and executes the appropriate action. Record expenses, create invoices, check profit, query receivables — all through one endpoint.

No need to model accounting systems. Just send what happened — in any language.

# Plain text

POST https://books.marathonbooks.app/api/v1/quickcapture

Authorization: Bearer mb_live_...

{
  "text": "Send $500 invoice to Mike for landscaping"
}

# Structured JSON

POST https://books.marathonbooks.app/api/v1/quickcapture

{
  "type": "invoice",
  "amount": 500,
  "customer": "Mike",
  "description": "landscaping"
}

Same result

{
  "success": true,
  "intent": "create_invoice_draft",
  "reply": "Invoice INV-0012 created for Mike — $500.00 for landscaping.",
  "language": "en",
  "link": {
    "url": "https://books.marathonbooks.app/i/a1b2c3...",
    "label": "View invoice"
  }
}

# Any language — same result

POST https://books.marathonbooks.app/api/v1/quickcapture

Spanish

{ "text": "Enviar factura de $500 a Mike por jardinería" }

Portuguese

{ "text": "Enviar fatura de $500 para Mike por paisagismo" }

Same structured output. No translation layer required.

Send it however you have it

Same endpoint, same result. Plain text for speed, JSON for precision, or both.

💬

Natural language mode

Send raw text in any language. Ideal for humans, messages, notes, OCR text, email bodies, ERP comment fields.

{ "text": "Paid Home Depot $120 for supplies" }

{ "text": "Pagué $120 por materiales en Home Depot" }

📋

Structured mode

Send JSON with typed fields. Ideal for ERP integrations, POS systems, invoicing tools, payroll systems.

{ "type": "expense", "amount": 120,
  "description": "Supplies", "vendor": "Home Depot" }
🔀

Hybrid mode

Send structured fields plus a freeform note. Best of both worlds — precision and context.

{ "type": "expense", "amount": 120,
  "vendor": "Home Depot",
  "text": "for the Martinez bathroom remodel" }

One endpoint handles all of this

The payload tells the system what to do. No different routes to call.

Record expense

expense

"Paid $300 for supplies at Home Depot"

Record income

income

"Got paid $1,200 from Martinez LLC"

Create invoice

invoice

"Send $500 invoice to Mike for landscaping"

Check profit

query

"How much profit this month?"

Check receivables

query

"Who owes me money?"

Check expenses

query

"What did I spend on supplies?"

Optional control layers

AI figures it out by default. Add these when you want more control.

Explicit intent

Skip AI classification — tell the system exactly what to do. Discover available intents via GET /api/v1/quickcapture with your API key.

{ "intent": "capture_expense",
  "text": "Paid $120 for supplies" }

Strict mode

Require an explicit intent — no AI guessing. For systems that need predictability.

{ "mode": "strict",
  "intent": "create_invoice_draft",
  "text": "Invoice Mike $500 for landscaping" }

Dry run

Preview what would happen without executing. See the detected intent and params before committing.

{ "dry_run": true,
  "text": "John paid me $500" }

Returns:

{ "dry_run": true,
  "detected_intent": "capture_income",
  "params": { "amount": 500, "counterparty_name": "John" },
  "would_execute": true }

Idempotency

Prevent duplicate processing. Same key = same result, no matter how many times you send it.

{ "idempotency_key": "txn_abc123",
  "text": "Paid $120 for supplies" }

Authentication

1. Create an API key

Generate an API key from your MarathonBooks dashboard under Settings. The key is shown once — save it securely.

2. Include it in every request

Authorization: Bearer mb_live_your_key_here

3. Send requests

curl -X POST https://books.marathonbooks.app/api/v1/quickcapture \
  -H "Authorization: Bearer mb_live_..." \
  -H "Content-Type: application/json" \
  -d '{"text": "Paid $45 for gas"}'

API Reference

POST/api/v1/quickcapture

Request body

Minimum required: { "text": "..." } — everything else is optional. Use strict mode + explicit intent for fully deterministic behavior.

FieldTypeDescription
textstringNatural language input
typestringexpense, income, invoice, query
amountnumberDollar amount
descriptionstringWhat it was for
vendorstringWho you paid
customerstringWho paid you / invoice recipient
intentstringExplicit intent (skip AI classification)
modestring“auto” (default) or “strict” (requires intent)
dry_runbooleanPreview without executing
idempotency_keystringPrevent duplicate processing

Success response

{
  "success": true,
  "intent": "create_invoice_draft",
  "reply": "Invoice INV-0012 created for Mike — $500.00.",
  "language": "en",
  "link": {
    "url": "https://books.marathonbooks.app/i/a1b2c3...",
    "label": "View invoice"
  }
}

Error response

{
  "success": false,
  "error": "Could not determine intent",
  "intent": null
}

HTTP 422 when intent can't be determined. 401 for invalid API key. 400 for missing input.

Integration ideas

POS systems

Pipe transactions from your point-of-sale directly into your books.

Zapier / Make.com

Connect any app to QuickCapture with no-code automations.

ERP systems

Send accounting events from your existing business software.

Email parsing

Forward receipt emails and let QuickCapture extract the data.

Chrome extensions

Build a "Send to QuickCapture" button for any web page.

Internal tools

Log business activity from your custom dashboards and scripts.

Global / multilingual

Your users send in their language. No translation layer needed — structured output every time.

Start sending business events
in minutes.

One API key. One endpoint. Send what happened — QuickCapture handles the rest.

Start sending business events