---
title: "Get an access point's churn"
method: GET
path: "/v1/aps/{key}/churn"
tags: ["Access Points"]
---

# Get an access point's churn

`GET /v1/aps/{key}/churn`

## Request

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

An Access Point's joiner / mover / leaver activity over a period: a daily category series with derived net growth, period totals, and the 'won from / lost to' counterpart breakdown. Joiners are first-ever serving seats (from 2026-08-02 onward, first-full-deep-sweep completion); movers change Provider (both sides resolved to the current identity); leavers deregister while served. Defaults to the trailing 30 days.

A Vendor key (`v-<slug>`) returns the same shape for the Vendor, from a daily comparison of its membership. Movement is counted from `churn_since`; there is no history before it. A counterpart is a Provider or another Vendor (`kind`). `match_totals` and the `newly_matched` / `no_longer_matched` series count membership changes with no real event behind them (a signal appeared or disappeared): they are a data-quality figure, not movement, and are never in `net_growth`.

For a Provider key, `counterpart_flow` gives each mover side (out, in) its top counterpart with its share and the effective number of counterparts, over the requested period. The share is null under 25 movers on that side and the effective number under 100. A Vendor key has no `counterpart_flow`.

PLATFORM MOVES. A mover is a platform move when the platform that serves the participant stayed and only the certificate Seat changed: it is not a customer decision. The verdict is per DIRECTED provider pair (from → to), over all its movers since 2026-08-02, with one of two reasons (`same_host`, `sub_provider`): at least 90% of the movers whose endpoint host can be compared (5 or more, and at least 50% of all movers of the pair) kept their endpoint host, or at least 90% of 25 or more movers still carry, at the new provider, the sub-provider brand of the provider they left. It is a CURRENT judgment, computed again on every rollup cycle. For a Provider key, the movers of a platform-move pair are in `platform_won` / `platform_lost` of the counterpart and not in its `won` / `lost`; the flag is per direction (counterpart → Provider, Provider → counterpart). `totals.platform_in` / `totals.platform_out` are their sums. `totals.movers_in`, `totals.movers_out`, `net_growth` and the daily series still count all movers. A Vendor key is not changed: its counterparts have no platform fields.

## Path parameters

- `key` string, required

## Query parameters

- `from` string, date
- `to` string, date

## Response `200`

The access point's churn over the period.

- ApChurnView
  - `kind` 'provider' | 'vendor': `vendor` for a Vendor key. Absent means a Provider.
  - `churn_since` string, date, nullable: Vendor only: the first day movement is counted from. A period that starts before it is not fully covered.
  - `match_totals` object: Vendor only: the period totals of the two match categories. A change of this kind is a signal change, not a move.
    - `newly_matched` integer, required
    - `no_longer_matched` integer, required
  - `key` string, required
  - `name` string, required
  - `from` string, date, required: Inclusive period start (UTC).
  - `to` string, date, required: Inclusive period end (UTC).
  - `totals` ChurnTotals, required
    - `joiners` integer, required
    - `movers_in` integer, required
    - `movers_out` integer, required
    - `leavers` integer, required
    - `net_growth` integer, required
    - `platform_in` integer: Provider only. The part of `movers_in` that is a platform move: the sum of `platform_won` over the counterparts. Absent for a Vendor.
    - `platform_out` integer: Provider only. The part of `movers_out` that is a platform move: the sum of `platform_lost` over the counterparts. Absent for a Vendor.
  - `series` ChurnSeriesPoint[], required
    - `day` string, date, required: UTC calendar day (YYYY-MM-DD).
    - `joiners` integer, required
    - `movers_in` integer, required
    - `movers_out` integer, required
    - `leavers` integer, required
    - `net_growth` integer, required: joiners + movers_in − movers_out − leavers for the day.
    - `newly_matched` integer: Vendor only: participants that entered the Vendor's membership with no real event behind it. Not movement; not in `net_growth`.
    - `no_longer_matched` integer: Vendor only: participants that left the Vendor's membership with no real event behind it. Not movement; not in `net_growth`.
    - `baseline` boolean: Vendor only: true on a day the membership was only recorded, so no movement was counted for it.
  - `counterparts` ChurnCounterpartTotal[], required
    - `kind` 'provider' | 'vendor': On a Vendor's churn only: whether the counterpart is a Provider or another Vendor.
    - `key` string, required: The counterpart's key (`/v1/aps/{key}`).
    - `name` string, required
    - `won` integer, required: Participants this AP won FROM the counterpart. For a Provider, platform moves are not in it.
    - `lost` integer, required: Participants this AP lost TO the counterpart. For a Provider, platform moves are not in it.
    - `platform_won` integer: Provider only. Movers from the counterpart when the pair counterpart → this Provider is a platform move; else 0. Not counted as won. Absent for a Vendor.
    - `platform_lost` integer: Provider only. Movers to the counterpart when the pair this Provider → counterpart is a platform move; else 0. Not counted as lost. Absent for a Vendor.
    - `net` integer: Provider only. `won − lost`, platform moves excluded. Absent for a Vendor.
  - `counterpart_flow` CounterpartFlow: Provider keys only; absent for a Vendor key. Where the Provider's movers go and where they come from over the requested period, computed from `counterparts`. The day of a mover is the day the change was observed, not the day of the switch.
    - `out` CounterpartFlowSide, required: One side of a Provider's mover flow over the period. Unit: participant IDs, not companies (one company can hold several IDs). Platform moves are not counted.
      - `movers` integer, required: Movers on this side over the period.
      - `counterparts` integer, required: The number of counterparts on this side. It follows the volume of movers, so it is context only: do not rank or compare Providers by it.
      - `top` object, nullable, required: The counterpart with the most movers on this side (a tie breaks on the name). Null when the side has no movers.
        - `key` string, required: The counterpart's key (`/v1/aps/{key}`).
        - `name` string, required
        - `movers` integer, required
        - `share` number, nullable, required: `movers` as a ratio in [0,1] of this side's movers. Null when the side has fewer than 25 movers.
      - `effective` number, nullable, required: The effective number of counterparts: 1 ÷ the sum of the squared flow shares. Null when the side has fewer than 100 movers.
    - `in` CounterpartFlowSide, required: One side of a Provider's mover flow over the period. Unit: participant IDs, not companies (one company can hold several IDs). Platform moves are not counted.
      - `movers` integer, required: Movers on this side over the period.
      - `counterparts` integer, required: The number of counterparts on this side. It follows the volume of movers, so it is context only: do not rank or compare Providers by it.
      - `top` object, nullable, required: The counterpart with the most movers on this side (a tie breaks on the name). Null when the side has no movers.
        - `key` string, required: The counterpart's key (`/v1/aps/{key}`).
        - `name` string, required
        - `movers` integer, required
        - `share` number, nullable, required: `movers` as a ratio in [0,1] of this side's movers. Null when the side has fewer than 25 movers.
      - `effective` number, nullable, required: The effective number of counterparts: 1 ÷ the sum of the squared flow shares. Null when the side has fewer than 100 movers.

## Other responses

- `404`: No such access point has churn.

---

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