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

GET/api/v1.1/metrics

Volumes 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

  • fromstring

    ISO 8601 date or datetime. Default: 30 days ago.

  • tostring

    ISO 8601 date or datetime. Default: now.

  • granularitystring

    The size of each series bucket. One of day, week, month. Default "day".

  • includestring

    volumes, throughput, or both comma-separated. Default "volumes,throughput".

Response

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());
200
{
  "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

GET/api/v1.1/metrics/volumes

Documents and pages processed, by type and over time.

Query parameters

  • fromstring

    ISO 8601 date or datetime. Default: 30 days ago.

  • tostring

    ISO 8601 date or datetime. Default: now.

  • granularitystring

    The size of each series bucket. One of day, week, month. Default "day".

Response

  • organizationstring
  • period_startstring
  • period_endstring
  • granularitystring
  • totalsobject

    documents and pages.

  • by_typearray of object

    Per raw classifier code (document_category, documents, pages). Stable keys for data pipelines.

  • by_type_familiesarray of object

    Codes folded into business families (family, label, documents, pages), as on the in-product dashboard.

  • seriesarray of object

    One 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());
200
{
  "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

GET/api/v1.1/metrics/throughput

Workflow runs by outcome and by ingestion channel, with success rate and average processing time.

Query parameters

  • fromstring

    ISO 8601 date or datetime. Default: 30 days ago.

  • tostring

    ISO 8601 date or datetime. Default: now.

Response

  • organizationstring
  • period_startstring
  • period_endstring
  • totalsobject

    processed (every run), completed, failed.

  • success_ratenumber | null

    Completed over completed plus failed; runs still in flight are left out. Null when nothing has finished.

  • avg_duration_msinteger | null
  • by_channelarray of object

    channel and runs.

  • by_statusarray of object

    status and runs.

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());
200
{
  "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
    }
  ]
}