Axiomatic

Practice Management

Practice management APIs for partner firms. All endpoints require the requesting entity to be an active partner firm (enforced by requirePartner).

Client Entities

List Client Entities

GET /api/practice/clients?firmEntityId={firmEntityId}

Returns all active client entities managed by the partner firm.

Create Client Entity

POST /api/practice/clients

Creates a new entity, seeds default chart of accounts and books, links it to the partner firm, and syncs the Stripe subscription.

Request body

FieldTypeRequiredDescription
firmEntityIdstringYesPartner firm entity ID
namestringYesClient business name
typestringNoEntity type (llc, corp, sole_prop, etc.)
industrystringNoIndustry classification
tierstringNoClient subscription tier (STARTER, PROFESSIONAL, BUSINESS). Default: STARTER
billingModestringNoconsolidated or client_direct. Default: consolidated

Response

{
  "entity": { "id": "ent_new", "name": "Acme Corp", "...": "..." },
  "link": { "id": "pcl_123", "clientTier": "STARTER", "billingMode": "consolidated", "monthlyFee": 79 }
}

Invite Client User

POST /api/practice/clients/{entityId}/invite

Sends an email invitation to a client user to join the entity.

FieldTypeRequiredDescription
emailstringYesInvitee email address
rolestringNoRole to assign (ADMIN, MEMBER, VIEWER). Default: VIEWER

Time Tracking

List Time Entries

GET /api/practice/time?firmEntityId={firmEntityId}

Query parameters

FieldTypeRequiredDescription
firmEntityIdstringYesPartner firm entity ID
clientEntityIdstringNoFilter by client entity
fromstringNoStart date (ISO 8601)
tostringNoEnd date (ISO 8601)
unbilledOnlybooleanNoOnly return unbilled entries

Response

{
  "entries": [ { "id": "te_1", "hours": 2.5, "description": "Month-end close", "..." : "..." } ],
  "totalHours": 12.5,
  "billableHours": 10.0
}

Create Time Entry

POST /api/practice/time
FieldTypeRequiredDescription
firmEntityIdstringYesPartner firm entity ID
entityIdstringYesClient entity ID
datestringYesDate of work (ISO 8601)
hoursnumberYesHours worked
descriptionstringNoDescription of work
billablebooleanNoWhether billable. Default: true
ratenumberNoHourly rate in cents

Delete Time Entry

DELETE /api/practice/time?timeEntryId={timeEntryId}&firmEntityId={firmEntityId}

Deletes a time entry. Invoiced entries cannot be deleted.


Engagements

List Engagements

GET /api/practice/engagements?firmEntityId={firmEntityId}

Returns all engagements with their associated tasks.

Create Engagement

POST /api/practice/engagements
FieldTypeRequiredDescription
firmEntityIdstringYesPartner firm entity ID
entityIdstringYesClient entity ID
namestringYesEngagement name
startDatestringYesStart date (ISO 8601)
typestringNobookkeeping, tax_prep, advisory, audit, other
recurrencestringNomonthly, quarterly, annual, or null
notesstringNoAdditional notes

Update Engagement / Complete Task

PATCH /api/practice/engagements

Complete a task:

{ "firmEntityId": "...", "taskId": "task_123" }

Update engagement status:

{ "firmEntityId": "...", "engagementId": "eng_123", "status": "completed" }

Billing

Get Billing Overview

GET /api/practice/billing?firmEntityId={firmEntityId}

Returns partner tier, volume discount, and per-client billing breakdown.

Generate Invoice from Time Entries

POST /api/practice/billing/invoice

Creates an AR invoice from unbilled time entries for a specific client.

FieldTypeRequiredDescription
firmEntityIdstringYesPartner firm entity ID
clientEntityIdstringYesClient entity ID
timeEntryIdsstring[]YesArray of time entry IDs to invoice

Response

{
  "invoice": { "id": "inv_123", "total": 250000, "lineCount": 3 },
  "markedEntries": 3
}

Reports

Generate PDF Report

GET /api/reports/pdf?entityId={entityId}&bookId={bookId}&report={type}&from={date}&to={date}

Server-side financial report generation. Returns HTML (Content-Type: text/html).

ParameterTypeRequiredDescription
entityIdstringYesEntity ID
bookIdstringYesBook ID
reportstringYesbalance_sheet, income_statement, or trial_balance
fromstringYesPeriod start date
tostringYesPeriod end date
POST /api/reports/share

Generates a time-limited shareable link to a report.

FieldTypeRequiredDescription
entityIdstringYesEntity ID
reportTypestringYesReport type
parametersobjectYesReport parameters (bookId, from, to)
expiresInDaysnumberNoExpiry in days. Default: 7

Response

{
  "shareUrl": "https://app.axiomatic.com/api/reports/share/tok_abc123",
  "expiresAt": "2026-03-11T00:00:00Z"
}

Access Shared Report

GET /api/reports/share/{token}

Redirects to the rendered report if the token is valid and not expired. Increments access count.

On this page