---
title: "Network joiners curve"
method: GET
path: "/v1/stats/participants/joiners"
tags: ["Participants"]
---

# Network joiners curve

`GET /v1/stats/participants/joiners`

## Request

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

The real onboarding curve (issue #222): joiner counts bucketed by derived network join date (business-card RegistrationDate, else genuine first-seen), with a whole-network coverage split (registration_date / first_seen / unknown). The unknown/seed tail is reported in `coverage` only, never folded into a bucket. Keyless-cacheable.

## Query parameters

- `bucket` 'year' | 'month'

## Response `200`

The joiners curve with coverage.

- ParticipantJoiners: The network onboarding curve with whole-network coverage (issue #222).
  - `bucket` 'year' | 'month', required
  - `refreshed_at` string, date-time, required
  - `series` JoinerPoint[], required: Buckets ordered ascending; only known join dates appear.
    - `bucket` string, date, required: Period start (YYYY-MM-DD, UTC).
    - `count` integer, required
    - `registration_date` integer, required
    - `first_seen` integer, required
  - `coverage` object, required: Whole-network split; `unknown` is reported here, never folded into a bucket.
    - `registration_date` integer, required
    - `first_seen` integer, required
    - `unknown` integer, required

## Other responses

- `400`: An invalid `bucket`.

---

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