Metrics
Volumes and processing performance for your organization: documents and pages by type and over time, runs by outcome and channel. Built for dashboards and BI pulls.
Every endpoint takes an optional window, from and to; without it, the last 30 days. Figures cover the organization that owns the key, update as work completes, and leave out the internal page-split children of a segmented bundle, so document totals are real submissions. An invalid granularity or include answers 400. Whether Holofin can take work right now is Health.
Get all metrics
/api/v1.1/metricsVolumes and throughput for one window, in one call: the one to use for a scheduled BI pull. The volumes and throughput objects hold the fields of the two endpoints below.
Query parameters
fromstringISO 8601 date or datetime. Default: 30 days ago.
tostringISO 8601 date or datetime. Default: now.
granularitystringThe size of each
seriesbucket. One ofday,week,month. Default"day".includestringvolumes,throughput, or both comma-separated. Default"volumes,throughput".
Response
organizationstringperiod_startstringperiod_endstringgranularitystringvolumesobjectAs volume metrics.
throughputobject
curl -G "https://app.holofin.ai/api/v1.1/metrics" \
-H "X-API-Key: $HOLOFIN_API_KEY" \
--data-urlencode "from=2026-01-01" \
--data-urlencode "granularity=month"import os
import requests
response = requests.get(
"https://app.holofin.ai/api/v1.1/metrics",
headers={"X-API-Key": os.environ["HOLOFIN_API_KEY"]},
params={
"from": "2026-01-01",
"granularity": "month",
},
)
response.raise_for_status()
print(response.json())const response = await fetch("https://app.holofin.ai/api/v1.1/metrics?from=2026-01-01&granularity=month", {
headers: {
"X-API-Key": process.env.HOLOFIN_API_KEY,
},
});
if (!response.ok) throw new Error(await response.text());
console.log(await response.json());{
"organization": "Acme Corp",
"period_start": "2026-01-01T00:00:00+00:00",
"period_end": "2026-09-01T08:14:22.481930+00:00",
"granularity": "month",
"volumes": {
"totals": {
"documents": 70,
"pages": 678
},
"by_type": [
{
"document_category": "relevé_bancaire",
"documents": 57,
"pages": 536
}
],
"by_type_families": [
{
"family": "bank_statement",
"label": "Bank statement",
"documents": 58,
"pages": 537
}
],
"series": [
{
"period": "2026-07-01",
"documents": 12,
"pages": 140
}
]
},
"throughput": {
"totals": {
"processed": 64,
"completed": 60,
"failed": 1
},
"success_rate": 0.9836,
"avg_duration_ms": 41250,
"by_channel": [
{
"channel": "api",
"runs": 46
}
],
"by_status": [
{
"status": "completed",
"runs": 60
}
]
}
}Get volume metrics
/api/v1.1/metrics/volumesDocuments and pages processed, by type and over time.
Query parameters
fromstringISO 8601 date or datetime. Default: 30 days ago.
tostringISO 8601 date or datetime. Default: now.
granularitystringThe size of each
seriesbucket. One ofday,week,month. Default"day".
Response
organizationstringperiod_startstringperiod_endstringgranularitystringtotalsobjectdocumentsandpages.by_typearray of objectPer raw classifier code (
document_category,documents,pages). Stable keys for data pipelines.by_type_familiesarray of objectCodes folded into business families (
family,label,documents,pages), as on the in-product dashboard.seriesarray of objectOne bucket per period:
period,documents,pages.
Use by_type in data pipelines, its raw codes are stable; use by_type_families for dashboards people read.
curl -G "https://app.holofin.ai/api/v1.1/metrics/volumes" \
-H "X-API-Key: $HOLOFIN_API_KEY" \
--data-urlencode "from=2026-01-01" \
--data-urlencode "granularity=month"import os
import requests
response = requests.get(
"https://app.holofin.ai/api/v1.1/metrics/volumes",
headers={"X-API-Key": os.environ["HOLOFIN_API_KEY"]},
params={
"from": "2026-01-01",
"granularity": "month",
},
)
response.raise_for_status()
print(response.json())const response = await fetch("https://app.holofin.ai/api/v1.1/metrics/volumes?from=2026-01-01&granularity=month", {
headers: {
"X-API-Key": process.env.HOLOFIN_API_KEY,
},
});
if (!response.ok) throw new Error(await response.text());
console.log(await response.json());{
"organization": "Acme Corp",
"period_start": "2025-01-01T00:00:00+00:00",
"period_end": "2026-07-19T14:32:45.123456+00:00",
"granularity": "month",
"totals": {
"documents": 70,
"pages": 678
},
"by_type": [
{
"document_category": "relevé_bancaire",
"documents": 57,
"pages": 536
},
{
"document_category": null,
"documents": 5,
"pages": 29
}
],
"by_type_families": [
{
"family": "bank_statement",
"label": "Bank statement",
"documents": 58,
"pages": 537
},
{
"family": "__unclassified__",
"label": "Unclassified",
"documents": 5,
"pages": 29
}
],
"series": [
{
"period": "2026-07-01",
"documents": 12,
"pages": 140
}
]
}Get throughput metrics
/api/v1.1/metrics/throughputWorkflow runs by outcome and by ingestion channel, with success rate and average processing time.
Query parameters
fromstringISO 8601 date or datetime. Default: 30 days ago.
tostringISO 8601 date or datetime. Default: now.
Response
organizationstringperiod_startstringperiod_endstringtotalsobjectprocessed(every run),completed,failed.success_ratenumber | nullCompleted over completed plus failed; runs still in flight are left out. Null when nothing has finished.
avg_duration_msinteger | nullby_channelarray of objectchannelandruns.by_statusarray of objectstatusandruns.
curl -G "https://app.holofin.ai/api/v1.1/metrics/throughput" \
-H "X-API-Key: $HOLOFIN_API_KEY" \
--data-urlencode "from=2026-01-01"import os
import requests
response = requests.get(
"https://app.holofin.ai/api/v1.1/metrics/throughput",
headers={"X-API-Key": os.environ["HOLOFIN_API_KEY"]},
params={
"from": "2026-01-01",
},
)
response.raise_for_status()
print(response.json())const response = await fetch("https://app.holofin.ai/api/v1.1/metrics/throughput?from=2026-01-01", {
headers: {
"X-API-Key": process.env.HOLOFIN_API_KEY,
},
});
if (!response.ok) throw new Error(await response.text());
console.log(await response.json());{
"organization": "Acme Corp",
"period_start": "2025-01-01T00:00:00+00:00",
"period_end": "2026-07-19T14:32:45.123456+00:00",
"totals": {
"processed": 64,
"completed": 60,
"failed": 1
},
"success_rate": 0.9836,
"avg_duration_ms": 1258816,
"by_channel": [
{
"channel": "webhook",
"runs": 46
},
{
"channel": "manual",
"runs": 18
}
],
"by_status": [
{
"status": "completed",
"runs": 60
},
{
"status": "running",
"runs": 3
},
{
"status": "failed",
"runs": 1
}
]
}