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.

Only go to production after verifying the whole flow in the sandbox (Quickstart). A production key (efk_pk_live_…) burns credits and creates real tax documents.
This page assumes you already havea production key. If you don't yet, complete the 3-step onboarding in the partner portal first (request → contract with e-mail code signature → production key); the walkthrough is on Going live.

Two production paths

PathWhenWhat 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.
Why not just the token?Path A doesn't require you to manually obtain and copy the FS token: the company confirms receipt by clicking in the email. The anti-misrouting safeguard is preserved: the company's mailbox confirms (its FS 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   ✅ DONE

Step 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

1
Get a production (live) key

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.

2
Pair / create the client organization

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"} }'
If your live key doesn't have the 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.
3
The company chooses eFaktúra as its provider on the FS portal

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Č>.

4
Send the company a confirmation email (claim)

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" }
5
The company confirms receipt by clicking in the email

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.

6
Verify status (polling)

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…" }'
The token must be pure hex (0‑9, a‑f) with no spaces/line breaks. Whitespace characters often sneak in from a multi-line .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

FieldValueMeaning
claim_statusclaimedThe FS mandate is bound to this org, so receiving is active.
pending_mandatetrueThe FS mandate arrived, but the company hasn't confirmed yet (waiting for the email click).
peppol_statusactiveThe Peppol account is active (registered in the SMP).
peppol_eligibletrueThe org can send/receive on production Peppol.
statuscaka_na_token / caka_na_fs / aktivneOrganization onboarding state (waiting for FS verification → active).

Troubleshooting

SymptomCauseResolution
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_mandateThe 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_formatThe FS token contains spaces/line breaks.Remove all whitespace; the token is pure hex.
claim → 403 scopeThe 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.