{"openapi":"3.1.0","info":{"title":"API Odświeżona","version":"1.0.0","description":"API dla programistów od Odświeżona (odswiezona.pl): płatne na jednym kluczu Bearer (każde API to osobny zakres klucza i osobny limit dzienny, do tego 20 zapytań na minutę na klucz) i bezpłatne bez klucza (60 zapytań na minutę z adresu IP, CORS). Odpowiedź: {\"ok\": true, …}, błąd: {\"ok\": false, \"blad\": \"…\"}. Złe dane (400) nie są liczone do limitu. Treści zapytań i wyników nie zapisujemy. Klucz bez dostępu do danego API dostaje 401.","contact":{"name":"Odświeżona","email":"kontakt@odswiezona.pl","url":"https://odswiezona.pl/api"},"termsOfService":"https://odswiezona.pl/warunki-uslug"},"externalDocs":{"description":"Przegląd API","url":"https://odswiezona.pl/api"},"servers":[{"url":"https://odswiezona.pl"}],"tags":[{"name":"Płatne","description":"Z kluczem Bearer odsw_… (zakres klucza = api_klucze.zakres)"},{"name":"Bezpłatne","description":"Bez klucza i rejestracji"}],"paths":{"/api/v1/kontrahenci":{"post":{"operationId":"post_kontrahenci","summary":"Sprawdź kontrahentów: biała lista VAT i VIES","description":"Do 30 NIP-ów w jednym zapytaniu: status VAT i dane z białej listy Ministerstwa Finansów, czy rachunek jest w wykazie, aktywność w VIES i identyfikator zapytania MF. Niepoprawny NIP albo rachunek (suma kontrolna) daje 400 i nic nie jest liczone do limitu. NIP-ów nie zapisujemy.\n\nLimity: Plan 49 zł netto/mies.: 100 NIP-ów dziennie; 149 zł: 500. Każdy NIP to jedna jednostka limitu. Do tego 20 zapytań na minutę na klucz.","tags":["Płatne"],"externalDocs":{"description":"Dokumentacja i przykłady","url":"https://odswiezona.pl/api-kontrahentow"},"security":[{"kluczApi":["kontrahenci"]}],"x-zakres-klucza":"kontrahenci","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"pozycje":{"type":"array","items":{"type":"object","properties":{"nip":{"type":"string","description":"NIP (10 cyfr, może mieć prefiks PL, spacje i myślniki)"},"rachunek":{"type":"string","description":"numer rachunku do sprawdzenia w wykazie (26 cyfr NRB), opcjonalnie"}},"required":["nip"]},"description":"do 30 pozycji","minItems":1,"maxItems":30},"vies":{"type":"boolean","description":"sprawdzić też VIES (domyślnie tak)","default":true}},"required":["pozycje"],"description":"Zamiast \"pozycje\" można podać jedną pozycję wprost: {\"nip\": \"…\", \"rachunek\": \"…\"}."},"example":{"pozycje":[{"nip":"1234563218","rachunek":"61109010140000071219812874"}],"vies":true}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"data":{"type":["string","null"],"description":"data sprawdzenia (RRRR-MM-DD)"},"id_zapytania":{"type":["string","null"],"description":"identyfikator zapytania z białej listy MF (requestId)"},"limit":{"$ref":"#/components/schemas/Limit"},"wyniki":{"type":"array","items":{"type":"object","properties":{"nip":{"type":["string","null"]},"podmiot":{"type":["object","null"],"properties":{"nazwa":{"type":["string","null"]},"status_vat":{"type":["string","null"],"description":"np. Czynny, Zwolniony"},"regon":{"type":["string","null"]},"krs":{"type":["string","null"]},"adres":{"type":["string","null"]},"rejestracja":{"type":["string","null"],"description":"data rejestracji jako podatnika VAT"},"rachunki":{"type":["integer","null"],"description":"liczba rachunków w wykazie"}}},"rachunek":{"type":["object","null"],"properties":{"na_liscie":{"type":["boolean","null"],"description":"czy podany rachunek jest w wykazie"}}},"vies":{"type":["object","null"],"properties":{"aktywny":{"type":["boolean","null"]}}}}}}},"required":["ok","wyniki","limit"]},"example":{"ok":true,"data":"2026-10-03","id_zapytania":"Ab1Cd-2eF3g4h","limit":{"dzienny":100,"wykorzystano":1},"wyniki":[{"nip":"1234563218","podmiot":{"nazwa":"FIRMA PRZYKŁADOWA SP. Z O.O.","status_vat":"Czynny","regon":"123456785","krs":null,"adres":"UL. PRZYKŁADOWA 1, 00-001 WARSZAWA","rejestracja":"2020-01-15","rachunki":1},"rachunek":{"na_liscie":true},"vies":{"aktywny":true}}]}}}},"400":{"$ref":"#/components/responses/ZleDane"},"401":{"$ref":"#/components/responses/BrakKlucza"},"413":{"$ref":"#/components/responses/ZaDuze"},"429":{"$ref":"#/components/responses/Limit"},"502":{"$ref":"#/components/responses/BladUslugi"},"503":{"$ref":"#/components/responses/Niedostepne"}}}},"/api/v1/dowod":{"post":{"operationId":"post_dowod","summary":"Odczytaj kod Aztec z dowodu rejestracyjnego","description":"Tekst z czytnika kodu Aztec dowodu rejestracyjnego (do 10 kodów) → dane pojazdu. Dekoduje Worker; dane właściciela pomijamy. Kod, który nie jest z dowodu, daje 400 i nic nie jest liczone do limitu. Kodów ani wyników nie zapisujemy.\n\nLimity: Plan 49 zł netto/mies.: 100 odczytów dziennie; 99 zł: 500. Każdy kod to jedna jednostka limitu. Do tego 20 zapytań na minutę na klucz.","tags":["Płatne"],"externalDocs":{"description":"Dokumentacja i przykłady","url":"https://odswiezona.pl/api-dowod"},"security":[{"kluczApi":["dowod"]}],"x-zakres-klucza":"dowod","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"kody":{"type":"array","items":{"type":"string","maxLength":3000},"description":"teksty z czytnika kodów 2D (1–10)","minItems":1,"maxItems":10}},"required":["kody"],"description":"Zamiast \"kody\" można podać jeden kod: {\"kod\": \"…\"}."},"example":{"kody":["TEKST_Z_CZYTNIKA_KODÓW"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"limit":{"$ref":"#/components/schemas/Limit"},"wyniki":{"type":"array","items":{"type":"object","properties":{"plate":{"type":["string","null"],"description":"numer rejestracyjny"},"make":{"type":["string","null"],"description":"marka"},"model":{"type":["string","null"]},"vin":{"type":["string","null"]},"year":{"type":["integer","null"],"description":"rok produkcji"},"first_registration":{"type":["string","null"],"description":"pierwsza rejestracja (RRRR-MM-DD)"},"displacement_l":{"type":["number","null"],"description":"pojemność w litrach"},"power_kw":{"type":["integer","null"]},"fuel_type":{"type":["string","null"]},"kind":{"type":["string","null"],"description":"rodzaj pojazdu"},"category":{"type":["string","null"],"description":"kategoria, np. M1"},"seats":{"type":["integer","null"]},"curb_mass_kg":{"type":["integer","null"]},"max_mass_kg":{"type":["integer","null"]},"document_number":{"type":["string","null"],"description":"seria i numer dowodu"}}}}},"required":["ok","wyniki","limit"]},"example":{"ok":true,"limit":{"dzienny":100,"wykorzystano":1},"wyniki":[{"plate":"PO1234A","make":"VOLKSWAGEN","model":"GOLF","vin":"WVWZZZ1KZ8W000000","year":2019,"first_registration":"2019-04-11","displacement_l":1.998,"power_kw":110,"fuel_type":"Diesel","kind":"SAMOCHÓD OSOBOWY","category":"M1","seats":5,"curb_mass_kg":1320,"max_mass_kg":1900,"document_number":"BAX0000001"}]}}}},"400":{"$ref":"#/components/responses/ZleDane"},"401":{"$ref":"#/components/responses/BrakKlucza"},"413":{"$ref":"#/components/responses/ZaDuze"},"429":{"$ref":"#/components/responses/Limit"},"502":{"$ref":"#/components/responses/BladUslugi"},"503":{"$ref":"#/components/responses/Niedostepne"}}}},"/api/v1/audyt":{"post":{"operationId":"post_audyt","summary":"Audyt strony i domeny","description":"Wynik 0–100 i lista problemów po polsku (PageSpeed na telefonie, dostępność, tytuł i opis, dane strukturalne, boty AI, przestarzały kod, WordPress i wtyczki) oraz domena: wygaśnięcie (RDAP), MX, SPF i DMARC. Strona, której nie da się otworzyć, daje 422 (z danymi domeny; audyt jest już policzony do limitu).\n\nLimity: Plan 49 zł netto/mies.: 100 audytów dziennie; 149 zł: 500. Do tego 20 zapytań na minutę na klucz.","tags":["Płatne"],"externalDocs":{"description":"Dokumentacja i przykłady","url":"https://odswiezona.pl/api-audyt"},"security":[{"kluczApi":["audyt"]}],"x-zakres-klucza":"audyt","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"adres":{"type":"string","description":"domena albo adres strony, np. firma.pl"}},"required":["adres"]},"example":{"adres":"firma.pl"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"adres":{"type":"string","description":"adres końcowy po przekierowaniach"},"wynik":{"type":"integer","description":"0–100","minimum":0,"maximum":100},"ocena":{"type":"string"},"punkty":{"type":"array","items":{"type":"object","properties":{"klucz":{"type":"string","description":"sekcja audytu"},"status":{"$ref":"#/components/schemas/Status"},"tytul":{"type":"string"},"opis":{"type":"string"}}}},"szybkosc":{"type":["integer","null"],"description":"wynik PageSpeed na telefonie (0–100)"},"dostepnosc":{"type":["object","null"],"properties":{"wynik":{"type":"integer","description":"wynik dostępności Lighthouse (0–100)"},"problemy":{"type":"array","items":{"type":"object","properties":{"nazwa":{"type":"string","description":"problem po polsku"},"ile":{"type":"integer","description":"liczba miejsc"},"reguly":{"type":"array","items":{"type":"string"},"description":"identyfikatory reguł axe"}}}}},"description":"null, gdy PageSpeed nie zwrócił kategorii"},"wordpress":{"type":["object","null"],"properties":{"wersja":{"type":["string","null"],"description":"wersja WordPressa z kodu strony"},"core":{"type":["string","null"],"description":"stan wersji według wordpress.org","enum":["latest","outdated","insecure"]},"najnowsza":{"type":["string","null"]},"wtyczki":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string"},"nazwa":{"type":"string"},"wersja":{"type":["string","null"]},"najnowsza":{"type":["string","null"]},"stan":{"type":"string","enum":["aktualna","nieaktualna","zamknieta","zamknieta_bezpieczenstwo","nieznana"]}}}}},"description":"null, gdy strona nie działa na WordPressie"},"domena":{"$ref":"#/components/schemas/Domena"},"limit":{"$ref":"#/components/schemas/Limit"}},"required":["ok","adres","wynik","ocena","punkty","domena","limit"]},"example":{"ok":true,"adres":"https://firma.pl/","wynik":72,"ocena":"Strona wymaga poprawek","szybkosc":54,"punkty":[{"klucz":"szybkosc","status":"uwaga","tytul":"Ładowanie do poprawy","opis":"Wynik Google PageSpeed na telefonie: 54/100, główna treść pojawia się po 4,1 s."}],"domena":{"nazwa":"firma.pl","wygasa":"2027-03-01","dni_do_wygasniecia":149,"zarejestrowana":"2012-03-01","mx":["mx1.firma.pl"],"spf":"v=spf1 include:_spf.firma.pl ~all","dmarc":null,"dmarc_polityka":null,"uwagi":[{"status":"uwaga","tytul":"Brak rekordu DMARC","opis":"Gmail i Outlook wymagają DMARC od firm wysyłających więcej poczty; bez niego łatwiej się podszyć pod domenę."}]},"limit":{"dzienny":100,"wykorzystano":1}}}}},"400":{"$ref":"#/components/responses/ZleDane"},"401":{"$ref":"#/components/responses/BrakKlucza"},"413":{"$ref":"#/components/responses/ZaDuze"},"422":{"$ref":"#/components/responses/StronaNiedostepna"},"429":{"$ref":"#/components/responses/Limit"},"502":{"$ref":"#/components/responses/BladUslugi"},"503":{"$ref":"#/components/responses/Niedostepne"}}}},"/api/v1/ksef":{"post":{"operationId":"post_ksef","summary":"Link weryfikacyjny i kod QR faktury KSeF","description":"Z pliku faktury FA (najpewniej xml_base64, bo skrót liczony jest z dokładnych bajtów) link weryfikacyjny KSeF (KOD I) i kod QR w SVG; z linku z kodu QR jego odczyt, a z pliku i linku naraz sprawdzenie zgodności. Treści faktur nie zapisujemy.\n\nLimity: Plan 29 zł netto/mies.: 1 000 faktur dziennie; 69 zł: 3 000. Do tego 20 zapytań na minutę na klucz.","tags":["Płatne"],"externalDocs":{"description":"Dokumentacja i przykłady","url":"https://odswiezona.pl/api-ksef"},"security":[{"kluczApi":["ksef"]}],"x-zakres-klucza":"ksef","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"xml_base64":{"type":"string","description":"plik faktury (XML FA) w Base64, do 2 MB"},"xml":{"type":"string","description":"plik faktury jako tekst (skrót może się różnić od pliku, jeśli zmienią się bajty)"},"link":{"type":"string","description":"treść kodu QR z faktury (https://qr.ksef.mf.gov.pl/invoice/…)"},"srodowisko":{"type":"string","description":"środowisko KSeF dla linku z pliku","enum":["prod","test","demo"],"default":"prod"},"qr":{"type":"boolean","description":"false = bez kodu QR w odpowiedzi","default":true}},"description":"Wymagane jedno z pól: xml_base64, xml albo link."},"example":{"xml_base64":"PD94bWwgdmVyc2lvbj0iMS4wIj8+…","srodowisko":"prod"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"faktura":{"type":"object","properties":{"nip":{"type":"string","description":"NIP sprzedawcy (Podmiot1)"},"nip_poprawny":{"type":"boolean"},"data_wystawienia":{"type":"string","description":"P_1, RRRR-MM-DD"},"skrot":{"type":"string","description":"SHA-256 pliku w Base64URL"}}},"link":{"type":"string","description":"link weryfikacyjny KSeF (KOD I)"},"qr_svg":{"type":"string","description":"kod QR w SVG"},"odczytany_link":{"type":"object","properties":{"srodowisko":{"type":"string","enum":["prod","test","demo"]},"nip":{"type":"string"},"nip_poprawny":{"type":"boolean"},"data_wystawienia":{"type":"string"},"skrot":{"type":"string"}}},"zgodny":{"type":"boolean","description":"czy link z kodu QR pasuje do pliku (tylko gdy podano oba)"},"limit":{"$ref":"#/components/schemas/Limit"}},"required":["ok","limit"]},"example":{"ok":true,"faktura":{"nip":"1234563218","nip_poprawny":true,"data_wystawienia":"2026-09-30","skrot":"q1w2e3r4t5y6u7i8o9p0a1s2d3f4g5h6j7k8l9z0x1c"},"link":"https://qr.ksef.mf.gov.pl/invoice/1234563218/30-09-2026/q1w2e3r4t5y6u7i8o9p0a1s2d3f4g5h6j7k8l9z0x1c","qr_svg":"<svg xmlns=\"http://www.w3.org/2000/svg\" …</svg>","limit":{"dzienny":1000,"wykorzystano":1}}}}},"400":{"$ref":"#/components/responses/ZleDane"},"401":{"$ref":"#/components/responses/BrakKlucza"},"413":{"$ref":"#/components/responses/ZaDuze"},"429":{"$ref":"#/components/responses/Limit"},"502":{"$ref":"#/components/responses/BladUslugi"},"503":{"$ref":"#/components/responses/Niedostepne"}}}},"/api/v1/kategorie":{"post":{"operationId":"post_kategorie","summary":"Kategorie kosztów z AI","description":"Do 50 pozycji z faktur kosztowych; każda dostaje kategorię z listy klienta (np. kolumny KPiR) albo z listy domyślnej. Model AI tylko wybiera z listy; kategoria spoza listy → null. Treści nie zapisujemy.\n\nLimity: Plan 49 zł netto/mies.: 500 pozycji dziennie; 149 zł: 3 000 (koszt AI w cenie). Każda pozycja to jedna jednostka limitu. Do tego 20 zapytań na minutę na klucz.","tags":["Płatne"],"externalDocs":{"description":"Dokumentacja i przykłady","url":"https://odswiezona.pl/api-kategorie"},"security":[{"kluczApi":["kategorie"]}],"x-zakres-klucza":"kategorie","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"pozycje":{"type":"array","items":{"type":"object","properties":{"nazwa":{"type":"string","description":"nazwa pozycji (do 200 znaków)"},"dostawca":{"type":"string","description":"do 150 znaków"},"kwota":{"type":"number"}},"required":["nazwa"]},"description":"do 50 pozycji","minItems":1,"maxItems":50},"kategorie":{"type":"array","items":{"type":"string","maxLength":60},"description":"własna lista kategorii (2–40 nazw)","minItems":2,"maxItems":40}},"required":["pozycje"]},"example":{"pozycje":[{"nazwa":"Paliwo ON","dostawca":"Stacja paliw","kwota":250}]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"kategorie":{"type":"array","items":{"type":"string"},"description":"lista, z której model wybierał"},"wyniki":{"type":"array","items":{"type":"object","properties":{"nazwa":{"type":"string"},"kategoria":{"type":["string","null"]}}}},"limit":{"$ref":"#/components/schemas/Limit"}},"required":["ok","kategorie","wyniki","limit"]},"example":{"ok":true,"kategorie":["paliwo","materiały","usługi obce","inne"],"wyniki":[{"nazwa":"Paliwo ON","kategoria":"paliwo"}],"limit":{"dzienny":500,"wykorzystano":1}}}}},"400":{"$ref":"#/components/responses/ZleDane"},"401":{"$ref":"#/components/responses/BrakKlucza"},"413":{"$ref":"#/components/responses/ZaDuze"},"429":{"$ref":"#/components/responses/Limit"},"502":{"$ref":"#/components/responses/BladUslugi"},"503":{"$ref":"#/components/responses/Niedostepne"}}}},"/api/v1/seo":{"post":{"operationId":"post_seo","summary":"Opisy SEO z AI (strona albo produkty i usługi)","description":"{\"adres\"}: Worker pobiera stronę i proponuje tytuł (do 60 znaków), opis dla Google (do 155), H1 (do 70), frazy i teksty alternatywne zdjęć (do 120); strona, która się nie otwiera, daje 422 bez liczenia do limitu. {\"pozycje\"}: do 20 własnych opisów. Pole z liczbą spoza danych wejściowych ma wartość null. Treści nie zapisujemy.\n\nLimity: Plan 49 zł netto/mies.: 200 opisów dziennie; 149 zł: 1 000 (koszt AI w cenie). Strona = 1 opis, pozycje = tyle, ile pozycji. Do tego 20 zapytań na minutę na klucz.","tags":["Płatne"],"externalDocs":{"description":"Dokumentacja i przykłady","url":"https://odswiezona.pl/api-seo"},"security":[{"kluczApi":["seo"]}],"x-zakres-klucza":"seo","requestBody":{"required":true,"content":{"application/json":{"schema":{"oneOf":[{"type":"object","properties":{"adres":{"type":"string","description":"domena albo adres strony"}},"required":["adres"]},{"type":"object","properties":{"pozycje":{"type":"array","items":{"type":"object","properties":{"nazwa":{"type":"string","description":"do 150 znaków"},"opis":{"type":"string","description":"do 1500 znaków"},"kategoria":{"type":"string"},"slowa":{"type":"string","description":"frazy, na które ma się wyświetlać"}},"required":["nazwa"]},"description":"do 20 pozycji","minItems":1,"maxItems":20}},"required":["pozycje"]}]},"example":{"pozycje":[{"nazwa":"Wymiana opon","opis":"Sezonowa wymiana i przechowywanie opon w Pruszkowie."}]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"oneOf":[{"type":"object","properties":{"ok":{"type":"boolean","const":true},"adres":{"type":"string"},"obecne":{"type":"object","properties":{"tytul":{"type":["string","null"]},"opis":{"type":["string","null"]}}},"propozycja":{"type":"object","properties":{"tytul":{"type":["string","null"]},"opis":{"type":["string","null"]},"h1":{"type":["string","null"]},"frazy":{"type":"array","items":{"type":"string"}},"alt":{"type":"array","items":{"type":"object","properties":{"src":{"type":"string"},"alt":{"type":"string"}}}}}},"limit":{"$ref":"#/components/schemas/Limit"}},"required":["ok","adres","obecne","propozycja","limit"],"description":"odpowiedź na {\"adres\"}"},{"type":"object","properties":{"ok":{"type":"boolean","const":true},"wyniki":{"type":"array","items":{"type":"object","properties":{"nazwa":{"type":"string"},"tytul":{"type":["string","null"]},"opis":{"type":["string","null"]},"h1":{"type":["string","null"]},"alt":{"type":["string","null"]}}}},"limit":{"$ref":"#/components/schemas/Limit"}},"required":["ok","wyniki","limit"],"description":"odpowiedź na {\"pozycje\"}"}]},"example":{"ok":true,"wyniki":[{"nazwa":"Wymiana opon","tytul":"Wymiana opon Pruszków – sezonowa wymiana i przechowalnia","opis":"Sezonowa wymiana opon i przechowywanie kół w Pruszkowie. Umów termin i przyjedź bez czekania.","h1":"Wymiana i przechowywanie opon w Pruszkowie","alt":"Mechanik zakłada koło w warsztacie"}],"limit":{"dzienny":200,"wykorzystano":1}}}}},"400":{"$ref":"#/components/responses/ZleDane"},"401":{"$ref":"#/components/responses/BrakKlucza"},"413":{"$ref":"#/components/responses/ZaDuze"},"422":{"$ref":"#/components/responses/StronaNiedostepna"},"429":{"$ref":"#/components/responses/Limit"},"502":{"$ref":"#/components/responses/BladUslugi"},"503":{"$ref":"#/components/responses/Niedostepne"}}}},"/api/v1/dokumenty":{"post":{"operationId":"post_dokumenty","summary":"Odczyt dokumentów z AI (faktury, paragony, umowy, pisma)","description":"PDF albo zdjęcie (JPEG, PNG, WebP) w Base64, do 10 MB; typ sprawdzany po sygnaturze pliku, zanim policzymy użycie. Kod sprawdza NIP-y (suma kontrolna), daty, rachunek i zgodność netto + VAT = brutto. Plików nie zapisujemy.\n\nLimity: Plan 49 zł netto/mies.: 20 dokumentów dziennie; 149 zł: 100 (koszt AI w cenie). Do tego 20 zapytań na minutę na klucz.","tags":["Płatne"],"externalDocs":{"description":"Dokumentacja i przykłady","url":"https://odswiezona.pl/api-dokumenty"},"security":[{"kluczApi":["dokumenty"]}],"x-zakres-klucza":"dokumenty","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"plik_base64":{"type":"string","description":"plik w Base64 (do 10 MB)"},"typ":{"type":"string","enum":["application/pdf","image/jpeg","image/png","image/webp"]},"nazwa":{"type":"string","description":"nazwa pliku PDF (opcjonalnie)"},"tekst":{"type":"boolean","description":"true = dołącz pełny tekst dokumentu","default":false}},"required":["plik_base64","typ"]},"example":{"plik_base64":"JVBERi0xLjcK…","typ":"application/pdf","nazwa":"faktura.pdf"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"dokument":{"$ref":"#/components/schemas/Dokument"},"limit":{"$ref":"#/components/schemas/Limit"}},"required":["ok","dokument","limit"]},"example":{"ok":true,"limit":{"dzienny":20,"wykorzystano":1},"dokument":{"rodzaj":"faktura","tytul":"Faktura za paliwo 09/2026","wystawca":{"nazwa":"Stacja Paliw Sp. z o.o.","nip":"1234563218"},"odbiorca":{"nazwa":"Firma Przykładowa","nip":null},"numer":"FV/123/09/2026","data_wystawienia":"2026-09-30","data_sprzedazy":"2026-09-30","termin_platnosci":"2026-10-14","waluta":"PLN","kwota_netto":203.25,"kwota_vat":46.75,"kwota_brutto":250,"zgodnosc_kwot":true,"rachunek":null,"pozycje":[{"nazwa":"Olej napędowy","ilosc":40,"cena_netto":5.08,"wartosc_brutto":250}],"tagi":["paliwo"],"streszczenie":"Faktura za 40 l oleju napędowego."}}}}},"400":{"$ref":"#/components/responses/ZleDane"},"401":{"$ref":"#/components/responses/BrakKlucza"},"413":{"$ref":"#/components/responses/ZaDuze"},"429":{"$ref":"#/components/responses/Limit"},"502":{"$ref":"#/components/responses/BladUslugi"},"503":{"$ref":"#/components/responses/Niedostepne"}}}},"/api/v1/wspolrzedne":{"post":{"operationId":"post_wspolrzedne","summary":"Współrzędne z adresu (rejestr adresowy GUGiK)","description":"Adres → współrzędne WGS84 z punktów adresowych PRG (GUGiK), do 10 adresów. Pisownia miejscowości bez polskich znaków poprawiana (GeoNames, CC-BY 4.0), numer z dopiskiem lokalu upraszczany, odpowiedź o innej ulicy odrzucana; poziom trafienia: adres, ulica albo miejscowość. Błąd jednej pozycji jest w jej wyniku (\"ok\": false), \"ponow\": true = wyślij ją jeszcze raz. Adresów nie zapisujemy.\n\nLimity: Plan 49 zł netto/mies.: 1 000 adresów dziennie; 149 zł: 10 000 (wspólny limit z /api/v1/adres). Każda pozycja to jedna jednostka limitu. Do tego 20 zapytań na minutę na klucz.","tags":["Płatne"],"externalDocs":{"description":"Dokumentacja i przykłady","url":"https://odswiezona.pl/api-geo"},"security":[{"kluczApi":["geo"]}],"x-zakres-klucza":"geo","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"adres":{"oneOf":[{"type":"string","description":"adres w jednym polu, części rozdzielone przecinkiem"},{"$ref":"#/components/schemas/AdresWejscie"}]},"adresy":{"type":"array","items":{"oneOf":[{"type":"string"},{"$ref":"#/components/schemas/AdresWejscie"}]},"description":"do 10 adresów","minItems":1,"maxItems":10}},"description":"Podaj \"adres\" albo \"adresy\"; pola miejscowosc, ulica, numer, kod można też podać wprost w treści."},"example":{"adres":"ul. Długa 1, 31-147 Kraków"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"wyniki":{"type":"array","items":{"oneOf":[{"$ref":"#/components/schemas/WynikWspolrzednych"},{"$ref":"#/components/schemas/BladPozycjiGeo"}]}},"zrodlo":{"type":"string"},"limit":{"$ref":"#/components/schemas/Limit"}},"required":["ok","wyniki","zrodlo","limit"]},"example":{"ok":true,"wyniki":[{"ok":true,"lat":50.0679,"lon":19.9411,"poziom":"adres","potwierdzone":true,"potwierdzone_przez":"kod_pocztowy","adres":{"lat":50.0679,"lon":19.9411,"miejscowosc":"Kraków","czesc_miejscowosci":null,"ulica":"Długa","numer":"1","kod":"31-147","wojewodztwo":"małopolskie","powiat":"Kraków","gmina":"Kraków","teryt":"126101","simc":"0950463","ulic":"04308","dokladnosc":1},"zapytanie":"Kraków, Długa 1","uwagi":[]}],"zrodlo":"punkty adresowe PRG (GUGiK); pisownia miejscowości: GeoNames (CC-BY 4.0)","limit":{"dzienny":1000,"wykorzystano":1}}}}},"400":{"$ref":"#/components/responses/ZleDane"},"401":{"$ref":"#/components/responses/BrakKlucza"},"413":{"$ref":"#/components/responses/ZaDuze"},"429":{"$ref":"#/components/responses/Limit"},"502":{"$ref":"#/components/responses/BladUslugi"},"503":{"$ref":"#/components/responses/Niedostepne"}}}},"/api/v1/adres":{"post":{"operationId":"post_adres","summary":"Najbliższy adres ze współrzędnych (rejestr adresowy GUGiK)","description":"Współrzędne WGS84 → najbliższy punkt adresowy PRG w promieniu (domyślnie 100 m, do 2000 m), do 10 punktów. Tylko Polska; zamienione \"lat\" i \"lon\" są wykrywane. Błąd jednej pozycji jest w jej wyniku. Współrzędnych nie zapisujemy.\n\nLimity: Plan 49 zł netto/mies.: 1 000 adresów dziennie; 149 zł: 10 000 (wspólny limit z /api/v1/wspolrzedne). Każdy punkt to jedna jednostka limitu. Do tego 20 zapytań na minutę na klucz.","tags":["Płatne"],"externalDocs":{"description":"Dokumentacja i przykłady","url":"https://odswiezona.pl/api-geo"},"security":[{"kluczApi":["geo"]}],"x-zakres-klucza":"geo","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"lat":{"type":"number","description":"szerokość geograficzna"},"lon":{"type":"number","description":"długość geograficzna"},"punkt":{"$ref":"#/components/schemas/Punkt"},"punkty":{"type":"array","items":{"oneOf":[{"$ref":"#/components/schemas/Punkt"},{"type":"array","items":{"type":"number"},"description":"[lat, lon]","minItems":2,"maxItems":2}]},"description":"do 10 punktów","minItems":1,"maxItems":10},"promien":{"type":"integer","description":"promień w metrach","minimum":1,"maximum":2000,"default":100}},"description":"Podaj \"lat\" i \"lon\", \"punkt\" albo \"punkty\"."},"example":{"lat":52.2297,"lon":21.0122,"promien":100}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"wyniki":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"ok":{"type":"boolean","const":true},"adres":{"$ref":"#/components/schemas/PunktAdresowy"},"odleglosc_m":{"type":["integer","null"]}},"required":["ok","adres"]},{"$ref":"#/components/schemas/BladPozycjiGeo"}]}},"promien":{"type":"integer"},"zrodlo":{"type":"string"},"limit":{"$ref":"#/components/schemas/Limit"}},"required":["ok","wyniki","promien","zrodlo","limit"]},"example":{"ok":true,"promien":100,"zrodlo":"punkty adresowe PRG (GUGiK)","limit":{"dzienny":1000,"wykorzystano":1},"wyniki":[{"ok":true,"odleglosc_m":12,"adres":{"lat":52.2296,"lon":21.0123,"miejscowosc":"Warszawa","czesc_miejscowosci":null,"ulica":"Marszałkowska","numer":"100","kod":"00-026","wojewodztwo":"mazowieckie","powiat":"Warszawa","gmina":"Warszawa","teryt":"146501","simc":"0918123","ulic":"12345","odleglosc_m":12}}]}}}},"400":{"$ref":"#/components/responses/ZleDane"},"401":{"$ref":"#/components/responses/BrakKlucza"},"413":{"$ref":"#/components/responses/ZaDuze"},"429":{"$ref":"#/components/responses/Limit"},"502":{"$ref":"#/components/responses/BladUslugi"},"503":{"$ref":"#/components/responses/Niedostepne"}}}},"/api/v1/walidacja":{"get":{"operationId":"get_walidacja","summary":"Walidacja NIP, REGON, PESEL, IBAN, KRS i VIN (parametry w adresie)","description":"Sumy kontrolne i format; IBAN z bankiem dla polskich rachunków, VIN z producentem, regionem, cyfrą kontrolną i rokiem modelowym. Każdy parametr można powtórzyć. Niczego nie zapisujemy.\n\nLimity: Bezpłatnie, bez klucza: 60 zapytań na minutę z adresu IP.","tags":["Bezpłatne"],"externalDocs":{"description":"Dokumentacja i przykłady","url":"https://odswiezona.pl/api-narzedzia"},"security":[],"parameters":[{"name":"nip","in":"query","required":false,"schema":{"type":"string"}},{"name":"regon","in":"query","required":false,"schema":{"type":"string"}},{"name":"pesel","in":"query","required":false,"schema":{"type":"string"}},{"name":"iban","in":"query","required":false,"schema":{"type":"string"}},{"name":"rachunek","in":"query","required":false,"schema":{"type":"string"},"description":"jak iban"},{"name":"krs","in":"query","required":false,"schema":{"type":"string"}},{"name":"vin","in":"query","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"wyniki":{"type":"array","items":{"$ref":"#/components/schemas/WynikWalidacji"}}},"required":["ok","wyniki"]},"example":{"ok":true,"wyniki":[{"typ":"nip","poprawny":true,"postac":"1133067162"}]}}}},"400":{"$ref":"#/components/responses/ZleDane"},"429":{"$ref":"#/components/responses/Limit"}}},"post":{"operationId":"post_walidacja","summary":"Walidacja wielu numerów naraz (do 100)","description":"To samo co GET, ale lista do 100 pozycji w JSON. Nieznany typ albo pusta wartość daje \"poprawny\": false z polem \"blad\" w wyniku tej pozycji.\n\nLimity: Bezpłatnie, bez klucza: 60 zapytań na minutę z adresu IP.","tags":["Bezpłatne"],"externalDocs":{"description":"Dokumentacja i przykłady","url":"https://odswiezona.pl/api-narzedzia"},"security":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"pozycje":{"type":"array","items":{"type":"object","properties":{"typ":{"type":"string","enum":["nip","regon","pesel","iban","rachunek","krs","vin"]},"wartosc":{"type":["string","number"],"maxLength":60}},"required":["typ","wartosc"]},"description":"do 100 pozycji","minItems":1,"maxItems":100}},"required":["pozycje"]},"example":{"pozycje":[{"typ":"nip","wartosc":"1133067162"},{"typ":"iban","wartosc":"61 1090 1014 0000 0712 1981 2874"}]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"wyniki":{"type":"array","items":{"$ref":"#/components/schemas/WynikWalidacji"}}},"required":["ok","wyniki"]},"example":{"ok":true,"wyniki":[{"typ":"nip","poprawny":true,"postac":"1133067162"},{"typ":"iban","poprawny":true,"kraj":"PL","postac":"PL61 1090 1014 0000 0712 1981 2874","bank":"Santander Bank Polska"}]}}}},"400":{"$ref":"#/components/responses/ZleDane"},"413":{"$ref":"#/components/responses/ZaDuze"},"429":{"$ref":"#/components/responses/Limit"}}}},"/api/v1/kurs":{"get":{"operationId":"get_kurs","summary":"Kurs średni NBP do faktury (art. 31a ustawy o VAT)","description":"Kurs z tabeli A NBP z ostatniego dnia roboczego przed podaną datą, numer tabeli i opcjonalnie kwota w złotych (zaokrąglona do grosza). 404: brak kursu waluty albo dzisiejsza tabela jeszcze nieopublikowana.\n\nLimity: Bezpłatnie, bez klucza: 60 zapytań na minutę z adresu IP.","tags":["Bezpłatne"],"externalDocs":{"description":"Dokumentacja i przykłady","url":"https://odswiezona.pl/api-narzedzia"},"security":[],"parameters":[{"name":"waluta","in":"query","required":true,"schema":{"type":"string","description":"kod ISO 4217, inny niż PLN","pattern":"^[A-Za-z]{3}$"},"example":"EUR"},{"name":"data","in":"query","required":false,"schema":{"type":"string","description":"RRRR-MM-DD, od 2002-01-03 do jutra (domyślnie dziś)","format":"date"},"example":"2026-09-15"},{"name":"kwota","in":"query","required":false,"schema":{"type":"string","description":"kwota w walucie, np. 1234.56 (przecinek też działa)"},"example":"100.50"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"waluta":{"type":"string"},"waluta_nazwa":{"type":["string","null"]},"data":{"type":"string"},"kurs":{"type":"number"},"tabela":{"type":"string","description":"numer tabeli NBP"},"data_kursu":{"type":"string"},"kwota":{"type":"number","description":"tylko z parametrem kwota"},"kwota_pln":{"type":"number","description":"tylko z parametrem kwota"},"zasada":{"type":"string"}},"required":["ok","waluta","data","kurs","tabela","data_kursu","zasada"]},"example":{"ok":true,"waluta":"EUR","waluta_nazwa":"euro","data":"2026-09-15","kurs":4.2635,"tabela":"178/A/NBP/2026","data_kursu":"2026-09-14","kwota":100.5,"kwota_pln":428.48,"zasada":"Kurs średni NBP (tabela A) z ostatniego dnia roboczego przed podaną datą (art. 31a ust. 1 ustawy o VAT; tak samo w PIT i CIT)."}}}},"400":{"$ref":"#/components/responses/ZleDane"},"404":{"$ref":"#/components/responses/NieZnaleziono"},"429":{"$ref":"#/components/responses/Limit"},"502":{"$ref":"#/components/responses/BladUslugi"}}}},"/api/v1/kalendarz":{"get":{"operationId":"get_kalendarz","summary":"Polskie święta, dni robocze i terminy","description":"Jeden z trybów: ?rok= (święta i liczba dni roboczych), ?data= (czy dzień roboczy) albo ?od=&dni=[&rodzaj=robocze] (termin z przesunięciem z soboty, niedzieli i święta na następny dzień roboczy, art. 115 KC).\n\nLimity: Bezpłatnie, bez klucza: 60 zapytań na minutę z adresu IP.","tags":["Bezpłatne"],"externalDocs":{"description":"Dokumentacja i przykłady","url":"https://odswiezona.pl/api-narzedzia"},"security":[],"parameters":[{"name":"rok","in":"query","required":false,"schema":{"type":"integer","description":"2000–2100","minimum":2000,"maximum":2100},"example":2026},{"name":"data","in":"query","required":false,"schema":{"type":"string","description":"RRRR-MM-DD","format":"date"},"example":"2026-11-11"},{"name":"od","in":"query","required":false,"schema":{"type":"string","description":"początek terminu, RRRR-MM-DD","format":"date"},"example":"2026-09-29"},{"name":"dni","in":"query","required":false,"schema":{"type":"integer","description":"0–730","minimum":0,"maximum":730,"default":0},"example":14},{"name":"rodzaj","in":"query","required":false,"schema":{"type":"string","enum":["kalendarzowe","robocze"],"default":"kalendarzowe"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"oneOf":[{"type":"object","properties":{"ok":{"type":"boolean","const":true},"rok":{"type":"integer"},"swieta":{"type":"array","items":{"type":"object","properties":{"data":{"type":"string"},"nazwa":{"type":"string"}}}},"dni_robocze":{"type":"integer"}},"required":["ok","rok","swieta","dni_robocze"],"description":"tryb ?rok="},{"type":"object","properties":{"ok":{"type":"boolean","const":true},"data":{"type":"string"},"dzien_roboczy":{"type":"boolean"},"swieto":{"type":["string","null"]},"sobota_lub_niedziela":{"type":"boolean"},"nastepny_dzien_roboczy":{"type":"string"}},"required":["ok","data","dzien_roboczy","swieto","sobota_lub_niedziela","nastepny_dzien_roboczy"],"description":"tryb ?data="},{"type":"object","properties":{"ok":{"type":"boolean","const":true},"od":{"type":"string"},"dni":{"type":"integer"},"rodzaj":{"type":"string","enum":["kalendarzowe","robocze"]},"termin":{"type":"string"},"przesuniety":{"type":"boolean"},"termin_bez_przesuniecia":{"type":"string","description":"tylko dla dni kalendarzowych"},"zasada":{"type":"string"}},"required":["ok","od","dni","rodzaj","termin","przesuniety","zasada"],"description":"tryb ?od=&dni="}]},"example":{"ok":true,"od":"2026-09-29","dni":14,"rodzaj":"kalendarzowe","termin":"2026-10-13","przesuniety":false,"termin_bez_przesuniecia":"2026-10-13","zasada":"Termin w sobotę, niedzielę albo święto przesuwa się na następny dzień roboczy (art. 115 KC, art. 12 § 5 Ordynacji podatkowej)."}}}},"400":{"$ref":"#/components/responses/ZleDane"},"429":{"$ref":"#/components/responses/Limit"}}}}},"components":{"securitySchemes":{"kluczApi":{"type":"http","scheme":"bearer","bearerFormat":"odsw_…","description":"Nagłówek Authorization: Bearer odsw_…; klucz ma zakresy (kontrahenci, dowod, audyt, ksef, kategorie, seo, dokumenty, geo), wymagany zakres podaje security operacji."}},"schemas":{"Blad":{"type":"object","properties":{"ok":{"type":"boolean","const":false},"blad":{"type":"string","description":"opis błędu po polsku"},"bledne":{"type":"array","items":{"type":"object","properties":{"pozycja":{"type":"integer","description":"numer pozycji od 0"},"blad":{"type":"string"}},"required":["pozycja","blad"]},"description":"pozycje z błędami (przy listach)"},"limit":{"$ref":"#/components/schemas/Limit"},"domena":{"$ref":"#/components/schemas/Domena"}},"required":["ok","blad"],"description":"Wspólny kształt błędu. \"limit\" jest wtedy, gdy zapytanie zostało już policzone; \"domena\" przy 422 z audytu."},"Limit":{"type":"object","properties":{"dzienny":{"type":["integer","null"],"description":"dzienny limit klucza dla tego API"},"wykorzystano":{"type":"integer","description":"wykorzystane dziś (z tym zapytaniem)"}},"required":["dzienny","wykorzystano"]},"Status":{"type":"string","description":"ok, info, uwaga (do poprawy), zle (problem)","enum":["ok","info","uwaga","zle"]},"Domena":{"type":"object","properties":{"nazwa":{"type":"string"},"wygasa":{"type":["string","null"],"description":"RRRR-MM-DD"},"dni_do_wygasniecia":{"type":["integer","null"]},"zarejestrowana":{"type":["string","null"]},"mx":{"type":["array","null"],"items":{"type":"string"}},"spf":{"type":["string","null"]},"dmarc":{"type":["string","null"]},"dmarc_polityka":{"type":["string","null"],"enum":["none","quarantine","reject",null]},"uwagi":{"type":"array","items":{"type":"object","properties":{"status":{"$ref":"#/components/schemas/Status"},"tytul":{"type":"string"},"opis":{"type":"string"}}}}}},"Dokument":{"type":"object","properties":{"rodzaj":{"type":"string","enum":["faktura","faktura_korygujaca","paragon","rachunek","umowa","pismo","wezwanie","potwierdzenie_przelewu","oferta","inne"]},"tytul":{"type":["string","null"]},"wystawca":{"type":"object","properties":{"nazwa":{"type":["string","null"]},"nip":{"type":["string","null"],"description":"tylko z poprawną sumą kontrolną"}}},"odbiorca":{"type":"object","properties":{"nazwa":{"type":["string","null"]},"nip":{"type":["string","null"]}}},"numer":{"type":["string","null"]},"data_wystawienia":{"type":["string","null"],"format":"date"},"data_sprzedazy":{"type":["string","null"],"format":"date"},"termin_platnosci":{"type":["string","null"],"format":"date"},"waluta":{"type":["string","null"]},"kwota_netto":{"type":["number","null"]},"kwota_vat":{"type":["number","null"]},"kwota_brutto":{"type":["number","null"]},"zgodnosc_kwot":{"type":["boolean","null"],"description":"netto + VAT = brutto (±0,02); null, gdy brakuje kwoty"},"rachunek":{"type":["string","null"],"description":"NRB albo IBAN, tylko poprawny"},"pozycje":{"type":"array","items":{"type":"object","properties":{"nazwa":{"type":"string"},"ilosc":{"type":["number","null"]},"cena_netto":{"type":["number","null"]},"wartosc_brutto":{"type":["number","null"]}}}},"tagi":{"type":"array","items":{"type":"string"}},"streszczenie":{"type":["string","null"]},"tekst":{"type":["string","null"],"description":"tylko z \"tekst\": true"}}},"AdresWejscie":{"type":"object","properties":{"miejscowosc":{"type":"string"},"ulica":{"type":"string","description":"może zawierać numer, np. „Długa 1”"},"numer":{"type":"string"},"kod":{"type":"string","description":"kod pocztowy, pomaga wybrać miejscowość"},"adres":{"type":"string","description":"adres w jednym polu zamiast miejscowosc/ulica/numer"}}},"Punkt":{"type":"object","properties":{"lat":{"type":"number"},"lon":{"type":"number"}},"required":["lat","lon"]},"PunktAdresowy":{"type":"object","properties":{"lat":{"type":"number"},"lon":{"type":"number"},"miejscowosc":{"type":["string","null"]},"czesc_miejscowosci":{"type":["string","null"]},"ulica":{"type":["string","null"]},"numer":{"type":["string","null"]},"kod":{"type":["string","null"]},"wojewodztwo":{"type":["string","null"]},"powiat":{"type":["string","null"]},"gmina":{"type":["string","null"]},"teryt":{"type":["string","null"]},"simc":{"type":["string","null"]},"ulic":{"type":["string","null"]},"dokladnosc":{"type":"number"},"odleglosc_m":{"type":"integer"}}},"WynikWspolrzednych":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"lat":{"type":"number"},"lon":{"type":"number"},"poziom":{"type":"string","enum":["adres","ulica","miejscowosc"]},"potwierdzone":{"type":"boolean"},"potwierdzone_przez":{"type":"string","enum":["kod_pocztowy","gmina_kodu_pocztowego","jedyne_dopasowanie","miasto_na_prawach_powiatu"]},"adres":{"$ref":"#/components/schemas/PunktAdresowy"},"zapytanie":{"type":"string","description":"zapytanie, które trafiło"},"dopasowan":{"type":"integer","description":"liczba pasujących miejscowości, gdy więcej niż jedna"},"uwagi":{"type":"array","items":{"type":"string"}}},"required":["ok","lat","lon","poziom","potwierdzone","adres","zapytanie","uwagi"]},"BladPozycjiGeo":{"type":"object","properties":{"ok":{"type":"boolean","const":false},"blad":{"type":"string"},"ponow":{"type":"boolean","description":"true = wyślij tę pozycję ponownie"},"uwagi":{"type":"array","items":{"type":"string"}}},"required":["ok","blad"]},"WynikWalidacji":{"type":"object","properties":{"typ":{"type":"string"},"poprawny":{"type":"boolean"},"postac":{"type":"string","description":"postać znormalizowana"},"blad":{"type":"string","description":"nieznany typ albo brak wartości"},"uwaga":{"type":"string"},"kraj":{"type":"string","description":"IBAN"},"bank":{"type":["string","null"],"description":"IBAN: bank dla polskich rachunków"},"vin":{"type":"string"},"producent":{"type":["string","null"]},"region":{"type":["string","null"]},"cyfra_kontrolna":{"type":"string","enum":["zgodna","niezgodna"]},"rok_modelowy":{"type":["integer","null"]}},"required":["typ","poprawny"]}},"responses":{"ZleDane":{"description":"Złe dane wejściowe; nic nie zostało policzone do limitu. Przy listach pole \"bledne\" wskazuje pozycje.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Blad"},"example":{"ok":false,"blad":"Popraw pozycje z błędami (nic nie zostało sprawdzone ani policzone do limitu).","bledne":[{"pozycja":0,"blad":"niepoprawny NIP"}]}}}},"BrakKlucza":{"description":"Brak albo zły format klucza, klucz nieznany, wyłączony, wygasły albo bez dostępu do tego API (zakresu).","headers":{"WWW-Authenticate":{"description":"Bearer (tylko gdy brak klucza albo zły format)","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Blad"},"example":{"ok":false,"blad":"Brak albo zły klucz API (nagłówek Authorization: Bearer odsw_…)."}}}},"NieZnaleziono":{"description":"Brak danych (np. kursu waluty w tabeli A NBP).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Blad"},"example":{"ok":false,"blad":"Brak kursu XYZ w tabeli A NBP."}}}},"ZaDuze":{"description":"Zapytanie jest za duże.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Blad"},"example":{"ok":false,"blad":"Zapytanie jest za duże."}}}},"StronaNiedostepna":{"description":"Nie udało się otworzyć podanej strony.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Blad"},"example":{"ok":false,"blad":"Nie udało się otworzyć tej strony."}}}},"Limit":{"description":"Limit: na minutę (nagłówek Retry-After), z adresu IP albo dzienny limit klucza (odnawia się o północy).","headers":{"Retry-After":{"description":"sekundy do ponowienia (przy limicie na minutę)","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Blad"},"example":{"ok":false,"blad":"Za dużo zapytań w krótkim czasie (limit na minutę). Spróbuj za chwilę."}}}},"BladUslugi":{"description":"Usługa w tle (rejestr, n8n, model AI, NBP) chwilowo nie odpowiada; spróbuj ponownie za kilka minut.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Blad"},"example":{"ok":false,"blad":"Nie udało się sprawdzić teraz. Spróbuj za kilka minut."}}}},"Niedostepne":{"description":"Usługa chwilowo niedostępna.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Blad"},"example":{"ok":false,"blad":"Usługa chwilowo niedostępna."}}}}}}}