API dla agentów AI

Ostatnia aktualizacja: 03.09.2026

Ta strona opisuje publiczne API serwisu Szambi — na tyle dokładnie, żeby asystent działający w imieniu użytkownika mógł zapisać go na listę oczekujących albo zgłosić firmę do programu partnerskiego bez zgadywania i bez wysyłania próbnych żądań. Opis maszynowy tego samego API znajdziesz w specyfikacji OpenAPI 3.1.

Punkty startowe

Odkrywanie zaczyna się od katalogu API w standardowej przestrzeni /.well-known/, zgodnie z RFC 9727. Strona główna ogłasza go nagłówkiem Link: </.well-known/api-catalog>; rel="api-catalog" oraz znacznikiem <link rel="api-catalog"> w sekcji <head>.

AdresCo zawiera
/.well-known/api-catalogKatalog API w formacie application/linkset+json: odnośniki do specyfikacji, tej dokumentacji i health-checku.
/openapi.jsonSpecyfikacja OpenAPI 3.1 — pola, limity długości, kody błędów.
/llms.txtSkondensowany opis produktu, cennik i etap projektu. Stąd bierz odpowiedzi o produkcie, nie z API.
Accept: text/markdownKażda podstrona wydana jako czysty markdown zamiast HTML-a. Ten sam plik leży też pod adresem podstrony z dopiskiem index.md.
/sitemap.xmlPełna lista publicznych adresów.
/api/healthStan usługi. Odpowiedź 200 oznacza, że API działa.

Zasady korzystania

Dwa endpointy zapisu przyjmują dane osobowe i wysyłają e-mail do wskazanej osoby. Dlatego obowiązują przy nich reguły twardsze niż zwykłe „nie przekraczaj limitu":

  • Zapis wykonuj tylko na wyraźną prośbę użytkownika. Zapisanie kogoś, kto o to nie prosił, wysyła mu e-mail, którego się nie spodziewa, i umieszcza jego dane w naszej bazie bez podstawy.
  • Znacznik zgody to moment zgody użytkownika, nie moment wysłania żądania. Pola consentTimestamp i zgodaTimestamp są dokumentacją zgody na przetwarzanie danych (RODO). Wpisz w nie czas, w którym użytkownik potwierdził, że zna politykę prywatności, w formacie ISO 8601 ze strefą czasową — bez strefy żądanie zostanie odrzucone kodem NO_CONSENT. Data poprawna, ale z przyszłości albo starsza niż 30 dni, wraca jako CONSENT_OUT_OF_WINDOW: zgody sprzed miesiąca nie przyjmiemy, trzeba ją odebrać na nowo.
  • Przesyłaj wyłącznie dane podane przez użytkownika. Adres e-mail musi być jego własny — to na niego idzie potwierdzenie z numerem referencyjnym. Nie uzupełniaj pól zgadywanymi wartościami.
  • Numer referencyjny pokaż użytkownikowi. refId z odpowiedzi 201 to jedyny identyfikator, po którym można później znaleźć zgłoszenie.
  • Odpowiedzi 409 nie ponawiaj. Oznacza, że zgłoszenie już istnieje — powtórzenie żądania niczego nie zmieni.
  • Przedstaw się w User-Agent. Nazwa agenta i adres kontaktowy pomagają odróżnić ruch asystentów od nadużyć, gdy patrzymy na limity.
  • Nie wywołuj /api/wizyta. To licznik wejść ludzi na stronę; odczyt treści przez agenta nie jest wizytą i zafałszowałby statystykę.

Serwis nie prowadzi sprzedaży i nie przyjmuje płatności. Lista pozycji wysłana w polu zamowienie jest deklaracją zainteresowania, a nie zamówieniem ani rezerwacją towaru — szczegóły w regulaminie.

Zapis na listę oczekujących

POST /api/waitlist — zapisuje osobę lub firmę na listę oczekujących na zestaw Szambi. Kluczem jest adres e-mail. Limit: 3 zapisy na godzinę z jednego adresu IP.

POST https://szambi.pl/api/waitlist
Content-Type: application/json

{
  "name": "Anna Kowalska",
  "email": "[email protected]",
  "phone": "+48 600 100 200",
  "consentTimestamp": "2026-09-03T10:15:00+02:00",
  "zamowienie": [{ "id": "zestaw", "ilosc": 1 }]
}

Wymagane: name (2–100 znaków), email (do 254 znaków), consentTimestamp. Opcjonalne: phone (do 20 znaków) oraz zamowienie — lista pozycji z cennika przedsprzedaży, każdy produkt najwyżej raz, ilość od 1 do 20:

  • zestaw — Zestaw Szambi (600 zł)
  • czujnik — Sam czujnik (500 zł)
  • stacja — Sama stacja bazowa (200 zł)

Zapis firmowy włącza się polem isBusiness: true (musi być booleanem) i wymaga dodatkowo companyName oraz taxId — NIP-u lub KRS-u zapisanego cyframi. Ceny i opis zamówienia liczy serwer z własnego cennika, więc kwot się nie przesyła.

HTTP/1.1 201 Created
Content-Type: application/json

{
  "success": true,
  "refId": "SZB-7K2M9QX4",
  "position": 128,
  "message": "Zapisano na listę oczekujących."
}

Zgłoszenie do programu partnerskiego

POST /api/partner — zgłoszenie firmy instalacyjnej lub serwisowej do programu partnerskiego. Kluczem jest NIP: sprawdzana jest jego suma kontrolna, a firma już zgłoszona dostaje kod 409. Limit: 5 zgłoszeń na godzinę z jednego adresu IP.

POST https://szambi.pl/api/partner
Content-Type: application/json

{
  "imie": "Jan",
  "nazwisko": "Nowak",
  "firma": "Instalacje Nowak",
  "nip": "1234563218",
  "email": "[email protected]",
  "telefon": "+48 600 100 200",
  "wiadomosc": "Montujemy zbiorniki na Podlasiu.",
  "zgodaTimestamp": "2026-09-03T10:15:00+02:00"
}

Wymagane: imie (2–60 znaków), nazwisko (2–80), firma (2–160), nip (10 cyfr), email (do 254 znaków), zgodaTimestamp. Opcjonalne: telefon (do 20 znaków) i wiadomosc (do 1000 znaków). Przekroczenie któregokolwiek z tych limitów wraca jako FIELD_TOO_LONG z nazwą pola w komunikacie — wartości nie obcinamy za nadawcę. Odpowiedź 201 zawiera refId w formacie SZP-XXXXXXXX.

Zgłoszenie jest nawiązaniem kontaktu, nie zawarciem umowy — obszar działania i warunki współpracy ustalamy indywidualnie, poza serwisem.

Błędy i limity

Każdy błąd wraca jako JSON ze stałym kodem w polu error i komunikatem po polsku w polu message — dotyczy to również błędów sprzed walidacji, takich jak zepsuty JSON czy zbyt duże ciało żądania. Komunikat można pokazać użytkownikowi wprost; decyzje podejmuj po kodzie, bo treść komunikatów bywa poprawiana.

HTTP/1.1 409 Conflict
Content-Type: application/json

{
  "error": "DUPLICATE_EMAIL",
  "message": "Ten adres e-mail jest już na liście."
}
KodHTTPZnaczenie
INVALID_JSON400Ciało żądania nie jest poprawnym JSON-em — parser odrzucił je przed walidacją pól.
INVALID_NAME, NAME_TOO_LONG400Imię krótsze niż 2 znaki albo dłuższe niż 100.
INVALID_EMAIL, EMAIL_TOO_LONG400Adres e-mail niepoprawny albo dłuższy niż 254 znaki.
INVALID_PHONE, PHONE_TOO_LONG400Telefon nie jest tekstem albo przekracza 20 znaków.
INVALID_BUSINESS400Pole isBusiness nie jest booleanem.
NO_CONSENT400Brak znacznika zgody albo zły format daty — wymagana strefa czasowa.
CONSENT_OUT_OF_WINDOW400Data poprawna, ale spoza okna: z przyszłości lub starsza niż 30 dni. U człowieka zwykle znaczy przestawiony zegar urządzenia.
INVALID_ORDER400Nieznana pozycja, powtórzony produkt albo ilość poza zakresem.
INVALID_COMPANY, COMPANY_TOO_LONG, INVALID_TAX_ID400Zapis firmowy bez nazwy firmy, nazwa dłuższa niż 160 znaków albo NIP/KRS spoza zakresu 9–14 cyfr. Wartości nie obcinamy za nadawcę.
INVALID_IMIE, INVALID_NAZWISKO, INVALID_FIRMA, INVALID_NIP400Braki w zgłoszeniu partnerskim; NIP ma sprawdzaną sumę kontrolną.
FIELD_TOO_LONG400Pole zgłoszenia partnerskiego przekracza swój limit znaków. Komunikat nazywa pole; wartości nie obcinamy za nadawcę.
CORS_FORBIDDEN403Żądanie z przeglądarki, której origin nie jest na liście dozwolonych. Klienta bez nagłówka Origin — agenta, curla, serwera — nie dotyczy.
NOT_FOUND404Nieznany adres pod /api — sprawdź ścieżkę w specyfikacji OpenAPI.
DUPLICATE_EMAIL, DUPLICATE_NIP409Zgłoszenie już istnieje. Ponowienie żądania niczego nie zmieni.
PAYLOAD_TOO_LARGE413Ciało żądania przekracza 10 kB. Skróć wiadomość albo listę pozycji.
RATE_LIMITED429Przekroczony limit żądań z jednego adresu IP.
SERVER_ERROR500Błąd serwera — zgłoszenie NIE zostało zapisane.

Limity liczone są per adres IP, a odpowiedź 429 niesie nagłówek Retry-After z liczbą sekund do ponowienia oraz standardowe nagłówki RateLimit-* z pozostałym budżetem i czasem odnowienia. Po 429 odczekaj czas z Retry-After zamiast ponawiać żądanie od razu.

Budżet zużywa każde żądanie POST, także odrzucone — zgłoszenie z błędem 400 kosztuje tyle samo, co zapisane. Przy trzech zapisach na godzinę dwie pomyłki w polach wyczerpują więc limit przed pierwszym udanym zapisem, dlatego pola sprawdzaj u siebie przed wysłaniem, a nie metodą prób. Pozostały budżet niesie nagłówek RateLimit-Remaining, dokładany również do odpowiedzi 400.

Kontakt

Aqsod Sp. z o.o.
Młynowa 80 / U1, 15-404 Białystok, Polska
E-mail: [email protected]
Telefon: +48 538 444 491

Problem ze specyfikacją albo pole, którego brakuje w opisie? Napisz — poprawimy dokumentację, zamiast kazać zgadywać.