Getting Started
REST API — Bearer API keys and OpenAPI reference for the platform.
Overview
The REST API is the primary programmatic surface: JSON under https://app.triplebooks.com/api/..., documented in openapi.json and in the sidebar modules below.
- Authentication:
Authorization: Bearer ak_...using an API key from API keys in Settings. Keys are pinned to one entity and to module scopes (read:ledger,write:crm, and so on). The first path segment after/api/selects the module (for example,/api/ledger/...needs ledger scopes). Write scope implies read for the same module. - Interactive use: Signed-in browser traffic hits the same routes; you do not send a Bearer header from the UI.
Base URL: https://app.triplebooks.com
Authentication
curl "https://app.triplebooks.com/api/ledger/accounts?entityId=<uuid>" \
-H "Authorization: Bearer ak_..."Create and revoke keys under Settings → API keys. Rate limits apply per key.
Multi-tenant routing
Each organization has an isolated database. Requests are scoped to one entity. Pass entityId in this order (first match wins):
entityIdorentity_idquery parameterx-entity-idheader — useful for GET requests that do not putentityIdin the query string- On POST/PUT/PATCH,
entityIdin the JSON body if not already set above Authorization: Bearer ak_...— the API key is already pinned to an entity; includeentityIdin query, body, or header only when it must match that key’s entity
CRM, Sales, Helpdesk, and most module APIs use this model so the same routes work for signed-in browser sessions and Bearer API keys.
Endpoints
The sidebar is one folder per product module (closed until you open it). Folders are grouped under Core and Experimental, matching the platform overview. Each folder opens to Overview plus resource pages. Short links without the section segment (for example /api/entities) redirect to the canonical URL (/api/workspace/entities). Single-page modules (Health, Helpdesk, and similar) sit at the top level.
| Category | Description |
|---|---|
| Health | Liveness and engine version (no auth) |
| Entities | Create and manage legal entities |
| Books | Multi-book accounting (GAAP, IFRS, tax) |
| Accounts | Chart of accounts CRUD |
| Account Mappings | Map roles to accounts for automated posting |
| CRM | Companies, contacts, leads, pipeline, and related resources — read:crm / write:crm |
| Sales | Quotes, orders, plans, subscriptions — read:sales / write:sales |
| Cap table | Issuance, grants, transfers, valuations — read:ledger / write:ledger |
| Projects | Client projects, milestones, time — read:projects / write:projects |
| Governance | Parties, meetings, actions, filings — read:admin / write:admin |
| Helpdesk | Tickets and messages — read:helpdesk / write:helpdesk |
| HR | Employees, departments, leave, and payroll — read:hr / write:hr |
| Maintenance | Equipment, work orders, PM schedules — read:maintenance / write:maintenance |
| Production | BOMs, work orders, work centers — read:production / write:production |
| Events | Record financial events |
| Process | Trigger the posting engine |
| Journal | Query and manage journal entries |
| Trial Balance | Per-account debit/credit totals |
| Periods | Accounting period lifecycle |
| Reports | Balance sheet, income statement, cash flow |
| Fund Reports | Fund-specific reporting |
| Invoicing | Invoices, send, PDF, credit memos, settings — read:invoicing / write:invoicing |
| Purchasing | Vendors, bills, purchase orders, debit memos — read:purchasing / write:purchasing |
| Purchasing — PO matching | Match vendor bills to purchase orders |
| Treasury | Cash positions and linked accounts |
| FX Rates | Exchange rate management |
| FX Revaluation | Period-end currency revaluation |
| Rule Packs | DSL posting rules |
| Reconciliation | Transaction matching and confirmation |
| Anomalies | AI-powered anomaly detection and review |
| Team | Team members and invitations |
| API Keys | Programmatic API key management |
| Compliance | GDPR data export, erasure, consent |
| Integrations | Plaid bank linking and sync |
| Billing | Prepaid credit checkout, balance/history, Stripe customer portal |
| Notifications | In-app notification management |
| Payroll | Payroll runs, employees, calculator, tax forms |
| Inventory | Inventory items, lots, transactions, counts, valuation |
| Fixed Assets | Asset register, depreciation, disposal |
| Loans | Loan instruments and amortization |
| Leases | Lease accounting (ASC 842 / IFRS 16) |
| Contracts | Revenue contracts (ASC 606 / IFRS 15) |
| Exchange | Receivables exchange marketplace |
| Dimensions | Segment and dimension tagging |
| Subledgers | Subledger management and drill-down |
| Consolidation | Multi-entity consolidation |
| Intercompany | Intercompany transactions |
| Close Calendar | Period-end close templates and tasks |
| Approval Policies | Multi-level approval workflows |
| Accruals | Accrual schedule management |
| Waterfall | Fund waterfall distributions |
| Documents | Files, folders, revisions, and e-sign — read:documents / write:documents |
| Comments | Threaded comments and reactions |
| Audit Log | Immutable audit trail queries |
| Cost Categories | Cost classification and reports |
| Tax Rates | Tax rate tables and tax reports |
| Payment Intents | Payment intents and file generation |
| Settlements | Settlement recording and batches |
| Webhook Subscriptions | Outbound webhook configuration |
| Address Book | Counterparties and contacts |
| Practice | Practice management dashboard |
| Partner | Partner program and client management |
| Privacy | Shielded transfers and ZK proofs |
| Import Batches | Bulk data import |
| Connections | Provider connections and sync |
| Categorization | Transaction matching patterns |
| Tax Lots | Crypto/investment tax lot tracking |
Rate limits
API requests are rate-limited per API key. Typical limits:
- 100 requests/minute for read endpoints (GET)
- 30 requests/minute for write endpoints (POST/PUT/PATCH/DELETE)
Rate limit headers may be included in responses:
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 97
X-RateLimit-Reset: 1709164800Errors
All errors return a JSON body with an error field:
{ "error": "Entity not found" }| Status | Meaning |
|---|---|
400 | Bad request — missing or invalid parameters |
401 | Unauthorized — missing or invalid credentials |
403 | Forbidden — insufficient access or entity mismatch |
404 | Not found — resource doesn't exist |
402 | Payment required — credit balance exhausted (writes) |
429 | Rate limited — too many requests |
500 | Server error — unexpected failure |