Endpointy API
Lista dostępnych endpointów, parametry list, wymagane pola, przykłady curl i obsługa błędów.
Ostatnia aktualizacja:
Bazowy URL, format odpowiedzi i paginacja
Wszystkie endpointy są dostępne pod adresem https://app.bakepilot.pl/api/v1/. Odpowiedzi są w formacie JSON (UTF-8), daty w formacie ISO 8601, kwoty w walucie dokumentu. Pojedynczy zasób jest w polu data. Listy są stronicowane parametrami limit i offset, a odpowiedź ma pole meta z total (liczba wszystkich pozycji), limit i offset. Pełną, zawsze aktualną specyfikację z możliwością przetestowania na żywo znajdziesz pod /api/v1/docs (Swagger), a maszynowy opis OpenAPI pod /api/v1/openapi.
- Bazowy URL: https://app.bakepilot.pl/api/v1/
- Lista: { data: [...], meta: { total, limit, offset } }; pojedynczy zasób: { data: {...} }
- Paginacja: limit (domyślnie 50, maksymalnie 200; produkty i składniki do 500) i offset (od 0)
- Dokumentacja interaktywna (Swagger): https://app.bakepilot.pl/api/v1/docs
- Specyfikacja OpenAPI: https://app.bakepilot.pl/api/v1/openapi
Otwórz interaktywną dokumentację API (Swagger) (otwiera się w nowej karcie)
Przykład wywołania (curl)
Klucz przekazujesz w nagłówku Authorization: Bearer albo X-API-Key. Poniższe wywołanie pobiera recepturę przeliczoną na 100 sztuk - te same liczby, które zobaczysz na wydruku w aplikacji.
- curl -H "Authorization: Bearer bp_live_TWOJ_KLUCZ" "https://app.bakepilot.pl/api/v1/recipes?limit=20"
- curl -H "Authorization: Bearer bp_live_TWOJ_KLUCZ" "https://app.bakepilot.pl/api/v1/recipes/ID_RECEPTURY?qty=100"
- curl -H "X-API-Key: bp_live_TWOJ_KLUCZ" "https://app.bakepilot.pl/api/v1/wz?status=issued&limit=50"
- curl -X POST -H "Authorization: Bearer bp_live_TWOJ_KLUCZ" -H "Content-Type: application/json" -d '{"customer_name":"Anna Kowalska","customer_phone":"600100200","pickup_date":"2026-10-01T10:00:00","items":[{"product_name":"Jagodzianka","quantity":6,"unit_price":12,"total_price":72}]}' https://app.bakepilot.pl/api/v1/orders
Zamówienia
GET /orders zwraca zamówienia organizacji od najnowszego (parametry limit, offset oraz status). GET /orders/{id} zwraca zamówienie razem z pozycjami (order_items). POST /orders tworzy zamówienie - domyślnie w statusie Szkic (draft), a polem status możesz od razu ustawić confirmed, in_production lub ready. Klient jest dopasowywany po customer_id, numerze telefonu lub NIP-ie albo tworzony automatycznie. Pozycje przekazujesz w polu items.
- GET /orders - lista (limit, offset, status)
- GET /orders/{id} - zamówienie z pozycjami
- POST /orders - utworzenie zamówienia, status domyślny draft (Szkic)
- Wymagane: customer_name, pickup_date, items (minimum jedna pozycja)
- Pozycja: product_name, quantity, unit_price, total_price; product_id, variant_id i configuration opcjonalne
- Dodatkowe pola: payment_method_note (gotowka, przelew, karta, termin), crates_small, crates_medium, crates_large
- Statusy delivered i cancelled nie są dozwolone przy tworzeniu
Wskazówka: Zaliczka: deposit większe od zera ustawia od razu datę wpłaty zaliczki (deposit_paid_at).
Klienci
GET /customers zwraca klientów organizacji od najnowszego (limit, offset). POST /customers dodaje klienta. Tworzenie jest idempotentne: jeśli istnieje już klient o tym samym telefonie, e-mailu lub NIP-ie, API zwraca jego id z polem deduplicated: true zamiast tworzyć duplikat - chyba że dodasz parametr ?force=true.
- GET /customers - lista klientów (limit, offset)
- POST /customers - dodanie klienta, odpowiedź { id, deduplicated }
- Wymagane: first_name, last_name
- Opcjonalne: phone, email, nip, address, customer_type (b2c lub b2b), b2b_discount, zgody marketingowe
- Dedup po telefonie, e-mailu lub NIP-ie; ?force=true zawsze tworzy nowego
Produkty
GET /products zwraca katalog produktów organizacji ułożony alfabetycznie - domyślnie tylko aktywne, parametr active=false pokazuje wszystkie, search filtruje po nazwie. GET /products/{id} zwraca produkt z wariantami (product_variants), składem na etykietę, alergenami, wagą netto i terminem przydatności. Produktów nie tworzysz przez API - obsługujesz je w panelu.
- GET /products - katalog (limit do 500, offset, active, search)
- GET /products/{id} - produkt z wariantami, składem i alergenami
- Tworzenie i edycja produktów: w panelu aplikacji
Receptury i składniki (tylko odczyt)
GET /recipes zwraca listę receptur z wydajnością („Z wypieku wychodzi”: yield_unit i portions_count), wagą wypieku i kosztami. GET /recipes/{id} zwraca recepturę ze składnikami: dla każdej pozycji nazwę, ilość w gramach (amount_grams), a przy półproduktach sub_recipe_id. Parametr qty przelicza recepturę na wielkość produkcji w jednostce receptury - w polu scaled_amount_grams dostajesz ilości pomnożone, a w scaling mnożnik i wagę po przeliczeniu. GET /ingredients i GET /ingredients/{id} zwracają bazę składników z cenami za kg, wartościami odżywczymi i nazwą na etykietę.
- GET /recipes - lista (limit, offset, active, search)
- GET /recipes/{id}?qty=100 - receptura przeliczona na 100 sztuk / kg / blach
- Receptura bez ustawionej wydajności: scaling.factor = null i unavailable_reason
- GET /ingredients, GET /ingredients/{id} - baza składników (limit do 500, offset, active, search)
- Uprawnienia klucza: recipes:read, ingredients:read (klucze utworzone wcześniej dostały je automatycznie)
Wskazówka: Ilości w recepturze są zawsze w gramach - także dla składników kupowanych w sztukach czy litrach.
Dokumenty WZ, oferty i umowy (tylko odczyt)
GET /wz zwraca dokumenty WZ od najnowszego (parametr status: issued, invoiced, cancelled), a GET /wz/{id} dokument z pozycjami (wz_items: nazwa produktu, ilość, cena netto i brutto, stawka VAT). GET /offers i GET /offers/{id} zwracają oferty z pozycjami (offer_items), GET /contracts i GET /contracts/{id} umowy z warunkami płatności i datami wysłania oraz podpisania. Dokumentów nie tworzysz przez API - powstają w panelu.
- GET /wz, GET /wz/{id} - dokumenty WZ z pozycjami (uprawnienie wz:read)
- GET /offers, GET /offers/{id} - oferty z pozycjami (offers:read)
- GET /contracts, GET /contracts/{id} - umowy (contracts:read)
- Każda lista przyjmuje limit, offset i status
Obsługa błędów
API zwraca standardowe kody HTTP: 200 (sukces), 201 (utworzono), 400 (błędny JSON), 401 (brak lub błędny klucz), 403 (plan bez API albo klucz bez wymaganego uprawnienia), 404 (zasób nie istnieje w Twojej organizacji), 422 (błędne dane wejściowe albo parametry, np. limit poza zakresem), 429 (limit zapytań, nagłówek Retry-After), 500 (błąd po naszej stronie). Każdy błąd ma format JSON { error: { code, message } }, a komunikat (message) jest po polsku.
- 200 / 201 - sukces / utworzono
- 400 - nieprawidłowy JSON
- 401 - brak lub błędny klucz API
- 403 - plan bez API (kod plan_required) albo klucz bez uprawnienia
- 404 - zasób nie istnieje (także cudzy identyfikator)
- 422 - błędne dane wejściowe lub parametry
- 429 - przekroczono limit 120 zapytań na minutę, nagłówek Retry-After
- 500 - błąd serwera, szczegóły zapisujemy po naszej stronie