curl --request GET --fail-with-body --max-time 30 \
"${AMLOK_API_BASE_URL}/v1/billing/rate-card?snapshot_id=billing_snapshot_example" \
--header "Authorization: Bearer ${AMLOK_API_KEY}" \
--header "Accept: application/json"import os
import requests
base_url = os.environ["AMLOK_API_BASE_URL"].rstrip("/")
headers = {'Accept': 'application/json'}
headers["Authorization"] = "Bearer " + os.environ["AMLOK_API_KEY"]
response = requests.request(
"GET", base_url + "/v1/billing/rate-card?snapshot_id=billing_snapshot_example",
headers=headers, timeout=30, allow_redirects=False,
)
response.raise_for_status()
print(response.json())
const baseUrl = process.env.AMLOK_API_BASE_URL;
const apiKey = process.env.AMLOK_API_KEY;
if (!baseUrl || !apiKey) throw new Error("Configure AMLOK_API_BASE_URL and AMLOK_API_KEY");
const headers = {
"Accept": "application/json"
};
headers.Authorization = `Bearer ${apiKey}`;
const response = await fetch(baseUrl.replace(/\/$/, "") + "/v1/billing/rate-card?snapshot_id=billing_snapshot_example", {
method: "GET", headers,
redirect: "error", signal: AbortSignal.timeout(30000),
});
if (!response.ok) throw new Error(`AMLOK returned HTTP ${response.status}`);
console.log(await response.json());{
"data": {
"id": "billing_rate_card_example",
"object": "billing_rate_card",
"record_version": 1,
"created_at": "2026-10-23T14:00:00Z",
"updated_at": "2026-10-23T14:00:00Z",
"workspace_id": "wsp_example",
"currency": "CAD",
"effective_from": "2026-10-01T00:00:00Z",
"effective_to": null,
"agreement_id": "agr_example",
"agreement_version": "3",
"supersedes_id": null,
"rates": [
{
"product": "insights",
"tier": "standard",
"unit": "completed_underwriting",
"base_rate": "5.00",
"discount_percent": "0",
"effective_rate": "5.00",
"pricing_basis": "published",
"workload_limits": {
"bank_accounts": 2,
"business_integrations": 5,
"record_limit": 75000,
"minimum_banking_history_months": 12,
"analysis_scope": "Routine reconciliation and standard analysis",
"record_counting_basis": "per_underwriting",
"record_counting_rule": "distinct_record_versions"
},
"billing_timing": "successful_output_completion"
},
{
"product": "insights",
"tier": "advanced",
"unit": "completed_underwriting",
"base_rate": "15.00",
"discount_percent": "0",
"effective_rate": "15.00",
"pricing_basis": "published",
"workload_limits": {
"bank_accounts": 4,
"business_integrations": 10,
"record_limit": 250000,
"minimum_banking_history_months": 12,
"analysis_scope": "Multiple entities or channels and deeper reconciliation",
"record_counting_basis": "per_underwriting",
"record_counting_rule": "distinct_record_versions"
},
"billing_timing": "successful_output_completion"
},
{
"product": "insights",
"tier": "complex",
"unit": "completed_underwriting",
"base_rate": "35.00",
"discount_percent": "0",
"effective_rate": "35.00",
"pricing_basis": "published",
"workload_limits": {
"bank_accounts": 8,
"business_integrations": 20,
"record_limit": 1000000,
"minimum_banking_history_months": 12,
"analysis_scope": "Extensive relationships, exceptions, and investigation",
"record_counting_basis": "per_underwriting",
"record_counting_rule": "distinct_record_versions"
},
"billing_timing": "successful_output_completion"
},
{
"product": "signal",
"tier": "standard",
"unit": "active_account_month",
"base_rate": "3.00",
"discount_percent": "0",
"effective_rate": "3.00",
"pricing_basis": "published",
"workload_limits": {
"bank_accounts": 2,
"business_integrations": 5,
"record_limit": 75000,
"minimum_banking_history_months": null,
"analysis_scope": "Routine reconciliation and standard analysis",
"record_counting_basis": "new_records_per_month",
"record_counting_rule": "distinct_record_versions"
},
"billing_timing": "month_start_or_first_activation"
},
{
"product": "signal",
"tier": "advanced",
"unit": "active_account_month",
"base_rate": "5.00",
"discount_percent": "0",
"effective_rate": "5.00",
"pricing_basis": "published",
"workload_limits": {
"bank_accounts": 4,
"business_integrations": 10,
"record_limit": 250000,
"minimum_banking_history_months": null,
"analysis_scope": "Multiple entities or channels and deeper reconciliation",
"record_counting_basis": "new_records_per_month",
"record_counting_rule": "distinct_record_versions"
},
"billing_timing": "month_start_or_first_activation"
},
{
"product": "signal",
"tier": "complex",
"unit": "active_account_month",
"base_rate": "8.00",
"discount_percent": "0",
"effective_rate": "8.00",
"pricing_basis": "published",
"workload_limits": {
"bank_accounts": 8,
"business_integrations": 20,
"record_limit": 1000000,
"minimum_banking_history_months": null,
"analysis_scope": "Extensive relationships, exceptions, and investigation",
"record_counting_basis": "new_records_per_month",
"record_counting_rule": "distinct_record_versions"
},
"billing_timing": "month_start_or_first_activation"
}
],
"snapshot_id": "billing_snapshot_example"
},
"meta": {
"request_id": "req_example",
"schema_version": "1.4.2",
"generated_at": "2026-10-23T14:00:00Z",
"data_status": "complete"
}
}Retrieve billing rate card
Read published or negotiated rates and agreed workload limits for the workspace. Custom quotes retain standard, advanced or complex as the tier and use pricing_basis negotiated with the agreed effective_rate and workload_limits. Insights record_limit covers the complete underwriting snapshot, including at least 12 months of banking history. Signal record_limit covers only newly processed records during the month; each updated record version counts as new, while retries and unchanged baseline records are not counted again. The tier must cover every workload dimension; custom allowances require an agreed quote. Historical usage retains its own rate-card identifier and effective rate.
Required scope: billing:read. The API key is bound to exactly one workspace, institution and environment. There is no workspace override; this binding applies to every read and export.
curl --request GET --fail-with-body --max-time 30 \
"${AMLOK_API_BASE_URL}/v1/billing/rate-card?snapshot_id=billing_snapshot_example" \
--header "Authorization: Bearer ${AMLOK_API_KEY}" \
--header "Accept: application/json"import os
import requests
base_url = os.environ["AMLOK_API_BASE_URL"].rstrip("/")
headers = {'Accept': 'application/json'}
headers["Authorization"] = "Bearer " + os.environ["AMLOK_API_KEY"]
response = requests.request(
"GET", base_url + "/v1/billing/rate-card?snapshot_id=billing_snapshot_example",
headers=headers, timeout=30, allow_redirects=False,
)
response.raise_for_status()
print(response.json())
const baseUrl = process.env.AMLOK_API_BASE_URL;
const apiKey = process.env.AMLOK_API_KEY;
if (!baseUrl || !apiKey) throw new Error("Configure AMLOK_API_BASE_URL and AMLOK_API_KEY");
const headers = {
"Accept": "application/json"
};
headers.Authorization = `Bearer ${apiKey}`;
const response = await fetch(baseUrl.replace(/\/$/, "") + "/v1/billing/rate-card?snapshot_id=billing_snapshot_example", {
method: "GET", headers,
redirect: "error", signal: AbortSignal.timeout(30000),
});
if (!response.ok) throw new Error(`AMLOK returned HTTP ${response.status}`);
console.log(await response.json());{
"data": {
"id": "billing_rate_card_example",
"object": "billing_rate_card",
"record_version": 1,
"created_at": "2026-10-23T14:00:00Z",
"updated_at": "2026-10-23T14:00:00Z",
"workspace_id": "wsp_example",
"currency": "CAD",
"effective_from": "2026-10-01T00:00:00Z",
"effective_to": null,
"agreement_id": "agr_example",
"agreement_version": "3",
"supersedes_id": null,
"rates": [
{
"product": "insights",
"tier": "standard",
"unit": "completed_underwriting",
"base_rate": "5.00",
"discount_percent": "0",
"effective_rate": "5.00",
"pricing_basis": "published",
"workload_limits": {
"bank_accounts": 2,
"business_integrations": 5,
"record_limit": 75000,
"minimum_banking_history_months": 12,
"analysis_scope": "Routine reconciliation and standard analysis",
"record_counting_basis": "per_underwriting",
"record_counting_rule": "distinct_record_versions"
},
"billing_timing": "successful_output_completion"
},
{
"product": "insights",
"tier": "advanced",
"unit": "completed_underwriting",
"base_rate": "15.00",
"discount_percent": "0",
"effective_rate": "15.00",
"pricing_basis": "published",
"workload_limits": {
"bank_accounts": 4,
"business_integrations": 10,
"record_limit": 250000,
"minimum_banking_history_months": 12,
"analysis_scope": "Multiple entities or channels and deeper reconciliation",
"record_counting_basis": "per_underwriting",
"record_counting_rule": "distinct_record_versions"
},
"billing_timing": "successful_output_completion"
},
{
"product": "insights",
"tier": "complex",
"unit": "completed_underwriting",
"base_rate": "35.00",
"discount_percent": "0",
"effective_rate": "35.00",
"pricing_basis": "published",
"workload_limits": {
"bank_accounts": 8,
"business_integrations": 20,
"record_limit": 1000000,
"minimum_banking_history_months": 12,
"analysis_scope": "Extensive relationships, exceptions, and investigation",
"record_counting_basis": "per_underwriting",
"record_counting_rule": "distinct_record_versions"
},
"billing_timing": "successful_output_completion"
},
{
"product": "signal",
"tier": "standard",
"unit": "active_account_month",
"base_rate": "3.00",
"discount_percent": "0",
"effective_rate": "3.00",
"pricing_basis": "published",
"workload_limits": {
"bank_accounts": 2,
"business_integrations": 5,
"record_limit": 75000,
"minimum_banking_history_months": null,
"analysis_scope": "Routine reconciliation and standard analysis",
"record_counting_basis": "new_records_per_month",
"record_counting_rule": "distinct_record_versions"
},
"billing_timing": "month_start_or_first_activation"
},
{
"product": "signal",
"tier": "advanced",
"unit": "active_account_month",
"base_rate": "5.00",
"discount_percent": "0",
"effective_rate": "5.00",
"pricing_basis": "published",
"workload_limits": {
"bank_accounts": 4,
"business_integrations": 10,
"record_limit": 250000,
"minimum_banking_history_months": null,
"analysis_scope": "Multiple entities or channels and deeper reconciliation",
"record_counting_basis": "new_records_per_month",
"record_counting_rule": "distinct_record_versions"
},
"billing_timing": "month_start_or_first_activation"
},
{
"product": "signal",
"tier": "complex",
"unit": "active_account_month",
"base_rate": "8.00",
"discount_percent": "0",
"effective_rate": "8.00",
"pricing_basis": "published",
"workload_limits": {
"bank_accounts": 8,
"business_integrations": 20,
"record_limit": 1000000,
"minimum_banking_history_months": null,
"analysis_scope": "Extensive relationships, exceptions, and investigation",
"record_counting_basis": "new_records_per_month",
"record_counting_rule": "distinct_record_versions"
},
"billing_timing": "month_start_or_first_activation"
}
],
"snapshot_id": "billing_snapshot_example"
},
"meta": {
"request_id": "req_example",
"schema_version": "1.4.2",
"generated_at": "2026-10-23T14:00:00Z",
"data_status": "complete"
}
}billing:read
Read published or negotiated rates and agreed workload limits for the workspace. Custom quotes retain standard, advanced or complex as the tier and use pricing_basis negotiated with the agreed effective_rate and workload_limits. Insights record_limit covers the complete underwriting snapshot, including at least 12 months of banking history. Signal record_limit covers only newly processed records during the month; each updated record version counts as new, while retries and unchanged baseline records are not counted again. The tier must cover every workload dimension; custom allowances require an agreed quote. Historical usage retains its own rate-card identifier and effective rate.
Required scope: billing:read. The API key is bound to exactly one workspace, institution and environment. There is no workspace override; this binding applies to every read and export.
Product scope · Processing lifecycle · ErrorsAuthorizations
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
Reuse an immutable snapshot from this workspace. Omit to use a current snapshot. Cursors bind this value; unknown snapshots return 404 and conflicting cursor parameters return 400.