Odporúčaný tok

Ako poskladať vystavenie a odoslanie faktúry cez Agent API: vytvoriť, voliteľne skontrolovať jedným volaním, odoslať a sledovať stav.

Poradie volaní

KrokVolaniePoznámka
1. VytvoreniePOST /v1/agent/invoicesUložte si id faktúry.
2. Preflight (voliteľný)POST /v1/agent/invoices/{id}/preflightNezaraďujte ho do klikacej cesty koncového používateľa.
3. OdoslaniePOST /v1/agent/peppol/send/{id}Odpoveď 202, odoslanie je asynchrónne.
4. Stavwebhook peppol.document.* alebo GET stavuWebhook je lepší než polling.

Preflight je len pomôcka. Odoslanie dokument zvaliduje znova, takže preflight nemusíte volať pred každým odoslaním.

Preflight faktúry

POST /v1/agent/invoices/{id}/preflight (scope invoice:read) zvaliduje presne ten dokument, ktorý sa odošle (vrátane príloh a Peppol ID) a overí príjemcu odvodeného z DIČ odberateľa. Nikdy nezapisuje a nič neúčtuje.

{
  "data": {
    "send_ready": true,
    "validator_unavailable": false,
    "validation": { "ran": true, "valid": true, "error_count": 0, "warning_count": 1 },
    "repair": [
      { "field": "…", "code": "…", "message": "…", "severity": "warning" }
    ],
    "recipient": { "peppol_id": "0245:2010101010", "found": true },
    "assembly": { "attachments_bytes": 20480 }
  }
}
SituáciaVýsledok
Odberateľ bez DIČ / IČ DPH200 so send_ready: false a položkou repair s kódom RECEIVER_UNRESOLVED.
Odosielanie by odmietli (iná Peppol sieť ako kľúč, neaktívny Peppol účet)200 so send_ready: false a položkou repair SENDER_WORLD_MISMATCH alebo PEPPOL_ACCOUNT_INACTIVE.
Prílohy nad 10 MB422

Náhľad XML pred odoslaním

GET /v1/agent/invoices/{id}/xml pred odoslaním vracia presne ten dokument, ktorý sa odošle, vrátane príloh a Peppol ID odosielateľa aj príjemcu (hlavička X-Efaktura-Ubl-Source: preview). Ak sú údaje odberateľa neúplné, náhľad sa vráti aj tak, len bez EndpointID príjemcu. Problém s prílohou vráti 422.

Výnimka: faktúra v cudzej mene bez uloženého výmenného kurzu sa v náhľade zobrazí s kurzom ECB z cache (alebo bez BT-111, ak žiadny nie je). Odoslanie môže použiť novší kurz.

Server-Timing

Každá odpoveď /v1/agent/* nesie hlavičku Server-Timing: total;dur=<ms>. Oba preflight endpointy pridávajú validate a recipient, preflight faktúry aj assemble (všetko v ms). Hlavička je cez CORS dostupná aj v prehliadači.

Timeouty a opakovanie

Nastavte klientský timeout 10 s. Opakujte iba s rovnakým Idempotency-Key. Pri odpovedi mimo 2xx čítajte JSON telo chyby.

<?php
$ch = curl_init('https://api.efaktura.sk/v1/agent/invoices/' . $id . '/preflight');
curl_setopt_array($ch, [
    CURLOPT_POST => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT => 10,
    CURLOPT_HTTPHEADER => [
        'X-API-Key: ' . $apiKey,
        'X-Organization-Id: ' . $orgId,
        'Content-Type: application/json',
    ],
]);
$raw = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

if ($raw === false) {
    // sieťová chyba alebo timeout: opakujte s rovnakým Idempotency-Key
}
$body = json_decode($raw, true); // 2xx aj chybová odpoveď sú JSON
if ($status >= 200 && $status < 300) {
    $sendReady = $body['data']['send_ready'];
} else {
    // $body obsahuje náš popis chyby
}
file_get_contents bez 'ignore_errors' => true pri odpovedi mimo 2xx vráti false a telo chyby ostane skryté. Používajte cURL.