Sklep internetowy

Jak połączyć własny sklep z easySales przez API

Jak połączyć własny sklep z easySales przez API

Podłącz przez API dowolny własny lub nieobsługiwany sklep do easySales: dwa potrzebne poświadczenia, wysyłanie produktów i stanów, przekazywanie zamówień i odbieranie zmian z powrotem.

Kiedy tego potrzebujesz

easySales ma gotowe konektory do popularnych platform sklepowych. Jeśli prowadzisz coś własnego — sklep zbudowany wewnętrznie albo platformę, do której nie mamy integracji — możesz podłączyć go samodzielnie przez API.

To zadanie dla programisty. Napiszesz kod, który wyśle Twój katalog do easySales i przekaże zamówienia, a easySales odezwie się do Twojego sklepu, gdy coś się zmieni. Nic z tego nie wymaga instalowania wtyczki.

Jak działa to połączenie

W grę wchodzą dwa poświadczenia, a ich pomylenie to najczęstszy powód, dla którego pierwsza integracja zwraca 403.

Poświadczenie Skąd pochodzi Jak jest wysyłane Jeśli go brakuje
Token dostępu POST /oauth/token, przy użyciu klienta OAuth utworzonego w Ustawieniach API Nagłówek Authorization: Bearer <token> 401
Token strony Krok Konfiguracja w kreatorze łączenia Pole website_token w ciele żądania, nie w nagłówku 403 Invalid website token
Dwa poświadczenia i do czego służy każde z nich

Oba są potrzebne przy każdym zapisie. Token dostępu potwierdza, kto wywołuje; token strony mówi, do którego sklepu należą dane.

Krok 1 — Dodaj stronę

Wejdź w Integracje → Strony internetowe, kliknij Połącz do strony internetowej, wypełnij formularz, a następnie wybierz kafelek API i wersję API V2 pod nim.

Formularz Połącz do strony internetowej w easySales z zaznaczonym kafelkiem API i zielonym znacznikiem, a poniżej kafelek wersji API V2 pod nagłówkiem Wybierz wersję platformy, którą używa twoja strona.
Wybierz kafelek API, a pod nim API V2.
Pole Co robi
Nazwa strony internetowej Twoja własna etykieta. Po niej rozpoznasz później swoje sklepy.
URL strony internetowej Adres Twojego sklepu, z właściwym protokołem.
Kraj Decyduje, jakie stawki VAT zaproponuje kolejne pole. Na stałe.
VAT ceny VAT stosowany do produktów, które przychodzą bez niego. Wybierany z listy, nie wpisywany.
VAT dostawy VAT stosowany do dostawy, gdy zamówienie go nie zawiera.
Język / Waluta Język sklepu i waluta, w której podajesz ceny. Oba na stałe.
Status niestandardowy dla nowego zamówienia Opcjonalne. Umieszcza każde zaimportowane zamówienie w jednym z Twoich własnych statusów.
Źródło zapasów Gdzie znajduje się wiążąca wartość stanu magazynowego. Domyślnie easySales.
Implicit package type Wartość domyślna używana przy generowaniu listów przewozowych dla tych zamówień.
Seria faktury Seria faktur używana, gdy Twój ładunek jej nie podaje.
Formularz łączenia

Krok 2 — Skopiuj token strony

Krok Konfiguracja w kreatorze pokazuje 60-znakowy token. To ten, o którym stary artykuł w ogóle nie wspomina, i ten, którego potrzebuje każde wywołanie zapisu.

Krok Konfiguracja w kreatorze łączenia easySales dla API V2, z wygenerowanym 60-znakowym tokenem strony tylko do odczytu i przyciskiem kopiowania do schowka.
Token strony. Każde wywołanie zapisu niesie go w ciele żądania.

Skopiuj go przyciskiem, zamiast przepisywać ręcznie, i przechowuj jako sekret w swojej aplikacji. Kliknij Zapisz, aby utworzyć stronę.

Sklep pojawia się teraz w Integracje → Strony internetowe i ma ten sam token na swojej karcie — tam znajdziesz go później.

Ekran Strony internetowe w easySales z kartą podłączonego sklepu API V2, jego adresem URL, VAT-em ceny, tokenem strony i przełącznikiem Aktywne.
Podłączony sklep API. Token na karcie to dokładnie ten, który wysyła Twój kod.

Krok 3 — Utwórz klienta OAuth

Wejdź w Ustawienia → Ustawienia API. Tam znajdują się poświadczenia OAuth.

Ekran Ustawienia API w easySales z listą klientów OAuth wraz z identyfikatorem, nazwą i zamaskowanym sekretem, a poniżej token dostępu osobistego.
Ustawienia → Ustawienia API. Klienci OAuth u góry, tokeny dostępu osobistego niżej.

Kliknij Utwórz nowego klienta, nazwij go po systemie, który będzie wywoływał, i ustaw Typ grantu na Website Grant.

Formularz tworzenia klienta w Ustawieniach API easySales z wypełnioną nazwą i Typem grantu ustawionym na Website Grant, z wyjaśnieniem, że Website Grant pobiera token dostępu przy użyciu website_token.
Website Grant — ten, który wymienia Twój token strony na token dostępu.

Website Grant jest zbudowany dokładnie do tego zadania: wymienia Twój token strony na token dostępu, bez przekierowania w przeglądarce i bez udziału użytkownika. Zapisz i skopiuj Identyfikator klienta oraz Sekretny, które się pojawią.

Krok 4 — Pobierz token dostępu

POST https://easy-sales.com/oauth/token
Content-Type: application/json

{
  "grant_type":    "website",
  "client_id":     "your-client-id",
  "client_secret": "your-client-secret",
  "website_token": "your-60-character-website-token",
  "scope":         "add-products update-products update-stock add-orders update-orders read-orders"
}

Odpowiedź to standardowe ciało OAuth:

{
  "token_type":    "Bearer",
  "expires_in":    31536000,
  "access_token":  "eyJ0eXAiOiJKV1Qi...",
  "refresh_token": "def50200a1b2c3..."
}

Wysyłaj go jako Authorization: Bearer <access_token> w każdym kolejnym wywołaniu.

Krok 5 — Wyślij swój katalog

Bazowy adres dla wszystkiego poniżej to https://easy-sales.com/api/v2.

Kolejność ma znaczenie. Kategorie i cechy muszą istnieć, zanim produkt będzie mógł się do nich odwołać, inaczej wywołanie produktu zostanie odrzucone.

  1. POST /categories/save — Twoje kategorie
  2. POST /characteristics/save — Twoje atrybuty
  3. POST /products/save — Twoje produkty
POST https://easy-sales.com/api/v2/products/save
Authorization: Bearer <access_token>
Content-Type: application/json

{
  "website_token": "your-60-character-website-token",
  "product": {
    "product_website_id": "10231",
    "sku": "TS-BLK-M",
    "name": "Black T-shirt, size M",
    "sale_price": 79.99,
    "full_price": 99.99,
    "stock": 24,
    "type": "simple",
    "tax_rate": 21,
    "url": "https://my-shop.example.com/p/ts-blk-m",
    "images": ["https://my-shop.example.com/img/ts-blk-m.jpg"],
    "categories": ["cat-778"],
    "characteristics": [{ "id": "char-12", "value": "Black" }]
  }
}
Pole Wymagane Uwagi
product_website_id Tak Własny identyfikator produktu w Twoim sklepie
sku Tak Unikalny w obrębie strony; klucz upsertu
name Tak
sale_price Tak Cena, którą płaci klient
stock Tak Musi być liczbą
type Tak simple lub complex
full_price Nie Cena przed rabatem, jeśli ją pokazujesz
tax_rate Nie Musi być stawką obowiązującą w kraju strony
categories Nie Twoje własne identyfikatory kategorii — każdy musi już istnieć
characteristics Nie Twoje własne identyfikatory atrybutów — każdy musi już istnieć
images Nie Tablica adresów URL, które możemy pobrać
weight, handling_time, description, url Nie Używane przez kurierów, szacowanie dostawy i oferty na marketplace'ach
Pola produktu

Krok 6 — Utrzymuj stany magazynowe w zgodzie

Stan magazynowy musi być aktualny i jest to najtańsze wywołanie, które można wykonywać często. Wyślij do 100 wierszy naraz:

PATCH https://easy-sales.com/api/v2/stocks/bulk
Authorization: Bearer <access_token>

{
  "website_token": "your-60-character-website-token",
  "data": [
    { "sku": "TS-BLK-M", "stock": 24 },
    { "sku": "TS-BLK-L", "stock": 0 }
  ]
}

Każdy SKU musi już istnieć na tej stronie; nieznane są odrzucane, a nie tworzone.

Krok 7 — Prześlij swoje zamówienia

POST https://easy-sales.com/api/v2/orders/save
Authorization: Bearer <access_token>

{
  "website_token": "your-60-character-website-token",
  "order": {
    "order_id": "SO-100244",
    "order_date": "2026-09-09 14:31:00",
    "order_total": 179.98,
    "status": "new",
    "payment_mode": "card",
    "shipment_tax": 21,
    "billing_address":  { "country": "RO", "city": "Cluj-Napoca", "street": "Str. Memorandumului 4" },
    "shipping_address": { "country": "RO", "city": "Cluj-Napoca", "street": "Str. Memorandumului 4" },
    "order_products": [
      { "product_website_id": "10231", "sku": "TS-BLK-M", "name": "Black T-shirt, size M",
        "quantity": 2, "price": 79.99, "total": 159.98 }
    ]
  }
}

Wyślij ponownie ten sam order_id, a zamówienie zostanie zaktualizowane, a nie zduplikowane — dzięki temu ponowne próby są bezpieczne.

Krok 8 — Odbieraj zmiany z powrotem

Twój sklep musi wiedzieć, kiedy zamówienie zostało zafakturowane, ma list przewozowy albo zmienia status. Zamiast odpytywać, zasubskrybuj webhook:

GET https://easy-sales.com/api/v2/webhooks
Authorization: Bearer <access_token>
POST https://easy-sales.com/api/v2/webhooks/order-updated
Authorization: Bearer <access_token>

{
  "url":    "https://my-shop.example.com/hooks/easysales",
  "secret": "a-shared-secret-of-at-least-24-characters"
}

Subskrybujesz po jednym zdarzeniu naraz, więc powtórz wywołanie dla każdego z order-created, order-updated, awb-created, invoice-created i delivery-status-updated.

Każda dostawa jest podpisana, więc zweryfikuj podpis, zanim zaufasz treści. Odpowiadaj szybko — żądanie wygasa po kilku sekundach i jest ponawiane ograniczoną liczbę razy, więc najpierw potwierdź, a przetwarzaj później.

Limity

Limit Wartość
Żądania 500 na minutę w całym API
Żądania o token 60 na minutę — buforuj swój token
Produkty, stany, ceny, kategorie, cechy na jedno wywołanie zbiorcze 100
Produkty na jedno zbiorcze archiwizowanie 50
Strony na konto 30
Opis produktu 65 534 znaki
Limity, pod które warto zaprojektować integrację

Kiedy coś zawiedzie

Kod Znaczenie Zwykła przyczyna
400 Invalid json Ciało żądania nie jest poprawnym JSON-em
401 Brak uwierzytelnienia Brakujący, wygasły lub uszkodzony token dostępu
403 Invalid website token Brakuje website_token albo jest błędny
403 The website has been deactivated Przełącznik Aktywne strony jest wyłączony
422 Walidacja nie powiodła się Brakuje wymaganego pola, SKU się powtarza albo kategoria lub cecha jeszcze nie istnieje
429 Zbyt wiele żądań Ponad 500 na minutę
503 Chwilowo niedostępne Przyjmowanie danych jest przeciążone; ponów po podanym czasie
Co oznacza każdy kod odpowiedzi

Wszystko, co zawiedzie po naszej stronie, trafia też do Produkty → Sklepy Online → Błędy strony internetowej, wraz z ładunkiem i akcją ponowienia, co zwykle jest szybsze niż odtwarzanie wywołania.

Dokumentacja

Pełna dokumentacja endpointów, z każdym polem i każdą odpowiedzią, jest opublikowana pod adresem https://api.easy-sales.com.

Często zadawane pytania

Token dostępu to token bearer OAuth2, który identyfikuje Twoje konto, i trafia do nagłówka Authorization. Token strony identyfikuje jeden konkretny sklep i trafia do ciała żądania jako website_token. Wywołania zapisu potrzebują obu: 401 oznacza, że błędny jest token dostępu, a 403 z komunikatem "Invalid website token" — że błędny jest token strony.

Dla własnego sklepu nie ma częstotliwości odświeżania i nie ma na nią pola w formularzu. Nic nie jest odpytywane — to Ty decydujesz, kiedy wysyłasz produkty, stany i zamówienia, a zmiany otrzymujesz z powrotem przez webhooki. Stary artykuł opisywał pole, które nie jest już częścią procesu łączenia.

Nie. Strony typu API nie są testowane pod kątem połączenia, bo easySales nie ma czego wywołać, dopóki nie zaczniesz wysyłać danych. Plakietka jest ustawiana w chwili utworzenia rekordu. Prawdziwym testem jest to, czy Twoje produkty pojawiają się w Produkty → Sklepy Online → Produkty.

Website Grant. Jest zbudowany dokładnie do tego: wymienia token strony na token dostępu bez przekierowania i bez udziału użytkownika, czyli dokładnie tak, jak potrzebuje integracja serwer-serwer. Token dostępu osobistego też zadziała, ale obejmuje całe konto zamiast jednego sklepu i jest pokazywany tylko raz.

Tokeny dostępu, tokeny odświeżania i tokeny dostępu osobistego są ważne przez rok. Token strony w ogóle nie wygasa — żyje, dopóki nie klikniesz Odśwież token albo nie usuniesz strony. Buforuj token dostępu, zamiast pobierać nowy przy każdym wywołaniu; endpoint tokenu ma limit 60 żądań na minutę.

Kategorie i cechy muszą istnieć, zanim produkt będzie mógł się do nich odwołać. Wyślij najpierw kategorie, potem cechy, a na końcu produkty. To samo dotyczy zbiorczych aktualizacji stanów: każdy SKU musi już istnieć na stronie.

Tak, jeśli używasz endpointów /save. POST /products/save wykonuje upsert po SKU, a POST /orders/save po order_id, więc ponowne próby są bezpieczne, a powtórzone dostawy nie tworzą duplikatów. Zwykłe endpointy POST /products i POST /orders odrzucają duplikaty błędem 422.

Nie w przypadku własnego sklepu. Stan płynie w jedną stronę, z Twojego sklepu do easySales, więc Twój sklep pozostaje źródłem prawdy. Wraca natomiast to, co dotyczy zamówień: zmiany statusu, listy przewozowe i faktury, dostarczane przez webhooki, które zasubskrybujesz.

Czy ten przewodnik był pomocny?