curl --request GET \
--url https://api.maxcare.ai/v1/patients/{id}/documents \
--header 'Authorization: Bearer <token>' \
--header 'X-Organization-Id: <x-organization-id>'import requests
url = "https://api.maxcare.ai/v1/patients/{id}/documents"
headers = {
"X-Organization-Id": "<x-organization-id>",
"Authorization": "Bearer <token>"
}
response = requests.get(url, headers=headers)
print(response.text)const options = {
method: 'GET',
headers: {'X-Organization-Id': '<x-organization-id>', Authorization: 'Bearer <token>'}
};
fetch('https://api.maxcare.ai/v1/patients/{id}/documents', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.maxcare.ai/v1/patients/{id}/documents",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"X-Organization-Id: <x-organization-id>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.maxcare.ai/v1/patients/{id}/documents"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-Organization-Id", "<x-organization-id>")
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.maxcare.ai/v1/patients/{id}/documents")
.header("X-Organization-Id", "<x-organization-id>")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.maxcare.ai/v1/patients/{id}/documents")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-Organization-Id"] = '<x-organization-id>'
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"code": "success",
"data": {
"documents": [
{
"id": "9c1f0f7a-2f4b-4f2e-8a1e-6b0f2d3c4a5b",
"kind": "insurance_card",
"category": "pathology",
"dateOfService": "2026-07-30T00:00:00.000Z",
"pageCount": 3,
"sourceCategory": "Insurance Card Front",
"title": "Insurance Card Front",
"filename": "insurance_card_front.jpg",
"mimeType": "image/jpeg",
"bytes": 184320,
"createdAt": "2026-02-27T15:04:05.000Z",
"updatedAt": "2026-08-14T10:15:00.000Z",
"downloaded": true,
"url": "https://storage.maxcare.ai/…?X-Amz-Signature=…",
"expiresInSeconds": 3600,
"deletedFromEhrAt": null
}
],
"ehrType": "modmed",
"ehrPatientId": "35242114",
"ehrActive": true,
"listFetchedAt": "2026-08-14T09:00:00.000Z",
"pagination": {
"page": 1,
"pageSize": 100,
"totalCount": 250,
"totalPages": 3
},
"lastRefresh": {
"status": "completed",
"requestedVia": "api",
"requestedAt": "2026-08-15T20:15:00.000Z",
"completedAt": "2026-08-15T20:15:07.000Z",
"errorKind": null
}
}
}{
"code": "bad_request",
"message": "'id' must be a valid UUID",
"trace_id": "550e8400-e29b-41d4-a716-446655440000"
}{
"code": "unauthorized",
"message": "Invalid or missing API key",
"trace_id": "550e8400-e29b-41d4-a716-446655440000"
}{
"code": "forbidden",
"message": "Insufficient scope",
"trace_id": "550e8400-e29b-41d4-a716-446655440000"
}{
"code": "not_found",
"message": "Resource not found",
"trace_id": "550e8400-e29b-41d4-a716-446655440000"
}{
"code": "rate_limit_exceeded",
"message": "Rate limit exceeded. Maximum 1000 requests per 60 seconds.",
"trace_id": "550e8400-e29b-41d4-a716-446655440000"
}List a patient's chart documents
Returns the documents on the patient’s chart in the source EHR — insurance cards, photo identification, prior-authorization paperwork and clinical files — with the EHR’s own category passed through as sourceCategory and a best-effort kind. Serves the cached listing, so it makes no EHR calls and is safe to poll; use updatedSince for delta sync. category (the upload vocabulary, best-effort) and dateFrom/dateTo (the EHR’s created date) narrow the set before paging. A document whose bytes have never been pulled from the EHR is returned with downloaded: false and no url rather than omitted. The envelope names the chart this listing came from (ehrType, ehrPatientId) and whether it can still be re-listed (ehrActive) — a practice running two EHRs holds a separate record per EHR for the same human, each with its own documents. Requires read:patient_documents scope.
curl --request GET \
--url https://api.maxcare.ai/v1/patients/{id}/documents \
--header 'Authorization: Bearer <token>' \
--header 'X-Organization-Id: <x-organization-id>'import requests
url = "https://api.maxcare.ai/v1/patients/{id}/documents"
headers = {
"X-Organization-Id": "<x-organization-id>",
"Authorization": "Bearer <token>"
}
response = requests.get(url, headers=headers)
print(response.text)const options = {
method: 'GET',
headers: {'X-Organization-Id': '<x-organization-id>', Authorization: 'Bearer <token>'}
};
fetch('https://api.maxcare.ai/v1/patients/{id}/documents', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.maxcare.ai/v1/patients/{id}/documents",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"X-Organization-Id: <x-organization-id>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.maxcare.ai/v1/patients/{id}/documents"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-Organization-Id", "<x-organization-id>")
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.maxcare.ai/v1/patients/{id}/documents")
.header("X-Organization-Id", "<x-organization-id>")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.maxcare.ai/v1/patients/{id}/documents")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-Organization-Id"] = '<x-organization-id>'
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"code": "success",
"data": {
"documents": [
{
"id": "9c1f0f7a-2f4b-4f2e-8a1e-6b0f2d3c4a5b",
"kind": "insurance_card",
"category": "pathology",
"dateOfService": "2026-07-30T00:00:00.000Z",
"pageCount": 3,
"sourceCategory": "Insurance Card Front",
"title": "Insurance Card Front",
"filename": "insurance_card_front.jpg",
"mimeType": "image/jpeg",
"bytes": 184320,
"createdAt": "2026-02-27T15:04:05.000Z",
"updatedAt": "2026-08-14T10:15:00.000Z",
"downloaded": true,
"url": "https://storage.maxcare.ai/…?X-Amz-Signature=…",
"expiresInSeconds": 3600,
"deletedFromEhrAt": null
}
],
"ehrType": "modmed",
"ehrPatientId": "35242114",
"ehrActive": true,
"listFetchedAt": "2026-08-14T09:00:00.000Z",
"pagination": {
"page": 1,
"pageSize": 100,
"totalCount": 250,
"totalPages": 3
},
"lastRefresh": {
"status": "completed",
"requestedVia": "api",
"requestedAt": "2026-08-15T20:15:00.000Z",
"completedAt": "2026-08-15T20:15:07.000Z",
"errorKind": null
}
}
}{
"code": "bad_request",
"message": "'id' must be a valid UUID",
"trace_id": "550e8400-e29b-41d4-a716-446655440000"
}{
"code": "unauthorized",
"message": "Invalid or missing API key",
"trace_id": "550e8400-e29b-41d4-a716-446655440000"
}{
"code": "forbidden",
"message": "Insufficient scope",
"trace_id": "550e8400-e29b-41d4-a716-446655440000"
}{
"code": "not_found",
"message": "Resource not found",
"trace_id": "550e8400-e29b-41d4-a716-446655440000"
}{
"code": "rate_limit_exceeded",
"message": "Rate limit exceeded. Maximum 1000 requests per 60 seconds.",
"trace_id": "550e8400-e29b-41d4-a716-446655440000"
}Authorizations
Marketplace API key
Headers
Target clinic organization ID
Path Parameters
Patient ID
Query Parameters
Filter to a single document kind.
insurance_card, identification, prior_auth, clinical, other "insurance_card"
Delta sync: only documents whose record changed at or after this instant (ISO 8601). Compared against updatedAt. Pair with includeDeleted=true to also learn about documents removed from the chart since the cursor — without it a delta poll reports additions and changes only.
"2026-08-01T00:00:00.000Z"
Include documents that have since been removed from the EHR chart (they carry deletedFromEhrAt). Defaults to false: a removed document is normally noise, and because removal is the newest thing that happened to it, it would otherwise sort to the top of the list.
false
Only documents whose category is this one (see category on the document). Applied before paging, so totalCount counts the filtered set.
referral, pathology, lab, imaging, prior_authorization, medical_records, records_request, correspondence, prescription, forms, insurance, billing, audit, disclosure "pathology"
Only documents created in the EHR at or after this point (createdAt). A date (2026-08-01, the start of that UTC day) or a date-time with an offset. Documents the EHR did not date are excluded whenever dateFrom or dateTo is set.
"2026-08-01"
Only documents created in the EHR at or before this point (createdAt). A date includes that whole UTC day. Must not be before dateFrom (400).
"2026-08-31"
