{"openapi":"3.0.3","info":{"title":"ePostak Enterprise API — Core","description":"Locked 12-operation Enterprise golden path for token, capability check, preflight, send, status, pull/webhook events, inbound retrieval and support evidence.","version":"1.10.0","contact":{"email":"info@epostak.sk","url":"https://epostak.sk"}},"servers":[{"url":"https://epostak.sk/api/v1","description":"Production"}],"tags":[{"name":"Documents","description":"Odosielanie dokumentov cez Peppol"},{"name":"Webhooks","description":"Push webhook subscriptions and Events pull subscriptions (Enterprise only). Prefer /events/pull for pull-based event handling; webhook-queue paths remain compatibility endpoints."},{"name":"Peppol","description":"SMP lookup a Peppol directory"},{"name":"Auth","description":"API key introspection and rotation"},{"name":"Webhooks & Events","description":"Push webhooks and canonical Events pull endpoints for reliable ERP delivery. Retired webhook-queue aliases are no longer served."},{"name":"Lifecycle & proof","description":"Document status, timeline, responses and support/evidence packets for audit and dispute workflows."},{"name":"Pull API — Inbound","description":"Pull API — Inbound operations in this generated Enterprise profile."}],"security":[{"bearerAuth":[]}],"paths":{"/auth/token":{"post":{"tags":["Auth"],"summary":"Mint a JWT access token (OAuth 2.0 client_credentials)","description":"Exchange a `sk_live_*` or `sk_int_*` API key for a short-lived JWT access token + refresh token.\n\n**Body** (JSON or `application/x-www-form-urlencoded`):\n- `grant_type`: must be `client_credentials`\n- `client_id`: the client_id shown with the key; it must match the API key row UUID or displayed key prefix and must not be the secret\n- `client_secret`: the full `sk_live_*` or `sk_int_*` key\n- `scope` (optional): space-separated subset of the key's allowed scopes\n\n**Response** (RFC 6749):\n```json\n{\n  \"access_token\": \"eyJhbGciOiJSUzI1NiIs...\",\n  \"token_type\": \"Bearer\",\n  \"expires_in\": 900,\n  \"refresh_token\": \"rt_...\",\n  \"scope\": \"documents:send documents:read\"\n}\n```\n\n**Errors** use Peppol error envelope: `{ error: { category, code, message, retryable, correlation_id, details? } }`.\n\nFailed-credential throttling: after 5 invalid attempts within 15 min, repeated exact-pair attempts and further invalid guesses targeting the same `client_id` return 423. A valid secret is authenticated before client-wide failure state is enforced and remains usable.\n\nThis endpoint is the canonical Enterprise URL; `/sapi/v1/auth/token` is the SAPI-spec equivalent and shares the same handler.","operationId":"authToken","security":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JwtTokenRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/JwtTokenRequest"}}}},"responses":{"200":{"description":"Access token + refresh token issued","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JwtTokenResponse"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"400":{"description":"Invalid grant_type or malformed body","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PeppolErrorResponse"}}}},"401":{"description":"Invalid client credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PeppolErrorResponse"}}}},"403":{"description":"Requested scope(s) not allowed by key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PeppolErrorResponse"}}}},"423":{"description":"Invalid credential attempts throttled after 5 failures; valid credentials remain usable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PeppolErrorResponse"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PeppolErrorResponse"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}}},"x-epostak-product":"enterprise","x-epostak-profile-visibility":"core","x-epostak-lifecycle":"active","x-epostak-deprecation-at":null,"x-epostak-sunset-at":null,"x-epostak-replacement":null,"x-epostak-accepted-credential-types":["enterprise-api-key","integrator-api-key","peppol-client"],"x-epostak-required-scopes":[],"x-epostak-firm-context":"forbidden","x-epostak-idempotency":false,"x-epostak-owner":"enterprise:auth","x-epostak-docs-anchor":"enterprise-authtoken"}},"/documents/send":{"post":{"tags":["Documents"],"summary":"Odoslat dokument cez Peppol","description":"Odosle fakturu cez Peppol siet. Podporuje dva rezimy:\n\n**JSON mode** — poskytnete strukturovane data (`items`) pre standardnu fakturu, UBL XML sa vygeneruje automaticky. Odosielatel sa berie z autentifikovanej firmy, nie z payloadu.\n\n**XML mode** — poskytnete hotove UBL XML (`xml`), odosle sa priamo.\n\nV oboch pripadoch je `receiverPeppolId` povinne.\n\n**Idempotency (always strict):** pass `Idempotency-Key: <any unique string>` (alias `X-Idempotency-Key`) to safely retry after network errors — the second completed call with the same body returns HTTP 200 with the current document status and `duplicate: true`, without creating or sending another document. If the same key is currently being processed, returns 409 CONFLICT. If the body SHA-256 differs from the stored hash, returns 422 IDEMPOTENCY_KEY_MISMATCH (body is canonicalized — keys sorted recursively — before hashing). There is no non-strict mode.\n\n**Cross-path dedup (XML mode):** if the same UBL XML SHA-256 was already accepted for this firm via dashboard mass-import, returns 200 with `{ data: { invoice_id, peppol_message_id, status, duplicate: true } }`.\n\n**Items[] max 999.** Unit codes use UN/ECE Rec 20 (C62, HUR, KGM, MTR, LTR, DAY, ...).\n\n**Attachments (BG-24):** up to 20 files, 10 MB per file, 15 MB total after base64 decode. MIME types enforced per BR-CL-22.\n\n**Required scope:** `documents:send`. Wildcard scopes (`*`, `full`, or empty `[]`) also satisfy this requirement.","operationId":"sendDocument","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":255},"description":"Client-supplied idempotency key (canonical RFC-draft header). If the same key was used recently with the same body, the prior response is replayed."},{"name":"X-Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":255},"description":"Alias for `Idempotency-Key`. Both headers are accepted."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/SendDocumentJsonRequest"},{"$ref":"#/components/schemas/SendDocumentXmlRequest"}]},"examples":{"json_mode":{"summary":"Complete JSON invoice mode","value":{"receiverPeppolId":"0245:0000000001","receiverName":"Zakaznik Demo s.r.o.","receiverIco":"12345678","receiverDic":"0000000001","receiverIcDph":"SK0000000001","receiverStreet":"Testovacia 1","receiverCity":"Bratislava","receiverPostalCode":"811 01","receiverCountry":"SK","invoiceNumber":"FA-2026-001","issueDate":"2026-07-01","dueDate":"2026-07-15","currency":"EUR","paymentMethod":"bank_transfer","iban":"SK9811000000000000000001","variableSymbol":"2026001","buyerReference":"PO-2026-0001","note":"Services for June 2026. Attachment: signed acceptance protocol.","prepaidAmount":100,"items":[{"description":"Implementation services","quantity":16,"unit":"HUR","unitPrice":75,"vatRate":23,"vatCategoryCode":"S","discount":5,"deliveryDate":"2026-06-30"},{"description":"Support subscription","quantity":1,"unit":"C62","unitPrice":240,"vatRate":23,"vatCategoryCode":"S"}],"attachments":[{"fileName":"acceptance-protocol.pdf","mimeType":"application/pdf","content":"JVBERi0xLjQKJc...","description":"Signed acceptance protocol"}]}},"json_mode_with_attachments":{"summary":"JSON mode s prilohami (BG-24)","value":{"receiverPeppolId":"0245:12345678","receiverName":"Zakaznik s.r.o.","invoiceNumber":"FAK-2026-0001","items":[{"description":"Konzultacne sluzby","quantity":10,"unitPrice":50,"vatRate":23}],"attachments":[{"fileName":"invoice-detail.pdf","mimeType":"application/pdf","content":"JVBERi0xLjQKJeLjz9MKMS...","description":"Rozpis odpracovanych hodin"}]}},"xml_mode":{"summary":"XML mode for ready UBL, including self-billing","value":{"receiverPeppolId":"0245:0000000001","xml":"<?xml version=\"1.0\" encoding=\"UTF-8\"?><Invoice>...<cbc:InvoiceTypeCode>389</cbc:InvoiceTypeCode>...</Invoice>"}}}}}},"responses":{"200":{"description":"Idempotent replay; no new document or send was created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendDocumentResponse"}}}},"201":{"description":"Dokument uspesne odoslany","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendDocumentResponse"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"202":{"description":"Dokument bol dorucenny cez Peppol, ale zapis lokalneho stavu zlyhal. Reconcile cron stav doplni; idempotent retry vrati identicku odpoved.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendDocumentResponse"}}}},"401":{"description":"Neplatny alebo chybajuci API kluc","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"API plan required or access denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenErrorResponse"}}}},"409":{"description":"Idempotency key in-flight — same X-Idempotency-Key is currently being processed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"413":{"description":"Payload too large (> 25 MB JSON mode, > 5 MB XML mode)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error. Two distinct failure shapes return 422 here: (a) UBL pre-flight rule violation — body matches UblValidationError with `code: \"UBL_VALIDATION_ERROR\"` and a `rule` field naming the violated BR-* / BT-* / PEPPOL-R* code; (b) IDEMPOTENCY_KEY_MISMATCH — same X-Idempotency-Key was replayed with a different request body hash, body matches the generic ErrorResponse.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/UblValidationError"},{"$ref":"#/components/schemas/ErrorResponse"}]}}}},"502":{"description":"SEND_FAILED — Peppol AP dispatch failed (retryable)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"IDEMPOTENCY_STORE_UNAVAILABLE — Redis idempotency layer unreachable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-epostak-product":"enterprise","x-epostak-profile-visibility":"core","x-epostak-lifecycle":"active","x-epostak-deprecation-at":null,"x-epostak-sunset-at":null,"x-epostak-replacement":null,"x-epostak-accepted-credential-types":["enterprise-bearer"],"x-epostak-required-scopes":[],"x-epostak-firm-context":"required","x-epostak-idempotency":true,"x-epostak-owner":"enterprise:documents","x-epostak-docs-anchor":"enterprise-senddocument"}},"/documents/preflight":{"post":{"tags":["Documents"],"summary":"Pred-odosielacia validacia","description":"Enterprise reliability contract: capability -> preflight -> send -> events -> support. Dry-run send without creating a document or billing usage; run it after capability checks and before POST /documents/send. Read decision/canSend/errors/checks for the result, and retry the later send call with the same Idempotency-Key when it is the same payload.","operationId":"preflightDocument","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["receiverPeppolId"],"properties":{"receiverPeppolId":{"type":"string","example":"0245:12345678","description":"Peppol ID prijemcu"},"documentTypeId":{"type":"string","example":"urn:oasis:names:specification:ubl:schema:xsd:Invoice-2","description":"Typ dokumentu (volitelne, default: Invoice)"}}}}}},"responses":{"200":{"description":"Vysledok preflight kontroly (tri-state booleans)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreflightResponse"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"401":{"description":"Neplatny alebo chybajuci API kluc","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"API plan required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenErrorResponse"}}}},"413":{"description":"Payload too large (> 6 MB)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"UBL validation error (schematron rule failed)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UblValidationError"}}}},"503":{"description":"SMP lookup service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-epostak-product":"enterprise","x-epostak-profile-visibility":"core","x-epostak-lifecycle":"active","x-epostak-deprecation-at":null,"x-epostak-sunset-at":null,"x-epostak-replacement":null,"x-epostak-accepted-credential-types":["enterprise-bearer"],"x-epostak-required-scopes":[],"x-epostak-firm-context":"required","x-epostak-idempotency":true,"x-epostak-owner":"enterprise:documents","x-epostak-docs-anchor":"enterprise-preflightdocument"}},"/documents/{id}/status":{"get":{"tags":["Documents"],"summary":"Stav dokumentu — uplny lifecycle","description":"Vrati aktualny stav dokumentu vratane kompletnej historie stavov.","operationId":"getDocumentStatus","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"ID dokumentu"}],"responses":{"200":{"description":"Stav dokumentu","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentStatusResponse"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"401":{"description":"Neplatny alebo chybajuci API kluc","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Pristup odmietnuty","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Dokument nenajdeny","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-epostak-product":"enterprise","x-epostak-profile-visibility":"core","x-epostak-lifecycle":"active","x-epostak-deprecation-at":null,"x-epostak-sunset-at":null,"x-epostak-replacement":null,"x-epostak-accepted-credential-types":["enterprise-bearer"],"x-epostak-required-scopes":[],"x-epostak-firm-context":"required","x-epostak-idempotency":false,"x-epostak-owner":"enterprise:documents","x-epostak-docs-anchor":"enterprise-getdocumentstatus"}},"/webhooks":{"post":{"tags":["Webhooks"],"summary":"Vytvorit webhook","description":"Zaregistruje novu webhook URL alebo pull-only subscription pre vybrane udalosti. Subscription je forward-only: zaradia sa iba udalosti vytvorene po jej aktivacii; historicke sender-side ani receiver-side udalosti sa spatne nedoplnaju. Push URL musi byt HTTPS a nesmie byt localhost ani privatna siet (SSRF ochrana). Max 10 subscriptions per firma.\n\n**Vyzaduje API pristup: `api-enterprise` priamo alebo `integrator-managed` cez spravujuceho integratora.**\n\nPodporovane udalosti (7): `document.created`, `document.sent`, `document.received`, `document.validated`, `document.delivered`, `document.rejected`, `document.response_received`.","operationId":"createWebhook","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateWebhookRequest"},"example":{"url":"https://vas-system.sk/webhooks/epostak","events":["document.received","document.sent"]}}}},"responses":{"201":{"description":"Webhook vytvoreny","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookDetailResponse"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"400":{"description":"Neplatna URL alebo udalosti","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Neplatny alebo chybajuci API kluc","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"API plan je vyzadovany","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenErrorResponse"}}}}},"x-epostak-product":"enterprise","x-epostak-profile-visibility":"core","x-epostak-lifecycle":"active","x-epostak-deprecation-at":null,"x-epostak-sunset-at":null,"x-epostak-replacement":null,"x-epostak-accepted-credential-types":["enterprise-bearer"],"x-epostak-required-scopes":[],"x-epostak-firm-context":"required","x-epostak-idempotency":false,"x-epostak-owner":"enterprise:webhooks","x-epostak-docs-anchor":"enterprise-createwebhook"}},"/peppol/capabilities":{"post":{"tags":["Peppol"],"summary":"Capability probe — does receiver accept this doctype?","description":"Storecove-style `discovery/receives`: given a participant + optional candidate document type + process id, answer whether the receiver accepts it. Enterprise reliability contract starts here: before building the payload, read `networkReady` and `matchedDocumentTypes`, then continue capability -> preflight -> send -> events -> support.\n\nWhen `documentType` or `processId` are omitted, the endpoint defaults to BIS Billing 3.0 Invoice over the BIS Billing process. Response `matchedDocumentType` is the probed document type when accepted, otherwise `null`. Send `documentTypes[]` to check 1-20 document type URNs in one request; the response includes `capabilities[]` and `matchedDocumentTypes[]`.","operationId":"peppolCapabilities","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CapabilitiesRequest"}}}},"responses":{"200":{"description":"Lookup result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CapabilitiesResponse"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"401":{"description":"Invalid or missing API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"API plan required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenErrorResponse"}}}},"404":{"description":"Participant not registered in Peppol network","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CapabilitiesResponse"}}}},"422":{"description":"Invalid scheme/identifier format","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-epostak-product":"enterprise","x-epostak-profile-visibility":"core","x-epostak-lifecycle":"active","x-epostak-deprecation-at":null,"x-epostak-sunset-at":null,"x-epostak-replacement":null,"x-epostak-accepted-credential-types":["enterprise-bearer"],"x-epostak-required-scopes":[],"x-epostak-firm-context":"required","x-epostak-idempotency":false,"x-epostak-owner":"enterprise:peppol","x-epostak-docs-anchor":"enterprise-peppolcapabilities"}},"/inbound/documents":{"get":{"tags":["Pull API — Inbound"],"summary":"List inbound documents","description":"Cursor-based list of documents received from Peppol. Returns newest-first by default. Use ?since= cursor for forward-paging (oldest-to-newest order is ascending).\n\n**Auth:** scope `documents:read`, plan `api-enterprise` directly, or `integrator-managed` through the managing integrator.\n\nResponse shape is produced by `formatInboundDocument`.","operationId":"listInboundDocuments","parameters":[{"name":"since","in":"query","required":false,"schema":{"type":"string"},"description":"Opaque versioned cursor from previous response next_cursor. Omit to start from beginning."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":500,"default":100}},{"name":"kind","in":"query","required":false,"schema":{"type":"string"},"description":"Filter by doctype key (invoice, credit_note, etc.)"},{"name":"sender","in":"query","required":false,"schema":{"type":"string"},"description":"Filter by sender Peppol ID (exact match)"}],"responses":{"200":{"description":"Paginated list of inbound documents","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InboundDocumentsListResponse"}}}},"400":{"description":"Invalid query parameters (e.g. malformed cursor, limit out of range)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Invalid or missing API key / JWT","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Insufficient plan or scope (requires api-enterprise directly or integrator-managed through the managing integrator, scope documents:read)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenErrorResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-epostak-product":"enterprise","x-epostak-profile-visibility":"core","x-epostak-lifecycle":"active","x-epostak-deprecation-at":null,"x-epostak-sunset-at":null,"x-epostak-replacement":null,"x-epostak-accepted-credential-types":["enterprise-bearer"],"x-epostak-required-scopes":[],"x-epostak-firm-context":"required","x-epostak-idempotency":false,"x-epostak-owner":"enterprise:pull-api-inbound","x-epostak-docs-anchor":"enterprise-listinbounddocuments"}},"/inbound/documents/{id}":{"get":{"tags":["Pull API — Inbound"],"summary":"Get inbound document","description":"Fetch a single inbound document by ID. 404 when the document does not exist or belongs to a different tenant.","operationId":"getInboundDocument","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"},"description":"Document ID"}],"responses":{"200":{"description":"Inbound document","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InboundDocument"}}}},"401":{"description":"Invalid or missing API key / JWT","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Insufficient plan or scope (requires api-enterprise directly or integrator-managed through the managing integrator, scope documents:read)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenErrorResponse"}}}},"404":{"description":"Document not found or does not belong to this tenant","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-epostak-product":"enterprise","x-epostak-profile-visibility":"core","x-epostak-lifecycle":"active","x-epostak-deprecation-at":null,"x-epostak-sunset-at":null,"x-epostak-replacement":null,"x-epostak-accepted-credential-types":["enterprise-bearer"],"x-epostak-required-scopes":[],"x-epostak-firm-context":"required","x-epostak-idempotency":false,"x-epostak-owner":"enterprise:pull-api-inbound","x-epostak-docs-anchor":"enterprise-getinbounddocument"}},"/inbound/documents/{id}/ack":{"post":{"tags":["Pull API — Inbound"],"summary":"Acknowledge inbound document","description":"Mark an inbound document as acknowledged by the client. Idempotent — calling again with a new client_reference overwrites the previous one (latest-ack-wins).\n\n**Auth:** scope `documents:write` (NOT `documents:read` — this is a write operation).\n\n**Response:** Returns the full document shape post-ack.","operationId":"ackInboundDocument","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InboundAckRequest"}}}},"responses":{"200":{"description":"Document acknowledged; returns updated document shape","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InboundDocument"}}}},"401":{"description":"Invalid or missing API key / JWT","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Insufficient plan or scope (requires api-enterprise directly or integrator-managed through the managing integrator, scope documents:write)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenErrorResponse"}}}},"404":{"description":"Document not found or does not belong to this tenant","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-epostak-product":"enterprise","x-epostak-profile-visibility":"core","x-epostak-lifecycle":"active","x-epostak-deprecation-at":null,"x-epostak-sunset-at":null,"x-epostak-replacement":null,"x-epostak-accepted-credential-types":["enterprise-bearer"],"x-epostak-required-scopes":[],"x-epostak-firm-context":"required","x-epostak-idempotency":false,"x-epostak-owner":"enterprise:pull-api-inbound","x-epostak-docs-anchor":"enterprise-ackinbounddocument"}},"/events/pull":{"get":{"tags":["Webhooks & Events"],"summary":"Pull unacknowledged events","description":"Canonical Events endpoint for polling queued webhook events in the Enterprise reliability contract. The queue is forward-only: only events created while a matching pull subscription is active are queued; older sender-side and receiver-side events are not backfilled. After send, poll unacknowledged events and acknowledge after local commit in the ERP; if processing fails, leave the event unacknowledged and pull it again. The server keeps state through acknowledgements, so clients do not need client-side cursor bookkeeping. The retired /webhook-queue alias is no longer served.","operationId":"eventsPull","responses":{"200":{"description":"Zoznam cakajucich udalosti","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventsPullResponse"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"401":{"description":"Neplatny alebo chybajuci API kluc","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"API plan je vyzadovany","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenErrorResponse"}}}}},"x-epostak-product":"enterprise","x-epostak-profile-visibility":"core","x-epostak-lifecycle":"active","x-epostak-deprecation-at":null,"x-epostak-sunset-at":null,"x-epostak-replacement":null,"x-epostak-accepted-credential-types":["enterprise-bearer"],"x-epostak-required-scopes":[],"x-epostak-firm-context":"required","x-epostak-idempotency":false,"x-epostak-owner":"enterprise:webhooks-events","x-epostak-docs-anchor":"enterprise-eventspull"}},"/events/batch-ack":{"post":{"tags":["Webhooks & Events"],"summary":"Acknowledge multiple events","description":"Canonical Events endpoint for batch acknowledgement. Enterprise reliability contract: acknowledge after local commit, not when the event is fetched. Use this after a batch import commit; on retry, leave events unacknowledged and read them again from /events/pull. The retired /webhook-queue/batch-ack alias is no longer served.","operationId":"eventsBatchAck","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["event_ids"],"properties":{"event_ids":{"type":"array","items":{"type":"string"},"example":["evt_1","evt_2","evt_3"],"description":"Zoznam ID udalosti na potvrdenie"}}}}}},"responses":{"200":{"description":"Udalosti potvrdene","content":{"application/json":{"schema":{"type":"object","properties":{"acknowledged":{"type":"integer","example":3,"description":"Pocet potvrdenych udalosti"}}}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"400":{"description":"Chybajuci alebo prazdny zoznam event_ids","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Neplatny alebo chybajuci API kluc","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"API plan je vyzadovany","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenErrorResponse"}}}}},"x-epostak-product":"enterprise","x-epostak-profile-visibility":"core","x-epostak-lifecycle":"active","x-epostak-deprecation-at":null,"x-epostak-sunset-at":null,"x-epostak-replacement":null,"x-epostak-accepted-credential-types":["enterprise-bearer"],"x-epostak-required-scopes":[],"x-epostak-firm-context":"required","x-epostak-idempotency":false,"x-epostak-owner":"enterprise:webhooks-events","x-epostak-docs-anchor":"enterprise-eventsbatchack"}},"/documents/{id}/support-packet":{"get":{"tags":["Lifecycle & proof"],"summary":"Document support packet","description":"Canonical Lifecycle & proof endpoint for the document support ZIP bundle. Enterprise reliability contract final step: store requestId, documentId/submissionId, messageId, payloadSha256 and support-packet for incidents instead of sending full XML when a hash and support packet are enough. The retired /documents/{id}/evidence-bundle alias is no longer served.","operationId":"getDocumentSupportPacket","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Document ID"}],"responses":{"200":{"description":"Document support packet","content":{"application/zip":{"schema":{"type":"string","format":"binary"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"API plan required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Document not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"413":{"description":"Support packet too large","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"MDN evidence integrity check failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-epostak-product":"enterprise","x-epostak-profile-visibility":"core","x-epostak-lifecycle":"active","x-epostak-deprecation-at":null,"x-epostak-sunset-at":null,"x-epostak-replacement":null,"x-epostak-accepted-credential-types":["enterprise-bearer"],"x-epostak-required-scopes":[],"x-epostak-firm-context":"required","x-epostak-idempotency":false,"x-epostak-owner":"enterprise:lifecycle-proof","x-epostak-docs-anchor":"enterprise-getdocumentsupportpacket"}}},"components":{"schemas":{"JwtTokenRequest":{"type":"object","required":["grant_type","client_id","client_secret"],"properties":{"grant_type":{"type":"string","enum":["client_credentials"]},"client_id":{"type":"string","description":"The client_id shown with the key. It must match the API key row UUID or displayed key prefix; it is not the sk_live_*/sk_int_* secret."},"client_secret":{"type":"string","description":"The full `sk_live_*` or `sk_int_*` API key."},"scope":{"type":"string","description":"Optional space-separated subset of the key's allowed scopes. If omitted, the JWT inherits the key's full scope set (or `*` for wildcard keys)."}}},"JwtTokenResponse":{"type":"object","required":["access_token","token_type","expires_in","refresh_token","scope"],"properties":{"access_token":{"type":"string","description":"Short-lived JWT (RS256, 15 min TTL). Use as `Authorization: Bearer <token>` on all `/api/v1/*` endpoints."},"token_type":{"type":"string","enum":["Bearer"]},"expires_in":{"type":"integer","example":900},"refresh_token":{"type":"string","description":"Refresh token (30 day TTL). Single-use — rotated on each `/auth/renew` call."},"scope":{"type":"string","example":"documents:send documents:read"}}},"PeppolErrorResponse":{"type":"object","description":"Error envelope used by the JWT auth endpoints (`/auth/token`, `/auth/renew`, `/auth/revoke`) and any `/sapi/v1/*` endpoint. Different from `ErrorResponse` — designed for Peppol Access Point error semantics with retry hints.","required":["error"],"properties":{"error":{"type":"object","required":["category","code","message","retryable","correlation_id"],"properties":{"category":{"type":"string","enum":["AUTH","VALIDATION","PROCESSING","TEMPORARY","PERMANENT"]},"code":{"type":"string","example":"SAPI-AUTH-001","description":"Stable machine-readable code (e.g. `SAPI-AUTH-001` invalid creds, `SAPI-AUTH-008` scope denied, `SAPI-AUTH-099` internal)."},"message":{"type":"string","example":"Invalid client credentials"},"retryable":{"type":"boolean","description":"True for 5xx/429 — caller may retry with backoff."},"correlation_id":{"type":"string","format":"uuid"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"issue":{"type":"string"},"value":{"type":"string"}}}}}}}},"SendDocumentJsonRequest":{"type":"object","required":["items"],"allOf":[{"description":"A successful JSON billing request needs a Peppol recipient ID. Use receiverPeppolId for invoice/credit_note; self-billing may use supplierPeppolId.","anyOf":[{"required":["receiverPeppolId"]},{"required":["supplierPeppolId"]}]},{"description":"A successful JSON billing request needs the counterparty legal name. Use receiverName for invoice/credit_note; self-billing may use supplierName.","anyOf":[{"required":["receiverName"]},{"required":["supplierName"]}]}],"description":"Complete JSON billing contract shared by Enterprise send and Connector. UBL XML is generated automatically for invoice, credit_note, self_billing and self_billing_credit_note. Only items is unconditionally required under one fixed field name; a successful request also needs one accepted Peppol recipient ID and one accepted counterparty name. receiverPeppolId and receiverName are required for invoice/credit_note, while self-billing may use supplierPeppolId and supplierName. Credit-note types additionally require precedingInvoiceRef. Sender fields are not accepted: the authenticated firm is the supplier for regular invoices/credit notes and the buyer for self-billing. Unknown fields are not mapped into the generated UBL.","properties":{"processId":{"type":"string","description":"Peppol process URN. Accepts the bare URN or the cenbii-procid-ubl:: prefixed form. Defaults to profile 01; use urn:peppol:bis:billing_with_response to require an Invoice Response."},"documentType":{"type":"string","enum":["invoice","credit_note","self_billing","self_billing_credit_note"],"default":"invoice","example":"invoice","description":"Business document type. invoice is a supplier-issued invoice; credit_note corrects a supplier-issued invoice; self_billing is a buyer-issued invoice; self_billing_credit_note corrects a buyer-issued invoice. Defaults to invoice."},"document_type":{"type":"string","enum":["invoice","credit_note","self_billing","self_billing_credit_note"],"description":"Snake_case alias for documentType. If multiple aliases are sent, all non-empty values must match."},"docType":{"type":"string","enum":["invoice","credit_note","self_billing","self_billing_credit_note"],"description":"Compatibility alias for documentType. Do not send conflicting alias values."},"receiverPeppolId":{"type":"string","example":"0245:12345678","description":"Peppol participant ID in scheme:identifier form, for example 0245:2123456789. Required for invoice/credit_note and identifies the buyer. For self-billing it identifies the supplier/Peppol recipient, but supplierPeppolId is the clearer alias."},"supplierPeppolId":{"type":"string","example":"0245:2123038963","description":"Self-billing alias for the supplier/Peppol recipient in scheme:identifier form. Allowed only for self_billing and self_billing_credit_note; it is normalized into receiverPeppolId."},"invoiceNumber":{"type":"string","example":"FAK-2026-0001","description":"Invoice or credit-note number. If omitted or empty, ePošťák allocates the next number from the authenticated firm's numbering sequence."},"precedingInvoiceRef":{"type":"string","example":"FAK-2026-0001","description":"External original invoice number corrected by this credit note. Required for credit_note and self_billing_credit_note; emitted as UBL BillingReference."},"issueDate":{"type":"string","format":"date","example":"2026-04-01","description":"Issue date in YYYY-MM-DD format. If omitted, the current date in Europe/Bratislava is used."},"dueDate":{"type":"string","format":"date","example":"2026-04-15","description":"Payment due date in YYYY-MM-DD format. Optional."},"taxPointDate":{"type":"string","format":"date","example":"2026-04-01","description":"VAT tax point date (BT-7) in YYYY-MM-DD format. Kept separate from the actual delivery date."},"deliveryDate":{"type":"string","format":"date","example":"2026-03-31","description":"Actual delivery date for the whole document (BT-72) in YYYY-MM-DD format."},"documentDiscountPercent":{"type":"number","minimum":0,"maximum":100,"example":5,"description":"Document-level discount percentage represented as a Peppol BG-20 allowance. This is additional to any items[].discount."},"currency":{"type":"string","example":"EUR","default":"EUR","description":"ISO 4217 currency code. If omitted, the authenticated firm's default currency is used, falling back to EUR."},"note":{"type":"string","example":"Dakujeme za objednavku.","description":"Free-text invoice note. Use it for a human-readable exemption/reverse-charge reason or other information the receiver must see."},"iban":{"type":"string","example":"SK1234567890123456789012","description":"Payment IBAN. If omitted, the authenticated firm's saved IBAN is used when available."},"paymentMethod":{"type":"string","example":"bank_transfer","description":"Payment method. Accepted convenience aliases: bank_transfer=30, credit_transfer=30, sepa=58, card=48, cash=10, direct_debit=49. A direct UNCL4461 code such as 30 is also accepted. Omitted defaults to 30 in generated UBL."},"variableSymbol":{"type":"string","example":"20260001","description":"Variable symbol / payment reference included with payment means."},"buyerReference":{"type":"string","example":"PO-2026-99","description":"Buyer reference, purchase-order number, or internal procurement reference."},"receiverName":{"type":"string","example":"Zakaznik s.r.o.","description":"Counterparty legal/business name. Required for invoice/credit_note. For self-billing it identifies the supplier, but supplierName is the clearer alias."},"receiverIco":{"type":"string","example":"12345678","description":"Counterparty company registration number (IČO)."},"receiverDic":{"type":"string","example":"2020123456","description":"Counterparty tax identification number (DIČ)."},"receiverIcDph":{"type":"string","example":"SK2020123456","description":"Counterparty VAT identification number (IČ DPH). For self-billing it is also used to determine supplier-side VAT-payer treatment."},"receiverStreet":{"type":"string","example":"Hlavna 1","description":"Receiver street and number. Preferred over parsing receiverAddress."},"receiverCity":{"type":"string","example":"Bratislava","description":"Counterparty city."},"receiverPostalCode":{"type":"string","example":"81101","description":"Counterparty postal code."},"receiverAddress":{"type":"string","example":"Hlavna 1, Bratislava, 81101","description":"Single-line counterparty address. Prefer receiverStreet, receiverCity and receiverPostalCode when the ERP has split address fields."},"receiverCountry":{"type":"string","example":"SK","default":"SK","description":"Counterparty country as ISO 3166-1 alpha-2. Defaults to SK."},"supplierName":{"type":"string","example":"Dodavatel s.r.o.","description":"Self-billing alias for receiverName (supplier). Required for self_billing/self_billing_credit_note when receiverName is omitted."},"supplierIco":{"type":"string","example":"50123456","description":"Self-billing alias for receiverIco."},"supplierDic":{"type":"string","example":"2123038963","description":"Self-billing alias for receiverDic."},"supplierIcDph":{"type":"string","example":"SK2123038963","description":"Self-billing alias for receiverIcDph. Used for supplier-side VAT payer logic."},"supplierStreet":{"type":"string","example":"Priemyselna 8","description":"Self-billing alias for receiverStreet."},"supplierCity":{"type":"string","example":"Zilina","description":"Self-billing alias for receiverCity."},"supplierPostalCode":{"type":"string","example":"01001","description":"Self-billing alias for receiverPostalCode."},"supplierAddress":{"type":"string","example":"Priemyselna 8, Zilina, 01001","description":"Self-billing alias for receiverAddress."},"supplierCountry":{"type":"string","example":"SK","default":"SK","description":"Self-billing alias for receiverCountry."},"prepaidAmount":{"type":"number","minimum":0,"example":123,"description":"Amount paid in advance (BT-113). Emitted as LegalMonetaryTotal/PrepaidAmount and reduces PayableAmount. Do not combine with items[].lineType=advance_deduction."},"prepayments":{"type":"array","minItems":1,"description":"Structured settled prepayments on the final invoice. The API sums prepayments[].amountWithVat into prepaidAmount, reduces PayableAmount, and preserves advance/tax references in the UBL note. It does not create a separate UBL tax breakdown for the prepayment; tax subtotals still come from invoice lines. Do not combine with items[].lineType=advance_deduction.","items":{"$ref":"#/components/schemas/Prepayment"}},"items":{"type":"array","minItems":1,"maxItems":999,"description":"Billing lines. Between 1 and 999 entries are accepted.","items":{"$ref":"#/components/schemas/LineItem"}},"attachments":{"type":"array","maxItems":20,"description":"Invoice supporting documents (Peppol BG-24), embedded in UBL as base64 through AdditionalDocumentReference / EmbeddedDocumentBinaryObject. Maximum 20 files, 10 MB decoded per file, and 15 MB decoded total.","items":{"$ref":"#/components/schemas/DocumentAttachment"}}}},"SendDocumentXmlRequest":{"type":"object","required":["receiverPeppolId","xml"],"description":"XML mode — poskytnute UBL XML sa odosle priamo v JSON poli xml. Pouzite ho ako expert fallback pre hotovy Peppol UBL alebo specifika mimo JSON line-item mode.","properties":{"processId":{"type":"string","description":"Peppol process URN. Accepts the bare URN or the cenbii-procid-ubl:: prefixed form. For profile 02 use urn:peppol:bis:billing_with_response; it must match the UBL ProfileID."},"receiverPeppolId":{"type":"string","example":"0245:12345678"},"xml":{"type":"string","description":"Kompletne UBL XML (Invoice alebo CreditNote).","example":"<?xml version=\"1.0\" encoding=\"UTF-8\"?><Invoice>...</Invoice>"}}},"SendDocumentResponse":{"type":"object","properties":{"documentId":{"type":"string","example":"clx1234abcdef","description":"Interne ID dokumentu"},"submissionId":{"type":"string","example":"clx1234abcdef","description":"Storecove-style alias for documentId. Use this as the submission handle if your integration models sends as submissions."},"messageId":{"type":"string","example":"msg-uuid-here","description":"Peppol messageId"},"status":{"type":"string","example":"SENT","description":"Current document lifecycle status. The first successful call normally returns `SENT`; an HTTP 200 idempotent replay returns the latest persisted status such as `SENT`, `DELIVERED`, or `REJECTED`. `SENT_DB_PENDING` = HTTP 202 (delivered via Peppol but local DB write failed; reconciled by the post-send cron)."},"duplicate":{"type":"boolean","description":"True only for HTTP 200 idempotent replay responses.","example":true},"payloadSha256":{"type":"string","example":"a1b2c3d4e5f60718...","description":"Lowercase-hex SHA-256 of the canonical UBL XML bytes that were placed on the AS4 wire. Receivers can verify the payload they received off Peppol matches what we logged on send. Only present in `SENT` (201) responses; absent in `SENT_DB_PENDING` (202) because the DB persist that captures it failed."},"warning":{"type":"string","description":"Human-readable explanation when `status=SENT_DB_PENDING` — describes the partial-failure mode and what reconciliation will do.","example":"Document delivered via Peppol but local status update failed — will be reconciled automatically"},"links":{"$ref":"#/components/schemas/SendDocumentLinks"}}},"ErrorResponse":{"type":"object","description":"Standard error envelope for `/api/v1/*` endpoints (excluding `/auth/token|renew|revoke` which use `PeppolErrorResponse`, and `/oauth/token` which uses RFC 6749 `OAuthErrorResponse`). The `requestId` echoes the `X-Request-Id` response header — quote it in support tickets.","required":["error"],"properties":{"error":{"type":"object","required":["code","message","requestId"],"properties":{"code":{"type":"string","description":"Machine-readable error code. Branch on this value, not only on HTTP status. Known codes:\n- VALIDATION_ERROR (422) - JSON, XML shape, or required field validation failed; fix the payload and retry.\n- UBL_VALIDATION_ERROR (422) - Peppol/CEN schematron rejection; inspect details[].rule such as BR-CO-26.\n- UNPROCESSABLE_ENTITY (422) - business rule rejection.\n- IDEMPOTENCY_KEY_MISMATCH (422) - the same Idempotency-Key was reused with a different canonicalized body.\n- IDEMPOTENCY_IN_FLIGHT (409) - the same idempotency key is still processing; wait and poll status.\n- CONNECTOR_LEGACY_IDEMPOTENCY_OWNER_UNPROVEN (409) - a pre-deploy Connector send cannot yet prove the historical key owner; if retryable=true wait 30 seconds and retry the exact same key/body, never change the key; if retryable=false do not resubmit and contact support.\n- AUTOPILOT_REPLAY_MISMATCH (409) - the command changed or a historical direct reference is reserved in another/unproven ownership namespace; no timed retry, reconcile first.\n- CONNECTOR_OUTBOX_REFERENCE_RESERVED (409) - a historical outbox item without proven integrator ownership already reserves the ERP reference; reconcile first.\n- NOT_FOUND (404).\n- FORBIDDEN (403) - plan, scope, or ownership denied.\n- CONFLICT (409) - duplicate or unique-constraint collision.\n- BAD_REQUEST (400) - malformed body or parameters.\n- INVALID_PARAM (400).\n- PAYLOAD_TOO_LARGE (413).\n- RATE_LIMITED (429) - respect Retry-After when present.\n- VALIDATION_SERVICE_UNAVAILABLE (503) - retry with backoff.\n- IDEMPOTENCY_STORE_UNAVAILABLE (503) - retry the same payload with the same Idempotency-Key.\n- SEND_FAILED (502) - Peppol AP dispatch failed, retryable when the same payload and key are used.\n- SERVICE_UNAVAILABLE (503) - upstream dependency unavailable.\n- INTERNAL_ERROR (500).\nBusiness error catalog:\n- participant_not_found (422) - retryable=false; fix_hint=change or verify the receiver Peppol ID.\n- receiver_unsupported_document_type (422) - retryable=false; fix_hint=change document type/profile or receiver capability.\n- validation_failed (422) - retryable=false; fix_hint=fix the UBL/JSON payload using details/rule.\n- temporary_transport_error (502/503) - retryable=true; fix_hint=retry with backoff and the same Idempotency-Key.\n- delivery_dead_lettered (409) - retryable=false; fix_hint=inspect events/support-packet, then retry manually or contact support.\n- duplicate_idempotency_key (422) - retryable=false; fix_hint=send the original body or use a new key for changed payload.","example":"VALIDATION_ERROR"},"message":{"type":"string","example":"receiverPeppolId is required"},"requestId":{"type":"string","format":"uuid","description":"Mirror of the `X-Request-Id` response header — for tracing."},"details":{"description":"Optional structured details (e.g., Zod error array, Peppol schematron rule IDs)"},"conflictTarget":{"type":"string","description":"On 409 from a unique-constraint collision: comma-joined target columns (e.g. `firm_id,idempotency_key`)."}}}}},"ForbiddenErrorResponse":{"allOf":[{"$ref":"#/components/schemas/ErrorResponse"}],"description":"403 variant of `ErrorResponse`. The 401/403 responses also include `WWW-Authenticate: Bearer error=\"invalid_token\"|\"insufficient_scope\" scope=\"<required-scope>\"` per RFC 6750 — clients should parse `scope=\"…\"` to learn what scope is required."},"UblValidationError":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message","rule"],"properties":{"code":{"type":"string","enum":["UBL_VALIDATION_ERROR"]},"message":{"type":"string"},"rule":{"type":"string","enum":["BR-02","BR-05","BR-06","BR-11","BR-16","BT-1","PEPPOL-R008"]},"requestId":{"type":"string"}}}}},"PreflightResponse":{"type":"object","description":"Pre-flight lookup. Three booleans use tri-state (true|false|null) — null means 'unable to determine' (e.g., SMP timeout, no doctype filter specified).","properties":{"receiverPeppolId":{"type":"string","example":"0245:12345678"},"recipientAcceptsDocumentType":{"type":"boolean","nullable":true,"description":"Tri-state: true = doctype in SMP, false = not advertised, null = no documentType probed or lookup inconclusive."},"validationPassed":{"type":"boolean","nullable":true,"description":"Tri-state: true = schematron clean, false = errors, null = skipped (no UBL payload to validate)."},"canSend":{"type":"boolean","nullable":true,"description":"Overall verdict. false blocks the send, null = caller should still attempt (non-blocking warning)."},"warnings":{"type":"array","items":{"type":"string"}},"errors":{"type":"array","items":{"type":"string"}}}},"DocumentStatusResponse":{"type":"object","description":"Stav dokumentu z pohľadu volajúceho — `direction` rozlišuje, či ide o **inbound** riadok (prijímateľ) alebo **outbound** riadok (odosielateľ). To isté Peppol message ID môže existovať na oboch stranách (prijímateľ aj odosielateľ majú vlastný riadok), ale ich timestampy a stavy sú **nezávislé**:\n\n- `deliveredAt` a `acknowledgedAt` na **inbound** riadku nastavuje prijímateľ cez `POST /documents/{id}/mark` resp. `POST /documents/inbox/{id}/acknowledge`. Tieto signály sú **lokálne** — Peppol BIS Billing 3.0 pre ne nemá ekvivalentnú správu, takže sa neposielajú odosielateľovi.\n- `acknowledgedAt` na **outbound** riadku sa vyplní iba vtedy, keď cez Peppol AS4 dorazí Invoice Response (kódy AP / AB / RE / …) — to je sieťový signál vygenerovaný cez `POST /documents/{id}/respond`.\n- `deliveredAt` na **outbound** riadku sa nikdy nepropaguje z prijímateľa. Ak odosielateľ potrebuje vidieť, že prijímateľ doručil/spracoval dokument, prijímateľ musí volať `/respond` s vhodným kódom (`AP` = accepted, `IP` = in process, `RE` = rejected).","properties":{"id":{"type":"string"},"status":{"type":"string","example":"DELIVERED"},"documentType":{"type":"string","nullable":true,"example":"invoice"},"direction":{"type":"string","enum":["inbound","outbound"],"description":"`inbound` = my sme prijímateľ (faktúru sme dostali). `outbound` = my sme odosielateľ. Určuje sémantiku timestampov: kto čo nastavuje a kedy."},"senderPeppolId":{"type":"string","nullable":true},"receiverPeppolId":{"type":"string","nullable":true},"statusHistory":{"type":"array","items":{"$ref":"#/components/schemas/StatusHistoryEntry"}},"validationResult":{"nullable":true,"description":"`null` on success, or `{ errors: string[] }` when validation failed.","type":"object","properties":{"errors":{"type":"array","items":{"type":"string"}}}},"deliveredAt":{"type":"string","format":"date-time","nullable":true,"description":"Inbound: nastavené prijímateľom cez `/mark state=delivered`. Outbound: vždy `null` — Peppol nemá delivery callback."},"acknowledgedAt":{"type":"string","format":"date-time","nullable":true,"description":"Inbound: nastavené prijímateľom cez `/acknowledge` alebo `/mark state=processed`. Outbound: nastavené v okamihu, keď nám AS4 doručí prijímateľov Invoice Response (cez `/respond`) — pokrýva celú sieťovú latenciu, takže timestamp sa typicky líši od inbound `acknowledgedAt`."},"invoiceResponseStatus":{"type":"string","enum":["AB","IP","UQ","CA","RE","AP","PD"],"nullable":true,"description":"Buyer's last invoice response status (7 UBL-2005 codes)."},"peppolMessageId":{"type":"string","nullable":true,"description":"Identifikátor správy v Peppol/AS4. Rovnaká hodnota ako `as4MessageId` (alias)."},"as4MessageId":{"type":"string","nullable":true,"description":"Identifikátor AS4 správy. Rovnaká hodnota ako `peppolMessageId` — oba aliasy sú v odpovedi pre uľahčenie konzumácie (detail faktúry vracia `peppolMessageId`, AS4-orientovaní integrátori používajú `as4MessageId`)."},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"CreateWebhookRequest":{"type":"object","required":[],"properties":{"url":{"type":"string","format":"uri","example":"https://vas-system.sk/webhooks/epostak","description":"Optional public HTTPS receiver URL. Omit it or send null for a pull-only subscription. When supplied, HTTP and private, loopback, or metadata addresses are rejected by the SSRF filter.","nullable":true},"events":{"type":"array","items":{"type":"string","enum":["document.created","document.sent","document.received","document.validated","document.delivered","document.rejected","document.response_received"]},"description":"Subscribed events. If omitted, subscribes to all 7.","example":["document.received","document.sent"]}}},"WebhookDetailResponse":{"allOf":[{"$ref":"#/components/schemas/WebhookResponse"},{"type":"object","properties":{"secret":{"type":"string","description":"HMAC-SHA256 signing secret (vrateny iba pri vytvoreni)","example":"a3f8...hex64chars"}}}]},"CapabilitiesRequest":{"type":"object","required":["participant"],"properties":{"participant":{"type":"object","required":["scheme","identifier"],"properties":{"scheme":{"type":"string","example":"0245","description":"4-digit ISO 6523 ICD scheme (SK = 0245)"},"identifier":{"type":"string","example":"2122701339"}}},"documentType":{"type":"string","description":"BIS 3.0 document type ID. Defaults to Peppol BIS Billing 3.0 Invoice when omitted.","example":"urn:cen.eu:en16931:2017"},"documentTypes":{"type":"array","minItems":1,"maxItems":20,"description":"Optional batch probe. When supplied, each document type is checked with the same participant/processId and the response includes capabilities[] and matchedDocumentTypes[].","items":{"type":"string"}},"processId":{"type":"string","description":"Optional BIS 3.0 process ID filter."}}},"CapabilitiesResponse":{"type":"object","properties":{"found":{"type":"boolean"},"accepts":{"type":"boolean","description":"Receiver accepts the probed documentType/processId. Always `false` when `found=false`."},"reason":{"type":"string","description":"Populated when found=false.","example":"Participant not registered in Peppol network"},"participant":{"type":"object","properties":{"scheme":{"type":"string"},"identifier":{"type":"string"},"id":{"type":"string","example":"0245:2122701339"}}},"accessPoint":{"type":"object","nullable":true,"description":"Receiver's Peppol AP endpoint. null when found=false.","properties":{"url":{"type":"string","example":"https://ap.epostak.sk/as4"},"transportProfile":{"type":"string","example":"peppol-transport-as4-v2_0"}}},"internal":{"type":"boolean","description":"Receiver is hosted on this AP"},"supportedDocumentTypes":{"type":"array","items":{"type":"string"}},"matchedDocumentType":{"type":"string","nullable":true,"description":"The probed document type when accepted, otherwise `null`."},"matchedDocumentTypes":{"type":"array","description":"Document type URNs accepted among documentTypes[]. Present for batch probes.","items":{"type":"string"}},"capabilities":{"type":"array","description":"Per-document-type probe results. Present for batch probes.","items":{"$ref":"#/components/schemas/CapabilityCheckResult"}},"capability":{"$ref":"#/components/schemas/CapabilityCheckResult"},"source":{"type":"string","nullable":true,"description":"Lookup cache origin (e.g. `sml`, `cache`, `internal`)"}}},"InboundDocumentsListResponse":{"type":"object","required":["documents","next_cursor","has_more"],"properties":{"documents":{"type":"array","items":{"$ref":"#/components/schemas/InboundDocument"}},"next_cursor":{"type":"string","nullable":true,"description":"Opaque base64url cursor (versioned, v=1). Pass as ?since= on the next request. NULL when no more pages."},"has_more":{"type":"boolean"}}},"InboundDocument":{"type":"object","required":["id","received_at","kind","sender","recipient","document_type","ubl_url","metadata","ack"],"properties":{"id":{"type":"string","format":"uuid"},"received_at":{"type":"string","format":"date-time","description":"When the document was received from Peppol (row insert time is sub-second after AS4 receive)"},"kind":{"type":"string","example":"invoice","description":"Peppol doctype key (invoice, credit_note, self_billing_invoice, etc.)"},"peppol_message_id":{"type":"string","nullable":true,"description":"AS4 Peppol message UUID"},"sender":{"$ref":"#/components/schemas/PeppolParty"},"recipient":{"$ref":"#/components/schemas/PeppolParty"},"document_type":{"type":"string","example":"BIS Billing 3.0 Invoice","description":"Human-readable document type label"},"document_type_id":{"type":"string","nullable":true,"description":"Full Peppol document type URN"},"ubl_url":{"type":"string","format":"uri","description":"Absolute URL of GET /inbound/documents/{id}/ubl"},"metadata":{"type":"object","description":"Whitelisted safe fields extracted from UBL: invoice_number, total_amount, currency, issue_date","additionalProperties":{"type":"string"}},"ack":{"type":"object","required":["acked_at","client_reference"],"properties":{"acked_at":{"type":"string","format":"date-time","nullable":true},"client_reference":{"type":"string","nullable":true,"maxLength":256}}}}},"InboundAckRequest":{"type":"object","properties":{"client_reference":{"type":"string","maxLength":256,"description":"Optional opaque reference stored on the document (your internal document ID, ERP reference, etc.). Latest-ack-wins: calling ack again with a new client_reference overwrites the previous one."}}},"EventsPullResponse":{"type":"object","required":["events","has_more"],"properties":{"events":{"type":"array","items":{"$ref":"#/components/schemas/WebhookQueueEvent"},"description":"Unacknowledged events returned oldest-first. Acknowledge after local commit to remove them from the queue."},"has_more":{"type":"boolean","description":"True when more unacknowledged events exist beyond this page"}}},"Prepayment":{"type":"object","required":["amountWithVat"],"description":"One settled prepayment on a final invoice. amountWithVat is the only required field and contributes to BT-113 PrepaidAmount. All monetary fields must be finite non-negative numbers and are rounded to two decimals. References, settlement date and VAT details are preserved in the UBL note; it does not create a separate UBL tax breakdown.","properties":{"advanceInvoiceRef":{"type":"string","example":"ZAL-2026-0004","description":"Advance/prepayment invoice reference from the ERP."},"taxDocumentRef":{"type":"string","example":"DDP-2026-0022","description":"Tax document number for the received advance payment."},"settlementDate":{"type":"string","format":"date","example":"2026-02-23","description":"Settlement date in strict YYYY-MM-DD format."},"amountWithoutVat":{"type":"number","minimum":0,"example":1000,"description":"Settled amount without VAT."},"vatAmount":{"type":"number","minimum":0,"example":230,"description":"VAT amount from the settled prepayment."},"amountWithVat":{"type":"number","minimum":0,"example":1230,"description":"Settled amount including VAT. Required and summed into prepaidAmount."},"vatRate":{"type":"number","minimum":0,"example":23,"description":"Non-negative VAT rate of the prepayment. This is descriptive prepayment metadata and is preserved in the UBL note."},"vatCategoryCode":{"type":"string","enum":["S","Z","AE","E","K","G","O","L","M"],"example":"S","description":"Optional VAT category of the prepayment. Values are normalized to uppercase and preserved as prepayment metadata."}}},"LineItem":{"type":"object","description":"One JSON billing line. Required fields are description, quantity, unitPrice and vatRate. Standard lines require quantity > 0; advance_deduction lines require quantity < 0 and advanceInvoiceReference. Unknown advanced fields are not mapped into UBL.","required":["description","quantity","unitPrice","vatRate"],"properties":{"description":{"type":"string","minLength":1,"example":"Konzultacne sluzby","description":"Non-empty line name or description."},"quantity":{"type":"number","example":10,"description":"Quantity. Must be greater than zero for a standard line. Must be negative for lineType=advance_deduction; zero is never accepted."},"unit":{"type":"string","example":"HUR","default":"C62","description":"UN/ECE Rec 20 unit code. Use H87 for a piece; C62 is the generic one/unit code. Short aliases are also mapped: ks=H87, kus=H87, piece=H87, pcs=H87, jednotka=C62, unit=C62, one=C62, hod=HUR, den=DAY, mes=MON, kg=KGM, m=MTR, l=LTR, km=KTM. Omitted values default to C62."},"unitPrice":{"type":"number","minimum":0,"example":50,"description":"Net price per unit. Must be a finite non-negative number."},"vatRate":{"type":"number","enum":[0,5,10,19,20,23],"example":23,"description":"VAT rate in percent. Accepted values: 0, 5, 10, 19, 20, 23; this includes historical 20% for older/corrective documents. Z, AE, E, K, G and O categories require 0; S, L and M require a positive rate."},"vatCategoryCode":{"type":"string","enum":["S","Z","AE","E","K","G","O","L","M"],"example":"AE","description":"DPH kategoria BT-151 podla UNCL5305. Ak chyba, odvodi sa zo sadzby: vatRate > 0 = S, vatRate 0 = Z. Pre prenesenie danovej povinnosti pouzite AE."},"vatCategory":{"type":"string","enum":["S","Z","AE","E","K","G","O","L","M"],"example":"AE","description":"Alias for vatCategoryCode."},"vat_category":{"type":"string","enum":["S","Z","AE","E","K","G","O","L","M"],"example":"AE","description":"Snake_case alias for vatCategoryCode."},"taxTreatment":{"type":"string","enum":["standard","zero_rate","reverse_charge_domestic","exempt","intra_community_supply","export","outside_scope"],"example":"reverse_charge_domestic","description":"Higher-level ePostak tax treatment mapped to vatCategoryCode: standard=S, zero_rate=Z, reverse_charge_domestic=AE, exempt=E, intra_community_supply=K, export=G, outside_scope=O. Explicit vatCategoryCode wins when both are present."},"tax_treatment":{"type":"string","enum":["standard","zero_rate","reverse_charge_domestic","exempt","intra_community_supply","export","outside_scope"],"example":"reverse_charge_domestic","description":"Snake_case alias for taxTreatment."},"discount":{"type":"number","minimum":0,"maximum":100,"example":10,"description":"Line discount percentage from 0 to 100. Omitted means 0."},"deliveryDate":{"type":"string","example":"2026-04-01","description":"Line delivery date (BT-134). ISO timestamps are accepted by the route and emitted as date-only in UBL. When line delivery dates represent a summary invoice, they must stay within one calendar month and issueDate must be no later than the 15th day after that month ends."},"lineType":{"type":"string","enum":["standard","advance_deduction"],"default":"standard","example":"advance_deduction","description":"Line type. Use advance_deduction for a negative advance deduction line on the final invoice."},"advanceInvoiceReference":{"type":"string","example":"ZF-2026-001","description":"Advance invoice number. Required when lineType is advance_deduction. Emitted to UBL as AdditionalItemProperty named AdvanceInvoiceNumber."},"customsTariffCode":{"type":"string","pattern":"^\\d{4,10}$","example":"72044910","description":"Customs tariff / combined nomenclature code. Emitted as CommodityClassification/ItemClassificationCode listID=HS; KV DPH A2 uses the first 4 digits as TK."},"commodityClassificationCode":{"type":"string","example":"72044910","description":"Generic item classification code when customsTariffCode is not used. Send together with commodityClassificationListId when the list is not HS."},"commodityClassificationListId":{"type":"string","example":"HS","description":"Classification list identifier from UNTDID 7143. Defaults to HS for customsTariffCode."},"reverseChargeParagraphLetter":{"type":"string","example":"f","description":"Domestic §69(12) paragraph letter for reverse-charge evidence, for example f or g. Emitted as AdditionalItemProperty."},"controlStatementType":{"type":"string","enum":["IO","MT"],"example":"MT","description":"Slovak KV DPH A2 TD value."},"controlStatementQuantity":{"type":"number","minimum":0,"exclusiveMinimum":true,"example":1250,"description":"Positive Slovak KV DPH A2 Mn quantity. If omitted and the unit can be mapped, the absolute line quantity is used."},"controlStatementUnit":{"type":"string","enum":["kg","t","m","ks"],"example":"kg","description":"Slovak KV DPH A2 MJ unit."}}},"DocumentAttachment":{"type":"object","required":["fileName","mimeType","content"],"description":"Invoice attachment encoded as base64 without a data: prefix. The declared MIME type is checked against file magic bytes. Maximum decoded size is 10 MB per file and 15 MB across all attachments.","properties":{"fileName":{"type":"string","minLength":1,"maxLength":255,"example":"invoice-detail.pdf","description":"Non-empty attachment filename."},"mimeType":{"type":"string","enum":["application/pdf","image/png","image/jpeg","text/csv","application/vnd.openxmlformats-officedocument.spreadsheetml.sheet","application/vnd.oasis.opendocument.spreadsheet"],"example":"application/pdf","description":"Allowed MIME types according to Peppol BR-CL-22. The decoded content must match this MIME type."},"content":{"type":"string","format":"byte","description":"Base64-encoded file content without a data: prefix. Must decode to a non-empty file and may be at most 10 MB after decoding.","example":"JVBERi0xLjQKJeLjz9MKMS..."},"description":{"type":"string","example":"Rozpis odpracovanych hodin","description":"Optional short attachment description shown as supporting-document metadata."}}},"SendDocumentLinks":{"type":"object","description":"Convenience links for the created outbound document submission.","properties":{"document":{"type":"string","example":"/api/v1/documents/clx1234abcdef"},"status":{"type":"string","example":"/api/v1/documents/clx1234abcdef/status"},"events":{"type":"string","example":"/api/v1/documents/clx1234abcdef/events"},"ubl":{"type":"string","example":"/api/v1/documents/clx1234abcdef/ubl"},"evidence":{"type":"string","example":"/api/v1/documents/clx1234abcdef/evidence"},"evidenceBundle":{"type":"string","example":"/api/v1/documents/clx1234abcdef/support-packet"}}},"StatusHistoryEntry":{"type":"object","properties":{"status":{"type":"string","example":"SENT"},"timestamp":{"type":"string","format":"date-time"},"detail":{"type":"string","nullable":true}}},"WebhookResponse":{"type":"object","properties":{"id":{"type":"string"},"url":{"type":"string","format":"uri"},"events":{"type":"array","items":{"type":"string"}},"isActive":{"type":"boolean"},"failedAttempts":{"type":"integer","description":"Consecutive failure counter. Webhooks auto-disable after 10 consecutive failures.","example":0},"createdAt":{"type":"string","format":"date-time"}}},"CapabilityCheckResult":{"type":"object","properties":{"documentTypeId":{"type":"string"},"processId":{"type":"string"},"found":{"type":"boolean"},"accepts":{"type":"boolean"},"routingStatus":{"type":"string","nullable":true},"networkReady":{"type":"boolean"},"accessPoint":{"type":"object","nullable":true},"source":{"type":"string","nullable":true},"certificate":{"type":"object","nullable":true},"supportedDocumentTypes":{"type":"array","items":{"type":"string"}}}},"PeppolParty":{"type":"object","properties":{"peppol_id":{"type":"string","nullable":true,"example":"0245:2012345678"},"name":{"type":"string","nullable":true},"country":{"type":"string","description":"ISO 3166-1 alpha-2 country code. Omitted (key absent) when the Peppol scheme is unknown.","example":"SK"}}},"WebhookQueueEvent":{"type":"object","description":"Snake_case keys on `/webhook-queue/all`. The per-firm `/webhook-queue` route returns the same shape.","properties":{"event_id":{"type":"string","format":"uuid","example":"a3d2...-uuid"},"firm_id":{"type":"string","format":"uuid"},"event":{"type":"string","example":"document.received"},"payload":{"type":"object","description":"Event-specific payload"},"created_at":{"type":"string","format":"date-time"}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum requests allowed in the current window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining requests in the current window","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp (seconds) when the rate-limit window resets","schema":{"type":"integer"}}},"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"OAuth 2.0 client_credentials JWT access token (15 min TTL).\n\n**Obtain a token:** `POST /api/v1/auth/token` with the `client_id` shown with the key plus `client_secret` (the full `sk_live_*` or `sk_int_*` API key). Response contains `access_token` (JWT) and `refresh_token`.\n\n**Use the JWT:** `Authorization: Bearer eyJhbGciOiJSUzI1NiIs...`\n\n**Two key types:**\n- JWT minted from `sk_live_*` — direct firm access, no X-Firm-Id needed.\n- JWT minted from `sk_int_*` — requires `X-Firm-Id: <UUID>` header to target a specific assigned firm. For cross-firm endpoints (`/documents/inbox/all`, `/webhook-queue/all`, `/firms/assign`) X-Firm-Id is not required.\n\n**Direct API key bearer (Bearer sk_live_… or Bearer sk_int_…) is no longer accepted.**\n\nRate limit: 200 requests per minute per key."}}},"x-epostak-profile":"core","x-epostak-legacy-combined-openapi":"https://epostak.sk/api/openapi.enterprise.json"}