cURL
curl --request GET --fail-with-body --max-time 30 \
"${AMLOK_API_BASE_URL}/v1/billing/usage" \
--header "Authorization: Bearer ${AMLOK_API_KEY}" \
--header 'Accept: application/json'import os
import requests
headers = {'Accept': 'application/json'}
headers["Authorization"] = "Bearer " + os.environ["AMLOK_API_KEY"]
response = requests.request('GET', os.environ["AMLOK_API_BASE_URL"] + '/v1/billing/usage', headers=headers, timeout=30, allow_redirects=False)
response.raise_for_status()
print(response.json())
const headers = {"Accept": "application/json"};
headers.Authorization = `Bearer ${process.env.AMLOK_API_KEY}`;
const response = await fetch(process.env.AMLOK_API_BASE_URL + "/v1/billing/usage", {
method: "GET", headers, redirect: "error", signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());
{
"data": [
{
"id": "usage_synthetic",
"snapshot_id": "snap_synthetic",
"borrower_id": "bor_synthetic",
"product": "insights",
"origination_id": "orgn_synthetic",
"monitor_ids": [],
"risk_package_ids": [
"rp_synthetic"
],
"period": {
"start": "2026-11-06T00:00:00Z",
"end": "2026-11-07T00:00:00Z"
},
"charged_at": "2026-11-06T12:00:00Z",
"tier": "standard",
"quantity": 1,
"unit_rate": "40.00",
"amount": "40.00",
"currency": "CAD",
"rate_card_id": "rate_synthetic",
"rate_version": "synthetic-1",
"transaction_id": "txn_usage_synthetic",
"workload": {
"bank_accounts": 1,
"business_systems": 2,
"records": 1500,
"record_counting_basis": "per_underwriting"
}
}
],
"meta": {
"request_id": "req_synthetic",
"schema_version": "1.0.0",
"environment": "sandbox"
},
"page": {
"next_cursor": null,
"has_more": false,
"snapshot_id": "snap_synthetic",
"expires_at": "2026-11-06T13:00:00Z"
}
}{
"error": {
"code": "validation_error",
"message": "Validation error.",
"retryable": false,
"request_id": "req_synthetic",
"field": null
}
}{
"error": {
"code": "unauthenticated",
"message": "Unauthenticated.",
"retryable": false,
"request_id": "req_synthetic",
"field": null
}
}{
"error": {
"code": "forbidden",
"message": "Forbidden.",
"retryable": false,
"request_id": "req_synthetic",
"field": null
}
}{
"error": {
"code": "not_found",
"message": "Not found.",
"retryable": false,
"request_id": "req_synthetic",
"field": null
}
}{
"error": {
"code": "invalid_state",
"message": "Invalid state.",
"retryable": false,
"request_id": "req_synthetic",
"field": null
}
}{
"error": {
"code": "cursor_expired",
"message": "Cursor expired.",
"retryable": false,
"request_id": "req_synthetic",
"field": null
}
}{
"error": {
"code": "rate_limited",
"message": "Rate limited.",
"retryable": true,
"request_id": "req_synthetic",
"field": null
}
}{
"error": {
"code": "temporarily_unavailable",
"message": "Temporarily unavailable.",
"retryable": true,
"request_id": "req_synthetic",
"field": null
}
}Billing
List billing usage
Read what was charged, for which borrower and product, with historical rate, tier, workload and links to the wallet transaction and assessment. Signal combines a borrower across deals once per workspace/month.
GET
/
v1
/
billing
/
usage
cURL
curl --request GET --fail-with-body --max-time 30 \
"${AMLOK_API_BASE_URL}/v1/billing/usage" \
--header "Authorization: Bearer ${AMLOK_API_KEY}" \
--header 'Accept: application/json'import os
import requests
headers = {'Accept': 'application/json'}
headers["Authorization"] = "Bearer " + os.environ["AMLOK_API_KEY"]
response = requests.request('GET', os.environ["AMLOK_API_BASE_URL"] + '/v1/billing/usage', headers=headers, timeout=30, allow_redirects=False)
response.raise_for_status()
print(response.json())
const headers = {"Accept": "application/json"};
headers.Authorization = `Bearer ${process.env.AMLOK_API_KEY}`;
const response = await fetch(process.env.AMLOK_API_BASE_URL + "/v1/billing/usage", {
method: "GET", headers, redirect: "error", signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());
{
"data": [
{
"id": "usage_synthetic",
"snapshot_id": "snap_synthetic",
"borrower_id": "bor_synthetic",
"product": "insights",
"origination_id": "orgn_synthetic",
"monitor_ids": [],
"risk_package_ids": [
"rp_synthetic"
],
"period": {
"start": "2026-11-06T00:00:00Z",
"end": "2026-11-07T00:00:00Z"
},
"charged_at": "2026-11-06T12:00:00Z",
"tier": "standard",
"quantity": 1,
"unit_rate": "40.00",
"amount": "40.00",
"currency": "CAD",
"rate_card_id": "rate_synthetic",
"rate_version": "synthetic-1",
"transaction_id": "txn_usage_synthetic",
"workload": {
"bank_accounts": 1,
"business_systems": 2,
"records": 1500,
"record_counting_basis": "per_underwriting"
}
}
],
"meta": {
"request_id": "req_synthetic",
"schema_version": "1.0.0",
"environment": "sandbox"
},
"page": {
"next_cursor": null,
"has_more": false,
"snapshot_id": "snap_synthetic",
"expires_at": "2026-11-06T13:00:00Z"
}
}{
"error": {
"code": "validation_error",
"message": "Validation error.",
"retryable": false,
"request_id": "req_synthetic",
"field": null
}
}{
"error": {
"code": "unauthenticated",
"message": "Unauthenticated.",
"retryable": false,
"request_id": "req_synthetic",
"field": null
}
}{
"error": {
"code": "forbidden",
"message": "Forbidden.",
"retryable": false,
"request_id": "req_synthetic",
"field": null
}
}{
"error": {
"code": "not_found",
"message": "Not found.",
"retryable": false,
"request_id": "req_synthetic",
"field": null
}
}{
"error": {
"code": "invalid_state",
"message": "Invalid state.",
"retryable": false,
"request_id": "req_synthetic",
"field": null
}
}{
"error": {
"code": "cursor_expired",
"message": "Cursor expired.",
"retryable": false,
"request_id": "req_synthetic",
"field": null
}
}{
"error": {
"code": "rate_limited",
"message": "Rate limited.",
"retryable": true,
"request_id": "req_synthetic",
"field": null
}
}{
"error": {
"code": "temporarily_unavailable",
"message": "Temporarily unavailable.",
"retryable": true,
"request_id": "req_synthetic",
"field": null
}
}Read what was charged, for which borrower and product, with historical rate, tier, workload and links to the wallet transaction and assessment. Signal combines a borrower across deals once per workspace/month. All IDs and cursors must belong to the authorized workspace and environment. Required scope: billing:read. Owner authority is required. Related reads can pin snapshot_id from billing summary to reconcile the same as-of state; expired snapshots return 410, never a silent refresh.
Examples use synthetic IDs. Replace them with values returned by your environment.
Authorizations
Server-to-server API key bound to exactly one workspace, institution tenant and environment. No caller-supplied workspace override is accepted. Do not use in public browser code.
Query Parameters
cursor
Minimum string length:
1limit
Required range:
1 <= x <= 100borrower id
Minimum string length:
1product
Available options:
insights, signal origination id
Minimum string length:
1monitor id
Minimum string length:
1charged from. UTC ranges are inclusive from and exclusive to; reject to <= from.
charged to. UTC ranges are inclusive from and exclusive to; reject to <= from.
snapshot id
Minimum string length:
1