API reference
All endpoints are relative to https://api.transactful.com/v1. IDs are
prefixed (co_, le_, app_); timestamps are ISO 8601 UTC; amounts are
decimal strings with an explicit currency.
Companies
Section titled “Companies”GET /companies # list, paginated (cursor)GET /companies/{id} # one company's credit state{ "id": "co_8fk2m1", "name": "Aldgate Homeware Co", "shopify_company_gid": "gid://shopify/Company/7391820", "status": "approved", "payment_terms": "NET_30", "credit_limit": { "amount": "10000.00", "currency": "GBP" }, "outstanding": { "amount": "8050.00", "currency": "GBP" }, "available_credit": { "amount": "1450.00", "currency": "GBP" }, "hold": null, "updated_at": "2026-07-24T16:41:09Z"}available_credit is what checkout enforces: limit − outstanding − safety
buffer. Filter with ?status=approved|on_hold and ?updated_since=.
Ledger
Section titled “Ledger”GET /companies/{id}/ledger # entries, newest first, paginated{ "id": "le_92hd7a", "kind": "order_placed", // order_placed | payment | refund | cancellation | adjustment | opening_balance "amount": { "amount": "2340.00", "currency": "GBP" }, "shopify_order_gid": "gid://shopify/Order/5510238", "note": null, "occurred_at": "2026-07-24T09:12:44Z"}The ledger is append-only: entries are never edited or deleted, so consumers
can sync incrementally with ?after={entry_id} and never re-reconcile.
Adjustments, limits, holds
Section titled “Adjustments, limits, holds”Requires write_credit. All three actions appear on the company timeline
attributed to the API key’s label, exactly like a staff action.
POST /companies/{id}/adjustments { "amount": "-500.00", "note": "Bank transfer 22 Jul ref 8841" } # note required
PUT /companies/{id}/credit-limit { "amount": "12000.00", "reason": "Season uplift" }
POST /companies/{id}/hold # place a manual hold { "note": "Dispute on invoice #1032" }DELETE /companies/{id}/hold # lift itAutomatic overdue holds can’t be lifted via API while the triggering invoice remains unpaid – the same rule the admin UI enforces.
Applications
Section titled “Applications”Requires read_applications (personal contact fields live here and nowhere
else).
GET /applications?status=submitted|in_review|needs_info|approved|rejectedGET /applications/{id}{ "id": "app_31xk8p", "status": "submitted", "business_name": "Fenwick & Daughters Ltd", "vat": { "number": "GB987654321", "status": "valid", "registry": "HMRC", "checked_at": "2026-07-24T14:02:11Z" }, "submitted_at": "2026-07-24T13:58:02Z"}Decisions (approve/reject) are not available via API – approvals create Shopify resources and carry credit judgement, so they stay in the admin where the audit trail shows a person. Tell us if your workflow genuinely needs this; it would ship with explicit safeguards.