API/Participants
Look up a Peppol participant
GET/v1/participants/{participant_id}· API key
Answers "can this business receive Peppol invoices, and which
documents does it accept?" by querying the Peppol SML and the
participant's SMP live. The SML is the authoritative source; the
Peppol Directory is optional for participants, so directory is
null for many businesses that are nonetheless registered.
A participant that is not registered returns 200 with
registered: false — absence from the network is an answer, not a
missing resource.
For a UK business, the participant identifier is usually its VAT
number under scheme 9932. Registrations exist both with and
without the GB prefix, and Peppol treats them as different
participants. So for 9932 both forms are tried, and id reports
the one that is registered. Identifier values are case-insensitive;
id is returned lower-cased, as Peppol hashes it.
The lookup follows the Peppol SML specification (v1.3.0, in force
since November 2025): a U-NAPTR record at a base32 SHA-256 hash of
the identifier, then the participant's SMP. Results are cached for
up to five minutes; checked_at says when the network was last
asked.
curl https://api.einvoicing.dev/v1/participants/<participant_id> \ -H "Authorization: Bearer $EINVOICING_API_KEY"<?php$client = new GuzzleHttp\Client();$response = $client->request('GET', 'https://api.einvoicing.dev/v1/participants/<participant_id>', [ 'headers' => [ 'Authorization' => 'Bearer ' . getenv('EINVOICING_API_KEY'), ],]);$data = json_decode((string) $response->getBody(), true)['data'];req, _ := http.NewRequest(http.MethodGet, "https://api.einvoicing.dev/v1/participants/<participant_id>", nil)req.Header.Set("Authorization", "Bearer "+os.Getenv("EINVOICING_API_KEY"))res, err := http.DefaultClient.Do(req)if err != nil { log.Fatal(err)}defer res.Body.Close()const res = await fetch("https://api.einvoicing.dev/v1/participants/<participant_id>", { headers: { Authorization: `Bearer ${process.env.EINVOICING_API_KEY}`, },});const { data } = await res.json();Parameters
| Name | In | Type | Description |
|---|---|---|---|
participant_idrequired | path | string | A Peppol participant identifier as |
Response
200 The network was asked and answered.
| Field | Type | Description |
|---|---|---|
datarequired | Participant | What the Peppol network says about one participant identifier. |
{ "data": { "id": "9932:GB123456789", "scheme": "9932", "identifier": "GB123456789", "registered": true, "capabilities": [ { "name": "Peppol BIS Billing 3.0 Invoice", "document_type_id": "urn:oasis:names:specification:ubl:schema:xsd:Invoice-2::Invoice##urn:cen.eu:en16931:2017#compliant#urn:fdc:peppol.eu:2017:poacc:billing:3.0::2.1", "process_id": "urn:fdc:peppol.eu:2017:poacc:billing:01:1.0" }, { "name": "Peppol BIS Billing 3.0 Credit Note", "document_type_id": "urn:oasis:names:specification:ubl:schema:xsd:CreditNote-2::CreditNote##urn:cen.eu:en16931:2017#compliant#urn:fdc:peppol.eu:2017:poacc:billing:3.0::2.1", "process_id": "urn:fdc:peppol.eu:2017:poacc:billing:01:1.0" } ], "directory": { "name": "Acme Widgets Ltd", "country_code": "GB" }, "checked_at": "2026-09-11T14:03:11.482Z" }}Errors
Every error is application/problem+json (RFC 9457). Branch on type, which is stable, never on title or detail.
| Status | When |
|---|---|
| 401 | No key, or a key that is unknown or revoked. Problem |
| 402 | The Free plan's monthly allowance for this operation is used up. This
is a billing state, not a rate limit: waiting will not help until the
period resets or the plan changes. Paid plans never receive it.
Problem |
| 422 | The identifier is not in |
| 429 | Too many requests in a short window. Slow down and retry after the
number of seconds in |
| 502 | The Peppol SML or the participant's SMP did not answer in time. The
question is still open, not answered "no". Problem |
Schemas
Participant
What the Peppol network says about one participant identifier.
| Field | Type | Description |
|---|---|---|
idrequired | string | The identifier as looked up, scheme:identifier. |
schemerequired | string | EAS scheme code. |
identifierrequired | string | |
registeredrequired | boolean | True when the SML resolves the participant to an SMP. |
capabilitiesrequired | object[] | The e-invoicing document types the participant accepts: Peppol BIS Billing 3.0 and PINT Billing invoices and credit notes. Other registered types (orders, catalogues and so on) are not listed. Empty when not registered, or when the participant's SMP no longer knows it. |
namerequired | string | A readable name for the document type. |
document_type_idrequired | string | The Peppol document type identifier, as registered in the SMP. |
process_idrequired | string | The Peppol process identifier. |
directoryrequired | object or null | The participant's Peppol Directory entry, when it has chosen to publish one. |
name | string or null | |
country_code | string or null | |
checked_atrequired | Timestamp · date-time | RFC 3339, UTC, millisecond precision. |