Store API
Wszystkie trasy Store API dodawane przez plugin, z parametrami i kształtem odpowiedzi.
Wszystkie trasy wymagają nagłówka z kluczem publikowalnym, jak każda trasa
/store, i odpowiadają tylko dla opublikowanych produktów z kanałów sprzedaży tego
klucza.
Trasy odczytu dla strony produktu są pod /store/products/:id/..., więc
wdrożenie, które publicznie wystawia tylko GET /store/products*, nie potrzebuje
dla nich zmian w ingressie. Trasy odstąpienia to żądania POST pod
/store/consumer-compliance/ i muszą być osiągalne.
Zgodność produktu
GET /store/products/:id/compliance?region_id=reg_...&locale=pl
region_id (albo zamiast niego currency_code) wybiera kontekst cenowy.
Odpowiedź:
{
"product_id": "prod_01...",
"variants": [
{
"variant_id": "variant_01...",
"currency_code": "pln",
"tax_inclusive": true,
"omnibus": {
"status": "ok",
"current_amount": 80,
"original_amount": 100,
"is_reduced": true,
"reduction_started_at": "2026-10-10T08:00:00.000Z",
"reference_price": 100,
"reference_basis": "lowest_in_window",
"reference_label": "lowest_30_days",
"reference_label_text": "Najniższa cena z 30 dni przed obniżką",
"reduction_percent": 20,
"window_days": 30,
"window_start": "2026-09-09T22:00:00.000Z",
"window_end": "2026-10-09T22:00:00.000Z",
"offered_less_than_window": false,
"history_incomplete": false,
"reference_not_higher": false,
"lowest_price_in_window": 80,
"reason": null
},
"unit_price": { "amount": 47.06, "reference_unit": "l", "reference_label": "l", "based_on": "net_quantity", "same_as_price": false },
"deposit": { "amount": 0.5, "currency_code": "pln" }
}
],
"safety": {
"applicable": true,
"manufacturer": { "name": "Producent sp. z o.o.", "trade_name": null, "postal_address": "ul. Prosta 1, Warszawa", "country_code": "pl", "email": "kontakt@producent.example", "url": null },
"responsible_person": null,
"product_identifier": "Model X-1",
"variant_identifiers": [{ "variant_id": "variant_01...", "sku": "KETTLE-1", "barcode": null, "ean": "5901234123457", "upc": null }],
"warnings": "Nie zanurzać w wodzie.",
"safety_information": null,
"safety_document_urls": [],
"accessibility_notes": null
}
}omnibus.status ma wartość no_price, gdy wariant nie ma ceny w kontekście, i
exempt dla produktów oznaczonych jako nieobjęte. unit_price i deposit są
null, gdy nie zostały skonfigurowane. Znaczenie pól opisują strony
Omnibus i Ceny jednostkowe.
Wiele wariantów naraz
GET /store/consumer-compliance/variants?ids=variant_1,variant_2®ion_id=...
Do 100 identyfikatorów, dla stron list. Zwraca { "variants": [...] } z takimi
samymi obiektami wariantów jak wyżej. Identyfikatory niewidoczne dla klucza są
pomijane.
GET /store/consumer-compliance/variants/:id/omnibus?region_id=...
Blok omnibus jednego wariantu.
Obie trasy przyjmują reduction_started_at=data ISO, żeby policzyć obniżkę spoza
cenników, na przykład kampanię z kodem rabatowym zaczętą w tym momencie.
Informacje
GET /store/consumer-compliance/disclosures?locale=pl
{
"reviews": { "enabled": true, "text": "Opinie mogą wystawiać wyłącznie osoby, które kupiły produkt..." },
"personalised_pricing": { "used": false, "text": null },
"withdrawal": {
"period_days": 14,
"labels": { "entry": "Odstąp od umowy tutaj", "confirm": "Potwierdź odstąpienie od umowy" },
"text": null
},
"omnibus_note": null
}Zgody przy zamówieniu
GET /store/consumer-compliance/carts/:id/consents?locale=pl zwraca cart_id,
locale, can_complete, blocking (null albo { code, keys }) i
consents[]: key, version, required, purpose, text (treść do
wyświetlenia dosłownie), link, line_item_ids, status (missing,
outdated, accepted), accepted_version, accepted_at. Przykład całego ciała
jest w wersji angielskiej i w pliku OpenAPI.
POST /store/consumer-compliance/carts/:id/consents
{ "locale": "pl", "acceptances": [{ "key": "digital_immediate_delivery", "version": 2 }] }Zapisuje każdą akceptację z dokładną treścią w tym języku, chwilą, IP i
przeglądarką klienta, i odpowiada tym samym ciałem co GET. Klucz, który nie
dotyczy koszyka, jest odrzucany (400); wersja inna niż bieżąca jest odrzucana z
kodem consent_version_outdated. Wtedy POST /store/carts/:id/complete się
udaje; bez akceptacji kończy się błędem consent_required albo
consent_version_outdated. Zob. Zgody przy zamówieniu.
Odstąpienie
Wszystkie trzy trasy przyjmują zalogowanego klienta (sesja lub token) i działają dla gości.
POST /store/consumer-compliance/withdrawals/lookup
{ "display_id": "1042", "email": "jan@example.com" }Zalogowany klient może wysłać samo { "order_id": "order_..." }. Zwraca
zamówienie (id, display_id, placed_at, canceled) i assessment: dla
każdej pozycji eligible, excluded_reason, basis (delivery,
contract_conclusion, awaiting_delivery), deadline_at, within_period, a
także deadline_at całego zamówienia, right_of_withdrawal (applies,
excluded_digital_consent, none_eligible), legal_basis (treść po polsku i
angielsku, przy excluded_digital_consent), digital_consent_at i
digital_consent_missing (zob. sekcję o treściach cyfrowych w
Odstąpieniu). Każda pozycja ma też legal_basis, gdy jest
wyłączona jako treść cyfrowa dostarczona za zgodą. Dla zamówienia z Allegro lub
innego serwisu wyszukiwanie odpowiada 200 z assessment: null i
external_marketplace_order (kod external_marketplace_order): obowiązuje proces
serwisu, a etap pierwszy jest odrzucany z tym kodem. Niezgodność danych i nieznane zamówienie
dają 404.
POST /store/consumer-compliance/withdrawals
{
"display_id": "1042",
"email": "jan@example.com",
"customer_name": "Jan Kowalski",
"contact_email": "jan@example.com",
"items": [{ "line_item_id": "ordli_...", "quantity": 1 }],
"statement": "optional, the default wording is used when omitted",
"reason": "optional, never required",
"locale": "pl"
}Bez items odstąpienie obejmuje wszystkie uprawnione pozycje. Odpowiedź 201 z
{ "withdrawal": {...}, "confirmation_token": "..." }. Odstąpienie ma status
pending_confirmation i nie jest jeszcze złożone. Błędy: pozycja wyłączona, ilość
większa niż zamówiona, anulowane zamówienie albo (przy rejectOutsidePeriod)
upływ terminu.
POST /store/consumer-compliance/withdrawals/:id/confirm
{ "token": "..." }Składa oświadczenie: status: "confirmed", ustawione submitted_at, wysłane
potwierdzenie (acknowledgement_sent_at). Zły token, nieznany identyfikator i
już potwierdzone żądanie dają 404. Wygasłe żądanie daje 400 i trzeba zacząć od
nowa.
GET /store/consumer-compliance/withdrawals (tylko zalogowany klient)
Złożone odstąpienia klienta.
Publiczny obiekt odstąpienia nigdy nie zawiera skrótu tokenu, szczegółów oceny ani notatek przedsiębiorcy.