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
- 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. - Każde zapytanie wysyłasz na adres
https://app.sellmatic.online/api/v1z nagłówkiemAuthorization: Bearer sm_live_…. - 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.
| Zakres | Co pozwala zrobić |
|---|---|
| orders.read | Odczyt zamówień, statusów, wpłat, zwrotów, eksport zamówień |
| orders.write | Wszystko z orders.read oraz tworzenie i edycja zamówień, statusy, wpłaty, akcje masowe |
| products.read | Odczyt produktów, kategorii, marek, szablonów opisów, eksport katalogu |
| products.write | Wszystko z products.read oraz tworzenie, edycja i usuwanie produktów, zdjęcia, import |
| inventory.read | Magazyny i ruchy magazynowe |
| inventory.write | Wszystko 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 wystarczy2026-09-27. - Identyfikatory to UUID. Numer zamówienia widoczny w panelu jest w polu
number, a numer z Allegro wexternalId. - 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": "…"
}
}| 400 | VALIDATION_FAILED | Błędne dane. W details[] są pola (path) i opis problemu (message). |
| 401 | UNAUTHENTICATED | Brak klucza, klucz błędny, unieważniony albo wygasły. |
| 403 | FORBIDDEN | Klucz nie ma potrzebnego zakresu (details.missing) albo endpoint nie jest dostępny dla kluczy. |
| 404 | NOT_FOUND | Nie ma takiego zasobu w Twojej organizacji. |
| 409 | CONFLICT | Konflikt, np. nieaktualne version przy edycji produktu albo zajęte SKU. |
| 429 | RATE_LIMITED | Za dużo zapytań. Odczekaj chwilę i ponów. |
| 500 | INTERNAL | Błą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.readLista 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.readZamówienie ze wszystkimi pozycjami, klientem, adresami, wpłatami, przesyłkami i historią.
- GET
/orders/countsorders.readLiczba zamówień w każdym statusie.
- GET
/orders/exportorders.readEksport CSV z tymi samymi filtrami co lista.
- GET
/order-statusesorders.readStatusy zamówień (id potrzebne do zmiany statusu i filtrów).
- GET
/order-status-groupsorders.readGrupy statusów.
- GET
/order-extra-fieldsorders.readPola dodatkowe zamówień.
- GET
/orders/:id/paymentsorders.readWpłaty zamówienia.
- GET
/returnsorders.readZwroty. Filtry: status (NEW|ACCEPTED|REFUNDED|REJECTED), q, page.
- POST
/ordersorders.writeNowe zamówienie. Dostaje źródło „api”.
- PATCH
/orders/:idorders.writeEdycja danych zamówienia, m.in. extraFields: { [idPola]: "wartość" }.
- PUT
/orders/:id/statusorders.writeZmiana statusu: { statusId }. Uruchamia automatyczne akcje „ustawiono status”.
- POST
/orders/:id/notesorders.writeNotatka w historii zamówienia: { message }.
- POST
/orders/:id/itemsorders.writeNowa pozycja. PATCH / DELETE /orders/:id/items/:itemId: edycja i usunięcie.
- PUT
/orders/:id/shipping-costorders.writeKoszt wysyłki: { shippingCost }.
- POST
/orders/:id/paymentsorders.writeWpłata: { amount, method?, paidAt?, note? }. Ujemna kwota to zwrot.
- POST
/orders/bulkorders.writeAkcja masowa na { ids[] } albo { filter }: status, add_tag, remove_tag, star, delete, restore.
- POST
/orders/:id/custom-events/:eventIdorders.writeWywoł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.readLista 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.readProdukt z wariantami, zdjęciami i stanami.
- GET
/products/exportproducts.readEksport: format=csv|xlsx|json|xml, z filtrami listy.
- GET
/products/:id/historyproducts.readHistoria zmian produktu, wariantów, zdjęć i stanów.
- GET
/categoriesproducts.readDrzewo kategorii. Zapis (products.write): POST, PATCH, DELETE /categories/:id.
- GET
/brandsproducts.readMarki. Zapis (products.write): POST, PATCH, DELETE /brands/:id.
- POST
/productsproducts.writeNowy produkt. Wymagane: sku, name i priceGross albo priceNet.
- PATCH
/products/:idproducts.writeEdycja. Wymaga pola version z ostatniego odczytu (409 CONFLICT, gdy ktoś zmienił produkt w międzyczasie).
- DELETE
/products/:idproducts.writePrzeniesienie do kosza. POST /products/:id/restore przywraca.
- POST
/products/:id/variantsproducts.writeNowy wariant. PATCH / DELETE /products/:id/variants/:variantId.
- POST
/products/:id/imagesproducts.writeZdjęcia: multipart, pole files (do 10 plików po 15 MB).
- POST
/products/bulkproducts.writeZmiana masowa na { ids[] } albo { filter }: price, vat, add_tag, remove_tag, category, status, delete, restore.
- POST
/importsproducts.writeImport 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.readMagazyny (warehouseId potrzebny do zmiany stanu).
- GET
/products/:id/stock-movementsinventory.readOstatnie 100 ruchów magazynowych produktu.
- POST
/products/:id/stockinventory.writeZmiana 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