---
title: "Get the network-level statistics"
method: GET
path: "/v1/network/stats"
tags: ["Network"]
---

# Get the network-level statistics

`GET /v1/network/stats`

## Request

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

How the whole network moves: Movers (AP) and Movers (SMP), Cross-border moves, Bulk moves, Joiners, Leavers and Net growth, the Leaver rate (annualized), Concentration (AP) and Concentration (SMP) (HHI, top 5, top 10), Concentration per country, Foreign-served participants and penetration. Each flow statistic gives its count over the last 7 and 30 days, the 7-day mean and the change against the period before.

Every rate is of the registered-participant count at the START of its period (`base`, the end of `base_day`) and is returned beside its absolute count. A day with no completed change scan is a gap: `gap_days` counts them, and moves found after a gap are counted on the next scan day. A 7-day mean is the mean over the scanned days of its window; a gap day is in neither the sum nor the divisor, and a window of gap days only has no mean (null). The series starts 2026-08-02; a window that would open earlier is clamped to it. `as_of` is the last complete UTC day and every flow period ends there. Concentration, Foreign-served participants and penetration are snapshots: each is the latest stored value and carries its own `day`, which can be one day after `as_of`.

`concentration_by_country` gives, per country, how the Peppol IDs of that country are shared over the providers that serve it: the HHI, the effective number of providers (10000 / HHI), the largest provider with its share, the top-4 and top-10 shares and the number of providers above 1%. The basis is the provider rosters (certificate seats); Vendors are not counted. Only a country with 8 or more providers is returned.

The headline numbers are free. The organic/bulk split, the cross-border split, the bulk share, penetration and the 30-day trends are returned for a Market key only (see `x-required-tier` on the fields); the body is private to the caller.

## Response `200`

The network-level statistics.

- NetworkStats
  - `as_of` string, date, nullable, required: The last complete UTC day; every flow period ends here. null = no data yet.
  - `since` string, date, required: First day of the series.
  - `refreshed_at` string, date-time, nullable, required
  - `gap_days_30d` integer, required: Days in the last 30 with no completed change scan.
  - `stats` object, nullable, required: null before the first rollup run.
    - `ap_switching` NetworkStatFlow, required: A flow statistic: participants per period.
      - `unit` 'ids', required
      - `last_7d` NetworkStatWindow, required: One period of a flow statistic: the count, its base and the percentage.
        - `from` string, date, required
        - `to` string, date, required
        - `count` integer, required: Absolute count over `from`..`to`.
        - `base` integer, nullable, required: Registered participants at the START of the period: the count at the end of `base_day`. null when no base day exists.
        - `base_day` string, date, nullable, required: The day before `from`, or the latest earlier day when that one has no base.
        - `pct` number, nullable, required: 100 × count / base (0–100, 3 decimals). null without a base.
        - `gap_days` integer, required: Days in the period with no completed change scan.
      - `last_30d` NetworkStatWindow, required: One period of a flow statistic: the count, its base and the percentage.
        - `from` string, date, required
        - `to` string, date, required
        - `count` integer, required: Absolute count over `from`..`to`.
        - `base` integer, nullable, required: Registered participants at the START of the period: the count at the end of `base_day`. null when no base day exists.
        - `base_day` string, date, nullable, required: The day before `from`, or the latest earlier day when that one has no base.
        - `pct` number, nullable, required: 100 × count / base (0–100, 3 decimals). null without a base.
        - `gap_days` integer, required: Days in the period with no completed change scan.
      - `mean_7d` number, nullable, required: Mean per day over the days of `last_7d` that had a change scan, 1 decimal. null when every day is a gap.
      - `change_7d` NetworkStatChange, required: A period against the period before it.
        - `count` integer, required: This period minus the earlier period.
        - `pct` number, nullable, required: The difference as a percentage of the earlier count; null when it was 0.
      - `change_30d` NetworkStatChange, required: A period against the period before it.
        - `count` integer, required: This period minus the earlier period.
        - `pct` number, nullable, required: The difference as a percentage of the earlier count; null when it was 0.
      - `annualized_pct` number, nullable: `leavers` only — the Leaver rate (annualized): `last_30d.pct` scaled to 365 days. null without a base.
      - `split` object: `ap_switching` only. The `last_30d` moves by kind: `platform` is the movers of a platform-move provider pair (the platform stayed and only the certificate Seat changed), `bulk` the other movers that belong to a bulk move, `organic` the rest. A platform mover is never also bulk. The three add up to `last_30d.count`. Returned for a Market key only.
        - `organic` integer, required
        - `bulk` integer, required
        - `platform` integer, required
      - `trend_30d` number[]: The 7-day mean on each of the last 30 days, oldest first; null where all 7 days are gaps. Returned for a Market key only.
    - `cross_border` object, nullable, required: Cross-border moves: the Movers (AP) of the last 30 days by whether the provider country changed. null below Market. `same` + `cross` + `unknown` = `moves` = `ap_switching.last_30d.count`.
      - `definition` 'provider_country_changed', required
      - `last_30d` object, required
        - `from` string, date, required
        - `to` string, date, required
        - `same` integer, required
        - `cross` integer, required
        - `unknown` integer, required
        - `moves` integer, required
        - `pct_cross` number, nullable, required: 100 × cross / moves.
      - `strict` object, required: The strict reading: the old provider was in the participant's country and the new provider is not.
        - `definition` 'left_home_country', required
        - `cross` integer, required
        - `unknown` integer, required
        - `pct_cross` number, nullable, required: 100 × cross / moves.
      - `split` object, required
        - `organic` NetworkStatBorderCounts, required: AP moves by whether the provider country changed. `unknown` = the country of either provider is not known. The three add up to all moves.
          - `same` integer, required
          - `cross` integer, required
          - `unknown` integer, required
        - `bulk` NetworkStatBorderCounts, required: AP moves by whether the provider country changed. `unknown` = the country of either provider is not known. The three add up to all moves.
          - `same` integer, required
          - `cross` integer, required
          - `unknown` integer, required
        - `platform` NetworkStatBorderCounts, required: AP moves by whether the provider country changed. `unknown` = the country of either provider is not known. The three add up to all moves.
          - `same` integer, required
          - `cross` integer, required
          - `unknown` integer, required
    - `smp_switching` NetworkStatFlow, required: A flow statistic: participants per period.
      - `unit` 'ids', required
      - `last_7d` NetworkStatWindow, required: One period of a flow statistic: the count, its base and the percentage.
        - `from` string, date, required
        - `to` string, date, required
        - `count` integer, required: Absolute count over `from`..`to`.
        - `base` integer, nullable, required: Registered participants at the START of the period: the count at the end of `base_day`. null when no base day exists.
        - `base_day` string, date, nullable, required: The day before `from`, or the latest earlier day when that one has no base.
        - `pct` number, nullable, required: 100 × count / base (0–100, 3 decimals). null without a base.
        - `gap_days` integer, required: Days in the period with no completed change scan.
      - `last_30d` NetworkStatWindow, required: One period of a flow statistic: the count, its base and the percentage.
        - `from` string, date, required
        - `to` string, date, required
        - `count` integer, required: Absolute count over `from`..`to`.
        - `base` integer, nullable, required: Registered participants at the START of the period: the count at the end of `base_day`. null when no base day exists.
        - `base_day` string, date, nullable, required: The day before `from`, or the latest earlier day when that one has no base.
        - `pct` number, nullable, required: 100 × count / base (0–100, 3 decimals). null without a base.
        - `gap_days` integer, required: Days in the period with no completed change scan.
      - `mean_7d` number, nullable, required: Mean per day over the days of `last_7d` that had a change scan, 1 decimal. null when every day is a gap.
      - `change_7d` NetworkStatChange, required: A period against the period before it.
        - `count` integer, required: This period minus the earlier period.
        - `pct` number, nullable, required: The difference as a percentage of the earlier count; null when it was 0.
      - `change_30d` NetworkStatChange, required: A period against the period before it.
        - `count` integer, required: This period minus the earlier period.
        - `pct` number, nullable, required: The difference as a percentage of the earlier count; null when it was 0.
      - `annualized_pct` number, nullable: `leavers` only — the Leaver rate (annualized): `last_30d.pct` scaled to 365 days. null without a base.
      - `split` object: `ap_switching` only. The `last_30d` moves by kind: `platform` is the movers of a platform-move provider pair (the platform stayed and only the certificate Seat changed), `bulk` the other movers that belong to a bulk move, `organic` the rest. A platform mover is never also bulk. The three add up to `last_30d.count`. Returned for a Market key only.
        - `organic` integer, required
        - `bulk` integer, required
        - `platform` integer, required
      - `trend_30d` number[]: The 7-day mean on each of the last 30 days, oldest first; null where all 7 days are gaps. Returned for a Market key only.
    - `joiners` NetworkStatFlow, required: A flow statistic: participants per period.
      - `unit` 'ids', required
      - `last_7d` NetworkStatWindow, required: One period of a flow statistic: the count, its base and the percentage.
        - `from` string, date, required
        - `to` string, date, required
        - `count` integer, required: Absolute count over `from`..`to`.
        - `base` integer, nullable, required: Registered participants at the START of the period: the count at the end of `base_day`. null when no base day exists.
        - `base_day` string, date, nullable, required: The day before `from`, or the latest earlier day when that one has no base.
        - `pct` number, nullable, required: 100 × count / base (0–100, 3 decimals). null without a base.
        - `gap_days` integer, required: Days in the period with no completed change scan.
      - `last_30d` NetworkStatWindow, required: One period of a flow statistic: the count, its base and the percentage.
        - `from` string, date, required
        - `to` string, date, required
        - `count` integer, required: Absolute count over `from`..`to`.
        - `base` integer, nullable, required: Registered participants at the START of the period: the count at the end of `base_day`. null when no base day exists.
        - `base_day` string, date, nullable, required: The day before `from`, or the latest earlier day when that one has no base.
        - `pct` number, nullable, required: 100 × count / base (0–100, 3 decimals). null without a base.
        - `gap_days` integer, required: Days in the period with no completed change scan.
      - `mean_7d` number, nullable, required: Mean per day over the days of `last_7d` that had a change scan, 1 decimal. null when every day is a gap.
      - `change_7d` NetworkStatChange, required: A period against the period before it.
        - `count` integer, required: This period minus the earlier period.
        - `pct` number, nullable, required: The difference as a percentage of the earlier count; null when it was 0.
      - `change_30d` NetworkStatChange, required: A period against the period before it.
        - `count` integer, required: This period minus the earlier period.
        - `pct` number, nullable, required: The difference as a percentage of the earlier count; null when it was 0.
      - `annualized_pct` number, nullable: `leavers` only — the Leaver rate (annualized): `last_30d.pct` scaled to 365 days. null without a base.
      - `split` object: `ap_switching` only. The `last_30d` moves by kind: `platform` is the movers of a platform-move provider pair (the platform stayed and only the certificate Seat changed), `bulk` the other movers that belong to a bulk move, `organic` the rest. A platform mover is never also bulk. The three add up to `last_30d.count`. Returned for a Market key only.
        - `organic` integer, required
        - `bulk` integer, required
        - `platform` integer, required
      - `trend_30d` number[]: The 7-day mean on each of the last 30 days, oldest first; null where all 7 days are gaps. Returned for a Market key only.
    - `leavers` NetworkStatFlow, required: A flow statistic: participants per period.
      - `unit` 'ids', required
      - `last_7d` NetworkStatWindow, required: One period of a flow statistic: the count, its base and the percentage.
        - `from` string, date, required
        - `to` string, date, required
        - `count` integer, required: Absolute count over `from`..`to`.
        - `base` integer, nullable, required: Registered participants at the START of the period: the count at the end of `base_day`. null when no base day exists.
        - `base_day` string, date, nullable, required: The day before `from`, or the latest earlier day when that one has no base.
        - `pct` number, nullable, required: 100 × count / base (0–100, 3 decimals). null without a base.
        - `gap_days` integer, required: Days in the period with no completed change scan.
      - `last_30d` NetworkStatWindow, required: One period of a flow statistic: the count, its base and the percentage.
        - `from` string, date, required
        - `to` string, date, required
        - `count` integer, required: Absolute count over `from`..`to`.
        - `base` integer, nullable, required: Registered participants at the START of the period: the count at the end of `base_day`. null when no base day exists.
        - `base_day` string, date, nullable, required: The day before `from`, or the latest earlier day when that one has no base.
        - `pct` number, nullable, required: 100 × count / base (0–100, 3 decimals). null without a base.
        - `gap_days` integer, required: Days in the period with no completed change scan.
      - `mean_7d` number, nullable, required: Mean per day over the days of `last_7d` that had a change scan, 1 decimal. null when every day is a gap.
      - `change_7d` NetworkStatChange, required: A period against the period before it.
        - `count` integer, required: This period minus the earlier period.
        - `pct` number, nullable, required: The difference as a percentage of the earlier count; null when it was 0.
      - `change_30d` NetworkStatChange, required: A period against the period before it.
        - `count` integer, required: This period minus the earlier period.
        - `pct` number, nullable, required: The difference as a percentage of the earlier count; null when it was 0.
      - `annualized_pct` number, nullable: `leavers` only — the Leaver rate (annualized): `last_30d.pct` scaled to 365 days. null without a base.
      - `split` object: `ap_switching` only. The `last_30d` moves by kind: `platform` is the movers of a platform-move provider pair (the platform stayed and only the certificate Seat changed), `bulk` the other movers that belong to a bulk move, `organic` the rest. A platform mover is never also bulk. The three add up to `last_30d.count`. Returned for a Market key only.
        - `organic` integer, required
        - `bulk` integer, required
        - `platform` integer, required
      - `trend_30d` number[]: The 7-day mean on each of the last 30 days, oldest first; null where all 7 days are gaps. Returned for a Market key only.
    - `net_growth` NetworkStatFlow, required: A flow statistic: participants per period.
      - `unit` 'ids', required
      - `last_7d` NetworkStatWindow, required: One period of a flow statistic: the count, its base and the percentage.
        - `from` string, date, required
        - `to` string, date, required
        - `count` integer, required: Absolute count over `from`..`to`.
        - `base` integer, nullable, required: Registered participants at the START of the period: the count at the end of `base_day`. null when no base day exists.
        - `base_day` string, date, nullable, required: The day before `from`, or the latest earlier day when that one has no base.
        - `pct` number, nullable, required: 100 × count / base (0–100, 3 decimals). null without a base.
        - `gap_days` integer, required: Days in the period with no completed change scan.
      - `last_30d` NetworkStatWindow, required: One period of a flow statistic: the count, its base and the percentage.
        - `from` string, date, required
        - `to` string, date, required
        - `count` integer, required: Absolute count over `from`..`to`.
        - `base` integer, nullable, required: Registered participants at the START of the period: the count at the end of `base_day`. null when no base day exists.
        - `base_day` string, date, nullable, required: The day before `from`, or the latest earlier day when that one has no base.
        - `pct` number, nullable, required: 100 × count / base (0–100, 3 decimals). null without a base.
        - `gap_days` integer, required: Days in the period with no completed change scan.
      - `mean_7d` number, nullable, required: Mean per day over the days of `last_7d` that had a change scan, 1 decimal. null when every day is a gap.
      - `change_7d` NetworkStatChange, required: A period against the period before it.
        - `count` integer, required: This period minus the earlier period.
        - `pct` number, nullable, required: The difference as a percentage of the earlier count; null when it was 0.
      - `change_30d` NetworkStatChange, required: A period against the period before it.
        - `count` integer, required: This period minus the earlier period.
        - `pct` number, nullable, required: The difference as a percentage of the earlier count; null when it was 0.
      - `annualized_pct` number, nullable: `leavers` only — the Leaver rate (annualized): `last_30d.pct` scaled to 365 days. null without a base.
      - `split` object: `ap_switching` only. The `last_30d` moves by kind: `platform` is the movers of a platform-move provider pair (the platform stayed and only the certificate Seat changed), `bulk` the other movers that belong to a bulk move, `organic` the rest. A platform mover is never also bulk. The three add up to `last_30d.count`. Returned for a Market key only.
        - `organic` integer, required
        - `bulk` integer, required
        - `platform` integer, required
      - `trend_30d` number[]: The 7-day mean on each of the last 30 days, oldest first; null where all 7 days are gaps. Returned for a Market key only.
    - `bulk_share` object, nullable, required: Bulk moves: the share of the Movers (AP) that belong to a bulk move. null below Market.
      - `last_30d` object, required
        - `from` string, date, required
        - `to` string, date, required
        - `bulk` integer, required
        - `moves` integer, required
        - `pct` number, nullable, required: 100 × bulk / moves.
    - `concentration_ap` NetworkStatApConcentration, required: Concentration (AP) or Concentration (SMP): how the participants are shared over the providers or the SMPs.
      - `day` string, date, required: The day the value was taken; can be one day after `as_of`.
      - `providers` integer, required: Providers (or SMPs) in the share base.
      - `total` integer, required: Participants in the share base.
      - `hhi` number, required: Herfindahl-Hirschman index, 0–10000.
      - `cr5_pct` number, required: Share of the 5 largest, 0–100.
      - `cr5_count` integer, required
      - `cr10_pct` number, required: Share of the 10 largest, 0–100.
      - `cr10_count` integer, required
      - `change_30d` object, required: Against the value 30 days before `day`; null when that day has none.
        - `hhi` number, nullable, required
        - `cr5_pp` number, nullable, required: Percentage points.
      - `trend_30d` number[]: `cr5_pct` on each of the 30 days to `day` that has a value, oldest first. Returned for a Market key only.
      - `top1_pct` number, nullable, required: Share of the largest provider, 0–100. null on a day stored before the figure existed.
      - `top1_count` integer, nullable, required
      - `top4_pct` number, nullable, required: Share of the 4 largest providers, 0–100. null on a day stored before the figure existed.
      - `top4_count` integer, nullable, required
      - `providers_over_1pct` integer, nullable, required: Providers with more than 1% of `total`. null on a day stored before the figure existed.
      - `registered` integer, nullable, required: Registered participants at the end of the latest day up to `day`. `registered` − `total` is the number of registered participants on no provider roster. null when no base day exists.
    - `concentration_by_country` NetworkStatCountryConcentration[], nullable, required: Concentration per country: one item per country with 8 or more providers, sorted by `leader.pct` descending, then by `country`. null until the first daily snapshot.
      - `country` string, required: ISO 3166-1 alpha-2, upper case.
      - `day` string, date, required: The day the value was taken; can be one day after `as_of`.
      - `providers` integer, required: Providers with at least one participant of the country. Never below 8.
      - `total` integer, required: Participants of the country on a provider roster: the base of every share.
      - `hhi` number, required: Herfindahl-Hirschman index, 0–10000.
      - `effective_providers` number, required: Effective number of providers: 10000 / `hhi`. The number of equal-sized providers that gives the same HHI.
      - `leader` object, required: The largest provider of the country.
        - `key` string, nullable, required: Provider key, for `/v1/aps/{key}`. null when the provider directory has no matching row.
        - `name` string, nullable, required
        - `pct` number, required: 100 × count / total.
        - `count` integer, required
      - `top4_pct` number, required: Share of the 4 largest providers, 0–100.
      - `top4_count` integer, required
      - `top10_pct` number, required: Share of the 10 largest providers, 0–100.
      - `top10_count` integer, required
      - `providers_over_1pct` integer, required: Providers with more than 1% of `total`.
    - `concentration_smp` NetworkStatConcentration, required: Concentration (AP) or Concentration (SMP): how the participants are shared over the providers or the SMPs.
      - `day` string, date, required: The day the value was taken; can be one day after `as_of`.
      - `providers` integer, required: Providers (or SMPs) in the share base.
      - `total` integer, required: Participants in the share base.
      - `hhi` number, required: Herfindahl-Hirschman index, 0–10000.
      - `cr5_pct` number, required: Share of the 5 largest, 0–100.
      - `cr5_count` integer, required
      - `cr10_pct` number, required: Share of the 10 largest, 0–100.
      - `cr10_count` integer, required
      - `change_30d` object, required: Against the value 30 days before `day`; null when that day has none.
        - `hhi` number, nullable, required
        - `cr5_pp` number, nullable, required: Percentage points.
      - `trend_30d` number[]: `cr5_pct` on each of the 30 days to `day` that has a value, oldest first. Returned for a Market key only.
    - `foreign_served` object, nullable, required: Foreign-served participants: participants whose provider is from another country, as a share of the registered participants. null until the first daily snapshot.
      - `day` string, date, required: The day the value was taken; can be one day after `as_of`.
      - `foreign` integer, required
      - `domestic` integer, required
      - `unknown` integer, required: The provider country or the participant country is not known.
      - `total` integer, required: `foreign` + `domestic` + `unknown`: participants on a roster.
      - `base` integer, nullable, required: Registered participants at the end of `base_day`. null when no base day exists.
      - `base_day` string, date, nullable, required: `day`, or the latest earlier day when that one has no base.
      - `pct` number, nullable, required: 100 × foreign / base.
      - `change_30d_pp` number, nullable, required: Percentage points against 30 days before; null if absent.
    - `penetration` object[], nullable, required: Companies on Peppol against the company register, per country with a register (the Adoption figure). null below Market and until the first daily snapshot.
      - `country` string, required
      - `day` string, date, required: The day the value was taken; can be one day after `as_of`.
      - `on_peppol` integer, required
      - `universe` integer, nullable, required: null when the register gives no universe for the country.
      - `pct` number, nullable, required: 100 × on_peppol / universe. null without a universe.

---

[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)
