---
title: "Network compliance landscape"
method: GET
path: "/v1/stats/compliance"
tags: ["Compliance"]
---

# Network compliance landscape

`GET /v1/stats/compliance`

## Request

- Base URL: `https://api.peppolstatus.com`
- URL: `https://api.peppolstatus.com/v1/stats/compliance`
- Auth: none required

The free compliance landscape (issue #692): per-country error rates — the share of a country's registered participants that break at least one published Peppol rule — and the per-rule breakdown of every open finding. Counts ONLY: no participant, seat or hostname appears here; the participant-level records are `GET /v1/compliance/findings` (Network tier). Read from the pre-computed compliance rollup tables and edge-cached. Keyless-cacheable.

Pass `country` to scope the whole body to one country (issue #716): the same shape, with `countries` holding that one cell, `rules` its own breakdown, each rule's `share` a share of THAT country's open findings, and the code echoed back in `country`. A country scope is how a structural national pattern is told apart from a real problem — AU and NZ, for example, break `not_in_peppol_directory` almost everywhere because A-NZ PINT participants are absent from the European Peppol Directory by design.

## Query parameters

- `country` string

## Response `200`

The compliance landscape aggregates.

- object
  - `countries` object[], required: Per-country cells, sorted by open findings desc.
    - `country` string, required: ISO 3166-1 alpha-2, or `ZZ` when the subject resolves to none.
    - `participants` integer, required
    - `affected_participants` integer, required: Distinct participants with at least one OPEN finding.
    - `error_rate` number, required: `affected_participants / participants`, 0..1.
    - `open_findings` integer, required
    - `fatal` integer, required
    - `warning` integer, required
    - `notice` integer, required
  - `rules` object[], required: Per-rule cells, sorted by open findings desc.
    - `rule_code` string, required
    - `title` string, required: The rule's published title from `GET /v1/compliance/rules`.
    - `grade` 'fatal' | 'warning' | 'notice', required
    - `open_findings` integer, required
    - `resolved_findings` integer, required
    - `affected_participants` integer, required
    - `countries` integer, required: Distinct countries the rule is open in. Inside a `country` scope there is only one, so this reads 1 when the rule is open there and 0 when only its corrected findings remain.
    - `share` number, required: Share of all open findings, 0..1.
  - `country` string: The country the body is scoped to; absent on the global landscape (#716).
  - `totals` object, required: Network totals behind the landscape header.
    - `participants` integer, required
    - `affected_participants` integer, required
    - `error_rate` number, required
    - `open_findings` integer, required
    - `resolved_findings` integer, required
    - `fatal` integer, required
    - `warning` integer, required
    - `notice` integer, required
  - `generated_at` string, date-time, required

## Other responses

- `400`: A `country` that is not a two-letter country code.

---

[API](https://skmtc.dev/peppolstatus/apis/peppolstatus-api.md) · [All operations](https://skmtc.dev/peppolstatus/apis/peppolstatus-api/llms.txt) · [OpenAPI document](https://skmtc.dev/peppolstatus/apis/peppolstatus-api/revisions/7e74fb32f23c?raw)
