Skip to content

Transactions V1 — Developer Guide

Reference: Transactions (V1) Endpoint Documentation


The base /v1/transactions endpoint provides a unified read-only view across all transaction types in the patient ledger. It returns the full transaction model regardless of sub-type (adjustments, insurance payments, patient payments, procedure charges).

For sub-type-specific read endpoints (bulk list and get-by-id), see:


GET — Bulk List Transactions

Returns a paginated list of transaction entries across all ledger types, filtered by the provided criteria.

⚠️ Rate Limited: This endpoint is rate limited. See the rate limiting guide for details.

Parameters

ParameterInRequiredTypeDescription
Organization-IDheaderYesstringThe organization ID
filterqueryYesstringFilter criteria (see filter keys below)
responseFieldsqueryNostringComma-delimited list of fields to include, or ALL
pagequeryNostringPage number for pagination
pageSizequeryNostringNumber of records per page
lastIdqueryNostringLargest transaction ID from the previous page, used for efficient date-filter pagination

Filter Keys

Filters use the form ?filter=key==value or ?filter=key>=value. Multiple filters are comma-delimited.

Filter KeyOperatorsExample
id->?filter=id->[123,124]
ledgerType==, !=?filter=ledgerType==InsurancePayment
patient.id==, ->?filter=patient.id==789
provider.id==?filter=provider.id==456
transactionDate>, <, >=, <=?filter=transactionDate>=2025-01-01
location.id==, !=, ->?filter=location.id==123 or ?filter=location.id==ALL
lastModified>, <, >=, <=?filter=lastModified>=2025-01-01

Important: A valid filter is required on every request. If no date-limiting filter is provided, one will be automatically applied using transactionDate >= <1 year ago> (or the organization's creation date if more recent). Use lastId (not page) when paginating over date-filtered results for best performance.

ledgerType Values

ValueDescription
PatientChargeAdjustmentA charge-based adjustment against a patient procedure
PatientCreditAdjustmentA credit applied to a patient's ledger
InsuranceRefundAdjustmentA refund adjustment from an insurance payment
PatientCreditCardRefundA credit card refund to a patient
PatientCreditCardVoidA void of a credit card transaction
PatientProcedureLedgerA procedure charge on the patient ledger
InsurancePaymentA payment received from an insurance carrier
PatientProcedurePaymentA payment received from a patient

Example Requests

Fetch all transactions for a specific patient:

GET /api/v1/transactions?filter=patient.id==12000006542062

Fetch all transactions modified since a date (across all locations):

GET /api/v1/transactions?filter=lastModified>=2025-01-01,location.id==ALL

Fetch insurance payment transactions for a location with pagination:

GET /api/v1/transactions?filter=ledgerType==InsurancePayment,location.id==123&pageSize=100&lastId=5000

GET — Transaction by ID

Returns a single transaction entry by its ID, regardless of ledger type.

Parameters

ParameterInRequiredTypeDescription
transactionIdpathYesintegerThe ID of the transaction
Organization-IDheaderYesstringThe organization ID
responseFieldsqueryNostringComma-delimited list of fields to include, or ALL

Example Request

GET /api/v1/transactions/100000042301

Response Structure

A successful 200 response returns the following top-level structure:

FieldTypeDescription
dataobjectThe transaction object (see below)
warningsarrayNon-fatal warnings (operation still succeeded)
errorsarrayField-level or structural errors

For bulk responses, data is an array and the response also includes:

FieldTypeDescription
meta.paginationobjectPagination metadata (page, pageSize, total)

data Object — Base Transaction Fields

FieldTypeRead-OnlyDescription
idintegerYesUnique transaction ID
typestringYesAlways "Transaction"
ledgerTypestringYesThe transaction sub-type (see ledgerType values above)
amountnumberNoTransaction amount in dollars
ownershipstringNoScope: PATIENT or GUARANTOR
transactionDatestring (date)NoThe date of the transaction (YYYY-MM-DD)
entryDatestring (date-time)YesTimestamp when the record was created
lastModifiedstring (date-time)YesTimestamp of the last modification
isAutomaticallyPostedbooleanYesWhether the transaction was auto-posted by the system
isActivebooleanYesWhether the transaction is active (not cancelled/replaced)
isPartialPaymentbooleanYesWhether this is a partial payment
notestringNoFree-text note, max 255 characters
metBasicnumberNoDeductible met — basic
metPreventivenumberNoDeductible met — preventive
metMajornumberNoDeductible met — major
metOrthonumberNoDeductible met — ortho
previousTransactionobjectYesLinked model ref if this replaced a prior transaction
replacedByTransactionobjectYesLinked model ref if this was replaced by a later transaction
patientobjectLinked patient ({ id })
locationobjectLinked location ({ id })
providerobjectLinked provider ({ id })
organizationLedgerTypeobjectLinked org ledger type ({ id })
patientProcedureobjectYesLinked procedure ({ id })
insuranceClaimobjectYesLinked insurance claim ({ id })
insurancePaymentobjectYesLinked insurance payment ({ id })
transactionTagsobjectMap of { orderIndex: { id } } tag references
reasonTagsobjectMap of { orderIndex: { id } } transfer reason references
patientPaymentBillingobjectBilling details (checkNumber, bankNumber, referenceNumber)
distributionsarrayAllocation records (chargeId, appliedAmount, isActive)

Streaming

The transactions domain is streamable via the Streaming API. Events are published whenever transaction records are created, updated, or deleted.

All transaction sub-types (adjustments, insurance payments, patient payments, procedures) share the same domain type in the routing key: TransactionV1.

Routing Key Format

organizationId.locationId.TransactionV1.operationType
SegmentDescription
organizationIdYour organization's ID
locationIdA specific location ID, or * for all locations
TransactionV1The domain type for all transaction records
operationTypeCREATE, UPDATE, DELETE, or * for all

Example Routing Keys

Listen for all transaction events across all locations:

66d22762060811049b50d085.*.TransactionV1.*

Listen for creates only at a specific location:

66d22762060811049b50d085.1000000000123.TransactionV1.CREATE

Operations by Sub-Type

Sub-TypeCREATEUPDATEDELETE
Adjustment (PatientChargeAdjustment)YesYesNo
Adjustment (PatientCreditAdjustment)YesYesYes
Insurance PaymentYesYes (emitted as CREATE on the rebill record)No
Patient PaymentYesYes (emitted as CREATE on the rebill record)No
ProcedureYesNoYes

Note on corrections (rebills): When an insurance payment or patient payment is corrected, a new replacement record is created rather than the original being modified. The stream emits a CREATE event for the new record. The original record is cancelled (isActive: false) but does not emit a DELETE event.

Filtering by ledgerType: Since all sub-types share the TransactionV1 domain, use the ledgerType field in the event payload to distinguish between sub-types in your consumer.


Errors & Warnings Reference

HTTP Status Code Errors — click to expand

400 — Bad Request

The request filter or parameters are invalid or cannot be processed. A filter is required on every bulk GET request.


401 — Unauthorized

MessageAuthentication is required and has failed or has not been provided.
WhyNo valid auth token was sent, the token is expired, or the token is malformed.
FixProvide a valid Bearer token in the Authorization header.

403 — Forbidden

MessageThe request is understood, but it has been refused or access is not allowed.
WhyThe caller is not permitted to read transactions for this organization.
FixConfirm credentials and organization access with your integration administrator.

404 — Not Found

MessageThe requested resource is either missing or does not exist.
WhyNo transaction exists for the given ID within your organization.
FixConfirm the transactionId is correct and belongs to your organization.

408 — Request Timeout

MessageThe server timed out while processing the request.
WhyThe server took too long to respond, often due to high server load or an overly broad filter.
FixNarrow your filter criteria and retry. If the issue persists, contact support.

429 — Too Many Requests

MessageRate limit exceeded.
WhyYour client has made too many requests in a short period of time.
FixImplement exponential backoff and retry logic. See the rate limiting guide.

500 — Internal Server Error

MessageAn unexpected error occurred.
WhyAn unhandled server-side error occurred.
FixRetry the request. If the issue persists, contact support with the request details and timestamp.

Field-Level Validation Errors — click to collapse

These errors are returned in the errors array alongside a 400 status code.


filter

Error: Missing or invalid filter.

WhyThe filter parameter was omitted, left empty, or used an unsupported key or operator.
FixProvide at least one valid filter key and value, e.g. ?filter=lastModified>=2025-01-01.

ledgerType

Error: Invalid value for ledgerType filter.

WhyThe ledgerType value is not one of the recognized enum values.
FixUse one of: PatientChargeAdjustment, PatientCreditAdjustment, InsuranceRefundAdjustment, PatientCreditCardRefund, PatientCreditCardVoid, PatientProcedureLedger, InsurancePayment, PatientProcedurePayment.