Dokumentacja API · wersja 1

API katalogu dropshippers.pl

Pobieraj nasz katalog do swojego systemu i wystawiaj oferty automatycznie. API zwraca nazwy, opisy i zdjęcia produktów, a po 10 opłaconych zamówieniach także Twoją cenę zakupu i dostępność. Format JSON, klucz w nagłówku, synchronizacja samych zmian. Dla systemów, które wczytują produkty z pliku, także XML i CSV.

Szybki start

1

Konto i zamówienia

Załóż konto sprzedawcy. API włącza się automatycznie po 10 opłaconych zamówieniach. Wcześniejszy dostęp do katalogu możemy włączyć ręcznie: napisz na czacie w panelu.

2

Klucz w panelu

W panelu sprzedawcy otwórz zakładkę 🔌 API i kliknij „Wygeneruj klucz API”. Klucz pokazujemy tylko raz, więc od razu zapisz go w bezpiecznym miejscu.

3

Pierwsze zapytanie

Wyślij zapytanie z kluczem w nagłówku X-API-Key. Odpowiedź przyjdzie w formacie JSON.

Pierwsze zapytanie (curl)
curl -H "X-API-Key: dsk_twój_klucz" \
  "https://dropshippers.pl/api/v1/products?limit=100"

Klucz API

Każde zapytanie wysyłasz z nagłówkiem X-API-Key: twój_klucz. Działa też Authorization: Bearer twój_klucz. Klucza w adresie URL nie przyjmujemy, bo adresy trafiają do logów i historii przeglądarki.

  • Jeden klucz na konto. Wygenerowanie nowego od razu unieważnia poprzedni.
  • Tylko na serwerze. API jest przeznaczone do połączeń serwer z serwerem. Przeglądarka nie odczyta odpowiedzi z kodu strony WWW, więc klucza nie umieszczaj w kodzie sklepu.
  • Klucz działa niezależnie od hasła do panelu. Zmiana hasła go nie unieważnia, a unieważnienie klucza nie wyloguje Cię z panelu.
  • Wyciek? Wygeneruj nowy klucz w zakładce 🔌 API. Stary przestaje działać natychmiast.

Endpointy

Adres bazowy: https://dropshippers.pl/api/v1. Wszystkie endpointy tylko odczytują dane.

Metoda i adresCo zwraca
GET /feed.xml, GET /feed.csvCały katalog jako plik do importu. Autoryzacja tokenem pliku, nie kluczem API (opis niżej, w sekcji Plik XML i CSV).
GET /productsProdukty z katalogu, te same, które widzisz w panelu w zakładce Nowe zamówienie. Stronicowanie kursorem.
GET /products/{id}Jeden produkt po ID albo kodzie, np. /products/123 lub /products/DS-123.
POST, GET /ordersZamówienia przez API (po włączeniu), opis niżej w sekcji Zamówienia przez API.

Lista produktów

ParametrOpis
limitLiczba produktów na stronie. Domyślnie 50, maksymalnie 100.
cursorWartość next_cursor z poprzedniej odpowiedzi. Pobieraj kolejne strony, dopóki has_more jest true.
updated_sinceTylko produkty zmienione od podanej chwili, format ISO 8601, np. 2026-10-16T08:00:00Z. Bez strefy czasowej przyjmujemy UTC.
codeJeden produkt po kodzie, np. DS-123.
Odpowiedź
{
  "data": [
    {
      "id": 123,
      "code": "DS-123",
      "name": "Torebka damska",
      "description_text": "Opis produktu…",
      "description_html": "<p>Opis produktu…</p>",
      "images": [
        "https://dropshippers.pl/uploads_products/prod_123.jpg",
        "https://dropshippers.pl/uploads_materials/123/abc.jpg"
      ],
      "price": 24.5,
      "availability": "available",
      "active": true,
      "updated_at": "2026-10-16T08:12:40Z"
    }
  ],
  "limit": 100, "total": 240, "has_more": true,
  "next_cursor": "MjAyNi0xMC0xNiAwODoxMjo0MHwxMjM"
}

Synchronizacja zmian

Nie musisz co godzinę pobierać całego katalogu. Wystarczą dwa kroki:

  1. Pierwsze pobranie: GET /products?limit=100, potem kolejne strony z parametrem cursor, dopóki has_more jest true. Zapamiętaj najnowsze updated_at, jakie dostałeś.
  2. Kolejne razy, np. co 15 minut: GET /products?updated_since= zapamiętany czas. Dostaniesz tylko produkty zmienione od tej chwili, też stronami z kursorem.

Produkt z "active": false wypadł z naszego katalogu. Wyłącz wtedy u siebie ofertę. Taki rekord zawiera tylko id, code, active i updated_at. Ten sam produkt może przyjść więcej niż raz, to normalne.

Twoja cena zależy od Twoich rabatów. Po awansie rangi albo zmianie rabatu zrób pełne pobieranie katalogu, żeby mieć aktualne ceny. Najprościej raz na dobę.

Plik XML i CSV

Jeśli Twój system wczytuje katalog z adresu pliku i nie potrafi wysłać klucza w nagłówku, użyj pliku XML albo CSV. Zawiera te same dane co API: cały katalog oraz produkty wycofane w ostatnich 30 dniach.

  • Adres pliku tworzysz w panelu, w zakładce 🔌 API. Zawiera osobny token, inny niż klucz API. Pokazujemy go tylko raz, a unieważnisz go jednym kliknięciem.
  • Token w adresie (?token=) albo jako login i hasło w adresie: https://feed:TOKEN@dropshippers.pl/api/v1/feed.xml. Druga forma nie zostawia tokenu w logach po drodze, użyj jej, jeśli Twój system ją obsługuje.
  • Odświeżanie: plik generujemy co 15 minut. Można go pobrać do 12 razy na godzinę, w praktyce wystarczy raz na godzinę.
AdresFormat
GET /feed.xmlXML w UTF-8. Jeden element <product id="…"> na produkt.
GET /feed.csvCSV w UTF-8, separator średnik, pierwszy wiersz to nagłówki, teksty w cudzysłowach. Zdjęcia w kolumnach image_1, image_2 i kolejnych.
feed.xml (fragment)
<products generated_at="2026-10-16T08:00:00Z" count="240">
  <product id="123">
    <code>DS-123</code>
    <active>1</active>
    <name><![CDATA[Torebka damska]]></name>
    <price>24.50</price>
    <quantity>10</quantity>
    <availability>available</availability>
    <description><![CDATA[<p>Opis produktu…</p>]]></description>
    <description_text><![CDATA[Opis produktu…]]></description_text>
    <images>
      <image>https://dropshippers.pl/uploads_products/prod_123.jpg</image>
    </images>
    <updated_at>2026-10-16T08:12:40Z</updated_at>
  </product>
  <product id="98">
    <code>DS-98</code>
    <active>0</active>
    <quantity>0</quantity>
    <updated_at>2026-10-16T09:01:05Z</updated_at>
  </product>
</products>

quantity nie jest stanem magazynu. Dla produktu dostępnego podajemy stałą wartość, dla niedostępnego i wycofanego 0. Dzięki temu Twój system sam wstrzyma ofertę, gdy produktu zabraknie. Cena i ilość są puste do 10 opłaconych zamówień, tak jak w API.

Pola produktu

PoleOpis
idID produktu w dropshippers.pl. Nie zmienia się.
codeStały kod produktu w API (DS- i ID). Służy do łączenia z Twoim systemem. W swoich ofertach nadajesz własne oznaczenia.
nameNazwa produktu. Może mieć wartość null, gdy produkt nie ma jeszcze nazwy handlowej. Wtedy nazwij ofertę sam.
description_textOpis do oferty jako zwykły tekst. Może mieć wartość null.
description_htmlTen sam opis w prostym HTML (akapity, listy, pogrubienia). Może mieć wartość null.
imagesPełne adresy zdjęć. Pierwsze to zdjęcie główne, dalej galeria. Pobierz je do siebie, zamiast linkować do nas z ofert.
priceTwoja cena zakupu u nas za sztukę, w złotych brutto. Ta sama, którą zapłacisz, składając zamówienie w panelu. Pojawia się po 10 opłaconych zamówieniach, wcześniej null.
availabilityavailable (jest) albo out_of_stock (brak). Odświeżane mniej więcej co 45 minut. Po 10 opłaconych zamówieniach, wcześniej null.
activetrue: produkt jest w katalogu. false (tylko przy updated_since): produkt wycofany.
updated_atCzas ostatniej zmiany któregokolwiek z powyższych pól, w UTC.

Limity

  • 60 zapytań na minutę i 5000 na dobę na jeden klucz.
  • 120 zapytań na minutę z jednego adresu IP.
  • Maksymalnie 100 produktów na stronie.

Ile zapytań zostało w bieżącej minucie, pokazuje nagłówek odpowiedzi RateLimit-Remaining. Pełne pobranie katalogu to kilka zapytań, więc synchronizacja co 15 minut mieści się w limitach z dużym zapasem.

Kody błędów

Błąd zwracamy jako JSON z jednym polem: {"error": "opis"}.

KodZnaczenie
400Zły parametr: updated_since, cursor albo code.
401Brak klucza albo klucz nieprawidłowy lub unieważniony.
403API nieaktywne dla konta: przed 10 opłaconymi zamówieniami albo wyłączone przez nas.
404Nie ma takiego produktu w katalogu albo nieznany adres.
429Przekroczony limit zapytań. Odczekaj chwilę i spróbuj ponownie.
500Błąd po naszej stronie. Spróbuj za kilka minut.

Przykład w JavaScript (Node.js 18+)

Pełne pobranie katalogu ze stronicowaniem kursorem:

sync.js
const KEY = process.env.DROPSHIPPERS_API_KEY; // klucz trzymaj w zmiennej środowiskowej
const BASE = 'https://dropshippers.pl/api/v1/products?limit=100';

async function fetchAll(since) {
  const all = [];
  let cursor = null;
  do {
    let url = BASE;
    if (since) url += '&updated_since=' + encodeURIComponent(since);
    if (cursor) url += '&cursor=' + cursor;
    const res = await fetch(url, { headers: { 'X-API-Key': KEY } });
    if (!res.ok) throw new Error('API: ' + res.status);
    const page = await res.json();
    all.push(...page.data);
    cursor = page.next_cursor;
  } while (cursor);
  return all;
}

fetchAll().then(products => console.log(products.length, 'produktów'));

Zamówienia przez API

Twój system może sam zakładać u nas paczki: wysyła etykietę PDF, produkty i swój numer zamówienia. Zamawianie przez API włączamy ręcznie, napisz do nas na czacie w panelu. Używasz tego samego klucza API.

  1. Twój system wysyła zamówienie (POST /orders). Paczka trafia do koszyka w panelu, w dzwonku 🔔.
  2. Płacisz raz za wybrane paczki jedną płatnością PayU, kiedy chcesz. Dopiero opłacona paczka idzie do pakowania.
  3. Przypominamy o nieopłaconych paczkach po 24 i 48 godzinach. Po 72 godzinach bez płatności paczkę anulujemy.
  4. Status i numer przesyłki pobierasz przez GET /orders.
Metoda i adresCo robi
POST /ordersZakłada paczkę. multipart/form-data: label (PDF, do 5 MB i 10 stron), items (JSON), external_id (Twój numer zamówienia, od 1 do 64 znaków), notes (opcjonalnie).
GET /ordersZamówienia złożone przez API. Parametry: updated_since, cursor, limit (max 100), external_id.
GET /orders/{id}Jedno zamówienie.
POST /orders/{id}/cancelAnuluje zamówienie, jeśli nie jest jeszcze pakowane.
Założenie paczki (curl)
curl -H "X-API-Key: dsk_twój_klucz" \
  -F "label=@etykieta.pdf;type=application/pdf" \
  -F 'items=[{"code":"DS-123","quantity":2},{"product_id":456,"quantity":1}]' \
  -F "external_id=ZAM-100234" \
  "https://dropshippers.pl/api/v1/orders"
Odpowiedź 201
{
  "data": {
    "id": 5120,
    "external_id": "ZAM-100234",
    "status": "awaiting_payment",
    "cancel_reason": null,
    "total": 73.5,
    "items": [
      { "product_id": 123, "code": "DS-123", "quantity": 2, "unit_price": 24.5 },
      { "product_id": 456, "code": "DS-456", "quantity": 1, "unit_price": 24.5 }
    ],
    "tracking_number": "620000000000000000000000",
    "tracking_courier": "inpost",
    "label_check": false,
    "created_at": "2026-10-20T08:12:40Z",
    "updated_at": "2026-10-20T08:12:40Z"
  }
}
  • Produkty: items to lista {"product_id": 123, "quantity": 2} albo {"code": "DS-123", "quantity": 2}. Do 10 różnych produktów w jednej paczce, ilość od 1 do 999. Ten sam produkt podany dwa razy sumujemy.
  • Cena: liczymy ją u nas, tak samo jak w panelu: Twoja cena zakupu w chwili przyjęcia zamówienia.
  • Ten sam external_id drugi raz: nie zakładamy nowej paczki, tylko oddajemy istniejącą (kod 200, pole "idempotent": true). Bezpieczne przy ponawianiu po błędzie sieci.
  • Etykieta: numer przesyłki odczytujemy z PDF. Jeśli go nie rozpoznamy, przyjmujemy paczkę z "label_check": true i sprawdzamy etykietę ręcznie. Ta sama etykieta (ten sam plik albo numer przesyłki) w ciągu 30 dni daje błąd 409.
  • Limity: 200 zamówień i 20 000 zł na dobę, do tego limity zapytań klucza.
  • created_at po zapłacie pokazuje chwilę przyjęcia paczki do realizacji.
StatusZnaczenie
awaiting_paymentPaczka czeka w koszyku na Twoją płatność.
acceptedOpłacona, czeka na pakowanie.
packingWłaśnie ją pakujemy.
packedSpakowana, czeka na kuriera.
shippedNadana.
deliveredDoręczona.
problemCoś wymaga wyjaśnienia, napiszemy na czacie.
cancelledAnulowana. cancel_reason: payment_timeout (72 godziny bez płatności) albo cancelled.

Anulowanie przez POST /orders/{id}/cancel: paczkę nieopłaconą anulujemy od razu; opłaconą, dopóki jej nie pakujemy, a pieniądze wracają na Twoje saldo w panelu. Paczki w trakcie pakowania i później anulować się nie da (kod 409).

Błędy zamówień: 400 zły formularz, produkt albo PDF, 403 zamawianie wyłączone albo brak danych do faktury, 409 powtórzona etykieta albo płatność w toku, 429 limit dzienny.

Załóż konto i zacznij od pierwszych zamówień

Konto działa od razu po rejestracji. API katalogu włącza się po 10 opłaconych zamówieniach.

Zarejestruj się
Bez abonamentu Płacisz tylko za zamówiony towar

Pytania

Ile kosztuje dostęp do API? +
Nic. API jest bezpłatne dla sprzedawców dropshippers.pl. Płacisz tylko za zamówiony u nas towar, tak jak w panelu.
Dlaczego API odpowiada błędem 403? +
Najczęściej dlatego, że konto nie ma jeszcze 10 opłaconych zamówień. Licznik widzisz w panelu w zakładce 🔌 API. Wcześniejszy dostęp do katalogu możemy włączyć ręcznie: napisz do nas na czacie w panelu.
Dlaczego pola price i availability mają wartość null? +
Twoja cena zakupu i dostępność pojawiają się w API po 10 opłaconych zamówieniach. Do tego czasu katalog (nazwy, opisy, zdjęcia) działa normalnie, a te dwa pola są puste.
Czy API pokazuje, ile sztuk jest w magazynie? +
Nie. Pole availability ma tylko dwie wartości: available (jest) albo out_of_stock (brak). Odświeżamy je mniej więcej co 45 minut, więc częstsze odpytywanie nie da nowszych danych.
Czy mogę podłączyć API do swojego systemu sprzedaży? +
Tak. Jeśli Twój system potrafi pobierać dane z API w formacie JSON z kluczem w nagłówku, programista podłączy katalog na podstawie tej dokumentacji. Jeśli wczytuje produkty z pliku pod adresem URL, użyj pliku XML lub CSV. Gotowej wtyczki do konkretnego systemu nie mamy. Link do niej skopiujesz w panelu przyciskiem „Kopiuj link dla programisty”.
Czy przez API mogę składać zamówienia? +
Tak, po włączeniu przez nas (napisz na czacie w panelu). Twój system wysyła paczkę z etykietą PDF, a Ty opłacasz zebrane paczki jedną płatnością z dzwonka w panelu. Szczegóły w sekcji Zamówienia przez API.
Co zrobić, gdy klucz wyciekł? +
W panelu w zakładce 🔌 API kliknij „Wygeneruj nowy klucz”. Stary klucz przestaje działać od razu. Nowy wpisz w swoim systemie.