These endpoints retrieve records asynchronously. When called, they return the first 10 matching results immediately in the HTTP response body, while simultaneously streaming all matching records to the Streaming API using a routing key.
Async requests are limited to a pageSize of 10 for the immediate response. All async endpoints require an Organization-ID header.
The following async endpoints are available:
- GET /v1/patients/async
- GET /v1/events/async
- GET /v1/appointments/async
- GET /v1/imageattachments/async
- GET /v1/locationproductionnetschedule/async
Reference: Patients (V1) Endpoint Documentation
Retrieves patients asynchronously. Returns the first 10 results immediately and streams all matching records to the Streaming API.
| Parameter | In | Required | Type | Description |
|---|---|---|---|---|
Organization-ID | header | Yes | string | Your organization identifier |
filter | query | No | string | Filter expression. See Filter Keys below |
responseFields | query | No | string | URL-encoded comma-delimited list of fields to return. Use ALL for all fields |
lastId | query | No | string | The largest patientId from the previous page — used for cursor-based pagination |
page | query | No | string | Page number for offset-based pagination |
pageSize | query | No | string | Page size — limited to 10 for async requests |
| Filter Key | Supported Operators |
|---|---|
firstName | ==, !=, ~=, <>= |
lastName | ==, !=, ~=, <>= |
gender | ==, != |
preferredName | ==, !=, ~=, <>= |
dateOfBirth | ==, != |
patientStatus | ==, != |
phones.number | ==, !=, -> |
emailAddress | == |
chartNumber | ==, .absent, .present |
preferredLocation.id | ==, !=, -> |
primaryGuarantor.id | == |
duplicateOfPatient.id | == |
primaryContact.id | == |
firstVisitDate | ==, >, >=, <, <= |
lastModified | >, >=, <, <= |
referredByPatient.id | ==, !=, -> |
referredByReferral.id | ==, !=, -> |
Note:
patientStatusvalid values:NEW,ACTIVE,NON-PATIENT,INACTIVE,DUPLICATE,DISMISSED,DECEASED.gendervalid values:M,F,O.
Ordering: Results on this async endpoint are returned in descending
idorder (newest first). The synchronousGET /v1/patientsbulk endpoint pages by ascendingid. See Patients V1 — Developer Guide for the full bulk GET filter list (includingid->[…], which is documented on sync bulk GET but not listed here).
Upcoming Breaking Change:
preferredLocation.id(as a list of IDs or["ALL"]) will become a required filter. Omitting it currently defaults to all locations.
Date-limiting filters: If you do not supply a date-limiting filter, one may be applied automatically using
lastModified. Supply your own date bound for predictable results. The following filter keys count as date-limiting:lastModified,createdDate, andupdatedDate.
Fetch all patients modified after a date:
GET /api/v1/patients/async?filter=lastModified>=2025-01-01T00:00:00Z,preferredLocation.id->[64000000000004]Paginate using lastId:
GET /api/v1/patients/async?lastId=22000012345678&filter=lastModified>=2025-01-01T00:00:00Z,preferredLocation.id->[64000000000004]Reference: Events (V1) Endpoint Documentation
Retrieves events asynchronously. Returns the first 10 results immediately and streams all matching records to the Streaming API.
For full Events V1 documentation — including all filter keys, create/update/delete semantics, recurrence, and field reference — see the Events V1 — Developer Guide.
| Parameter | In | Required | Type | Description |
|---|---|---|---|---|
Organization-ID | header | Yes | string | Your organization identifier |
filter | query | No | string | Filter expression. Same keys as GET /v1/events |
responseFields | query | No | string | URL-encoded comma-delimited list of fields to return. Use ALL for all fields |
lastId | query | No | string | The largest eventId from the previous page — used for cursor-based pagination |
page | query | No | string | Page number for offset-based pagination |
pageSize | query | No | string | Page size — limited to 10 for async requests |
Fetch events modified after a date at a specific location:
GET /api/v1/events/async?filter=lastModified>=2025-01-01T00:00:00Z,location.id->[64000000000004]Paginate using lastId:
GET /api/v1/events/async?lastId=500&filter=lastModified>=2025-01-01T00:00:00Z,location.id->[64000000000004]Reference: Appointments (V1) Endpoint Documentation
Retrieves appointments asynchronously. Returns the first 10 results immediately and streams all matching records to the Streaming API.
| Parameter | In | Required | Type | Description |
|---|---|---|---|---|
Organization-ID | header | Yes | string | Your organization identifier |
filter | query | No | string | Filter expression. See Filter Keys below |
responseFields | query | No | string | URL-encoded comma-delimited list of fields to return. Use ALL for all fields |
lastId | query | No | string | The largest appointmentId from the previous page — used for cursor-based pagination |
page | query | No | string | Page number for offset-based pagination |
pageSize | query | No | string | Page size — limited to 10 for async requests |
| Filter Key | Supported Operators |
|---|---|
id | -> |
needsFollowUp | ==, != |
status | ==, != |
patient.id | ==, != |
operatory.id | ==, !=, -> |
location.id | ==, !=, -> |
provider.id | ==, !=, -> |
asap | == |
start | >, >=, <, <= |
lastModified | >, >=, <, <= |
Upcoming Breaking Change:
location.id(as a list of IDs or["ALL"]) will become a required filter. Omitting it currently defaults to all locations.
Note:
statusvalid values:LATE,HERE,READY,CHAIR,COMPLETED,CONFIRMED,UNCONFIRMED,NO_SHOW,BROKEN,LEFT_MESSAGE,CHECKOUT,WILL_CALL,UNREACHABLE,CANCELLEDBYOFFICE.
Fetch appointments modified after a date at a specific location:
GET /api/v1/appointments/async?filter=lastModified>=2025-01-01T00:00:00Z,location.id->[64000000000004]Paginate using lastId:
GET /api/v1/appointments/async?lastId=8000052360370&filter=lastModified>=2025-01-01T00:00:00Z,location.id->[64000000000004]Reference: ImageAttachments (V1) Endpoint Documentation
Returns a list of image attachments with async support via the Streaming API.
Note: Async retrieval for image attachments is only available via this
/asyncendpoint. The regular/v1/imageattachmentsendpoint does not support async or streaming.
| Parameter | In | Required | Type | Description |
|---|---|---|---|---|
Organization-ID | header | Yes | string | Your organization identifier |
filter | query | No | string | Filter expression. See Filter Keys below |
responseFields | query | No | string | URL-encoded comma-delimited list of fields to return. Use ALL for all fields |
lastId | query | No | string | The largest image attachment ID from the previous page — used for cursor-based pagination |
page | query | No | string | Page number for offset-based pagination |
pageSize | query | No | string | Page size — limited to 10 for async requests |
| Filter Key | Supported Operators |
|---|---|
id | ==, -> |
insuranceClaim.id | ==, -> |
Fetch image attachments by insurance claim:
GET /api/v1/imageattachments/async?filter=insuranceClaim.id==456Fetch a specific set of attachments by ID:
GET /api/v1/imageattachments/async?filter=id->[123,124,125]Reference: Production Net Schedule Report (V1) Endpoint Documentation
Returns production total net schedule reports asynchronously based on filter criteria.
| Parameter | In | Required | Type | Description |
|---|---|---|---|---|
Organization-ID | header | Yes | string | Your organization identifier |
filter | query | Yes | string | Filter expression. fromDate is required. See Filter Keys below |
responseFields | query | No | string | URL-encoded comma-delimited list of fields to return. Use ALL for all fields |
| Filter Key | Supported Operators | Required | Notes |
|---|---|---|---|
fromDate | == | Yes | Start date for the report (e.g. 2025-01-14) |
location.id | ==, -> | No | Filter by location. Defaults to all locations. Will become required in a future release |
provider.id | ==, -> | No | Mutually exclusive with patient.id and appointment.id |
patient.id | ==, -> | No | Mutually exclusive with provider.id and appointment.id |
appointment.id | ==, -> | No | Mutually exclusive with provider.id and patient.id |
range | == | No | Number of days for the report window. Maximum 31 |
timezone | == | No | Timezone for the report (e.g. America/New_York). Defaults to organization timezone |
isPrimaryWriteOff | == | No | Deprecated — do not use in new implementations |
Note:
provider.id,patient.id, andappointment.idare mutually exclusive — only one may be used per request.
Upcoming Breaking Change:
location.id(as a list of IDs or["ALL"]) will become a required filter. Omitting it currently defaults to all locations.
Fetch production net schedule report for a date range at a location:
GET /api/v1/locationproductionnetschedule/async?filter=fromDate==2025-01-14,range==7,location.id->[64000000000004]Fetch report for a specific provider:
GET /api/v1/locationproductionnetschedule/async?filter=fromDate==2025-01-14,provider.id==789All async endpoints return a 200 response with the following top-level structure:
| Field | Type | Description |
|---|---|---|
data | array | The first 10 matching records. All remaining records are streamed via the Streaming API |
warnings | array | Non-fatal warnings (operation still succeeded) |
errors | array | Field-level or structural errors |
lastId is the recommended approach for iterating through large result sets on async endpoints. It uses the record's id as a cursor rather than an offset.
Send your first request without lastId:
GET /api/v1/patients/async?filter=lastModified>=2025-01-01T00:00:00Z,preferredLocation.id->[64000000000004]Take the id of the last record in the returned data array and pass it as lastId in the next request:
GET /api/v1/patients/async?lastId=22000012345678&filter=lastModified>=2025-01-01T00:00:00Z,preferredLocation.id->[64000000000004]Continue until the response returns an empty data array or no-more-data indicator.
Async endpoints deliver the complete result set to the Streaming API in parallel with the immediate HTTP response. To consume the streamed data, your application must be subscribed to the Streaming API.
See the Streaming API Webhooks Setup Guide for full setup instructions.
HTTP Status Code Errors — click to expand
These apply to all Async V1 endpoints.
The request query parameters are invalid or cannot be processed. Check that all required filters are provided and values are the correct type.
| Message | Authentication is required and has failed or has not been provided. |
| Why | No valid auth token was sent, the token is expired, or the token is malformed. |
| Fix | Provide a valid Bearer token in the Authorization header. |
| Message | The request is understood, but it has been refused or access is not allowed. |
| Why | The authenticated token does not have the required scope. Read operations require model:read. |
| Fix | Request a token that includes the model:read scope. |
| Message | The requested resource is either missing or does not exist. |
| Why | No records matching the provided filters exist within your organization. |
| Fix | Confirm your filter values are correct and belong to your organization. |
| Message | The server timed out while processing the request. |
| Why | The server took too long to respond, often due to high server load. |
| Fix | Retry the request. If the issue persists, contact support with the request details and timestamp. |
| Message | Rate limit exceeded. |
| Why | Your client has made too many requests in a short period of time. |
| Fix | Implement exponential backoff and retry logic. Reduce request frequency. See the rate limiting guide. |
| Message | An unexpected error occurred. |
| Why | An unhandled server-side error occurred. |
| Fix | Retry the request. If the issue persists, contact support with the request details and timestamp. |