Vytvorte API kľúč
V Nastaveniach → API kľúče vyberte firmu a rozsahy doklady.citanie, doklady.zapis a podľa potreby uhrady.zapis.
Od prvej faktúry po automatické úhrady a e-faktúry. Otvorený kontrakt, konkrétne príklady a udalosti, na ktoré sa môžete spoľahnúť.
OpenAPI 3.1, strojovo čitateľné schémy a kolekcia pre váš pracovný postup.
Stiahnuť OpenAPIStiahnuť Postman / Insomniahttps://www.billex.sk/api/v1Všetky ukážky volajte zo servera. Kľúč uložte do tajnej premennej BILLEX_API_KEY; nedávajte ho do prehliadača, URL ani repozitára.
V Nastaveniach → API kľúče vyberte firmu a rozsahy doklady.citanie, doklady.zapis a podľa potreby uhrady.zapis.
GET /overenie vráti firmu a rozsahy. Posielajte Authorization: Bearer … a Accept: application/json.
POST /doklady, rozsah doklady.zapis. Pre nový zápis nastavte nový BILLEX_IDEMPOTENCY_KEY; pri retry zachovajte kľúč aj presné telo. Dátumy a sumy príkladu prispôsobte.
V Nastaveniach → Webhooky zaregistrujte vlastný HTTPS prijímač. Zapnite udalosť invoice.paid a overte HMAC pred spracovaním.
Bez SDK a nových balíkov: cURL, natívne PHP cURL, Node.js fetch a štandardná knižnica Pythonu. ID 123 nahraďte ID vlastnej faktúry. V odpovedi zoznamu sledujte meta.pagination.next_cursor; ďalšia strana zachová filtre a limit.
POST /doklady · Vstupy a odpovede
curl --fail-with-body --request POST "https://www.billex.sk/api/v1/doklady" \
--header "Authorization: Bearer $BILLEX_API_KEY" \
--header 'Accept: application/json' \
--header 'Content-Type: application/json' \
--header "Idempotency-Key: $BILLEX_IDEMPOTENCY_KEY" \
--data-binary @- <<'JSON'
{
"typ": "faktura",
"datum_vystavenia": "2026-10-03",
"datum_dodania": "2026-10-03",
"datum_splatnosti": "2026-10-17",
"mena": "EUR",
"sposob_uhrady": "prevod",
"odberatel": {
"nazov": "Demo odberateľ, s.r.o.",
"ico": "12345678",
"email": "integracia@example.test",
"ulica": "Testovacia 1",
"psc": "81101",
"mesto": "Bratislava",
"krajina": "Slovensko"
},
"polozky": [
{
"nazov": "Webhosting",
"mnozstvo": "1",
"jednotka": "mesiac",
"cena_bez_dph": "49.00",
"sadzba_dph": "23"
}
]
}
JSON<?php
$headers = ['Authorization: Bearer '.getenv('BILLEX_API_KEY'), 'Accept: application/json'];
$headers[] = 'Content-Type: application/json';
$headers[] = 'Idempotency-Key: '.getenv('BILLEX_IDEMPOTENCY_KEY');
$body = <<<'JSON'
{
"typ": "faktura",
"datum_vystavenia": "2026-10-03",
"datum_dodania": "2026-10-03",
"datum_splatnosti": "2026-10-17",
"mena": "EUR",
"sposob_uhrady": "prevod",
"odberatel": {
"nazov": "Demo odberateľ, s.r.o.",
"ico": "12345678",
"email": "integracia@example.test",
"ulica": "Testovacia 1",
"psc": "81101",
"mesto": "Bratislava",
"krajina": "Slovensko"
},
"polozky": [
{
"nazov": "Webhosting",
"mnozstvo": "1",
"jednotka": "mesiac",
"cena_bez_dph": "49.00",
"sadzba_dph": "23"
}
]
}
JSON;
$ch = curl_init('https://www.billex.sk/api/v1/doklady');
curl_setopt_array($ch, [CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 30, CURLOPT_POSTFIELDS => $body]);
$response = curl_exec($ch);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($status >= 400) { throw new RuntimeException('HTTP '.$status.': '.$response); }
$data = json_decode($response, true, flags: JSON_THROW_ON_ERROR);
print_r($data);// Node.js s natívnym fetch; spúšťajte na serveri.
const response = await fetch('https://www.billex.sk/api/v1/doklady', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.BILLEX_API_KEY}`,
Accept: 'application/json',
'Content-Type': 'application/json',
'Idempotency-Key': process.env.BILLEX_IDEMPOTENCY_KEY,
},
body: JSON.stringify({
"typ": "faktura",
"datum_vystavenia": "2026-10-03",
"datum_dodania": "2026-10-03",
"datum_splatnosti": "2026-10-17",
"mena": "EUR",
"sposob_uhrady": "prevod",
"odberatel": {
"nazov": "Demo odberateľ, s.r.o.",
"ico": "12345678",
"email": "integracia@example.test",
"ulica": "Testovacia 1",
"psc": "81101",
"mesto": "Bratislava",
"krajina": "Slovensko"
},
"polozky": [
{
"nazov": "Webhosting",
"mnozstvo": "1",
"jednotka": "mesiac",
"cena_bez_dph": "49.00",
"sadzba_dph": "23"
}
]
}),
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());import os, json
from urllib.request import Request, urlopen
from urllib.error import HTTPError
headers = {'Authorization': 'Bearer ' + os.environ['BILLEX_API_KEY'], 'Accept': 'application/json'}
body = json.loads('''{"typ":"faktura","datum_vystavenia":"2026-10-03","datum_dodania":"2026-10-03","datum_splatnosti":"2026-10-17","mena":"EUR","sposob_uhrady":"prevod","odberatel":{"nazov":"Demo odberateľ, s.r.o.","ico":"12345678","email":"integracia@example.test","ulica":"Testovacia 1","psc":"81101","mesto":"Bratislava","krajina":"Slovensko"},"polozky":[{"nazov":"Webhosting","mnozstvo":"1","jednotka":"mesiac","cena_bez_dph":"49.00","sadzba_dph":"23"}]}''')
headers.update({'Content-Type': 'application/json', 'Idempotency-Key': os.environ['BILLEX_IDEMPOTENCY_KEY']})
request = Request('https://www.billex.sk/api/v1/doklady', method='POST', headers=headers, data=json.dumps(body).encode('utf-8'))
try:
with urlopen(request, timeout=30) as response:
print(json.load(response))
except HTTPError as error:
raise RuntimeError(f'HTTP {error.code}: {error.read().decode()}') from errorGET /doklady · Vstupy a odpovede
curl --fail-with-body --request GET "https://www.billex.sk/api/v1/doklady?typ=faktura&stav=vystaveny&limit=50" \
--header "Authorization: Bearer $BILLEX_API_KEY" \
--header 'Accept: application/json'<?php
$headers = ['Authorization: Bearer '.getenv('BILLEX_API_KEY'), 'Accept: application/json'];
$ch = curl_init('https://www.billex.sk/api/v1/doklady?typ=faktura&stav=vystaveny&limit=50');
curl_setopt_array($ch, [CURLOPT_CUSTOMREQUEST => 'GET', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 30]);
$response = curl_exec($ch);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($status >= 400) { throw new RuntimeException('HTTP '.$status.': '.$response); }
$data = json_decode($response, true, flags: JSON_THROW_ON_ERROR);
print_r($data);// Node.js s natívnym fetch; spúšťajte na serveri.
const response = await fetch('https://www.billex.sk/api/v1/doklady?typ=faktura&stav=vystaveny&limit=50', {
method: 'GET',
headers: {
Authorization: `Bearer ${process.env.BILLEX_API_KEY}`,
Accept: 'application/json',
},
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());import os, json
from urllib.request import Request, urlopen
from urllib.error import HTTPError
headers = {'Authorization': 'Bearer ' + os.environ['BILLEX_API_KEY'], 'Accept': 'application/json'}
request = Request('https://www.billex.sk/api/v1/doklady?typ=faktura&stav=vystaveny&limit=50', method='GET', headers=headers)
try:
with urlopen(request, timeout=30) as response:
print(json.load(response))
except HTTPError as error:
raise RuntimeError(f'HTTP {error.code}: {error.read().decode()}') from errorPOST /doklady/{id}/uhrady · Vstupy a odpovede
curl --fail-with-body --request POST "https://www.billex.sk/api/v1/doklady/123/uhrady" \
--header "Authorization: Bearer $BILLEX_API_KEY" \
--header 'Accept: application/json' \
--header 'Content-Type: application/json' \
--header "Idempotency-Key: $BILLEX_IDEMPOTENCY_KEY" \
--data-binary @- <<'JSON'
{
"datum": "2026-10-10",
"suma": "49.00",
"sposob": "prevod",
"poznamka": "Úhrada z integrácie"
}
JSON<?php
$headers = ['Authorization: Bearer '.getenv('BILLEX_API_KEY'), 'Accept: application/json'];
$headers[] = 'Content-Type: application/json';
$headers[] = 'Idempotency-Key: '.getenv('BILLEX_IDEMPOTENCY_KEY');
$body = <<<'JSON'
{
"datum": "2026-10-10",
"suma": "49.00",
"sposob": "prevod",
"poznamka": "Úhrada z integrácie"
}
JSON;
$ch = curl_init('https://www.billex.sk/api/v1/doklady/123/uhrady');
curl_setopt_array($ch, [CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 30, CURLOPT_POSTFIELDS => $body]);
$response = curl_exec($ch);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($status >= 400) { throw new RuntimeException('HTTP '.$status.': '.$response); }
$data = json_decode($response, true, flags: JSON_THROW_ON_ERROR);
print_r($data);// Node.js s natívnym fetch; spúšťajte na serveri.
const response = await fetch('https://www.billex.sk/api/v1/doklady/123/uhrady', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.BILLEX_API_KEY}`,
Accept: 'application/json',
'Content-Type': 'application/json',
'Idempotency-Key': process.env.BILLEX_IDEMPOTENCY_KEY,
},
body: JSON.stringify({
"datum": "2026-10-10",
"suma": "49.00",
"sposob": "prevod",
"poznamka": "Úhrada z integrácie"
}),
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());import os, json
from urllib.request import Request, urlopen
from urllib.error import HTTPError
headers = {'Authorization': 'Bearer ' + os.environ['BILLEX_API_KEY'], 'Accept': 'application/json'}
body = json.loads('''{"datum":"2026-10-10","suma":"49.00","sposob":"prevod","poznamka":"Úhrada z integrácie"}''')
headers.update({'Content-Type': 'application/json', 'Idempotency-Key': os.environ['BILLEX_IDEMPOTENCY_KEY']})
request = Request('https://www.billex.sk/api/v1/doklady/123/uhrady', method='POST', headers=headers, data=json.dumps(body).encode('utf-8'))
try:
with urlopen(request, timeout=30) as response:
print(json.load(response))
except HTTPError as error:
raise RuntimeError(f'HTTP {error.code}: {error.read().decode()}') from errorOverte podpis nad pôvodnými bajtmi. Prijímač vráti 2xx až po trvalom prijatí udalosti; ukážky ponechávajú 503, kým doplníte vlastnú frontu a odstránenie duplicít. Nastavte aj limity tela a timeout na HTTPS proxy.
# cURL neprijíma HTTP požiadavky. Toto je lokálny test vášho prijímača.
# WEBHOOK_URL nastavte na vlastný testovací prijímač, WEBHOOK_SECRET na jeho tajomstvo.
# Rovnaké pôvodné bajty musí prijímač overiť v PHP, Node.js alebo Pythone nižšie.
printf '%s' '{"event":"invoice.paid","document":{"id":123}}' > webhook.json
timestamp=$(date +%s)
export WEBHOOK_TIMESTAMP="$timestamp"
signature=$(php -r 'echo hash_hmac("sha256", getenv("WEBHOOK_TIMESTAMP").".".file_get_contents("webhook.json"), getenv("WEBHOOK_SECRET"));')
curl --fail-with-body "$WEBHOOK_URL" \
--header 'Content-Type: application/json' \
--header 'X-Webhook-Event: invoice.paid' \
--header "X-Webhook-Timestamp: $timestamp" \
--header "X-Webhook-Signature-V2: $signature" \
--header 'X-Webhook-Delivery: 123' \
--data-binary @webhook.json<?php
$secret = getenv('WEBHOOK_SECRET');
if (!$secret) { http_response_code(503); exit; }
$raw = file_get_contents('php://input');
$timestamp = $_SERVER['HTTP_X_WEBHOOK_TIMESTAMP'] ?? '';
$signature = $_SERVER['HTTP_X_WEBHOOK_SIGNATURE_V2'] ?? '';
if (!ctype_digit($timestamp) || abs(time() - (int)$timestamp) > 300
|| !preg_match('/\A[0-9a-f]{64}\z/', $signature)
|| !hash_equals(hash_hmac('sha256', $timestamp.'.'.$raw, $secret), $signature)) {
http_response_code(401); exit;
}
try { $event = json_decode($raw, true, flags: JSON_THROW_ON_ERROR); }
catch (JsonException) { http_response_code(400); exit; }
// Pred 2xx uložte udalosť do trvalej fronty a atomicky odstráňte duplicity.
// Duplicity odstráňte podľa stabilného X-Webhook-Delivery; retry má nový timestamp.
// Ak V2 chýba alebo neplatí, neprepínajte na starší podpis.
http_response_code(503); // Nahraďte 204 až po úspešnom trvalom prijatí.import { createServer } from 'node:http';
import { createHmac, timingSafeEqual } from 'node:crypto';
const secret = process.env.WEBHOOK_SECRET;
if (!secret) throw new Error('Chýba WEBHOOK_SECRET');
createServer(async (req, res) => {
if (req.method !== 'POST') { res.writeHead(405).end(); return; }
const chunks = [];
for await (const chunk of req) chunks.push(chunk);
const raw = Buffer.concat(chunks);
const timestamp = req.headers['x-webhook-timestamp'];
const signature = req.headers['x-webhook-signature-v2'];
const expected = createHmac('sha256', secret).update(String(timestamp) + '.').update(raw).digest();
if (typeof timestamp !== 'string' || !/^[0-9]+$/.test(timestamp)
|| Math.abs(Date.now() / 1000 - Number(timestamp)) > 300
|| typeof signature !== 'string' || !/^[0-9a-f]{64}$/.test(signature)
|| !timingSafeEqual(expected, Buffer.from(signature, 'hex'))) {
res.writeHead(401).end(); return;
}
let event;
try { event = JSON.parse(raw.toString('utf8')); }
catch { res.writeHead(400).end(); return; }
// Trvalo prijmite event a atomicky odstráňte duplicity podľa doménovej identity.
res.writeHead(503).end(); // 204 až po úspešnom zápise do trvalej fronty.
}).listen(Number(process.env.WEBHOOK_PORT)); // Vlastný port za HTTPS proxy.import os, json, hmac, hashlib, re, time
from http.server import BaseHTTPRequestHandler, HTTPServer
secret = os.environ['WEBHOOK_SECRET'].encode()
if not secret: raise RuntimeError('Chýba WEBHOOK_SECRET')
class Receiver(BaseHTTPRequestHandler):
def do_POST(self):
raw = self.rfile.read(int(self.headers.get('Content-Length', '0')))
timestamp = self.headers.get('X-Webhook-Timestamp', '')
signature = self.headers.get('X-Webhook-Signature-V2', '')
expected = hmac.new(secret, timestamp.encode() + b'.' + raw, hashlib.sha256).hexdigest()
if (not re.fullmatch(r'[0-9]+', timestamp) or abs(time.time() - int(timestamp)) > 300
or not re.fullmatch(r'[0-9a-f]{64}', signature) or not hmac.compare_digest(expected, signature)):
self.send_response(401); self.end_headers(); return
try: event = json.loads(raw)
except (ValueError, UnicodeDecodeError):
self.send_response(400); self.end_headers(); return
# Trvalo prijmite event a atomicky odstráňte duplicity podľa doménovej identity.
self.send_response(503) # 204 až po úspešnom zápise do trvalej fronty.
self.end_headers()
HTTPServer(('', int(os.environ['WEBHOOK_PORT'])), Receiver).serve_forever()
# Ukážka za HTTPS proxy; nastavte limity veľkosti tela a času požiadavky.Statická kolekcia pokrýva všetky verejné operácie z rovnakého OpenAPI ako referencia. V oboch nástrojoch zvoľte Import → File a načítajte JSON.
Stiahnuť kolekciubaseUrl na https://www.billex.sk/api/v1. Prázdne premenné apiKey, sandboxKey, networkToken a idempotencyKey vyplňte podľa operácie. Vypnuté query parametre sú voliteľné. DOPLNTE_HODNOTU, prázdne JSON telá a súborové polia doplňte podľa referencie; kolekcia nespúšťa požiadavky sama.Pri zmene OpenAPI správca repozitára spustí php artisan api:generuj-kolekciu. Kolekcia neobsahuje kľúče ani adresu vývojového prostredia. Formát Postman 2.1 · Import do Insomnia
Jeden API kľúč môže spájať všetky potrebné rozsahy. Vydávajte len tie, ktoré integrácia používa. Tabuľka vychádza zo spoločného katalógu aplikácie a aktuálnych balíkov; ďalej rozhodujú zapnuté moduly, práva autora a prípadné existujúce nároky firmy.
| Rozsah | Povolené operácie | Balíky / funkcia |
|---|---|---|
doklady.citanie | Čítanie dokladov zoznam a detail faktúr, PDF, odberatelia, číselné rady — napríklad pre účtovný program | Free, Štart, Proapi |
doklady.zapis | Vystavovanie dokladov vystaviť, upraviť a zmazať faktúru či predfaktúru, dobropis, zápis odberateľa — napríklad pre e-shop | Free, Štart, Proapi |
uhrady.zapis | Zápis úhrad označiť faktúru za zaplatenú — len pre program, ktorý platby naozaj vidí (banka, platobná brána) | Štart, Proapi_payments |
doklady.odosielanie | Odosielanie e-mailom poslať doklad odberateľovi e-mailom v mene vašej firmy | Štart, Proapi_sending |
eshop.katalog.citanie | Čítanie katalógu e-shopu úplné predajné atribúty, varianty, desatinná dostupnosť a cenové hladiny — bez nákupných cien | Štart, Prowarehouse |
sklad.stav | Čítanie stavu skladu čítať fyzické, rezervované a dostupné množstvo skladových kariet — napríklad pre e-shop | Štart, Prowarehouse |
sklad.ocenenie | Čítanie ocenenia skladu čítať hodnotu zásob z uložených oceňovacích vrstiev — iba pre účtovníctvo a controlling | Štart, Prowarehouse |
financie.citanie | Čítanie finančných účtov účty a pohyby pokladnice a banky; vyžaduje aj práva autora kľúča | Štart, Propublic_finance_accounts |
financie.zapis | Zápis finančných pohybov vkladať a stornovať finančné pohyby; platí aj balík pre zápis úhrad | Štart, Propublic_finance_accounts |
ucty.sprava | Správa finančných účtov vytvárať a upravovať finančné účty | Štart, Propublic_finance_accounts |
obchod.citanie | Čítanie obchodných dokladov objednávky, dodacie listy a väzby obchodných dokladov | Propublic_trade_documents |
obchod.zapis | Zápis obchodných dokladov vytvárať a meniť obchodné doklady a ich konverzie | Propublic_trade_documents |
katalog.citanie | Čítanie cenníka katalóg, cenovky, logistika a fyzické varianty produktov | Propublic_warehouse_operations |
sklad.pohyby.citanie | Čítanie skladových pohybov čítať skladové doklady a pohyby | Propublic_warehouse_operations |
sklad.pohyby.zapis | Zápis skladových pohybov vytvárať skladové pohyby, prevody a storná | Propublic_warehouse_operations |
prijate.citanie | Čítanie prijatých dokladov čítať prijaté doklady a ich číselníky | Štart, Propublic_received_documents |
prilohy.citanie | Čítanie príloh sťahovať originály a prílohy prijatých dokladov | Štart, Propublic_received_documents |
uctovanie.citanie | Čítanie účtovných údajov zahrnúť účtovné údaje pri práve autora na export | Štart, Propublic_received_documents |
dokumenty.nastroje | Nástroje dokumentov validovať a konvertovať dokumenty v rámci kvót nástrojov | Free, Štart, Prodocument_developer_tools |
ponuky.zapis | Správa cenových ponúk vytvárať a upravovať cenové ponuky, ich položky, zľavy a online zverejnenie | Štart, Proquotes_online |
webhooky.sprava | Správa webhookov spravovať odberové URL, udalosti, podpisové tajomstvá a doručovanie webhookov | Free, Štart, Proapi |
Sieťové rozsahy document:send, document:receive, efaktura:send a efaktura:read patria sieťovému tokenu digitálneho poštára. Neudeľujú sa bežným API kľúčom.
Spoločná chyba má error.code, error.message a objekt error.fields. Úspešné odpovede uvádzajú data alebo pôvodnú doménovú projekciu a meta.pagination pri zoznamoch; názvy projekcií zostávajú kompatibilné. Počet je integer total_count; starší počet total je kompatibilný zastaraný alias. Peňažné sumy sa prenášajú ako desatinné reťazce; podpísané webhook payloady zachovávajú historický formát.
Pri chýbajúcom rozsahu všetky agendy vracajú CHYBA_ROZSAH. Staršie BEZ_PRAVA a TOOLS_403 pre tento prípad zastarávajú; dočasne ich identifikuje X-Billex-Legacy-Error-Code s Deprecation: true. Kód BEZ_PRAVA zostáva platný pre živé oprávnenia. Dátum odstránenia aliasov nebol vyhlásený.
| Kód / HTTP | Význam | Riešenie |
|---|---|---|
BEZ_PRAVA403 | Autor alebo firma nemá živé oprávnenie. | Overte členstvo, práva autora a aktuálny balík. Starší kód pre chýbajúci rozsah je zastaraný; nahraďte ho CHYBA_ROZSAH. |
BILLEX-API-ERROR4xx | Sieťová brána odmietla operáciu. | Vyhodnoťte HTTP stav a bezpečnú správu. |
BILLEX-INTERNAL500 | Sieťové spracovanie zlyhalo interne. | Opakujte s rovnakým idempotency kľúčom; uveďte correlation_id podpore. |
BILLEX-POSTAR503 | Digitálny poštár je nedostupný. | Opakujte po oneskorení s rovnakou identitou dokumentu. |
BILLEX-READ-ONLY423 | Sieťový zápis je zablokovaný režimom iba na čítanie. | Overte predplatné a prístup firmy. |
CHYBA_ROZSAH403 | API kľúč nemá rozsah potrebný pre operáciu. | Pridajte rozsah z error.fields.scope alebo vydajte nový kľúč s potrebnými rozsahmi. |
CHYBA_ROZSAH_UHRADpayload | Objednávka bola prijatá bez zápisu úhrady. | Doplňte uhrady.zapis a synchronizujte úhradu; nevytvárajte druhý doklad. |
CHYBA_SERVERA500 | Operácia zlyhala interne. | Opakujte s rovnakým kľúčom a oneskorením; pri pretrvávaní kontaktujte podporu. |
DAVKA_PRILIS_VELKA413 | Dávka prekračuje limit riadkov alebo bajtov. | Rozdeľte dávku podľa publikovaných limitov. |
DOCASNE_NEDOSTUPNE503 | Dočasný výpadok závislosti alebo uloženej odpovede. | Opakujte po oneskorení s rovnakým kľúčom; pri pretrvávaní pošlite podpore čas a korelačné ID. |
DOKLAD_ODOSIELA_EFAKTURA423 | Elektronické doručovanie zmrazilo doklad. | Počkajte na výsledok doručovania a použite zákonnú opravu dokladu; neobchádzajte zmrazenie. |
DOKLAD_RUCNE_UPRAVENY409 | Synchronizácia by prepísala ručné zmeny. | Porovnajte doklad a objednávku; vyriešte konflikt ručne. |
DOKLAD_VYMAZANY409 | Doklad je v koši. | Vráťte doklad z koša pred ďalšou úpravou. |
DOKLAD_ZAMKNUTY409 | Doklad je uzamknutý. | Overte možnosť odomknutia vo webovej aplikácii. |
EFAKTURA_ZMAZANIE_ZAKAZANE423 | Doručený elektronický doklad nemožno zmazať. | Použite opravný doklad podľa stavu a pravidiel agendy; zachovajte auditnú históriu. |
EN16931_PARTIALvalidation | Čiastočná kontrola našla nesúlad. | Opravte uvedené pravidlo a vykonajte úplnú validáciu pred odoslaním. |
EN16931_UNVERIFIEDvalidation | Kontrola obchodných pravidiel sa nedokončila. | Výsledok nie je potvrdením zhody; skontrolujte zdrojový doklad a opakujte kontrolu. |
ESHOP_SYNC_ZLYHALA422 | Objednávka sa nedá zosynchronizovať. | Opravte údaje objednávky podľa správy. |
FUNKCIA_MIMO_BALIKA403 | Modul nie je povolený balíkom. | Overte balík a zapnutie sandboxu alebo modulu. |
IBA_SCHRANKA403 | Firma má povolenú iba Schránku. | Použite firmu s oprávnením na fakturačnú agendu. |
IDEMPOTENCY_KONFLIKT409 | Rovnaký kľúč už označuje inú požiadavku. | Pre nový zámer použite nový kľúč; pri retry zachovajte metódu, cestu, filtre a presné telo. |
INPUT_INVALID422 | Nástroj dokumentov odmietol vstup. | Opravte fields podľa schémy operácie. |
KEY_INVALID422 | Identifikátor alebo kľúč nástroja nie je platný. | Overte hodnotu a expiráciu náhľadu. |
KONFLIKT409 | Stav zdroja sa nezhoduje s požadovanou operáciou. | Znova načítajte detail, vyhodnoťte stav a pripravte nový pokus. |
LIMIT_BALIKA422 | Bol dosiahnutý počet záznamov povolený balíkom. | Skontrolujte kvótu a zvýšte balík; neopakujte rovnaký vstup bez zmeny. |
MEDZERA_V_UDALOSTIACH409 | Checkpoint je starší než retencia archívu. | Urobte úplnú synchronizáciu a uložte nový checkpoint. |
MIMO_BALIKA403 | Funkcia rozsahu nie je v balíku firmy. | Aktivujte zodpovedajúci balík alebo doplnok. |
NENAJDENE404 | Zdroj neexistuje, je neprístupný alebo je modul vypnutý. | Overte identifikátor vo vlastnej firme a nastavenie modulu; neskúšajte cudzie ID. |
NEPLATNE_UDAJE422 | Validácia vstupov zlyhala. | Opravte polia podľa error.fields; skontrolujte povinný Idempotency-Key. |
NEPLATNY_KLUC401 | Kľúč chýba, expiroval alebo bol odvolaný. | Overte Bearer token a aktivitu kľúča v správnej firme. |
NEPLATNY_SANDBOX_KLUC401 | Sandbox kľúč chýba alebo je neplatný. | Vydajte a použite blx_test_ kľúč v sandboxe. |
ODBERATEL_EXISTUJE409 | Odberateľ s daným IČO už je v adresári firmy. | Vyhľadajte existujúceho odberateľa a použite jeho ID, nevytvárajte duplicitný záznam. |
OPERACIA_ODMIETNUTA4xx | Operácia bola odmietnutá všeobecnou bránou. | Použite HTTP stav a správu, opravte požiadavku alebo práva. |
OVERENIE_NEDOSTUPNE503 | Overenie kľúča je dočasne nedostupné. | Opakujte s exponenciálnym oneskorením; pri zápise zachovajte idempotency kľúč. |
PDF_NEDOSTUPNE503 | PDF sa nepodarilo vytvoriť. | Skúste znova neskôr; 5xx môže byť normalizované na DOCASNE_NEDOSTUPNE. |
PRILIS_VELA_POKUSOV429 | Prekročený limit pokusov o overenie z IP adresy pred overením kľúča. | Dodržte Retry-After a znížte počet neplatných požiadaviek; skontrolujte konfiguráciu Bearer kľúča. |
PRILIS_VELA_VOLANI429 | Prekročený limit volaní. | Dodržte Retry-After, znížte súbežnosť a sledujte X-RateLimit-*. |
PRISTUP_ODMIETNUTY403 | Doménové pravidlá odmietli zápis. | Skontrolujte oprávnenie používateľa a dostupnosť agendy. |
PROFILE_UNSUPPORTEDvalidation | Nepodporovaný profil alebo proces. | Použite Peppol BIS Billing 3.0, billing:01:1.0. |
PROVIDER_INVALIDvalidation | Poštár doklad odmietol. | Opravte chyby validačnej odpovede poštára. |
PROVIDER_NOT_CONFIGUREDvalidation | Firma nemá nakonfigurovaného poštára. | Nastavte prepojenie na digitálneho poštára. |
PROVIDER_UNAVAILABLEvalidation | Poštár nedokončil overenie. | Opakujte kontrolu neskôr; stav unverified nepovažujte za platný doklad. |
SANDBOX_KLUC_NA_OSTROM_API403 | Testovací kľúč bol použitý na ostré API. | Použite ostrý kľúč alebo sandbox trasu. |
SAPI-AUTH-001401 | Sieťové poverenie je neplatné. | Získajte alebo obnovte sieťový token; nejde o bežný API kľúč. |
SAPI-AUTH-002403 | Sieťový token nemá potrebný rozsah alebo účastníka. | Overte sieťové rozsahy a X-Peppol-Participant-Id. |
SAPI-CONF-002409 | Sieťová požiadavka je v konflikte. | Overte identitu dokumentu, stav a idempotenciu. |
SAPI-DOC-001422 | Sieťový dokument bol odmietnutý. | Opravte údaje dokladu podľa details. |
SAPI-DOC-404404 | Sieťový dokument sa nenašiel. | Overte ID, účastníka a smer odoslania/prijatia. |
SAPI-RATE-429429 | Sieťový limit bol prekročený. | Počkajte podľa Retry-After. |
SAPI-VAL-001422 | Sieťové vstupné údaje nie sú platné. | Opravte details/fields podľa schémy. |
SAPI-VAL-413413 | Sieťový dokument je priveľký. | Zmenšite dokument a prílohy podľa limitu. |
SPRACOVAVA_SA409 | Rovnaká požiadavka sa práve spracúva. | Počkajte a opakujte s rovnakým kľúčom a telom. |
TOOLS_400400 | Nesprávna požiadavka. | Opravte tvar vstupu. |
TOOLS_403403 | Chýba oprávnenie nástroja. | Overte balík a práva; chýbajúci rozsah teraz vracia CHYBA_ROZSAH s legacy hlavičkou TOOLS_403. |
TOOLS_404404 | Zdroj nástroja sa nenašiel. | Overte ID a firmu. |
TOOLS_409409 | Konflikt nástroja. | Načítajte aktuálny zdroj a opravte požiadavku. |
TOOLS_413413 | Priveľký vstup nástroja. | Zmenšite vstup. |
TOOLS_422422 | Validácia nástroja zlyhala. | Opravte fields. |
TOOLS_429429 | Kvóta nástroja je vyčerpaná. | Dodržte Retry-After a minútovú alebo dennú kvótu. |
TOOLS_INTERNAL500 | Nástroj sa nedokončil. | Po oneskorení opakujte; uveďte correlation_id podpore. |
TOOLS_NOT_FOUND404 | Zdroj nástroja dokumentov neexistuje. | Overte identifikátor vo vlastnej firme. |
UBL_MAPPING422 | Doklad sa nedá namapovať do kanonického UBL modelu. | Opravte identity, krajiny, jednotky, kategórie DPH a štruktúru podľa príkladu. |
UBL_TOTAL_MISMATCHvalidation | Súčet v UBL nesúhlasí s vypočítanými položkami. | Opravte zaokrúhlenie a súčty podľa uvedeného field. |
UCET_LEN_NA_CITANIE423 | Firma je v režime iba na čítanie. | Overte úhradu predplatného; zápisy obnovte po odblokovaní. |
XML_EXTERNALvalidation | XML používa externé zdroje. | Odstráňte externé entity, XInclude a vstupné schémy. |
XML_LIMITvalidation | XML prekračuje hĺbku alebo počet uzlov. | Zmenšite a zjednodušte dokument. |
XML_SYNTAXvalidation | XML má syntaktickú chybu. | Opravte riadok uvedený vo výsledku. |
XML_TIMEOUTvalidation | Kontrola prekročila čas alebo pamäť. | Zmenšite XML a skúste znova. |
XML_UNSAFEvalidation | XML obsahuje nepovolené DTD, entity alebo kódovanie. | Použite UTF-8 bez DTD a externých entít. |
XSD_<číslo>validation | Validátor libxml hlási chybu XSD. | Opravte element a riadok podľa správy validátora. |
XSD_ROOTvalidation | Nesprávny koreň UBL. | Použite UBL 2.1 Invoice alebo CreditNote. |
invalid_grant400 | PKCE kód expiroval, bol použitý alebo nezodpovedá overeniu. | Začnite nový autorizačný súhlas; skontrolujte client_id, redirect_uri a code_verifier. |
neschvalene409 | Doklad čaká na schválenie pred odoslaním. | Dokončite schválenie vo webovej aplikácii. |
Kódy validačných vrstiev (XML_*, XSD_*, UBL_*, PROVIDER_*) môžu byť vnorené v výsledku kontroly aj pri HTTP 200. Sieťové SAPI-* chyby môžu pridávať kategóriu, retryable, details a correlation_id; OAuth výmena používa {"error":"invalid_grant","error_description":"…"}. Nové kódy z poštára vyhodnocujte podľa kategórie, príznaku opakovania a správy, nespoliehajte sa na úplný externý zoznam.
Stiahnite aktuálny dokument, validujte ho a klienta generujte vo vlastnom integračnom projekte. Návod používa samostatný nástroj OpenAPI Generator; nepridáva balík do Billexu. Použite jeho vydanie podporujúce OpenAPI 3.1, pripnite si verziu aj odtlačok kontraktu a testujte vytvorený klient v lokálnej testovacej firme.
curl --fail --location 'https://www.billex.sk/vyvojari/api/openapi.json' --output billex-openapi.json
openapi-generator-cli validate --input-spec billex-openapi.json
openapi-generator-cli generate --input-spec billex-openapi.json --generator-name typescript-fetch --output ./billex-clientGenerovanie klienta sa v tomto projekte nespúšťa; interné testy overujú kontraktové invarianty a lokálne odkazy, nie úplnú zhodu s celou JSON Schema 2020-12. Pre PHP nahraďte generátor php, pre Python python. Nástroj si nainštalujte podľa jeho oficiálneho návodu a CLI dokumentácie vo vlastnom prostredí. Nastavte základnú URL https://www.billex.sk/api/v1, Bearer kľúč iba na serveri a Idempotency-Key pre zápisy. Vygenerovaný klient musí zachovať desatinné reťazce, nullable hodnoty a neznáme polia. Všeobecný typ vygenerovaný pre webhook snapshot spresnite podľa katalógu udalosti; jeho obsah je minimalizovaný podľa práv. Príklady používajú ilustračné ID a testovacie domény, nenahrádzajú údaje vašej firmy.
Generický prijímač dostane X-Webhook-Event a X-Webhook-Signature: hexadecimálny HMAC SHA-256 pôvodného tela s tajomstvom endpointu. Nový podpis X-Webhook-Signature-V2 je HMAC SHA-256 nad X-Webhook-Timestamp + "." + pôvodné telo, kľúčom je tajomstvo endpointu. Čas je Unix v sekundách; odmietnite odchýlku nad 300 sekúnd a pri chybe V2 neprepínajte na starší podpis. X-Webhook-Delivery je stabilné ID doručenia pre odstránenie duplicít. Starší podpis ostáva kompatibilný bez oznámeného dátumu odstránenia. Porovnávajte v konštantnom čase; JSON dekódujte až po overení.
| Udalosť | Význam |
|---|---|
invoice.issued | Faktúra vystavená |
invoice.paid | Faktúra zaplatená |
proforma.issued | Predfaktúra vystavená |
proforma.paid | Predfaktúra zaplatená |
proforma.cancelled | Predfaktúra zrušená |
service.activate | Spustiť službu |
service.suspend | Pozastaviť službu |
service.restore | Obnoviť službu |
service.expiring | Služba sa blíži ku koncu |
Za úspech sa považuje 2xx. Dočasná chyba sa opakuje po 1 minúte, 5 minútach, 1 hodine a 6 hodinách; po piatom pokuse je doručenie vyčerpané. Trvalá chyba nastavenia sa uzavrie bez ďalšieho retry. Nespoliehajte sa na poradie ani jediné doručenie: doménovú identitu a spracovanie ukladajte atomicky. Pri dokladoch môže identitu tvoriť kombinácia event, document.id a timestamp, pri entitách vlastné ID udalosti. HTTPS endpoint musí mať verejnú IP; presmerovania sa nepovoľujú.
Všetky operácie vyžadujú rozsah webhooky.sprava, aktívneho autora kľúča s aktuálnym členstvom vo firme a právom nastavenia.spravovat; kľúč bez autora je odmietnutý. Dostupnosť každej udalosti navyše určujú jej balík a doménové práva. Operácie: GET /webhooky, POST /webhooky, GET/PATCH/DELETE /webhooky/{id}, POST /webhooky/{id}/tajomstvo, GET /webhooky/{id}/dorucenia a POST /webhooky/{id}/dorucenia/{delivery}/opakovat. Pri zápise použite Idempotency-Key. Vytvorenie a rotácia ukážu signing_secret raz; bezpečne ho uložte, idempotentné opakovanie vracia pôvodný výsledok. GET tajomstvo nezobrazuje.
Entitový odber spravujú POST/DELETE /webhooky/{id}/odber; vyžaduje kľúč autora s právom nastavení, živými doménovými právami a rozsahmi udalostí. Zoznam bežných udalostí endpointu je oddelený od entitového odberu. Celý zoznam je aj v sekcii webhooks OpenAPI.
| Entitová udalosť | Rozsah |
|---|---|
entity.bank_account.create | financie.citanie |
entity.bank_account.update | financie.citanie |
entity.bank_account.archive | financie.citanie |
entity.business_case.create | obchod.citanie |
entity.business_case.update | obchod.citanie |
entity.business_case.cancel | obchod.citanie |
entity.business_case_status.create | obchod.citanie |
entity.business_case_status.update | obchod.citanie |
entity.business_case_status.delete | obchod.citanie |
entity.client.create | doklady.citanie |
entity.client.update | doklady.citanie |
entity.client.archive | doklady.citanie |
entity.contact_activity_log.create | obchod.citanie |
entity.contact_activity_log.update | obchod.citanie |
entity.contact_activity_log.delete | obchod.citanie |
entity.credit_note.create | doklady.citanie |
entity.credit_note.update | doklady.citanie |
entity.credit_note.archive | doklady.citanie |
entity.credit_note.delete | doklady.citanie |
entity.credit_note.cancel | doklady.citanie |
entity.credit_note.paid | doklady.citanie |
entity.document_payment.create | financie.citanie |
entity.document_payment.update | financie.citanie |
entity.document_payment.archive | financie.citanie |
entity.invoice.create | doklady.citanie |
entity.invoice.update | doklady.citanie |
entity.invoice.archive | doklady.citanie |
entity.invoice.delete | doklady.citanie |
entity.invoice.cancel | doklady.citanie |
entity.invoice.paid | doklady.citanie |
entity.order.create | obchod.citanie |
entity.order.update | obchod.citanie |
entity.order.cancel | obchod.citanie |
entity.eshop_product.update | eshop.katalog.citanie |
entity.price_list_item.create | katalog.citanie |
entity.price_list_item.update | katalog.citanie |
entity.price_list_item.archive | katalog.citanie |
entity.price_list_item.stock-updated | sklad.stav |
entity.proforma.create | doklady.citanie |
entity.proforma.update | doklady.citanie |
entity.proforma.archive | doklady.citanie |
entity.proforma.delete | doklady.citanie |
entity.proforma.cancel | doklady.citanie |
entity.proforma.paid | doklady.citanie |
entity.quotation.create | doklady.citanie |
entity.quotation.update | doklady.citanie |
entity.quotation.archive | doklady.citanie |
entity.received_invoice.create | prijate.citanie |
entity.received_invoice.update | prijate.citanie |
entity.received_invoice.archive | prijate.citanie |
entity.received_invoice.cancel | prijate.citanie |
entity.received_invoice.paid | prijate.citanie |
entity.received_receipt.create | prijate.citanie |
entity.received_receipt.update | prijate.citanie |
entity.received_receipt.archive | prijate.citanie |
entity.received_receipt.cancel | prijate.citanie |
entity.received_receipt.paid | prijate.citanie |
entity.supplier.create | doklady.citanie |
entity.supplier.update | doklady.citanie |
entity.supplier.archive | doklady.citanie |
entity.warehouse.create | katalog.citanie |
entity.warehouse.update | katalog.citanie |
entity.warehouse.archive | katalog.citanie |
entity.inbound_receipt.create | sklad.pohyby.citanie |
entity.inbound_receipt.update | sklad.pohyby.citanie |
entity.inbound_receipt.cancel | sklad.pohyby.citanie |
entity.outbound_receipt.create | sklad.pohyby.citanie |
entity.outbound_receipt.update | sklad.pohyby.citanie |
entity.outbound_receipt.cancel | sklad.pohyby.citanie |
Udalosti entít, ich odbery a archív majú vlastný kontrakt: Katalóg udalostí entít · Archív udalostí a checkpoint. Dostupnosť závisí od zapnutého modulu, balíka a oprávnení; službové udalosti vyžadujú ovládanie služieb.
Po sprístupnení modulu správcom a splnení balíka otvorte Nastavenia → Testovacia firma a sandbox. Vydajte blx_test_… kľúč a bezpečne ho uložte; zobrazí sa iba pri vydaní. Aktuálny stav modulu: zapnutý.
POST /sandbox/simulacie s typom email, peppol alebo platba. Vytvorí izolovanú simulovanú udalosť, vráti environment: sandbox a simulovane: true. Vyžaduje Idempotency-Key.
Sandbox neposiela emaily, nevstupuje do Peppolu, nevykonáva platby ani ostré zápisy dokladov. Testovací kľúč platí iba na sandbox trasách; ostré API ho odmietne. Vystavenie faktúry z ukážky je ostrá operácia.
POST /sandbox/reset vyčistí len sandbox udalosti firmy. Opakovaný reset s rovnakým kľúčom zachová udalosti vzniknuté po prvom resete. Pre nové vyčistenie vytvorte nový kľúč.
Limit ostrého API sa počíta za minútu na kľúč podľa balíka firmy. Aktuálne hodnoty z konfigurácie:
| Balík | Volaní / minútu / kľúč | API kľúčov / firma |
|---|---|---|
| Free | 20 | 1 |
| Štart | 60 | 3 |
| Pro | 120 | 10 |
Hlavičky X-RateLimit-Limit, X-RateLimit-Remaining a X-RateLimit-Reset opisujú skutočné okno; pri 429 počkajte podľa Retry-After. Ďalšie kvóty modulov sa uplatňujú súčasne s limitom kľúča.
| Modul | Hodnota | Jednotka / okno |
|---|---|---|
| Pokusy pred overením kľúča / IP | 300 | 60 sekúnd |
| Dávky / jeden príjem | 100 riadkov / 2097152 bajtov | požiadavka |
| Samofakturácia | 60 | minúta (dodatočný limit trasy) |
| Samofakturácia / položky | 200 | doklad |
| Nástroje dokumentov / anonymne | 20 | minúta |
| Nástroje dokumentov / firma | 60 | minúta |
| Nástroje dokumentov / firma | 1000 | deň UTC |
| Nástroje dokumentov / vstup | 12582912 | bajtov na požiadavku |
| Kurzor / snapshot | 900 | sekúnd platnosti |
Kompatibilné rozšírenia môžu pridávať voliteľné polia a operácie. Ignorujte neznáme polia a pri neznámej udalosti ju bezpečne odložte. Zmena významu, odstránenie poľa alebo nové povinné pole patrí do novej hlavnej verzie. Bezpečnostné opravy a opravy nesúladu s publikovaným kontraktom môžu sprísniť odmietanie neplatných vstupov.
Zastarávanie oznámime v tomto changelogu s dotknutými operáciami, náhradou a termínom ukončenia. Pred migráciou overte nový kontrakt. Hlavička X-Billex-API-Version uvádza aktívnu verziu. Zastaranie označí Deprecation; Sunset pridáme len po schválení konkrétneho termínu. Dátum ukončenia podpory API v1 ani odstránenia kompatibilných aliasov zatiaľ nebol vyhlásený; politika neurčuje sľúbenú pevnú dobu podpory.
Verzovaný changelog z repozitára; správca ho aktualizuje spolu s API kontraktom. JSON feed zmien.
Dotknuté operácie: GET /faktury/openapi, GET /davky/openapi, GET /obchod/openapi, GET /doklady?po=…, POST /ponuky, PATCH /ponuky/{id}, GET /ponuky/{id}/pdf, GET /ponuky/{id}/online, /webhooky/*, všetky verejné operácie – chyby a spoločný kontrakt
Dotknuté operácie: portál a dokumentácia
Dotknuté operácie: portál a dokumentácia
Dotknuté operácie: portál a dokumentácia
Začnite konkrétnym procesom a povoľte iba rozsahy, ktoré potrebuje.
WooCommerce, Shoptet a Upgates konektory spravujete v Billexe v časti Integrácie → E-shop. Pre vlastné riešenie prepojte objednávku, katalóg a úhradu.
Vystaviť dokladE-shopový katalógSynchronizujte doklady postupne s kurzorom alebo pripravte súborový export podľa kontraktu účtovného programu.
Doklady s filtromÚčtovný exportBankové prepojenie Tatra banka Premium API spravujte v Billexe. API integrácia môže čítať účty, kontrolovať párovanie a zapisovať evidovanú úhradu.
Bankové účtyZapísať úhraduZdieľajte adresár odberateľov a zmeny dokladov. E-faktúru odovzdajte digitálnemu poštárovi cez sieťové API s jeho vlastným tokenom a identitou Peppol účastníka.
Adresár odberateľovPeppol odoslanieNapíšte metódu, cestu, HTTP stav a kód chyby. Priložte anonymizovaný príklad a čas požiadavky. Kľúče, tajomstvá webhookov a osobné údaje neposielajte.
info@billex.sk