Production onboarding
How to get a client company onto live Peppol (both receiving and sending e-invoices). Production activation is gated by the Slovak Financial Administration(FS): we can't create a Peppol participant ourselves, the FS has to authorize it. There are two paths for this; the full process and endpoints are below.
efk_pk_live_…) burns credits and creates real tax documents.Two production paths
| Path | When | What the partner does |
|---|---|---|
| A: webhook + email (recommended) | The company chooses eFaktúra as its delivery service provider (PDS) on the FS portal. The FS sends the mandate via webhook. | Pair the company → eFaktúra sends the company a confirmation email → the company clicks. No token, no company login. |
| B: FS token (fallback) | The FS sends the mandate only by email (no webhook), or you want to activate directly. | Obtain the FS verification token (Verification data from PFS) and send it to enroll. |
company_email), not the partner.How the whole thing works (flow)
PARTNER eFaktúra (SP) FINANCIAL ADMIN / COMPANY
─────── ───────────── ─────────────────────────
1. POST /organizations ─▶ child org (partner_id)
(IČO/DIČ/address)
company on PFS chooses ◀── 2. PDS selection
eFaktúra as PDS
FS PDS webhook ─────────────────▶ 3. mandate received
provisioning + SMP
registration 0245:DIČ
4. POST /:id/peppol-claim ─▶ sends ──── email ────▶ company receives
(re‑send, scope partner "Confirm receipt…"
invoice:send) confirmation email
bind receiving ◀──── click ────── 5. company confirms
to child org (public page)
6. GET /organizations/:id ─▶ claim_status: "claimed"
(polling) participant_id: "0245:DIČ"
peppol_eligible: true ✅ DONEStep 4 is often automatic: when the FS webhook finds a paired partner child org for the given DIČ, eFaktúra sends the confirmation email on its own. peppol-claim is for resending it (or when you paired the company only after the mandate arrived).
Canonical path (A): step by step
In the partner portal, in the API keys section, request a live key. Production keys are subject to approval (contract + license); once approved, you generate the key once. A sandbox key (efk_pk_test_…) you create immediately. The base URL is the same for both environments; the key prefix decides.
Via POST /v1/agent/organizations, create a child org for the company (IČO, DIČ (10 digits), VAT ID, full address). Idempotent by IČO: if it already exists, the same one is returned. Requires scope org:provision.
curl -X POST https://api.efaktura.sk/v1/agent/organizations \
-H "X-API-Key: efk_pk_live_..." \
-H "Content-Type: application/json" \
-d '{ "name":"Klient s.r.o.", "ico":"55460399", "dic":"2122027985",
"ic_dph":"SK2122027985",
"address":{"street":"Hlavná 1","city":"Trenčín","postalCode":"91101","country":"SK"} }'org:provision scope and the company already exists in your eFaktúra account, pairing happens by IČO. If the company needs to be created and the key lacks the scope, email sales@efaktura.sk.On the Financial Administration Portal (PFS), the entity (the company or its representative) chooses eFaktúra as its e-invoice delivery service provider (Peppol PDS). The FS then sends eFaktúra the mandate, usually via webhook, which automatically registers the company as Peppol participant 0245:<DIČ>.
If the mandate arrived after pairing (or you want to resend the email), call POST /v1/agent/organizations/{id}/peppol-claim (scope invoice:send, empty body). eFaktúra sends "Confirm receipt of e-invoices…" to the company's FS company_email.
curl -X POST https://api.efaktura.sk/v1/agent/organizations/{org_id}/peppol-claim \
-H "X-API-Key: efk_pk_live_..."Response (note: this endpoint returns the status directly, not in an envelope):
// 202: email sent
{ "organization_id": "1ecf…", "status": "pending_email_confirmation" }
// 200: nothing to send
{ "organization_id": "1ecf…", "status": "no_mandate" } // FS mandate hasn't arrived yet
{ "organization_id": "1ecf…", "status": "no_email" } // mandate has no company email
// 409: ambiguous assignment (see Troubleshooting)
{ "organization_id": "1ecf…", "status": "collision", "reason": "real_org_exists_for_ico" }The email contains a link to a public page (no login). After confirming, the receipt of e-invoices is bound to your child org. The company is now live on production Peppol under your partner account.
Track status via GET /v1/agent/organizations/{id}. Done = claim_status: "claimed" and peppol_eligible: true with an assigned participant_id.
curl https://api.efaktura.sk/v1/agent/organizations/{org_id} \
-H "X-API-Key: efk_pk_live_..."
{
"organization_id": "1ecf…",
"ico": "55460399",
"status": "aktivne",
"participant_id": "0245:2122027985",
"peppol_status": "active",
"claim_status": "claimed",
"peppol_eligible": true,
"pending_mandate": false
}From now on the company receives e-invoices via Peppol, and you can send on its behalf (issuing + send). You read incoming documents via GET /v1/agent/peppol/received and get the peppol.document.received webhook.
Fallback path (B): FS token
When the FS sends the mandate only by email (no webhook), or you want to activate directly, use the FS verification token (Verification data, hex from PFS) and call enroll:
curl -X POST https://api.efaktura.sk/v1/agent/peppol/enroll \
-H "X-API-Key: efk_pk_live_..." \
-H "X-Organization-Id: {org_id}" \
-H "Content-Type: application/json" \
-d '{ "verificationTokenHex": "a1b2c3…" }'.txt file, and the FS rejects it as invalid_format. For a live enroll the token is required; in the sandbox it's optional.Organization states
| Field | Value | Meaning |
|---|---|---|
claim_status | claimed | The FS mandate is bound to this org, so receiving is active. |
pending_mandate | true | The FS mandate arrived, but the company hasn't confirmed yet (waiting for the email click). |
peppol_status | active | The Peppol account is active (registered in the SMP). |
peppol_eligible | true | The org can send/receive on production Peppol. |
status | caka_na_token / caka_na_fs / aktivne | Organization onboarding state (waiting for FS verification → active). |
Troubleshooting
| Symptom | Cause | Resolution |
|---|---|---|
claim → 409 collision (real_org_exists_for_ico) | Another (non-partner) real org already exists for the same IČO, and it can't be blindly downgraded. | Email podpora@efaktura.sk: the duplicate needs to be merged/linked to your org. |
claim → no_mandate | The FS mandate for the given DIČ hasn't arrived yet. | The company must first choose eFaktúra as its PDS on the FS portal (step 3). |
enroll → invalid_format | The FS token contains spaces/line breaks. | Remove all whitespace; the token is pure hex. |
claim → 403 scope | The key doesn't have invoice:send. | peppol-claim requires invoice:send (NOT org:provision). Check the key's scopes. |
See also Going live (checklist and activation gates) and Error codes.