---
title: "List access points"
method: GET
path: "/v1/aps"
tags: ["Access Points"]
---

# List access points

`GET /v1/aps`

## Request

- Base URL: `https://api.peppolstatus.com`
- URL: `https://api.peppolstatus.com/v1/aps`
- Auth: one of:
  - HTTP bearer
  - API key in header `X-API-Key`

The Access Point directory: every Provider in its serving role, with its member seats and roster size (current participant count), busiest first. A Provider is resolved from each seat with the precedence curated mapping (verified) → exact signing-cert `O=` string (unverified) → bare SeatID. Not paginated (the envelope's `next_cursor` is always null). Pass `?country=CC` to compare providers within one market instead of network-wide. Every item carries the windowed net growth; a MARKET-tier key additionally gets the four churn components behind each net (`joiners`, `movers_in`, `movers_out`, `leavers` × 7d/30d/90d), which a lower-tier key simply does not receive.

`kind` selects the row kinds. The default is `provider`, and the list is then Provider rows only. A Vendor is a curated software or service brand that connects its customers through the Seats of one or more Providers; `kind=vendor` returns the Vendor rows and `kind=all` returns both, each item marked by `kind`. A Vendor's participants are always also in the count of the Provider that serves them: never add Provider rows and Vendor rows into one total, share or rank.

## Query parameters

- `kind` 'provider' | 'vendor' | 'all'
- `country` string

## Response `200`

The access point directory.

- ApPage: The access point directory (never paginated; next_cursor null).
  - `items` union[], required: Provider rows by default. Vendor rows only with `?kind=vendor|all`; read `kind` to tell them apart.
    - union
      - ApView
        - `kind` 'provider': The row kind. Always `provider` on this shape.
        - `key` string, required: Stable, URL-safe provider key: `c-<slug>` (curated), `o-<slug>-<hash>` (from the exact O=), or `s-<seatid>` (bare seat).
        - `name` string, required
        - `verified` boolean, required
        - `seats` string[], required
        - `participant_count` integer, required
        - `unique_organizations` integer: Unique organizations across the roster (sum of member seats' distinct company_key counts). Additive; absent on a pre-#451 rollup.
        - `ids_per_organization` number, nullable: participant_count / unique_organizations (the IDs-per-organization ratio); null under the <100-participant noise guard, absent on a pre-#451 rollup.
        - `net_growth` integer: Net growth (joiners + movers-in − movers-out − leavers) over the trailing 30-day period. Additive; absent before the churn rollup has run. Deprecated alias of `net_30d` — kept for clients that predate the windowed columns.
        - `net_7d` integer: Net growth over the trailing 7 UTC days. Additive, like `net_growth`.
        - `net_30d` integer: Net growth over the trailing 30 UTC days (same value as `net_growth`). Additive.
        - `net_90d` integer: Net growth over the trailing 90 UTC days. Additive. The churn epoch is 2026-08-02, so this window fills in over time as the rollup retains daily rows.
        - `joiners_7d` integer: Count of participants that joined the Peppol network on this Provider over the trailing 7 UTC days — a non-negative component of `net_7d`, which equals `joiners_7d + movers_in_7d − movers_out_7d − leavers_7d`. MARKET tier: omitted (never null) for a lower-tier key, because the per-provider breakdown at `/v1/aps/{key}/churn` is market-gated too. 0 when the Provider had no movement of this kind in the window.
        - `joiners_30d` integer: Count of participants that joined the Peppol network on this Provider over the trailing 30 UTC days — a non-negative component of `net_30d`, which equals `joiners_30d + movers_in_30d − movers_out_30d − leavers_30d`. MARKET tier: omitted (never null) for a lower-tier key, because the per-provider breakdown at `/v1/aps/{key}/churn` is market-gated too. 0 when the Provider had no movement of this kind in the window.
        - `joiners_90d` integer: Count of participants that joined the Peppol network on this Provider over the trailing 90 UTC days — a non-negative component of `net_90d`, which equals `joiners_90d + movers_in_90d − movers_out_90d − leavers_90d`. MARKET tier: omitted (never null) for a lower-tier key, because the per-provider breakdown at `/v1/aps/{key}/churn` is market-gated too. 0 when the Provider had no movement of this kind in the window.
        - `movers_in_7d` integer: Count of participants that migrated to this Provider from another one over the trailing 7 UTC days — a non-negative component of `net_7d`, which equals `joiners_7d + movers_in_7d − movers_out_7d − leavers_7d`. MARKET tier: omitted (never null) for a lower-tier key, because the per-provider breakdown at `/v1/aps/{key}/churn` is market-gated too. 0 when the Provider had no movement of this kind in the window.
        - `movers_in_30d` integer: Count of participants that migrated to this Provider from another one over the trailing 30 UTC days — a non-negative component of `net_30d`, which equals `joiners_30d + movers_in_30d − movers_out_30d − leavers_30d`. MARKET tier: omitted (never null) for a lower-tier key, because the per-provider breakdown at `/v1/aps/{key}/churn` is market-gated too. 0 when the Provider had no movement of this kind in the window.
        - `movers_in_90d` integer: Count of participants that migrated to this Provider from another one over the trailing 90 UTC days — a non-negative component of `net_90d`, which equals `joiners_90d + movers_in_90d − movers_out_90d − leavers_90d`. MARKET tier: omitted (never null) for a lower-tier key, because the per-provider breakdown at `/v1/aps/{key}/churn` is market-gated too. 0 when the Provider had no movement of this kind in the window.
        - `movers_out_7d` integer: Count of participants that migrated away from this Provider over the trailing 7 UTC days — a non-negative component of `net_7d`, which equals `joiners_7d + movers_in_7d − movers_out_7d − leavers_7d`. MARKET tier: omitted (never null) for a lower-tier key, because the per-provider breakdown at `/v1/aps/{key}/churn` is market-gated too. 0 when the Provider had no movement of this kind in the window.
        - `movers_out_30d` integer: Count of participants that migrated away from this Provider over the trailing 30 UTC days — a non-negative component of `net_30d`, which equals `joiners_30d + movers_in_30d − movers_out_30d − leavers_30d`. MARKET tier: omitted (never null) for a lower-tier key, because the per-provider breakdown at `/v1/aps/{key}/churn` is market-gated too. 0 when the Provider had no movement of this kind in the window.
        - `movers_out_90d` integer: Count of participants that migrated away from this Provider over the trailing 90 UTC days — a non-negative component of `net_90d`, which equals `joiners_90d + movers_in_90d − movers_out_90d − leavers_90d`. MARKET tier: omitted (never null) for a lower-tier key, because the per-provider breakdown at `/v1/aps/{key}/churn` is market-gated too. 0 when the Provider had no movement of this kind in the window.
        - `leavers_7d` integer: Count of participants that left the network while on this Provider over the trailing 7 UTC days — a non-negative component of `net_7d`, which equals `joiners_7d + movers_in_7d − movers_out_7d − leavers_7d`. MARKET tier: omitted (never null) for a lower-tier key, because the per-provider breakdown at `/v1/aps/{key}/churn` is market-gated too. 0 when the Provider had no movement of this kind in the window.
        - `leavers_30d` integer: Count of participants that left the network while on this Provider over the trailing 30 UTC days — a non-negative component of `net_30d`, which equals `joiners_30d + movers_in_30d − movers_out_30d − leavers_30d`. MARKET tier: omitted (never null) for a lower-tier key, because the per-provider breakdown at `/v1/aps/{key}/churn` is market-gated too. 0 when the Provider had no movement of this kind in the window.
        - `leavers_90d` integer: Count of participants that left the network while on this Provider over the trailing 90 UTC days — a non-negative component of `net_90d`, which equals `joiners_90d + movers_in_90d − movers_out_90d − leavers_90d`. MARKET tier: omitted (never null) for a lower-tier key, because the per-provider breakdown at `/v1/aps/{key}/churn` is market-gated too. 0 when the Provider had no movement of this kind in the window.
        - `countries` string[]: ISO 3166-1 alpha-2 codes (sorted) of the countries in this Provider's roster — the values of `country_mix`. Additive; powers the directory's country filter.
        - `country_roster` integer: Roster size inside the requested `?country=CC` scope — the provider's `country_mix` bucket for that country, 0 when it has no participants there. A client must read 0 as 'absent from the country' and show no growth at all, never a flat 0. This and the other `country_*` fields appear only on a country-scoped request.
        - `country_orgs` integer, nullable: Unique organizations inside the requested country (from `country_org_mix`); null when the rollup carries no per-country figure — not zero organizations.
        - `country_net_7d` integer: Net growth (joiners + movers-in − movers-out − leavers) inside the requested country over the trailing 7 UTC days. 0 when the provider has presence but no churn rows.
        - `country_net_30d` integer: Country-scoped net growth over the trailing 30 UTC days.
        - `country_net_90d` integer: Country-scoped net growth over the trailing 90 UTC days.
        - `country_joiners_7d` integer: Count of participants that joined the Peppol network on this Provider inside the requested `?country=CC` scope over the trailing 7 UTC days — a non-negative component of `country_net_7d`, which equals `country_joiners_7d + country_movers_in_7d − country_movers_out_7d − country_leavers_7d`. MARKET tier: omitted (never null) for a lower-tier key, because the per-provider breakdown at `/v1/aps/{key}/churn` is market-gated too. 0 when the provider has presence in the country but no churn rows there.
        - `country_joiners_30d` integer: Count of participants that joined the Peppol network on this Provider inside the requested `?country=CC` scope over the trailing 30 UTC days — a non-negative component of `country_net_30d`, which equals `country_joiners_30d + country_movers_in_30d − country_movers_out_30d − country_leavers_30d`. MARKET tier: omitted (never null) for a lower-tier key, because the per-provider breakdown at `/v1/aps/{key}/churn` is market-gated too. 0 when the provider has presence in the country but no churn rows there.
        - `country_joiners_90d` integer: Count of participants that joined the Peppol network on this Provider inside the requested `?country=CC` scope over the trailing 90 UTC days — a non-negative component of `country_net_90d`, which equals `country_joiners_90d + country_movers_in_90d − country_movers_out_90d − country_leavers_90d`. MARKET tier: omitted (never null) for a lower-tier key, because the per-provider breakdown at `/v1/aps/{key}/churn` is market-gated too. 0 when the provider has presence in the country but no churn rows there.
        - `country_movers_in_7d` integer: Count of participants that migrated to this Provider from another one inside the requested `?country=CC` scope over the trailing 7 UTC days — a non-negative component of `country_net_7d`, which equals `country_joiners_7d + country_movers_in_7d − country_movers_out_7d − country_leavers_7d`. MARKET tier: omitted (never null) for a lower-tier key, because the per-provider breakdown at `/v1/aps/{key}/churn` is market-gated too. 0 when the provider has presence in the country but no churn rows there.
        - `country_movers_in_30d` integer: Count of participants that migrated to this Provider from another one inside the requested `?country=CC` scope over the trailing 30 UTC days — a non-negative component of `country_net_30d`, which equals `country_joiners_30d + country_movers_in_30d − country_movers_out_30d − country_leavers_30d`. MARKET tier: omitted (never null) for a lower-tier key, because the per-provider breakdown at `/v1/aps/{key}/churn` is market-gated too. 0 when the provider has presence in the country but no churn rows there.
        - `country_movers_in_90d` integer: Count of participants that migrated to this Provider from another one inside the requested `?country=CC` scope over the trailing 90 UTC days — a non-negative component of `country_net_90d`, which equals `country_joiners_90d + country_movers_in_90d − country_movers_out_90d − country_leavers_90d`. MARKET tier: omitted (never null) for a lower-tier key, because the per-provider breakdown at `/v1/aps/{key}/churn` is market-gated too. 0 when the provider has presence in the country but no churn rows there.
        - `country_movers_out_7d` integer: Count of participants that migrated away from this Provider inside the requested `?country=CC` scope over the trailing 7 UTC days — a non-negative component of `country_net_7d`, which equals `country_joiners_7d + country_movers_in_7d − country_movers_out_7d − country_leavers_7d`. MARKET tier: omitted (never null) for a lower-tier key, because the per-provider breakdown at `/v1/aps/{key}/churn` is market-gated too. 0 when the provider has presence in the country but no churn rows there.
        - `country_movers_out_30d` integer: Count of participants that migrated away from this Provider inside the requested `?country=CC` scope over the trailing 30 UTC days — a non-negative component of `country_net_30d`, which equals `country_joiners_30d + country_movers_in_30d − country_movers_out_30d − country_leavers_30d`. MARKET tier: omitted (never null) for a lower-tier key, because the per-provider breakdown at `/v1/aps/{key}/churn` is market-gated too. 0 when the provider has presence in the country but no churn rows there.
        - `country_movers_out_90d` integer: Count of participants that migrated away from this Provider inside the requested `?country=CC` scope over the trailing 90 UTC days — a non-negative component of `country_net_90d`, which equals `country_joiners_90d + country_movers_in_90d − country_movers_out_90d − country_leavers_90d`. MARKET tier: omitted (never null) for a lower-tier key, because the per-provider breakdown at `/v1/aps/{key}/churn` is market-gated too. 0 when the provider has presence in the country but no churn rows there.
        - `country_leavers_7d` integer: Count of participants that left the network while on this Provider inside the requested `?country=CC` scope over the trailing 7 UTC days — a non-negative component of `country_net_7d`, which equals `country_joiners_7d + country_movers_in_7d − country_movers_out_7d − country_leavers_7d`. MARKET tier: omitted (never null) for a lower-tier key, because the per-provider breakdown at `/v1/aps/{key}/churn` is market-gated too. 0 when the provider has presence in the country but no churn rows there.
        - `country_leavers_30d` integer: Count of participants that left the network while on this Provider inside the requested `?country=CC` scope over the trailing 30 UTC days — a non-negative component of `country_net_30d`, which equals `country_joiners_30d + country_movers_in_30d − country_movers_out_30d − country_leavers_30d`. MARKET tier: omitted (never null) for a lower-tier key, because the per-provider breakdown at `/v1/aps/{key}/churn` is market-gated too. 0 when the provider has presence in the country but no churn rows there.
        - `country_leavers_90d` integer: Count of participants that left the network while on this Provider inside the requested `?country=CC` scope over the trailing 90 UTC days — a non-negative component of `country_net_90d`, which equals `country_joiners_90d + country_movers_in_90d − country_movers_out_90d − country_leavers_90d`. MARKET tier: omitted (never null) for a lower-tier key, because the per-provider breakdown at `/v1/aps/{key}/churn` is market-gated too. 0 when the provider has presence in the country but no churn rows there.
      - ApVendorView: A Vendor row (`?kind=vendor|all`, Market tier): a curated software or service brand that connects its customers through the Seats of one or more Providers. Its participants are always also in a Provider's count, so never add it to a Provider row.
        - `kind` 'vendor', required
        - `key` string, required: `v-<slug>`.
        - `slug` string, required: The curated slug; the `sub_provider` filter value on `/v1/participants`.
        - `name` string, required: The curated display label.
        - `verified` unknown, required
        - `seats` unknown, required
        - `via` ApVendorVia[], required: The Providers the Vendor connects through, largest first. A participant can be on more than one Seat, so the entries can sum above `participant_count`.
          - `key` string, required: The Provider's key (`/v1/aps/{key}`); `s-<seatid>` when the Seat resolves to no Provider.
          - `name` string, required
          - `participants` integer, required: The Vendor's distinct participants across this Provider's Seats.
          - `seats` object[], required: The Vendor's participants per Seat of this Provider. Each count equals the sub-provider count on that Provider's detail.
            - `seat_id` string, required
            - `participants` integer, required
        - `participant_count` integer, required: Distinct registered participants across all Seats. Participants on a Seat of the Vendor's own company are excluded: they count for that Provider.
        - `unique_organizations` integer, required
        - `ids_per_organization` number, nullable, required: participant_count / unique_organizations; null below 10 participants.
        - `countries` string[], required: The ISO 3166-1 alpha-2 countries of the roster, sorted.
        - `churn_since` string, date, nullable, required: The first day movement is counted from. A window that starts before it is null. null before the first daily run.
        - `net_7d` integer, nullable, required: Net growth over the trailing 7 UTC days: joiners + movers in − movers out − leavers. null while the window is not fully covered (see `churn_since`).
        - `joiners_7d` integer, nullable, required: A component of `net_7d`. null while the window is not fully covered.
        - `movers_in_7d` integer, nullable, required: A component of `net_7d`. null while the window is not fully covered.
        - `movers_out_7d` integer, nullable, required: A component of `net_7d`. null while the window is not fully covered.
        - `leavers_7d` integer, nullable, required: A component of `net_7d`. null while the window is not fully covered.
        - `net_30d` integer, nullable, required: Net growth over the trailing 30 UTC days: joiners + movers in − movers out − leavers. null while the window is not fully covered (see `churn_since`).
        - `joiners_30d` integer, nullable, required: A component of `net_30d`. null while the window is not fully covered.
        - `movers_in_30d` integer, nullable, required: A component of `net_30d`. null while the window is not fully covered.
        - `movers_out_30d` integer, nullable, required: A component of `net_30d`. null while the window is not fully covered.
        - `leavers_30d` integer, nullable, required: A component of `net_30d`. null while the window is not fully covered.
        - `net_90d` integer, nullable, required: Net growth over the trailing 90 UTC days: joiners + movers in − movers out − leavers. null while the window is not fully covered (see `churn_since`).
        - `joiners_90d` integer, nullable, required: A component of `net_90d`. null while the window is not fully covered.
        - `movers_in_90d` integer, nullable, required: A component of `net_90d`. null while the window is not fully covered.
        - `movers_out_90d` integer, nullable, required: A component of `net_90d`. null while the window is not fully covered.
        - `leavers_90d` integer, nullable, required: A component of `net_90d`. null while the window is not fully covered.
        - `country_roster` integer: Only with `?country=CC`: the participants in that country.
        - `country_orgs` integer, nullable: Only with `?country=CC`: the Companies in that country.
  - `next_cursor` string, nullable, required: Opaque cursor for the next page, or null on the last page.

## Other responses

- `400`: `country` is not a two-letter country code, or `kind` is not a known value.
- `403`: `kind=vendor` or `kind=all` with a key below the Market tier.

---

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