Konektor (odoslanie jedným volaním)

Jedno-prúdové odoslanie cez POST /v1/agent/peppol/connector/send. Jedno volanie spraví všetko: zvaliduje dodané UBL/CII XML (+ voliteľná auto-oprava normalizáciou), rezervuje kredit a zaradí doklad na odoslanie cez Peppol. Náhrada za reťazenie preflight send — s tromi bezpečnostnými poistkami.

Endpoint je súčasťou Agent API — autentifikuje sa hlavičkami X-API-Key a X-Organization-Id, scope invoice:send. Test kľúč (efk_pk_test_…) smeruje do sandbox AP a nikdy neúčtuje kredit; live kľúč odošle naostro a spotrebuje kredit.

Endpoint

MetódaCestaScopeHlavičky
POST/v1/agent/peppol/connector/sendinvoice:sendX-API-Key, X-Organization-Id, Idempotency-Key

Bezpečnostné poistky

Tri poistky robia z jedného volania bezpečnú operáciu aj pri opakovaní alebo čiastočnom zlyhaní:

PoistkaSprávanie
Idempotency-Key je povinnýVynechanie hlavičky vráti 400. Rovnaký kľúč s iným telom požiadavky vráti 409. Replay (rovnaký kľúč aj telo) vráti uloženú odpoveď a neodošle druhýkrát.
Kredit až pri pripravenostiKredit sa rezervuje len keď je doklad send_ready: true. Doklad s chybami sa zamietne ešte pred rezerváciou — kredit nikdy nepretečie a strhnutie nastane práve raz pri odoslaní (žiadne dvojité účtovanie).
Auto-oprava je opt-inNormalizačné zmeny sa aplikujú len pri options.autoRepair: true a každá je vypísaná v repair_applied — upravený doklad sa nikdy neodošle ticho. Bez autoRepair sa doklad vyžadujúci úpravu zamietne ako needs_repair.

Telo požiadavky

PoleTypPovinnéPopis
receiverPeppolIdstringNiePeppol identifikátor príjemcu (napr. 0245:DIČ). Keď je uvedený, vykoná sa aj SMP lookup a vyplní sa pole recipient.
documentobjektÁnoZdrojový doklad — viď nižšie.
document.formatubl | ciiÁnoFormát zdrojového XML.
document.xmlBase64string (base64)ÁnoBase64 zakódované UBL / CII XML.
options.autoRepairbooleanNieKeď true, normalizačné zmeny (BIS 3.0 identifikátory, CII→UBL) sa aplikujú a doklad sa odošle. Predvolene false.
options.validateOnlybooleanNieKeď true, vykoná len validáciu (status validated) — nerezervuje kredit ani neodosiela.
options.dispatchnow | laterNiePredvolene now (rezervuje kredit a hneď zaradí na odoslanie). later len pripraví (stage) doklad bez strhnutia kreditu a vráti staged_id — viď „Priprav teraz, odošli neskôr“ nižšie.
POST /v1/agent/peppol/connector/send
X-API-Key: efk_pk_test_...
X-Organization-Id: 0a2c1f3e-…
Idempotency-Key: 7d1f2c9a-3b4e-4f5a-8c6d-1e2f3a4b5c6d
Content-Type: application/json

{
  "receiverPeppolId": "0245:2123456789",
  "document": {
    "format": "ubl",
    "xmlBase64": "PD94bWwgdmVyc2lvbj0iMS4wIj8+..."
  },
  "options": { "autoRepair": true }
}

Odpoveď

Odpoveď je 200 vždy, keď operácia prebehla — samotný výsledok je v poli status (queued / rejected / validated) a send_ready. Polia invoice_id, document_id a job_id sú vyplnené len pri status: queued.

{
  "data": {
    "status": "queued",
    "invoice_id": "b1f0d7a2-…",
    "document_id": "0245:2123456789#OF2026001",
    "job_id": "0245:2123456789#OF2026001",
    "send_ready": true,
    "validator_unavailable": false,
    "validation": {
      "ran": true,
      "valid": true,
      "error_count": 0,
      "warning_count": 1
    },
    "repair": [],
    "repair_applied": [
      { "change": "Doplnené Peppol BIS 3.0 identifikátory (CustomizationID/ProfileID)." }
    ],
    "recipient": {
      "peppol_id": "0245:2123456789",
      "found": true,
      "sml_state": "active"
    }
  }
}
PoleTypPopis
statusqueued | rejected | validatedqueued = kredit rezervovaný + zaradené na odoslanie; rejected = neodoslané (viď reason); validated = len validácia (validateOnly).
reasonstring | nullDôvod zamietnutia (len pri rejected): validation | needs_repair | credit | validator_unavailable.
invoice_idstring | nullID vytvorenej faktúry (len pri queued).
document_idstring | nullIdentifikátor dokladu v prenose (len pri queued).
job_idstring | nullID zaradeného odosielacieho jobu (len pri queued).
send_readyboolean | nulltrue = doklad bol pripravený na odoslanie. null, keď validátor nebol dostupný.
validator_unavailablebooleantrue, ak validačný runtime nebol dostupný — send_ready je vtedy null.
validationobjektSúhrn behu: ran, valid, error_count, warning_count.
repairpole objektovNálezy / návrhy opráv: field, code, message, severity (error | warning).
repair_appliedpole objektovKonkrétne zmeny aplikované auto-opravou: field, change. Vyplnené len keď autoRepair=true a doklad sa odoslal.
recipientobjekt | nullVýsledok SMP lookupu príjemcu, ak bol receiverPeppolId uvedený; inak null.

Priprav teraz, odošli neskôr

Keď chcete doklad najprv pripraviť (zvalidovať) a odoslať ho až neskôr — napríklad po schválení — pošlite options.dispatch: "later". Pri pripravenom doklade sa nerezervuje ani nestrháva kredit; odpoveď má status: staged a vráti staged_id, ktorým doklad odošlete samostatným volaním. Predvolené dispatch: "now" sa správa ako doteraz (rezervuje kredit a hneď zaradí na odoslanie).

POST /v1/agent/peppol/connector/send
{
  "document": { "format": "ubl", "xmlBase64": "PD94bWwg..." },
  "options": { "dispatch": "later" }
}

→ 200
{
  "data": {
    "status": "staged",
    "staged_id": "5f2a9c1b-…",
    "send_ready": true,
    "validation": { "ran": true, "valid": true, "error_count": 0, "warning_count": 0 }
  }
}

Pripravený doklad odošlete cez POST /v1/agent/peppol/connector/dispatch/{stagedId} (scope invoice:send). Až teraz sa skontroluje a rezervuje kredit a doklad sa zaradí na odoslanie. Volanie je prirodzene idempotentné — pripravený doklad sa pri prvom odoslaní zmaže, takže opakovanie s rovnakým stagedId vráti 404. Pripravené doklady sa držia prechodne (7 dní) a sú viazané na organizáciu.

MetódaCestaScopeHlavičky
POST/v1/agent/peppol/connector/dispatch/{stagedId}invoice:sendX-API-Key, X-Organization-Id
POST /v1/agent/peppol/connector/dispatch/5f2a9c1b-…

→ 200
{
  "data": {
    "status": "queued",
    "invoice_id": "b1f0d7a2-…",
    "document_id": "0245:2123456789#OF2026001",
    "job_id": "0245:2123456789#OF2026001"
  }
}
PoleTypPopis
statusqueued | rejectedqueued = kredit rezervovaný + zaradené na odoslanie; rejected = neodoslané (viď reason).
reasonstring | nullDôvod zamietnutia (len pri rejected). Aktuálne credit = nedostatok kreditu.
invoice_idstring | nullID vytvorenej faktúry (len pri queued).
document_idstring | nullIdentifikátor dokladu v prenose (len pri queued).
job_idstring | nullID zaradeného odosielacieho jobu (len pri queued).
404 dostanete aj keď stagedId neexistuje, aj keď už bol raz odoslaný — pripravený doklad sa po odoslaní zmaže, takže dispatch nikdy neodošle dvakrát.

Chyby

Validačné nálezy samotného dokladu nie sú chyba 4xx — sú vždy súčasťou 200 odpovede v poliach status / repair. Stavové kódy 4xx sú len pre chyby protokolu:

KódVýznam
400Chýba hlavička Idempotency-Key, alebo je telo / doklad neplatné.
401Neplatný alebo chýbajúci API kľúč.
403Chýbajúci scope invoice:send alebo neplatná organizácia.
409Idempotency-Key už bol použitý s iným telom požiadavky.
Idempotency-Key je povinný. Použite stabilný kľúč odvodený od čísla faktúry (nie náhodný pri každom retry) — inak by retry po timeoute mohol vytvoriť druhé odoslanie. Replay s rovnakým kľúčom aj telom je bezpečný a vráti pôvodný výsledok.

Súvislosti

Na hromadné odoslanie z tabuľky použite CSV ingest. Príjemcu viete overiť samostatne cez Overenie príjemcu a dôkaz o doručení po odoslaní cez Dôkaz o doručení.