Sellmatic

Dla programistów i partnerów

Dokumentacja API

REST API Sellmatic pozwala połączyć z kontem sprzedawcy własny system, program magazynowy, hurtownię albo firmę realizującą wysyłki. Dostęp daje klucz API, który właściciel konta tworzy w menu Połączenia i przekazuje Tobie.

Szybki start

  1. Właściciel konta wchodzi w Połączenia → Klucze API → Nowy klucz, zaznacza zakresy i kopiuje klucz w postaci sm_live_…. Klucz jest pokazywany tylko raz.
  2. Każde zapytanie wysyłasz na adres https://app.sellmatic.online/api/v1 z nagłówkiem Authorization: Bearer sm_live_….
  3. Odpowiedzi i treść zapytań są w formacie JSON (UTF-8).
curl "https://app.sellmatic.online/api/v1/orders?pageSize=10" \
  -H "Authorization: Bearer sm_live_…"

Uwierzytelnianie i zakresy

Klucz jest przypisany do jednej organizacji (konta sprzedawcy). Widzisz tylko jej dane i tylko w zakresach, które zaznaczył właściciel. Nie potrzebujesz ciasteczek ani nagłówka organizacji. Jeśli jednak wyślesz x-organization-id, musi się zgadzać z organizacją klucza.

ZakresCo pozwala zrobić
orders.readOdczyt zamówień, statusów, wpłat, zwrotów, eksport zamówień
orders.writeWszystko z orders.read oraz tworzenie i edycja zamówień, statusy, wpłaty, akcje masowe
products.readOdczyt produktów, kategorii, marek, szablonów opisów, eksport katalogu
products.writeWszystko z products.read oraz tworzenie, edycja i usuwanie produktów, zdjęcia, import
inventory.readMagazyny i ruchy magazynowe
inventory.writeWszystko z inventory.read oraz zmiana stanów

Klucz nie daje dostępu do ustawień konta, użytkowników, integracji, faktur ani innych kluczy. Każda zmiana wykonana kluczem jest zapisywana w dzienniku audytu z nazwą klucza. Właściciel może unieważnić klucz w każdej chwili, a dostęp znika natychmiast.

Konwencje

  • Paginacja: ?page=1&pageSize=50. Odpowiedź listy: { items, total, page, pageSize }.
  • Kwoty w odpowiedziach są tekstem z kropką ("249.99"), żeby nie tracić groszy. W zapytaniach możesz wysłać liczbę albo tekst, najwyżej 2 miejsca po przecinku.
  • Daty w formacie ISO 8601 (2026-09-27T10:00:00Z). W filtrach wystarczy 2026-09-27.
  • Identyfikatory to UUID. Numer zamówienia widoczny w panelu jest w polu number, a numer z Allegro w externalId.
  • Stawki VAT: "23", "8", "5", "0" (tekst).

Błędy i limity

Każdy błąd ma ten sam kształt:

{
  "error": {
    "code": "FORBIDDEN",
    "message": "Nie masz uprawnień do wykonania tej operacji.",
    "requestId": "…"
  }
}
400VALIDATION_FAILEDBłędne dane. W details[] są pola (path) i opis problemu (message).
401UNAUTHENTICATEDBrak klucza, klucz błędny, unieważniony albo wygasły.
403FORBIDDENKlucz nie ma potrzebnego zakresu (details.missing) albo endpoint nie jest dostępny dla kluczy.
404NOT_FOUNDNie ma takiego zasobu w Twojej organizacji.
409CONFLICTKonflikt, np. nieaktualne version przy edycji produktu albo zajęte SKU.
429RATE_LIMITEDZa dużo zapytań. Odczekaj chwilę i ponów.
500INTERNALBłąd po naszej stronie. Podaj requestId z odpowiedzi, gdy piszesz do wsparcia.

Limit: 300 zapytań na minutę. Po przekroczeniu dostaniesz 429. Do synchronizacji dużych katalogów używaj filtrów (np. statusChangedFrom) i większych stron zamiast pobierania wszystkiego za każdym razem.

Zamówienia

Zamówienia ze wszystkich źródeł (Allegro, ręczne, API) w jednym miejscu. Zmiana statusu przez API uruchamia te same automatyczne akcje co zmiana w panelu.

  • GET/ordersorders.read

    Lista zamówień. Filtry: q, statusId, statusIds, source, integrationId, paid (paid|unpaid|partial), dateFrom, dateTo, statusChangedFrom, statusChangedTo, minTotal, maxTotal, currency, country, tag, hasShipment, hasInvoice (yes|no). Sortowanie: sort (orderedAt, statusChangedAt, number, totalGross…), order (asc|desc). Strony: page, pageSize ≤ 200.

  • GET/orders/:idorders.read

    Zamówienie ze wszystkimi pozycjami, klientem, adresami, wpłatami, przesyłkami i historią.

  • GET/orders/countsorders.read

    Liczba zamówień w każdym statusie.

  • GET/orders/exportorders.read

    Eksport CSV z tymi samymi filtrami co lista.

  • GET/order-statusesorders.read

    Statusy zamówień (id potrzebne do zmiany statusu i filtrów).

  • GET/order-status-groupsorders.read

    Grupy statusów.

  • GET/order-extra-fieldsorders.read

    Pola dodatkowe zamówień.

  • GET/orders/:id/paymentsorders.read

    Wpłaty zamówienia.

  • GET/returnsorders.read

    Zwroty. Filtry: status (NEW|ACCEPTED|REFUNDED|REJECTED), q, page.

  • POST/ordersorders.write

    Nowe zamówienie. Dostaje źródło „api”.

  • PATCH/orders/:idorders.write

    Edycja danych zamówienia, m.in. extraFields: { [idPola]: "wartość" }.

  • PUT/orders/:id/statusorders.write

    Zmiana statusu: { statusId }. Uruchamia automatyczne akcje „ustawiono status”.

  • POST/orders/:id/notesorders.write

    Notatka w historii zamówienia: { message }.

  • POST/orders/:id/itemsorders.write

    Nowa pozycja. PATCH / DELETE /orders/:id/items/:itemId: edycja i usunięcie.

  • PUT/orders/:id/shipping-costorders.write

    Koszt wysyłki: { shippingCost }.

  • POST/orders/:id/paymentsorders.write

    Wpłata: { amount, method?, paidAt?, note? }. Ujemna kwota to zwrot.

  • POST/orders/bulkorders.write

    Akcja masowa na { ids[] } albo { filter }: status, add_tag, remove_tag, star, delete, restore.

  • POST/orders/:id/custom-events/:eventIdorders.write

    Wywołanie zdarzenia własnego, np. żeby uruchomić wybrane automatyczne akcje.

Produkty

Katalog produktów z wariantami, zdjęciami, kategoriami i markami. SKU jest unikalne w organizacji (produkty i warianty razem).

  • GET/productsproducts.read

    Lista produktów. Filtry: q (nazwa, SKU, EAN), categoryId, brandId, status (active|inactive), stock (in|low|out), tag, priceMin, priceMax. Sortowanie: name, sku, priceGross, stockAvailable, createdAt, updatedAt. pageSize ≤ 500.

  • GET/products/:idproducts.read

    Produkt z wariantami, zdjęciami i stanami.

  • GET/products/exportproducts.read

    Eksport: format=csv|xlsx|json|xml, z filtrami listy.

  • GET/products/:id/historyproducts.read

    Historia zmian produktu, wariantów, zdjęć i stanów.

  • GET/categoriesproducts.read

    Drzewo kategorii. Zapis (products.write): POST, PATCH, DELETE /categories/:id.

  • GET/brandsproducts.read

    Marki. Zapis (products.write): POST, PATCH, DELETE /brands/:id.

  • POST/productsproducts.write

    Nowy produkt. Wymagane: sku, name i priceGross albo priceNet.

  • PATCH/products/:idproducts.write

    Edycja. Wymaga pola version z ostatniego odczytu (409 CONFLICT, gdy ktoś zmienił produkt w międzyczasie).

  • DELETE/products/:idproducts.write

    Przeniesienie do kosza. POST /products/:id/restore przywraca.

  • POST/products/:id/variantsproducts.write

    Nowy wariant. PATCH / DELETE /products/:id/variants/:variantId.

  • POST/products/:id/imagesproducts.write

    Zdjęcia: multipart, pole files (do 10 plików po 15 MB).

  • POST/products/bulkproducts.write

    Zmiana masowa na { ids[] } albo { filter }: price, vat, add_tag, remove_tag, category, status, delete, restore.

  • POST/importsproducts.write

    Import z pliku lub URL feedu (CSV, XLSX, XML, JSON). Postęp: GET /imports/:id.

Stany magazynowe

Zmiana stanu zapisuje ruch magazynowy z powodem. Jeśli sprzedawca ma włączone wysyłanie stanów do Allegro, nowy stan trafi też do powiązanych ofert.

  • GET/warehousesinventory.read

    Magazyny (warehouseId potrzebny do zmiany stanu).

  • GET/products/:id/stock-movementsinventory.read

    Ostatnie 100 ruchów magazynowych produktu.

  • POST/products/:id/stockinventory.write

    Zmiana stanu: { warehouseId, variantId?, mode: "set" | "delta", quantity, reason? }.

Przykłady

Opłacone zamówienia z ostatniego dnia

curl "https://app.sellmatic.online/api/v1/orders?paid=paid&dateFrom=2026-09-26&pageSize=100" \
  -H "Authorization: Bearer sm_live_…"
{
  "items": [
    {
      "id": "3f6c…",
      "number": 10482,
      "externalId": "a1b2c3d4-…",
      "source": "allegro",
      "status": { "id": "9e1d…", "name": "Do wysyłki", "color": "#f97316" },
      "totalGross": "249.99",
      "currency": "PLN",
      "orderedAt": "2026-09-26T18:42:11.000Z",
      …
    }
  ],
  "total": 37,
  "page": 1,
  "pageSize": 100
}

Zmiana statusu zamówienia

Id statusu weźmiesz z GET /order-statuses.

curl -X PUT "https://app.sellmatic.online/api/v1/orders/3f6c…/status" \
  -H "Authorization: Bearer sm_live_…" \
  -H "Content-Type: application/json" \
  -d '{ "statusId": "9e1d…" }'

Nowe zamówienie

curl -X POST "https://app.sellmatic.online/api/v1/orders" \
  -H "Authorization: Bearer sm_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "customer": { "firstName": "Anna", "lastName": "Nowak", "email": "anna@example.com", "phone": "+48600100200" },
    "items": [
      { "sku": "KUB-001", "name": "Kubek ceramiczny", "quantity": 2, "unitPriceGross": "39.90", "vatRate": "23" }
    ],
    "shippingCost": "12.99",
    "shippingMethod": "InPost Paczkomat",
    "paymentStatus": "PAID",
    "shippingAddress": { "name": "Anna Nowak", "street": "Prosta 1", "city": "Warszawa", "postalCode": "00-001", "countryCode": "PL" }
  }'

Ustawienie stanu produktu

curl -X POST "https://app.sellmatic.online/api/v1/products/7a2e…/stock" \
  -H "Authorization: Bearer sm_live_…" \
  -H "Content-Type: application/json" \
  -d '{ "warehouseId": "c41b…", "mode": "set", "quantity": 25, "reason": "Dostawa od hurtowni" }'

Potrzebujesz endpointu, którego tu nie ma?

Napisz na info@sellmatic.online, co chcesz połączyć. API rozwijamy razem z panelem, a kolejne zasoby (przesyłki, faktury, webhooki) udostępniamy etapami.

Załóż konto i utwórz klucz