curl --request GET \
--url https://api.maxcare.ai/v4/bank-transactions \
--header 'Authorization: Bearer <token>' \
--header 'X-Organization-Id: <x-organization-id>'import requests
url = "https://api.maxcare.ai/v4/bank-transactions"
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/v4/bank-transactions', 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/v4/bank-transactions",
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/v4/bank-transactions"
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/v4/bank-transactions")
.header("X-Organization-Id", "<x-organization-id>")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.maxcare.ai/v4/bank-transactions")
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": {
"bankTransactions": [
{
"id": "btx_5f1c0000000040000000000000000001",
"bankAccountId": "bka_5f1c0000000040000000000000000002",
"amount": "28412.60",
"direction": "credit",
"transactionDate": "2026-10-14",
"postedDate": "2026-10-14",
"pending": false,
"source": "plaid",
"bankRefId": "1SYN000000481",
"checkNumber": null,
"description": "ORIG CO NAME:SYNTHETIC PAYER ORIG ID:9000000001 SEC:CCD TRN*1*1SYN000000481*1310935772\\",
"references": [
"1SYN000000481",
"021000020000001",
"7000001"
],
"counterpartyName": "ELEVATE CENTRALP",
"status": "available",
"supersededBy": null,
"platformMatch": {
"status": "matched",
"eraPaymentIds": [
"erp_5f1c0000000040000000000000000003"
],
"cardPayout": false
},
"appMatches": [
{
"id": "dpm_5f1c0000000040000000000000000004",
"kind": "pharmacy_remittance",
"externalRef": "elevate:EB-1",
"amount": "41906.25",
"status": "active",
"createdAt": "2026-10-14T09:12:40.123Z"
}
],
"updatedAt": "2026-10-14T09:12:40.123Z"
}
],
"pagination": {
"page": 1,
"pageSize": 100,
"totalCount": 250,
"totalPages": 3
}
}
}{
"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 bank deposits
Deposits into the organization’s connected bank accounts: credits only, posted only unless includePending=true. Each row says whether it is still the row to use (status, supersededBy), how the platform reconciled it against payer ERAs (platformMatch) and your installation’s own matches (appMatches). Sync with updatedSince + cursorId. Each deposit carries the bank’s description; merchant text is never returned. Requires read:bank_transactions. Facility-limited API keys are refused.
curl --request GET \
--url https://api.maxcare.ai/v4/bank-transactions \
--header 'Authorization: Bearer <token>' \
--header 'X-Organization-Id: <x-organization-id>'import requests
url = "https://api.maxcare.ai/v4/bank-transactions"
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/v4/bank-transactions', 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/v4/bank-transactions",
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/v4/bank-transactions"
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/v4/bank-transactions")
.header("X-Organization-Id", "<x-organization-id>")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.maxcare.ai/v4/bank-transactions")
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": {
"bankTransactions": [
{
"id": "btx_5f1c0000000040000000000000000001",
"bankAccountId": "bka_5f1c0000000040000000000000000002",
"amount": "28412.60",
"direction": "credit",
"transactionDate": "2026-10-14",
"postedDate": "2026-10-14",
"pending": false,
"source": "plaid",
"bankRefId": "1SYN000000481",
"checkNumber": null,
"description": "ORIG CO NAME:SYNTHETIC PAYER ORIG ID:9000000001 SEC:CCD TRN*1*1SYN000000481*1310935772\\",
"references": [
"1SYN000000481",
"021000020000001",
"7000001"
],
"counterpartyName": "ELEVATE CENTRALP",
"status": "available",
"supersededBy": null,
"platformMatch": {
"status": "matched",
"eraPaymentIds": [
"erp_5f1c0000000040000000000000000003"
],
"cardPayout": false
},
"appMatches": [
{
"id": "dpm_5f1c0000000040000000000000000004",
"kind": "pharmacy_remittance",
"externalRef": "elevate:EB-1",
"amount": "41906.25",
"status": "active",
"createdAt": "2026-10-14T09:12:40.123Z"
}
],
"updatedAt": "2026-10-14T09:12:40.123Z"
}
],
"pagination": {
"page": 1,
"pageSize": 100,
"totalCount": 250,
"totalPages": 3
}
}
}{
"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
Query Parameters
Include deposits the bank still reports as pending. Defaults to false. A pending deposit is replaced by a NEW row when it posts: the pending row turns superseded and names the posted row in supersededBy.
Only deposits into this bank account (bka_…). An account outside your organization is a 404.
"bka_5f1c0000000040000000000000000001"
Only deposits whose record changed at/after this instant (ISO 8601 with an explicit UTC offset). Results are always ordered by updatedAt (millisecond) then id. A deposit changes when it posts, is excluded, gains or loses an ERA link, or an app match is recorded or revoked on it. Walk with cursorId; boundary rows re-deliver, so dedupe on id. Overlap your stored cursor by a few minutes: a change is stamped when its transaction starts and becomes visible when it commits.
"2026-10-18T00:00:00.000Z"
Only deposits whose record changed at/before this instant. Pin it to freeze a walk's window.
"2026-10-19T00:00:00.000Z"
Id of the last deposit you consumed (btx_…), for a keyset walk: pass it with updatedSince set to that row's updatedAt and always request page 1. pagination.totalCount then counts from the cursor's millisecond and shrinks as you walk; stop on a short page.
"btx_5f1c0000000040000000000000000001"
