{"openapi":"3.1.0","info":{"title":"Netium — API panelu domen","version":"1.0.0","description":"Publiczne API dla klientów panelu Netium.\n\nUwierzytelnianie: nagłówek `Authorization: Bearer <klucz>`. Klucze zakładasz w panelu (Konto → Klucze API); pełna wartość klucza jest pokazywana jednorazowo, przy tworzeniu.\n\nZakresy: `read` pozwala tylko czytać, `read_write` także wykonywać operacje. Operacje zapisujące wymagają dodatkowo aktywnego abonamentu — bez niego API zwraca 402 `subscription_required`, tak jak panel przechodzi w tryb tylko do odczytu.\n\nLimit zapytań: 120 na minutę na klucz. Odpowiedzi niosą nagłówki `X-RateLimit-Limit`, `X-RateLimit-Remaining` i `X-RateLimit-Reset`.\n\nOperacje na domenach pobierają środki z salda przedpłaty. Kod authinfo, płatności, zmiana danych klienta i zmiana hasła są dostępne wyłącznie w panelu."},"servers":[{"url":"https://panel.netium.pl"}],"tags":[{"name":"Domeny","description":"Rejestracja, odnowienia, transfery"},{"name":"Serwery DNS","description":"Delegacja domen"},{"name":"Kontakty","description":"Kontakty EPP"},{"name":"Konto","description":"Dane klienta, saldo, wyceny"}],"components":{"securitySchemes":{"apiKey":{"type":"http","scheme":"bearer","description":"Klucz API z panelu (Konto → Klucze API)"}},"schemas":{"Error":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Stabilny identyfikator błędu"},"message":{"type":"string","description":"Opis dla programisty (po angielsku)"},"details":{"description":"Dodatkowe dane, np. lista pól, które nie przeszły walidacji"}}}}}}},"security":[{"apiKey":[]}],"paths":{"/api/v1/domains":{"get":{"tags":["Domeny"],"summary":"Lista domen","description":"Zwraca domeny klienta, do którego należy klucz.","operationId":"get_domains","security":[{"apiKey":[]}],"parameters":[{"name":"page","in":"query","required":false,"description":"Numer strony (od 1)","schema":{"type":"integer"}},{"name":"page_size","in":"query","required":false,"description":"Liczba pozycji na stronie (maks. 200)","schema":{"type":"integer"}},{"name":"search","in":"query","required":false,"description":"Fragment nazwy domeny","schema":{"type":"string"}},{"name":"type","in":"query","required":false,"description":"Typ: DOMAIN, RESERVATION, FUTURE, TASTE, TO_TRANSFER","schema":{"type":"string"}}],"responses":{"200":{"description":"Powodzenie","content":{"application/json":{"example":{"domains":[{"id":42,"name":"przyklad.pl","type":"DOMAIN","expiration":"2027-03-14T00:00:00.000Z","isExpired":false,"daysToExpiration":204,"registrant":"Jan Kowalski"}],"pagination":{"page":1,"page_size":50,"total":13,"max_page_size":200}}}}},"401":{"description":"Brak klucza albo klucz nieważny","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Klucz tylko do odczytu przy operacji zapisującej","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Przekroczony limit zapytań","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-required-scope":"read"},"post":{"tags":["Domeny"],"summary":"Rejestracja domeny","description":"Zakłada kontakty w rejestrze, rejestruje domenę i pobiera opłatę z salda przedpłaty.","operationId":"post_domains","security":[{"apiKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"name":{"type":"string","minLength":1,"pattern":"^[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(\\.[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$"},"period":{"default":1,"type":"integer","minimum":1,"maximum":10},"registrant":{"type":"object","properties":{"name":{"type":"string","minLength":1},"org":{"anyOf":[{"type":"string"},{"type":"null"}]},"street":{"type":"string","minLength":1},"city":{"type":"string","minLength":1},"postalCode":{"type":"string","minLength":1},"voivodeship":{"anyOf":[{"type":"string"},{"type":"null"}]},"country":{"default":"PL","type":"string","minLength":2,"maxLength":2},"email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"voice":{"type":"string","minLength":1},"fax":{"anyOf":[{"type":"string"},{"type":"null"}]},"individual":{"default":false,"type":"boolean"}},"required":["name","street","city","postalCode","email","voice"]},"tech":{"type":"object","properties":{"name":{"type":"string","minLength":1},"org":{"anyOf":[{"type":"string"},{"type":"null"}]},"street":{"type":"string","minLength":1},"city":{"type":"string","minLength":1},"postalCode":{"type":"string","minLength":1},"voivodeship":{"anyOf":[{"type":"string"},{"type":"null"}]},"country":{"default":"PL","type":"string","minLength":2,"maxLength":2},"email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"voice":{"type":"string","minLength":1},"fax":{"anyOf":[{"type":"string"},{"type":"null"}]},"individual":{"default":false,"type":"boolean"}},"required":["name","street","city","postalCode","email","voice"]},"useSameAsTech":{"default":false,"type":"boolean"},"nameservers":{"minItems":2,"maxItems":13,"type":"array","items":{"type":"object","properties":{"name":{"type":"string","minLength":1,"pattern":"^[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(\\.[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$"},"ip":{"type":"string"}},"required":["name"]}},"authInfo":{"type":"string"},"acceptTerms":{"type":"boolean"}},"required":["name","registrant","nameservers","acceptTerms"]}}}},"responses":{"201":{"description":"Powodzenie","content":{"application/json":{"example":{"id":42,"name":"przyklad.pl","cost":40}}}},"401":{"description":"Brak klucza albo klucz nieważny","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Klucz tylko do odczytu przy operacji zapisującej","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Przekroczony limit zapytań","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-required-scope":"read_write"}},"/api/v1/domains/{id}":{"get":{"tags":["Domeny"],"summary":"Szczegóły domeny","operationId":"get_domains_id_","security":[{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Identyfikator domeny","schema":{"type":"integer"}}],"responses":{"200":{"description":"Powodzenie","content":{"application/json":{"example":{"id":42,"name":"przyklad.pl","type":"DOMAIN","roid":"DOM_123-DNSPL","expiration":"2027-03-14T00:00:00.000Z","isExpired":false,"refundPending":null,"contacts":{"registrant":{"id":7,"name":"Jan Kowalski","email":"jan@przyklad.pl"},"tech":{"id":7,"name":"Jan Kowalski","email":"jan@przyklad.pl"},"admin":null,"billing":null},"nameservers":[{"name":"ns1.przyklad.pl","ips":["192.0.2.1"]}]}}}},"401":{"description":"Brak klucza albo klucz nieważny","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Klucz tylko do odczytu przy operacji zapisującej","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Przekroczony limit zapytań","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-required-scope":"read"}},"/api/v1/domains/check":{"post":{"tags":["Domeny"],"summary":"Sprawdzenie dostępności","description":"Sprawdza nazwę najpierw lokalnie, potem w rejestrze. Błąd łączności z rejestrem zwraca kod registry_error, a nie „niedostępna\".","operationId":"post_domains_check","security":[{"apiKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"name":{"type":"string","minLength":3}},"required":["name"]}}}},"responses":{"200":{"description":"Powodzenie","content":{"application/json":{"example":{"name":"przyklad.pl","available":true,"reason":"available"}}}},"401":{"description":"Brak klucza albo klucz nieważny","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Klucz tylko do odczytu przy operacji zapisującej","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Przekroczony limit zapytań","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-required-scope":"read"}},"/api/v1/domains/{id}/renew":{"post":{"tags":["Domeny"],"summary":"Odnowienie domeny","description":"Pobiera opłatę z salda. Domena wygasła jest reaktywowana z opłatą 10% za pierwszy rok.","operationId":"post_domains_id_renew","security":[{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Identyfikator domeny","schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"period":{"type":"integer","minimum":1,"maximum":10},"reactivate":{"type":"boolean"}},"required":["period"]}}}},"responses":{"200":{"description":"Powodzenie","content":{"application/json":{"example":{"message":"Domain przyklad.pl successfully renewed for 2 year(s)","expiration":"2029-03-14T00:00:00.000Z","cost":80,"reactivated":false}}}},"401":{"description":"Brak klucza albo klucz nieważny","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Klucz tylko do odczytu przy operacji zapisującej","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Przekroczony limit zapytań","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-required-scope":"read_write"}},"/api/v1/domains/{id}/register-booked":{"post":{"tags":["Domeny"],"summary":"Rejestracja z rezerwacji","description":"Zamienia rezerwację, test lub opcję (RESERVATION, TASTE, FUTURE) w pełną rejestrację na rok.","operationId":"post_domains_id_register-booked","security":[{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Identyfikator domeny","schema":{"type":"integer"}}],"responses":{"200":{"description":"Powodzenie","content":{"application/json":{"example":{"message":"Domain przyklad.pl registered from booking","name":"przyklad.pl","cost":40}}}},"401":{"description":"Brak klucza albo klucz nieważny","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Klucz tylko do odczytu przy operacji zapisującej","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Przekroczony limit zapytań","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-required-scope":"read_write"}},"/api/v1/domains/transfer":{"post":{"tags":["Domeny"],"summary":"Transfer domeny","description":"Zleca transfer na podstawie kodu authinfo. Odpowiedź 202 oznacza przyjęcie zlecenia — o wyniku decyduje rejestr.","operationId":"post_domains_transfer","security":[{"apiKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"name":{"type":"string","minLength":1,"pattern":"^[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(\\.[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$"},"authInfo":{"type":"string","minLength":1},"period":{"default":0,"type":"integer","minimum":0,"maximum":10},"renewOnTransfer":{"default":false,"type":"boolean"}},"required":["name","authInfo"]}}}},"responses":{"202":{"description":"Powodzenie","content":{"application/json":{"example":{"message":"Transfer initiated for przyklad.pl","name":"przyklad.pl","cost":0,"renewal_years":0}}}},"401":{"description":"Brak klucza albo klucz nieważny","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Klucz tylko do odczytu przy operacji zapisującej","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Przekroczony limit zapytań","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-required-scope":"read_write"}},"/api/v1/domains/{id}/nameservers":{"get":{"tags":["Serwery DNS"],"summary":"Odczyt delegacji","operationId":"get_domains_id_nameservers","security":[{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Identyfikator domeny","schema":{"type":"integer"}}],"responses":{"200":{"description":"Powodzenie","content":{"application/json":{"example":{"domain":{"id":42,"name":"przyklad.pl"},"nameservers":[{"id":5,"name":"ns1.przyklad.pl","ips":["192.0.2.1"]}]}}}},"401":{"description":"Brak klucza albo klucz nieważny","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Klucz tylko do odczytu przy operacji zapisującej","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Przekroczony limit zapytań","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-required-scope":"read"},"put":{"tags":["Serwery DNS"],"summary":"Zmiana delegacji","description":"Zastępuje całą listę serwerów DNS. Wymagane od 2 do 13 pozycji; adresy IP podaje się tylko dla serwerów w obrębie tej samej domeny.","operationId":"put_domains_id_nameservers","security":[{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Identyfikator domeny","schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"nameservers":{"minItems":2,"maxItems":13,"type":"array","items":{"type":"object","properties":{"name":{"type":"string","minLength":1,"pattern":"^[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(\\.[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$"},"ips":{"type":"array","items":{"type":"string"}}},"required":["name"]}}},"required":["nameservers"]}}}},"responses":{"200":{"description":"Powodzenie","content":{"application/json":{"example":{"message":"Nameservers updated successfully for przyklad.pl"}}}},"401":{"description":"Brak klucza albo klucz nieważny","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Klucz tylko do odczytu przy operacji zapisującej","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Przekroczony limit zapytań","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-required-scope":"read_write"}},"/api/v1/contacts":{"get":{"tags":["Kontakty"],"summary":"Lista kontaktów","operationId":"get_contacts","security":[{"apiKey":[]}],"responses":{"200":{"description":"Powodzenie","content":{"application/json":{"example":{"contacts":[{"id":7,"name":"Jan Kowalski","organisation":null,"email":"jan@przyklad.pl","street":"ul. Testowa 1","city":"Warszawa","postalCode":"00-001","voivodeship":null,"country":"PL","voice":"+48.123456789","fax":null,"individual":true,"consentForPublishing":false,"eppId":"JK123","roid":"CNT_1-DNSPL"}]}}}},"401":{"description":"Brak klucza albo klucz nieważny","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Klucz tylko do odczytu przy operacji zapisującej","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Przekroczony limit zapytań","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-required-scope":"read"},"post":{"tags":["Kontakty"],"summary":"Utworzenie kontaktu","description":"Zakłada kontakt również w rejestrze NASK.","operationId":"post_contacts","security":[{"apiKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"name":{"type":"string","minLength":1},"org":{"anyOf":[{"type":"string"},{"type":"null"}]},"street":{"type":"string","minLength":1},"city":{"type":"string","minLength":1},"postalCode":{"type":"string","minLength":1},"voivodeship":{"anyOf":[{"type":"string"},{"type":"null"}]},"country":{"default":"PL","type":"string","minLength":2,"maxLength":2},"email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"voice":{"type":"string","minLength":1},"fax":{"anyOf":[{"type":"string"},{"type":"null"}]},"individual":{"default":false,"type":"boolean"},"id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"consentForPublishing":{"default":false,"type":"boolean"}},"required":["name","street","city","postalCode","email","voice"]}}}},"responses":{"201":{"description":"Powodzenie","content":{"application/json":{"example":{"id":7,"message":"Contact Jan Kowalski created successfully"}}}},"401":{"description":"Brak klucza albo klucz nieważny","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Klucz tylko do odczytu przy operacji zapisującej","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Przekroczony limit zapytań","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-required-scope":"read_write"}},"/api/v1/contacts/{id}":{"get":{"tags":["Kontakty"],"summary":"Odczyt kontaktu","operationId":"get_contacts_id_","security":[{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Identyfikator kontaktu","schema":{"type":"integer"}}],"responses":{"200":{"description":"Powodzenie","content":{"application/json":{"example":{"id":7,"name":"Jan Kowalski","email":"jan@przyklad.pl"}}}},"401":{"description":"Brak klucza albo klucz nieważny","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Klucz tylko do odczytu przy operacji zapisującej","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Przekroczony limit zapytań","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-required-scope":"read"},"patch":{"tags":["Kontakty"],"summary":"Zmiana kontaktu","description":"Identyfikator z ciała żądania jest ignorowany — liczy się ten ze ścieżki.","operationId":"patch_contacts_id_","security":[{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Identyfikator kontaktu","schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"name":{"type":"string","minLength":1},"org":{"anyOf":[{"type":"string"},{"type":"null"}]},"street":{"type":"string","minLength":1},"city":{"type":"string","minLength":1},"postalCode":{"type":"string","minLength":1},"voivodeship":{"anyOf":[{"type":"string"},{"type":"null"}]},"country":{"default":"PL","type":"string","minLength":2,"maxLength":2},"email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"voice":{"type":"string","minLength":1},"fax":{"anyOf":[{"type":"string"},{"type":"null"}]},"individual":{"default":false,"type":"boolean"},"id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"consentForPublishing":{"default":false,"type":"boolean"}},"required":["name","street","city","postalCode","email","voice"]}}}},"responses":{"200":{"description":"Powodzenie","content":{"application/json":{"example":{"message":"Contact Jan Kowalski updated successfully"}}}},"401":{"description":"Brak klucza albo klucz nieważny","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Klucz tylko do odczytu przy operacji zapisującej","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Przekroczony limit zapytań","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-required-scope":"read_write"},"delete":{"tags":["Kontakty"],"summary":"Usunięcie kontaktu","description":"Kontakt przypisany do domeny zwraca 409 z listą tych domen.","operationId":"delete_contacts_id_","security":[{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Identyfikator kontaktu","schema":{"type":"integer"}}],"responses":{"200":{"description":"Powodzenie","content":{"application/json":{"example":{"message":"Contact Jan Kowalski deleted successfully"}}}},"401":{"description":"Brak klucza albo klucz nieważny","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Klucz tylko do odczytu przy operacji zapisującej","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Przekroczony limit zapytań","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-required-scope":"read_write"}},"/api/v1/account":{"get":{"tags":["Konto"],"summary":"Dane klienta i saldo","description":"Wyłącznie odczyt — zmiana danych klienta jest możliwa tylko w panelu, bo trafiają one na faktury.","operationId":"get_account","security":[{"apiKey":[]}],"responses":{"200":{"description":"Powodzenie","content":{"application/json":{"example":{"customer":{"id":2,"name":"Przykład sp. z o.o.","street":"ul. Testowa 1","postalCode":"00-001","city":"Warszawa","voivodeship":null,"countryCode":"PL","nip":"5252248481","email":"biuro@przyklad.pl","notifMail":"biuro@przyklad.pl","voice":"+48.123456789","accountBalance":420.5,"counts":{"domains":13,"users":2}},"key":{"scope":"read"}}}}},"401":{"description":"Brak klucza albo klucz nieważny","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Klucz tylko do odczytu przy operacji zapisującej","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Przekroczony limit zapytań","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-required-scope":"read"}},"/api/v1/transactions":{"get":{"tags":["Konto"],"summary":"Historia salda","operationId":"get_transactions","security":[{"apiKey":[]}],"parameters":[{"name":"start_date","in":"query","required":false,"description":"Data początkowa (YYYY-MM-DD)","schema":{"type":"string"}},{"name":"end_date","in":"query","required":false,"description":"Data końcowa (YYYY-MM-DD)","schema":{"type":"string"}},{"name":"type","in":"query","required":false,"description":"all, credit albo debit","schema":{"type":"string"}},{"name":"page","in":"query","required":false,"description":"Numer strony (od 1)","schema":{"type":"integer"}},{"name":"page_size","in":"query","required":false,"description":"Liczba pozycji (maks. 200)","schema":{"type":"integer"}}],"responses":{"200":{"description":"Powodzenie","content":{"application/json":{"example":{"transactions":[{"id":901,"date":"2026-08-20T10:15:00.000Z","amount":-40,"description":"Domain renewal: przyklad.pl (1 year)","balance":420.5}],"current_balance":420.5,"pagination":{"page":1,"page_size":50,"total":128,"total_pages":3,"max_page_size":200}}}}},"401":{"description":"Brak klucza albo klucz nieważny","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Klucz tylko do odczytu przy operacji zapisującej","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Przekroczony limit zapytań","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-required-scope":"read"}},"/api/v1/pricing":{"post":{"tags":["Konto"],"summary":"Wycena operacji","description":"Zwraca kwoty i pozycje jako dane liczbowe — opisy w języku klienta powstają po jego stronie.","operationId":"post_pricing","security":[{"apiKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"operation":{"type":"string","enum":["registration","renewal","transfer"]},"name":{"type":"string","minLength":3},"period":{"type":"integer","minimum":0,"maximum":10},"expired":{"type":"boolean"}},"required":["operation","name","period"]}}}},"responses":{"200":{"description":"Powodzenie","content":{"application/json":{"example":{"operation":"renewal","name":"przyklad.pl","price":84,"reactivation_fee":4,"lines":[{"kind":"first_year_with_reactivation","amount":44,"fee":4},{"kind":"additional_years","years":1,"unitPrice":40,"amount":40,"period":2},{"kind":"total","amount":84}]}}}},"401":{"description":"Brak klucza albo klucz nieważny","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Klucz tylko do odczytu przy operacji zapisującej","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Przekroczony limit zapytań","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-required-scope":"read"}}}}