{"name":"DropShoping API","version":"1.0","description":"API platformy dropshippingowej DropShoping","authentication":{"apiKey":{"header":"X-API-Key","alternative":"Authorization: Bearer {key}","scope":"/api/v1/*"},"session":{"header":"Authorization: Bearer {jwt}","obtain":"POST /api/auth/login","scope":"/api/* (panel)"},"webhook":{"header":"X-Nouviro-Signature","scope":"POST /api/webhooks/nouviro"}},"authLabels":{"api-key":"Klucz API (X-API-Key)","session":"Sesja JWT (Bearer)","none":"Publiczne","webhook":"Webhook przychodzący"},"categories":[{"id":"intro","label":"Wprowadzenie"},{"id":"auth","label":"Autoryzacja"},{"id":"v1","label":"API zewnętrzne (v1)"},{"id":"products","label":"Produkty"},{"id":"shops","label":"Kanały sprzedaży"},{"id":"wholesalers","label":"Hurtownie"},{"id":"orders","label":"Zamówienia"},{"id":"opportunities","label":"Okazje"},{"id":"settings","label":"Ustawienia i marże"},{"id":"monitor","label":"Monitor"},{"id":"automation","label":"Automatyzacja (boty)"},{"id":"jobs","label":"Joby (kolejka)"},{"id":"catalog","label":"Import do katalogu"},{"id":"scraper","label":"Scraper (ceny)"},{"id":"webhooks","label":"Webhooki"}],"endpoints":[{"id":"intro-base","method":"GET","path":"/","title":"Bazowy URL","description":"Wszystkie endpointy są względem adresu Twojej instancji DropShoping. W development: http://localhost:3000","auth":"none","category":"intro","notes":["Format odpowiedzi: JSON (application/json)","Błędy zwracają obiekt { \"error\": \"komunikat\" }","Kody HTTP: 200 sukces, 201 utworzono, 400 błąd walidacji, 401 brak autoryzacji, 404 nie znaleziono, 500 błąd serwera"]},{"id":"auth-login","method":"POST","path":"/api/auth/login","title":"Logowanie (sesja panelu)","description":"Zwraca token JWT używany w panelu webowym i requestach z Authorization: Bearer.","auth":"none","category":"auth","body":[{"name":"email","type":"string","required":true,"description":"Adres email konta"},{"name":"password","type":"string","required":true,"description":"Hasło"}],"requestExample":"{\n  \"email\": \"jan@example.com\",\n  \"password\": \"twoje_haslo\"\n}","responseExample":"{\n  \"token\": \"eyJhbGciOiJIUzI1NiIs...\",\n  \"user\": {\n    \"id\": \"clxxx\",\n    \"email\": \"jan@example.com\",\n    \"name\": \"Jan\"\n  }\n}","curlExample":"curl -X POST https://twoja-domena.pl/api/auth/login \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"email\":\"jan@example.com\",\"password\":\"haslo\"}'"},{"id":"auth-register","method":"POST","path":"/api/auth/register","title":"Rejestracja konta","description":"Tworzy konto użytkownika i zwraca token JWT.","auth":"none","category":"auth","body":[{"name":"email","type":"string","required":true,"description":"Unikalny email"},{"name":"password","type":"string","required":true,"description":"Min. 6 znaków"},{"name":"name","type":"string","description":"Imię lub nazwa firmy"}],"requestExample":"{\n  \"email\": \"jan@example.com\",\n  \"password\": \"haslo123\",\n  \"name\": \"Jan Kowalski\"\n}","responseExample":"{\n  \"token\": \"eyJhbGciOiJIUzI1NiIs...\",\n  \"user\": { \"id\": \"clxxx\", \"email\": \"jan@example.com\", \"name\": \"Jan Kowalski\" }\n}"},{"id":"auth-me","method":"GET","path":"/api/auth/me","title":"Bieżący użytkownik","description":"Zwraca dane zalogowanego użytkownika na podstawie tokena JWT.","auth":"session","category":"auth","responseExample":"{\n  \"id\": \"clxxx\",\n  \"email\": \"jan@example.com\",\n  \"name\": \"Jan Kowalski\"\n}"},{"id":"keys-list","method":"GET","path":"/api/keys","title":"Lista kluczy API","description":"Zwraca aktywne klucze (bez pełnej wartości — tylko prefix).","auth":"session","category":"auth","responseExample":"[\n  {\n    \"id\": \"clxxx\",\n    \"name\": \"Integracja ERP\",\n    \"keyPrefix\": \"ds_a1b2c3d4\",\n    \"isActive\": true,\n    \"lastUsedAt\": \"2026-07-09T12:00:00.000Z\",\n    \"createdAt\": \"2026-07-01T10:00:00.000Z\"\n  }\n]"},{"id":"keys-create","method":"POST","path":"/api/keys","title":"Generuj klucz API","description":"Tworzy klucz do API zewnętrznego (/api/v1/*). Pełny klucz zwracany jest tylko raz w polu key.","auth":"session","category":"auth","body":[{"name":"name","type":"string","required":true,"description":"Etykieta klucza"}],"responseExample":"{\n  \"id\": \"clxxx\",\n  \"name\": \"Integracja ERP\",\n  \"key\": \"ds_64znakowyhex...\",\n  \"keyPrefix\": \"ds_a1b2c3d4\",\n  \"message\": \"Zapisz klucz teraz. Nie będzie widoczny ponownie.\"\n}"},{"id":"v1-products-list","method":"GET","path":"/api/v1/products","title":"Lista produktów","description":"Główny endpoint API zewnętrznego. Zwraca produkty z źródłami cen i aktywnymi ofertami w sklepach.","auth":"api-key","category":"v1","responseExample":"{\n  \"products\": [\n    {\n      \"id\": \"clxxx\",\n      \"name\": \"Słuchawki Pro\",\n      \"sku\": \"SLU-001\",\n      \"sources\": [\n        {\n          \"id\": \"clxxx\",\n          \"platform\": \"bigbuy\",\n          \"sourceUrl\": \"wholesaler://bigbuy/12345\",\n          \"currentPrice\": 34.2,\n          \"isAvailable\": true,\n          \"isLowest\": true\n        }\n      ],\n      \"listings\": [\n        {\n          \"id\": \"clxxx\",\n          \"status\": \"ACTIVE\",\n          \"listedPrice\": 41.04,\n          \"shopConnection\": { \"name\": \"Sklep WooCommerce\", \"platform\": \"WOOCOMMERCE\" }\n        }\n      ]\n    }\n  ]\n}","curlExample":"curl https://twoja-domena.pl/api/v1/products \\\n  -H \"X-API-Key: ds_twoj_klucz\""},{"id":"v1-products-create","method":"POST","path":"/api/v1/products","title":"Dodaj produkt i wystaw w sklepie","description":"Tworzy produkt z co najmniej jednym źródłem ceny i od razu publikuje ofertę w podłączonym sklepie (z marżą z ustawień).","auth":"api-key","category":"v1","body":[{"name":"name","type":"string","required":true,"description":"Nazwa produktu"},{"name":"sku","type":"string","description":"SKU / identyfikator"},{"name":"description","type":"string","description":"Opis produktu"},{"name":"imageUrl","type":"string (url)","description":"URL zdjęcia"},{"name":"shopConnectionId","type":"string","required":true,"description":"ID z sekcji Kanały sprzedaży"},{"name":"sources","type":"array","required":true,"description":"Min. 1 źródło ceny"},{"name":"sources[].sourceUrl","type":"string (url)","required":true,"description":"URL produktu u dostawcy lub wholesaler://bigbuy/ID"},{"name":"sources[].platform","type":"string","required":true,"description":"Np. bigbuy, cj_dropshipping, amazon"},{"name":"sources[].compareOnly","type":"boolean","description":"true dla Allegro/Ceneo — tylko porównanie"}],"requestExample":"{\n  \"name\": \"Słuchawki bezprzewodowe Pro\",\n  \"sku\": \"SLU-001\",\n  \"description\": \"Opis produktu\",\n  \"imageUrl\": \"https://example.com/img.jpg\",\n  \"shopConnectionId\": \"clxxx_id_sklepu\",\n  \"sources\": [\n    {\n      \"sourceUrl\": \"wholesaler://bigbuy/12345\",\n      \"platform\": \"bigbuy\"\n    },\n    {\n      \"sourceUrl\": \"https://www.ceneo.pl/123456\",\n      \"platform\": \"ceneo\",\n      \"compareOnly\": true\n    }\n  ]\n}","responseExample":"{\n  \"product\": { \"id\": \"clxxx\", \"name\": \"Słuchawki...\", \"sources\": [...] },\n  \"listing\": {\n    \"id\": \"clxxx\",\n    \"status\": \"ACTIVE\",\n    \"listedPrice\": 41.04,\n    \"sourcePrice\": 34.2,\n    \"marginPercent\": 20,\n    \"externalId\": \"123\"\n  }\n}","curlExample":"curl -X POST https://twoja-domena.pl/api/v1/products \\\n  -H \"X-API-Key: ds_twoj_klucz\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"name\": \"Słuchawki Pro\",\n    \"shopConnectionId\": \"clxxx\",\n    \"sources\": [{\n      \"sourceUrl\": \"wholesaler://bigbuy/12345\",\n      \"platform\": \"bigbuy\"\n    }]\n  }'","notes":["Marża liczona z ustawień konta (defaultMarginPercent, minMarginAmount) i reguł per kategoria","Platformy porównawcze (Allegro, Ceneo) nie mogą być jedynym źródłem zakupu"]},{"id":"products-list","method":"GET","path":"/api/products","title":"Lista produktów (panel)","description":"To samo co v1, ale przez sesję JWT z panelu.","auth":"session","category":"products"},{"id":"products-create","method":"POST","path":"/api/products","title":"Utwórz produkt (panel)","description":"Tworzy produkt. Jeśli podasz shopConnectionId — od razu wystawia ofertę. Obsługuje category i sourcePriority (fallback źródeł).","auth":"session","category":"products","body":[{"name":"name","type":"string","required":true,"description":"Nazwa"},{"name":"category","type":"string","description":"Kategoria — do reguł marży"},{"name":"shopConnectionId","type":"string","description":"Opcjonalnie — wystaw od razu"},{"name":"sources[].sourcePriority","type":"number","description":"1 = pierwsze, 2 = zapasowe"}],"requestExample":"{\n  \"name\": \"Lampa LED\",\n  \"category\": \"elektronika\",\n  \"shopConnectionId\": \"clxxx\",\n  \"sources\": [\n    { \"sourceUrl\": \"wholesaler://cj_dropshipping/abc\", \"platform\": \"cj_dropshipping\", \"sourcePriority\": 1 },\n    { \"sourceUrl\": \"wholesaler://bigbuy/999\", \"platform\": \"bigbuy\", \"sourcePriority\": 2 }\n  ]\n}"},{"id":"products-list-shop","method":"PUT","path":"/api/products","title":"Wystaw istniejący produkt","description":"Publikuje istniejący produkt w wybranym sklepie.","auth":"session","category":"products","body":[{"name":"productId","type":"string","required":true,"description":"ID produktu"},{"name":"shopConnectionId","type":"string","required":true,"description":"ID sklepu"}],"requestExample":"{ \"productId\": \"clxxx\", \"shopConnectionId\": \"clxxx\" }"},{"id":"shops-list","method":"GET","path":"/api/shops","title":"Lista kanałów sprzedaży","description":"Zwraca podłączone sklepy z liczbą aktywnych ofert.","auth":"session","category":"shops","responseExample":"[\n  {\n    \"id\": \"clxxx\",\n    \"name\": \"Sklep WooCommerce\",\n    \"platform\": \"WOOCOMMERCE\",\n    \"shopUrl\": \"https://sklep.pl\",\n    \"isActive\": true,\n    \"_count\": { \"listings\": 12 }\n  }\n]"},{"id":"shops-create","method":"POST","path":"/api/shops","title":"Podłącz sklep","description":"Tworzy połączenie z kanałem sprzedaży.","auth":"session","category":"shops","body":[{"name":"name","type":"string","required":true,"description":"Nazwa w panelu"},{"name":"platform","type":"enum","required":true,"description":"WOOCOMMERCE | SHOPIFY | PRESTASHOP | NOUVIRO | CUSTOM"},{"name":"shopUrl","type":"string (url)","required":true,"description":"URL sklepu lub API"},{"name":"apiKey","type":"string","description":"Klucz API sklepu"},{"name":"apiSecret","type":"string","description":"Secret / webhook secret"},{"name":"accessToken","type":"string","description":"Token Shopify"}],"requestExample":"{\n  \"name\": \"Sklep WooCommerce\",\n  \"platform\": \"WOOCOMMERCE\",\n  \"shopUrl\": \"https://sklep.pl\",\n  \"apiKey\": \"ck_...\",\n  \"apiSecret\": \"cs_...\"\n}"},{"id":"shops-delete","method":"DELETE","path":"/api/shops?id={id}","title":"Usuń połączenie sklepu","description":"Trwale usuwa połączenie z kanałem sprzedaży.","auth":"session","category":"shops","query":[{"name":"id","type":"string","required":true,"description":"ID połączenia"}]},{"id":"wholesalers-list","method":"GET","path":"/api/wholesalers","title":"Lista hurtowni","description":"Zwraca podłączone hurtownie (BigBuy, CJ Dropshipping).","auth":"session","category":"wholesalers"},{"id":"wholesalers-create","method":"POST","path":"/api/wholesalers","title":"Podłącz hurtownię","description":"Dodaje połączenie z hurtownią dropshippingową.","auth":"session","category":"wholesalers","body":[{"name":"name","type":"string","required":true,"description":"Nazwa połączenia"},{"name":"provider","type":"enum","required":true,"description":"BIGBUY | CJ_DROPSHIPPING"},{"name":"apiKey","type":"string","required":true,"description":"Klucz API hurtowni"},{"name":"apiSecret","type":"string","description":"Secret (CJ)"}],"requestExample":"{\n  \"name\": \"BigBuy EU\",\n  \"provider\": \"BIGBUY\",\n  \"apiKey\": \"twoj_klucz_bigbuy\"\n}"},{"id":"wholesalers-sync","method":"PUT","path":"/api/wholesalers","title":"Synchronizuj katalog hurtowni","description":"Pobiera i aktualizuje produkty z API hurtowni.","auth":"session","category":"wholesalers","body":[{"name":"connectionId","type":"string","required":true,"description":"ID hurtowni"}],"responseExample":"{ \"upserted\": 50, \"total\": 50 }"},{"id":"wholesalers-products","method":"GET","path":"/api/wholesalers/products?connectionId={id}","title":"Produkty z hurtowni","description":"Katalog zsynchronizowany z hurtowni — do importu do DropShoping.","auth":"session","category":"wholesalers","query":[{"name":"connectionId","type":"string","description":"Filtr po hurtowni"}]},{"id":"wholesalers-import","method":"POST","path":"/api/wholesalers/products","title":"Importuj produkt z hurtowni","description":"Tworzy produkt w DropShoping ze źródłem wholesaler://. Opcjonalnie wystawia w sklepie.","auth":"session","category":"wholesalers","body":[{"name":"wholesalerProductId","type":"string","required":true,"description":"ID produktu hurtowni"},{"name":"shopConnectionId","type":"string","description":"Wystaw od razu"}]},{"id":"orders-list","method":"GET","path":"/api/orders","title":"Lista zamówień","description":"Zamówienia ze sklepów + status auto-realizacji u hurtowni.","auth":"session","category":"orders","responseExample":"[\n  {\n    \"id\": \"clxxx\",\n    \"externalOrderId\": \"1842\",\n    \"status\": \"FULFILLED\",\n    \"totalAmount\": 89.99,\n    \"shopConnection\": { \"name\": \"Nouviro\", \"platform\": \"NOUVIRO\" },\n    \"supplierOrders\": [\n      {\n        \"provider\": \"BIGBUY\",\n        \"status\": \"SUBMITTED\",\n        \"externalOrderId\": \"bb_123\",\n        \"cost\": 34.2\n      }\n    ]\n  }\n]"},{"id":"opportunities-list","method":"GET","path":"/api/opportunities","title":"Lista okazji","description":"Zapisane okazje użytkownika + aktywne ScrapeTarget i autoUrls (linki do auto-wypełnienia).","auth":"session","category":"opportunities"},{"id":"opportunities-scan","method":"POST","path":"/api/opportunities","title":"Analizuj linki lub auto-skan","description":"Bez urls: ustaw auto:true (opcjonalnie queue:true), żeby skanować cele/trendy. Z urls: scrapuje podane linki.","auth":"session","category":"opportunities","body":[{"name":"urls","type":"string[]","description":"Lista URL produktów (opcjonalnie)"},{"name":"auto","type":"boolean","description":"true = skan automatyczny z celów i trendów"},{"name":"queue","type":"boolean","description":"true = dodaj job SCAN_OPPORTUNITIES do kolejki"}],"requestExample":"{ \"auto\": true, \"queue\": true }"},{"id":"settings-get","method":"GET","path":"/api/settings","title":"Ustawienia konta","description":"Pełne ustawienia użytkownika: marże, monitoring, automatyzacje (boty), trendy/popyt, platformy, powiadomienia i hurtownie.","auth":"session","category":"settings","responseExample":"{\n  \"defaultMarginPercent\": 20,\n  \"minMarginAmount\": 5,\n  \"monitorIntervalMinutes\": 30,\n  \"monitorEnabled\": true,\n  \"autoDelist\": true,\n  \"autoUpdatePrice\": true,\n  \"autoFulfillOrders\": true,\n  \"simulationMode\": false,\n\n  \"autoScanOpportunities\": true,\n  \"autoRefreshTrending\": true,\n  \"autoRefreshDemand\": true,\n  \"opportunityScanIntervalHours\": 6,\n  \"trendingRefreshIntervalHours\": 24,\n  \"demandRefreshIntervalHours\": 72,\n  \"minOpportunityMarginPercent\": 20,\n  \"minOpportunityProfit\": 10,\n\n  \"currency\": \"PLN\",\n  \"demandRegion\": \"PL\",\n  \"sourcePlatformIds\": [\"amazon\", \"aliexpress\"],\n  \"comparePlatformIds\": [\"ceneo\"],\n\n  \"enabledTrendingCategories\": [\"Elektronika\", \"Dom i ogród\"],\n  \"customTrendingQueries\": [{ \"category\": \"Elektronika\", \"keyword\": \"powerbank 20000mah\" }],\n  \"defaultShopConnectionId\": \"clxxx\",\n  \"showDemandStats\": true,\n  \"showComparisonStats\": true,\n\n  \"notifyWebhookUrl\": \"https://hooks.slack.com/services/...\",\n  \"notifyEmail\": \"jan@example.com\",\n  \"notifyOnOpportunity\": true,\n  \"notifyOnPriceChange\": true,\n  \"notifyOnDelist\": true,\n\n  \"autoImportWholesalers\": false,\n  \"wholesalerImportIntervalHours\": 24,\n  \"wholesalerImportCategories\": [\"Elektronika\", \"Moda\"]\n}"},{"id":"settings-update","method":"PUT","path":"/api/settings","title":"Aktualizuj ustawienia","description":"Częściowa aktualizacja — wysyłasz tylko pola, które chcesz zmienić.","auth":"session","category":"settings","body":[{"name":"defaultMarginPercent","type":"number","description":"Domyślna marża % (0–500)"},{"name":"minMarginAmount","type":"number","description":"Minimalna marża kwotowa (np. 5 PLN)"},{"name":"monitorIntervalMinutes","type":"number","description":"Co ile minut monitoring ma sprawdzać oferty (5–1440)"},{"name":"monitorEnabled","type":"boolean","description":"Globalny przełącznik: czy monitoring jest włączony"},{"name":"autoDelist","type":"boolean","description":"Czy bot ma zdejmować oferty, gdy brak dostępności u dostawcy"},{"name":"autoUpdatePrice","type":"boolean","description":"Czy bot ma aktualizować ceny ofert wg reguł marży"},{"name":"autoFulfillOrders","type":"boolean","description":"Czy auto-realizować zamówienia u hurtowni (gdy możliwe)"},{"name":"simulationMode","type":"boolean","description":"Tryb symulacji — bot liczy i loguje, ale nie publikuje i nie zamawia"},{"name":"autoScanOpportunities","type":"boolean","description":"Czy bot ma cyklicznie skanować cele (ScrapeTarget) pod okazje"},{"name":"autoRefreshTrending","type":"boolean","description":"Czy bot ma cyklicznie odświeżać trendy (seed trending)"},{"name":"autoRefreshDemand","type":"boolean","description":"Czy bot ma cyklicznie odświeżać popyt (Google Trends)"},{"name":"opportunityScanIntervalHours","type":"number","description":"Interwał skanu okazji w godzinach (1–168)"},{"name":"trendingRefreshIntervalHours","type":"number","description":"Interwał odświeżania trendów w godzinach (1–168)"},{"name":"demandRefreshIntervalHours","type":"number","description":"Interwał odświeżania popytu w godzinach (24–720)"},{"name":"minOpportunityMarginPercent","type":"number","description":"Minimalna marża % dla okazji, aby uznać ją za wartą zapisania"},{"name":"minOpportunityProfit","type":"number","description":"Minimalny zysk kwotowy dla okazji"},{"name":"currency","type":"string","description":"Waluta w formacie ISO-4217 (np. PLN, EUR)"},{"name":"demandRegion","type":"string","description":"Region/geo dla Google Trends (np. PL, DE, US)"},{"name":"sourcePlatformIds","type":"string[]","description":"Lista platform traktowanych jako źródła zakupu (sourcing)"},{"name":"comparePlatformIds","type":"string[]","description":"Lista platform referencyjnych/porównywarek (comparison/retail)"},{"name":"enabledTrendingCategories","type":"string[]","description":"Włączone kategorie trendów (np. Elektronika)"},{"name":"customTrendingQueries","type":"{ category: string; keyword: string }[]","description":"Własne zapytania trendów per kategoria"},{"name":"defaultShopConnectionId","type":"string | null","description":"Domyślny kanał sprzedaży do publikacji (jeśli ustawiony)"},{"name":"showDemandStats","type":"boolean","description":"Czy pokazywać statystyki popytu w panelu"},{"name":"showComparisonStats","type":"boolean","description":"Czy pokazywać statystyki porównań cen w panelu"},{"name":"notifyWebhookUrl","type":"string | null","description":"Webhook URL dla powiadomień (Slack/Discord/Zapier). Null usuwa."},{"name":"notifyEmail","type":"string | null","description":"Email do powiadomień (opcjonalnie). Pusty string usuwa."},{"name":"notifyOnOpportunity","type":"boolean","description":"Powiadom, gdy bot znajdzie okazję"},{"name":"notifyOnPriceChange","type":"boolean","description":"Powiadom, gdy monitoring zmieni cenę"},{"name":"notifyOnDelist","type":"boolean","description":"Powiadom, gdy oferta zostanie zdjęta"},{"name":"autoImportWholesalers","type":"boolean","description":"Czy bot ma cyklicznie importować produkty z hurtowni"},{"name":"wholesalerImportIntervalHours","type":"number","description":"Interwał auto-importu hurtowni w godzinach (1–168)"},{"name":"wholesalerImportCategories","type":"string[]","description":"Jakie kategorie importować z hurtowni (filtr)"}],"requestExample":"{\n  \"simulationMode\": true,\n  \"autoScanOpportunities\": true,\n  \"opportunityScanIntervalHours\": 6,\n  \"enabledTrendingCategories\": [\"Elektronika\"],\n  \"customTrendingQueries\": [{ \"category\": \"Elektronika\", \"keyword\": \"powerbank 20000mah\" }],\n  \"notifyWebhookUrl\": \"https://hooks.slack.com/services/...\"\n}"},{"id":"margin-rules-list","method":"GET","path":"/api/margin-rules","title":"Reguły marży per kategoria","description":"Nadpisują domyślną marżę dla produktów pasujących do categoryMatch.","auth":"session","category":"settings"},{"id":"margin-rules-create","method":"POST","path":"/api/margin-rules","title":"Dodaj regułę marży","description":"Tworzy regułę z priorytetem — wyższy priorytet wygrywa przy wielu dopasowaniach.","auth":"session","category":"settings","body":[{"name":"name","type":"string","required":true,"description":"Nazwa reguły"},{"name":"categoryMatch","type":"string","description":"Fragment nazwy kategorii (np. elektronika)"},{"name":"marginPercent","type":"number","required":true,"description":"Marża %"},{"name":"priority","type":"number","description":"Wyższy = ważniejszy"}]},{"id":"monitor-logs","method":"GET","path":"/api/monitor","title":"Logi monitora","description":"Historia aktualizacji cen, zdejmowań i błędów synchronizacji.","auth":"session","category":"monitor"},{"id":"monitor-run","method":"POST","path":"/api/monitor","title":"Uruchom monitoring ręcznie","description":"Sprawdza wszystkie aktywne oferty — ceny i dostępność u dostawcy.","auth":"session","category":"monitor","responseExample":"{ \"processed\": 12, \"results\": [...] }"},{"id":"automation-run","method":"POST","path":"/api/automation","title":"Kolejkuj job automatyzacji","description":"Dodaje zadanie do kolejki workera. Domyślnie RUN_AUTOMATION, ale można wskazać konkretny typ (np. SCAN_OPPORTUNITIES).","auth":"session","category":"automation","body":[{"name":"type","type":"JobType","description":"Opcjonalnie: RUN_AUTOMATION | REFRESH_TRENDING | REFRESH_DEMAND | SCAN_OPPORTUNITIES | IMPORT_WHOLESALERS"}],"requestExample":"{ \"type\": \"SCAN_OPPORTUNITIES\" }","responseExample":"{ \"queued\": true, \"jobId\": \"clxxx\" }"},{"id":"automation-status","method":"GET","path":"/api/automation/status","title":"Status workera i botów","description":"Zbiorczy status automatyzacji: heartbeat workera, liczniki, ostatnie uruchomienia oraz health scrapera i sygnał czy Google Trends działa.","auth":"session","category":"automation"},{"id":"automation-logs","method":"GET","path":"/api/automation/logs?limit={n}","title":"Logi automatyzacji (historia botów)","description":"Ostatnie zdarzenia botów (scan, refresh, notify, błędy).","auth":"session","category":"automation","query":[{"name":"limit","type":"number","description":"Limit wpisów (max 200)"}]},{"id":"jobs-list","method":"GET","path":"/api/jobs?status={status}&type={type}&limit={n}","title":"Lista jobów (kolejka)","description":"Zwraca joby użytkownika (kolejka wykonywana przez workera).","auth":"session","category":"jobs","query":[{"name":"status","type":"JobStatus","description":"Filtr statusu (opcjonalnie)"},{"name":"type","type":"JobType","description":"Filtr typu (opcjonalnie)"},{"name":"limit","type":"number","description":"Limit (max 200)"}]},{"id":"jobs-action","method":"PATCH","path":"/api/jobs","title":"Akcja na jobie (retry/cancel)","description":"Pozwala anulować job albo ponowić (ustawia status na QUEUED).","auth":"session","category":"jobs","body":[{"name":"id","type":"string","required":true,"description":"ID joba"},{"name":"action","type":"string","required":true,"description":"cancel lub retry"}],"requestExample":"{ \"id\": \"clxxx\", \"action\": \"retry\" }","responseExample":"{ \"success\": true }"},{"id":"catalog-import","method":"POST","path":"/api/catalog/import","title":"Import trendu/okazji do katalogu","description":"Tworzy produkt w katalogu na podstawie okazji lub trendu (z deduplikacją po sourceUrl). Opcjonalnie wystawia w domyślnym sklepie.","auth":"session","category":"catalog","body":[{"name":"type","type":"string","required":true,"description":"opportunity lub trending"},{"name":"id","type":"string","required":true,"description":"ID okazji lub ID trendu"},{"name":"shopConnectionId","type":"string","description":"Wystaw w konkretnym sklepie (opcjonalnie)"}],"requestExample":"{ \"type\": \"trending\", \"id\": \"clxxx\" }"},{"id":"scrape-targets-list","method":"GET","path":"/api/scrape-targets","title":"Lista celów skanowania","description":"Zapisane cele do auto-skana: frazy lub URL.","auth":"session","category":"automation"},{"id":"scrape-targets-create","method":"POST","path":"/api/scrape-targets","title":"Dodaj cel skanowania","description":"Dodaje ScrapeTarget dla botów (fraza lub URL).","auth":"session","category":"automation","body":[{"name":"name","type":"string","required":true,"description":"Nazwa celu"},{"name":"platform","type":"string","required":true,"description":"ID platformy (np. aliexpress)"},{"name":"baseUrl","type":"string","required":true,"description":"Bazowy URL albo URL produktu"},{"name":"searchQuery","type":"string","description":"Fraza wyszukiwania (opcjonalnie)"},{"name":"isActive","type":"boolean","description":"Czy aktywny"}]},{"id":"scrape-targets-update","method":"PATCH","path":"/api/scrape-targets","title":"Aktualizuj cel skanowania","description":"Aktualizuje ScrapeTarget (włącz/wyłącz, zmień frazę/URL).","auth":"session","category":"automation","body":[{"name":"id","type":"string","required":true,"description":"ID celu"},{"name":"name","type":"string","description":"Nowa nazwa"},{"name":"baseUrl","type":"string","description":"URL"},{"name":"searchQuery","type":"string","description":"Fraza"},{"name":"isActive","type":"boolean","description":"Aktywny"}]},{"id":"scrape-targets-delete","method":"DELETE","path":"/api/scrape-targets?id={id}","title":"Usuń cel skanowania","description":"Usuwa ScrapeTarget po ID.","auth":"session","category":"automation","query":[{"name":"id","type":"string","required":true,"description":"ID celu"}],"responseExample":"{ \"success\": true }"},{"id":"scraper-health","method":"GET","path":"/api/scraper/health","title":"Status scrapera","description":"Sprawdza czy moduł scrapera działa (wbudowany lub zewnętrzny).","auth":"none","category":"scraper"},{"id":"scraper-scrape","method":"POST","path":"/api/scraper/scrape","title":"Scrape pojedynczego URL","description":"Pobiera cenę/tytuł/dostępność dla URL produktu.","auth":"session","category":"scraper","body":[{"name":"url","type":"string","required":true,"description":"URL produktu"},{"name":"platform","type":"string","description":"Platforma (opcjonalnie, auto-detect)"}],"requestExample":"{ \"url\": \"https://www.amazon.pl/dp/...\", \"platform\": \"amazon\" }"},{"id":"scraper-compare","method":"POST","path":"/api/scraper/compare","title":"Porównaj ceny z listy URL","description":"Scrape wielu URL i zwrot najtańszego źródła + referencji rynku.","auth":"session","category":"scraper","body":[{"name":"urls","type":"string[]","required":true,"description":"Lista URL produktów"}]},{"id":"trending-list","method":"GET","path":"/api/trending?limit={n}&refresh={0|1}","title":"Trendy — lista","description":"Zwraca trending products do dashboardu. Jeśli użytkownik jest zalogowany, uwzględnia jego preferencje platform i ustawienia.","auth":"none","category":"automation","query":[{"name":"limit","type":"number","description":"Ile pozycji zwrócić (max 20)"},{"name":"refresh","type":"0|1","description":"1 = wymuś odświeżenie trendów przed zwróceniem"}]},{"id":"trending-refresh","method":"POST","path":"/api/trending","title":"Trendy — odśwież","description":"Wymusza odświeżenie trendów (serwer-side).","auth":"none","category":"automation","responseExample":"{ \"refreshed\": 8, \"products\": [...] }"},{"id":"demand-analytics","method":"GET","path":"/api/trending/demand?range={3m|6m|12m|24m}&from={YYYY-MM-DD}&to={YYYY-MM-DD}&category={name}&productId={id}&refresh={0|1}&forecastMonth={1-12}","title":"Popyt — analityka (Google Trends)","description":"Zwraca punkty popytu, metryki oraz prognozę sezonową (monthlyForecast): które produkty historycznie najlepiej sprzedają się w wybranym miesiącu kalendarzowym.","auth":"none","category":"automation","query":[{"name":"range","type":"string","description":"Zakres danych (np. 3m, 6m, 12m, 24m)"},{"name":"from","type":"string","description":"Data od (YYYY-MM-DD), opcjonalnie"},{"name":"to","type":"string","description":"Data do (YYYY-MM-DD), opcjonalnie"},{"name":"category","type":"string","description":"Filtr po kategorii (opcjonalnie)"},{"name":"productId","type":"string","description":"ID produktu (opcjonalnie)"},{"name":"refresh","type":"0|1","description":"1 = wymuś odświeżenie popytu przed zwróceniem"},{"name":"forecastMonth","type":"number","description":"Miesiąc 1–12 do prognozy „co sprzedawać” (domyślnie bieżący miesiąc)"}]},{"id":"demand-refresh","method":"POST","path":"/api/trending/demand","title":"Popyt — odśwież","description":"Wymusza odświeżenie popytu (Google Trends) dla produktów w bazie.","auth":"none","category":"automation","responseExample":"{ \"refreshed\": 12 }"},{"id":"webhook-nouviro","method":"POST","path":"/api/webhooks/nouviro?connectionId={id}","title":"Webhook Nouviro (przychodzący)","description":"Nouviro wysyła tu eventy zamówień. DropShoping przetwarza order.created i składa zamówienie u hurtowni.","auth":"webhook","category":"webhooks","query":[{"name":"connectionId","type":"string","required":true,"description":"ID połączenia Nouviro z panelu"}],"notes":["Nagłówek X-Nouviro-Signature — weryfikacja HMAC (webhook secret z połączenia)","Obsługiwane eventy: order.created (auto-realizacja), order.updated (ignorowany)","product.low_stock — ignorowany (dropshipping bez własnego magazynu)"],"requestExample":"{\n  \"event\": \"order.created\",\n  \"timestamp\": \"2026-07-09T12:00:00Z\",\n  \"data\": {\n    \"order\": {\n      \"id\": \"1842\",\n      \"customer_name\": \"Jan Kowalski\",\n      \"items\": [\n        { \"product_id\": \"nv_123\", \"sku\": \"SLU-001\", \"quantity\": 1, \"price\": 41.04 }\n      ],\n      \"total\": 41.04,\n      \"currency\": \"PLN\"\n    }\n  }\n}","responseExample":"{ \"ok\": true, \"shopOrderId\": \"clxxx\", \"status\": \"FULFILLING\" }"},{"id":"platforms-list","method":"GET","path":"/api/platforms","title":"Rejestr platform cenowych","description":"Publiczna lista obsługiwanych platform (bez autoryzacji).","auth":"none","category":"intro","responseExample":"{ \"total\": 75, \"sourcing\": 70, \"comparison\": 5, \"groups\": [...] }"}],"dictionaries":{"wholesalerSourceFormat":"wholesaler://{platform}/{externalId}\n\nPrzykłady:\n  wholesaler://bigbuy/12345\n  wholesaler://cj_dropshipping/abc123","listingStatuses":[{"status":"PENDING","description":"Oczekuje na publikację w sklepie"},{"status":"ACTIVE","description":"Oferta aktywna"},{"status":"DELISTED","description":"Zdjęta (brak towaru u dostawcy)"},{"status":"ERROR","description":"Błąd publikacji"}],"orderStatuses":[{"status":"RECEIVED","description":"Zamówienie odebrane"},{"status":"FULFILLING","description":"Realizacja u hurtowni w toku"},{"status":"FULFILLED","description":"Zrealizowane u dostawcy"},{"status":"PARTIAL","description":"Częściowo zrealizowane"},{"status":"FAILED","description":"Błąd realizacji"}],"jobStatuses":[{"status":"QUEUED","description":"W kolejce — czeka na workera"},{"status":"RUNNING","description":"W trakcie — worker wykonuje joba"},{"status":"SUCCEEDED","description":"Zakończony sukcesem"},{"status":"FAILED","description":"Zakończony błędem (można retry)"},{"status":"CANCELLED","description":"Anulowany"}],"jobTypes":[{"type":"RUN_AUTOMATION","description":"Pełna tura automatyzacji (zbiorczo)"},{"type":"REFRESH_TRENDING","description":"Odśwież trendy (seed trending)"},{"type":"REFRESH_DEMAND","description":"Odśwież popyt (Google Trends)"},{"type":"SCAN_OPPORTUNITIES","description":"Skanuj cele (ScrapeTarget) pod okazje"},{"type":"IMPORT_WHOLESALERS","description":"Auto-import produktów z hurtowni"}]}}