Agent-readable invoices and checkout links

Let accounts-payable assistants read what is owed as structured data from existing payer URLs

An accounts-payable assistant triaging a mailbox can read a RevKeen invoice or checkout link as structured data — no scraping, no new route, no new token, no new auth. This is a read capability: retrieving the representation moves no money.

The discriminator

Request the existing payer URL with Accept: application/json and without text/html:

curl -H "Accept: application/json" \
  https://pay.revkeen.com/i/INV_TOKEN

A browser navigation always accepts text/html, so pages keep rendering unchanged. Anything else asking for JSON gets the representation.

Discovery

A client that landed on HTML can discover the JSON the standard way — every invoice and checkout-link page sends:

Link: </i/INV_TOKEN>; rel="alternate"; type="application/json"

Agents that only render get the same facts from JSON-LD in the page head (schema.org Invoice on /i, Offer on /p).

Invoice representation (/i)

Amount, currency, issue and due dates, merchant, reference, line items, status, accepted rails, plus an agentPayable block:

{
  "success": true,
  "data": {
    "number": "INV-2026-0417",
    "status": "sent",
    "currency": "GBP",
    "totalCents": 5400,
    "amountDueCents": 5400,
    "dueDate": "2026-08-30T00:00:00.000Z",
    "client": { "name": "Islands Wellness" },
    "lineItems": [],
    "agentPayable": { "enabled": false, "reason": "not_enabled" }
  }
}

Terminal states

Paid, void, uncollectible and draft invoices return 200 with their status in the payload — never a 410 that reads as an error. Expired invoices return their expired state the same way. Unknown tokens return a JSON 404.

agentPayable is reserved

The block is currently always { "enabled": false }. Do not build payment flows against it — agent payment does not exist yet.

Checkout links return products and amount only:

{
  "success": true,
  "data": {
    "surface": "checkout_link",
    "status": "ready",
    "merchant": { "name": "Islands Wellness" },
    "currency": "GBP",
    "totalCents": 5400,
    "products": [{ "name": "Wellness Membership", "unitAmountMinor": 4500 }],
    "agentPayable": { "enabled": false, "reason": "not_enabled" }
  }
}

A checkout link does not know the payer, so the shape does not pretend to: no customer block, no invoice reference, no identifiers. Inactive, archived and expired links return 200 with that terminal status; unknown links return a JSON 404.

Field types

All money is integer minor units (totalCents, amountDueCents, unitAmountMinor). Dates are ISO-8601 strings or null. The JSON-LD price/value floats are display markup only — the integers are canonical.

On this page