Dokumentacja API
Połącz Basketly z własnym systemem, sklepem lub hurtownią danych: czytaj zamówienia, produkty, klientów i raporty, zmieniaj feedy, wysyłaj konwersje do kolejki Meta i odbieraj zdarzenia webhookami.
- Wersja
- 1.3.0
- Adres bazowy
- https://app.basketly.io/api/v1
- OpenAPI
- Specyfikacja OpenAPI (JSON)
- Markdown
- Markdown dla agentów AI
Spis treści
Szybki start
- Utwórz klucz w panelu: Konfiguracja → API. Klucze tworzą właściciele i administratorzy organizacji. Pełny klucz zobaczysz tylko raz, więc skopiuj go od razu.
- Każdy adres zaczyna się od
https://app.basketly.io/api/v1. Odpowiedzi są w JSON. - Sprawdź klucz wywołaniem
GET /me. Nie wymaga żadnych uprawnień i zwraca organizację, nazwę klucza, uprawnienia i termin ważności.
curl -H "Authorization: Bearer bsk_live_…" \
https://app.basketly.io/api/v1/meW pozostałych przykładach klucz jest w zmiennej środowiskowej API_KEY (export API_KEY=bsk_live_…). Nie umieszczaj klucza w kodzie strony ani aplikacji mobilnej: służy tylko do połączeń serwer–serwer.
Agenci AI (Claude, ChatGPT, Cursor, n8n) łączą się z serwerem MCP pod adresem https://app.basketly.io/mcp: tym samym kluczem albo przyciskiem „Połącz” (OAuth 2.1 z PKCE) bez klucza — wtedy agent działa jako osoba, która go połączyła, z jej rolą. Każde narzędzie agenta to wywołanie tego API, więc obowiązują te same uprawnienia i limity. Agent dopisze notatkę, status albo zadanie, ale nie wyśle konwersji.
Uwierzytelnianie
Każde żądanie wysyła klucz organizacji w nagłówku Authorization: Bearer bsk_live_…. Klucz należy do jednej organizacji i widzi tylko jej dane.
Pełny klucz pokazujemy tylko raz, przy tworzeniu. Przechowujemy wyłącznie jego skrót, więc nie da się go odzyskać: zgubiony klucz unieważnij i utwórz nowy.
Klucz możesz w każdej chwili unieważnić w panelu i możesz ustawić mu termin ważności. Unieważniony klucz dostaje 401 key_revoked, wygasły 401 key_expired.
Klucz ma uprawnienia (scopes). Uprawnienie :write obejmuje też :read tego samego obszaru. contacts:*, tasks:* i orders:read zwracają dane osobowe. Brak uprawnienia to 403 insufficient_scope z polem details.required_scope.
API i serwer MCP są w planach Rozwój, Agencja i Indywidualny. W planach Darmowy i Start właściciel konta ma 5 dni na wypróbowanie od założenia konta. Potem każde żądanie dostaje 402 plan_required, nowych kluczy nie da się utworzyć, a webhooki API nie są wysyłane. Po wyborze planu Rozwój lub wyższego w „Plan i rozliczenia” dotychczasowe klucze działają od razu.
| Uprawnienie | Na co pozwala | Endpointy |
|---|---|---|
contacts:read | Odczyt osób ze strony Klienci (imiona, telefony, e-maile — dane osobowe). | |
contacts:write | Dodawanie i zmiana osób: dane, notatki, tagi, status, blokada SMS. | |
events:read | Odczyt konwersji i statusu ich wysyłek do Meta. | |
events:write | Wysyłanie konwersji serwer–serwer do kolejki. | |
tasks:read | Otwarte zadania (dane osobowe). | |
tasks:write | Dodawanie, zamykanie i przekładanie zadań. | |
campaigns:read | Raport kampanii. |
|
creatives:read | Raport kreacji. | |
automations:read | Lista automatyzacji z ostatnim uruchomieniem i błędami z doby. | |
integrations:read | Przegląd integracji: stany i połączenia kluczem, bez kluczy. | |
orders:read | Zamówienia ze sklepu z pozycjami i kupującymi (dane osobowe: imiona kupujących). | |
products:read | Produkty, ich diagnoza i kartoteka produktu. | |
products:write | Ręczne poprawki produktów. | |
feeds:read | Feedy, reguły, przepływy, kategorie Google i podgląd zmian. | |
feeds:write | Dodawanie i zmiana feedów, zapis reguł, przepływów i kategorii, pobranie teraz. | |
templates:read | Szablony grafik. | |
diagnostics:read | Ostatnia autodiagnostyka. | |
diagnostics:write | Uruchamianie autodiagnostyki. | |
jobs:read | Odczyt zadań w tle. | |
webhooks:read | Odczyt webhooków i historii ich wysyłek. | |
webhooks:write | Dodawanie, zmiana, usuwanie i testowanie webhooków. |
Błędy
Każdy błąd ma ten sam kształt: {"error": {"code", "message", "details?"}}.
code jest stały i nigdy nie jest tłumaczony, więc na nim opieraj obsługę błędów. message jest dla człowieka, w języku z nagłówka Accept-Language: domyślnie polski, en dla angielskiego. details pojawia się tylko tam, gdzie są dodatkowe dane, np. required_scope.
{
"error": {
"code": "insufficient_scope",
"message": "Klucz API nie ma uprawnienia contacts:write.",
"details": {
"required_scope": "contacts:write"
}
}
}| Kod | HTTP | Znaczenie |
|---|---|---|
unauthorized | 401 | Brak klucza, zły format albo nieznany klucz. |
key_revoked | 401 | Klucz został unieważniony. |
key_expired | 401 | Minął termin ważności klucza. |
insufficient_scope | 403 | Klucz nie ma potrzebnego uprawnienia (details.required_scope). |
plan_required | 402 | Plan organizacji nie obejmuje API: po 5 dniach na wypróbowanie potrzebny jest plan Rozwój lub wyższy. |
rate_limited | 429 | Ponad 120 żądań na minutę tym kluczem; odczekaj Retry-After sekund. |
invalid_json | 400 | Treść nie jest poprawnym JSON-em albo zawiera nieznane pole. |
validation_error | 400 | Nieprawidłowa wartość pola lub parametru; opis mówi, co poprawić. |
invalid_cursor | 400 | cursor nie pochodzi z poprzedniej strony tej samej listy. |
not_found | 404 | Brak takiego rekordu w Twojej organizacji. |
route_not_found | 404 | Nie ma takiego endpointu. |
conflict | 409 | Operacja kłóci się z aktualnym stanem rekordu. |
contact_exists | 409 | Osoba z tym telefonem lub e-mailem już istnieje (details.contact_id). |
contact_merged | 409 | Karta została scalona z inną (details.merged_into). |
event_conflict | 409 | Zdarzenie koliduje z już przyjętym. |
source_paused | 409 | Źródło jest wstrzymane. |
limit_reached | 409 | Osiągnięty limit, np. 10 webhooków na organizację. |
idempotency_key_reused | 422 | Ten sam Idempotency-Key z inną treścią żądania. |
idempotency_in_progress | 409 | Żądanie z tym Idempotency-Key jeszcze trwa; ponów za chwilę. |
payload_too_large | 413 | Treść żądania ponad 64 KB. |
internal_error | 500 | Błąd po naszej stronie; ponów żądanie później. |
Paginacja
Listy zwracają {"data": [...], "next_cursor", "has_more"}. Rozmiar strony ustawiasz parametrem limit (1–100, domyślnie 25).
Następną stronę pobierasz, przekazując next_cursor z poprzedniej odpowiedzi jako cursor. Gdy has_more jest false, to koniec listy.
Kolejność to updated_at, a przy remisie identyfikator: order=desc od najnowszych (domyślnie) albo order=asc.
updated_since (ISO 8601) zwraca tylko rekordy zmienione w tym czasie lub później. Do synchronizacji przyrostowej zapisz czas, w którym zaczynasz synchronizację, przejdź przez wszystkie strony do końca i użyj zapisanego czasu jako updated_since przy następnej synchronizacji.
Wszystkie osoby zmienione od wskazanego czasu
cursor=""
while :; do
page=$(curl -s -G "https://app.basketly.io/api/v1/contacts" \
-H "Authorization: Bearer $API_KEY" \
--data-urlencode "limit=100" \
--data-urlencode "updated_since=2026-10-01T00:00:00Z" \
${cursor:+--data-urlencode "cursor=$cursor"})
echo "$page" | jq -c '.data[]'
[ "$(echo "$page" | jq -r '.has_more')" = "true" ] || break
cursor=$(echo "$page" | jq -r '.next_cursor')
doneconst records = []
let cursor = null
do {
const params = new URLSearchParams({ limit: '100', updated_since: '2026-10-01T00:00:00Z' })
if (cursor) params.set('cursor', cursor)
const response = await fetch(`https://app.basketly.io/api/v1/contacts?${params}`, {
headers: { Authorization: `Bearer ${process.env.API_KEY}` },
})
if (!response.ok) throw new Error((await response.json()).error.message)
const page = await response.json()
records.push(...page.data)
cursor = page.has_more ? page.next_cursor : null
} while (cursor)import os
import requests
records = []
params = {"limit": 100, "updated_since": "2026-10-01T00:00:00Z"}
while True:
response = requests.get(
"https://app.basketly.io/api/v1/contacts",
headers={"Authorization": f"Bearer {os.environ['API_KEY']}"},
params=params,
timeout=30,
)
response.raise_for_status()
page = response.json()
records.extend(page["data"])
if not page["has_more"]:
break
params["cursor"] = page["next_cursor"]<?php
$records = [];
$params = ['limit' => 100, 'updated_since' => '2026-10-01T00:00:00Z'];
do {
$ch = curl_init('https://app.basketly.io/api/v1/contacts?' . http_build_query($params));
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('API_KEY')],
]);
$page = json_decode(curl_exec($ch), true);
curl_close($ch);
if (isset($page['error'])) {
throw new RuntimeException($page['error']['message']);
}
$records = array_merge($records, $page['data']);
$params['cursor'] = $page['next_cursor'];
} while ($page['has_more']);Limity i formaty
- Limit: 120 żądań na minutę na klucz. Każda odpowiedź ma nagłówki
X-RateLimit-Limit,X-RateLimit-RemainingiX-RateLimit-Reset. - Po przekroczeniu dostajesz
429 rate_limitedz nagłówkiemRetry-After(sekundy). Odczekaj tyle i ponów. - Treść żądania może mieć najwyżej 64 KB, inaczej
413 payload_too_large. - Czasy w odpowiedziach są w ISO 8601 w UTC, np.
2026-10-08T10:00:00Z.
Idempotencja
- Każdy
POSTprzyjmuje nagłówekIdempotency-Key(1–255 widocznych znaków ASCII). Użyj wartości związanej z operacją, np. UUID zapisanego razem z rekordem po Twojej stronie. - Powtórzenie żądania z tym samym kluczem i tą samą treścią w ciągu 24 godzin zwraca zapisaną odpowiedź z nagłówkiem
Idempotent-Replayed: true, bez ponownego wykonania operacji. - Ten sam klucz z inną treścią to
422 idempotency_key_reused. Gdy pierwsze żądanie jeszcze trwa, dostajesz409 idempotency_in_progress. - Odpowiedzi 5xx i 429 nie są zapisywane, więc po nich możesz bezpiecznie ponowić żądanie z tym samym kluczem.
Endpointy
Klucze
Używany klucz.
/meOpis używanego klucza
Organizacja, nazwa klucza, uprawnienia i termin ważności. Bezpieczne pierwsze wywołanie do sprawdzenia nowego klucza; nie wymaga uprawnień.
Uprawnienie: bez uprawnień
Odpowiedzi
200OKPola odpowiedziNazwa Opis organizationobjectorganization.idstringorganization.namestringkeyobjectkey.idstringkey.namestringkey.prefixstringkey.scopesstring[]key.expires_atstring (date-time) | nullrate_limitobjectrate_limit.per_minuteinteger400Nieprawidłowe dane (validation_error,invalid_json,invalid_cursor).401Brak, nieznany, unieważniony lub wygasły klucz (unauthorized,key_revoked,key_expired).403Klucz nie ma uprawnienia (insufficient_scope,details.required_scope).429Ponad 120 żądań na minutę tym kluczem (rate_limited); odczekajRetry-Aftersekund.
Przykład
curl "https://app.basketly.io/api/v1/me" \
-H "Authorization: Bearer $API_KEY"const response = await fetch('https://app.basketly.io/api/v1/me', {
headers: {
Authorization: `Bearer ${process.env.API_KEY}`,
},
})
if (!response.ok) throw new Error((await response.json()).error.message)
const data = await response.json()
console.log(data)import os
import requests
response = requests.get(
"https://app.basketly.io/api/v1/me",
headers={
"Authorization": f"Bearer {os.environ['API_KEY']}",
},
timeout=30,
)
response.raise_for_status()
print(response.json())<?php
$ch = curl_init('https://app.basketly.io/api/v1/me');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('API_KEY'),
],
]);
$data = json_decode(curl_exec($ch), true);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($status >= 400) {
throw new RuntimeException($data['error']['message']);
}
print_r($data);Osoby
Osoby ze strony Klienci.
/contactsLista osób
Osoby ze strony Klienci (scalone karty są pominięte). Filtruj po tagu albo dokładnym e-mailu lub telefonie.
Uprawnienie: contacts:read
Parametry
| Nazwa | Opis |
|---|---|
limitzapytanieinteger | Rozmiar strony, 1–100 (domyślnie 25).Domyślnie: 25Zakres: 1–100 |
cursorzapytaniestring | next_cursor z poprzedniej strony. |
orderzapytaniestring | Sortowanie po updated_at (potem id): desc od najnowszych (domyślnie) lub asc.Wartości: asc, descDomyślnie: desc |
updated_sincezapytaniestring (date-time) | Tylko rekordy zmienione w tym czasie ISO 8601 lub później. |
tagzapytaniestring | Tag. |
emailzapytaniestring | Dokładny e-mail (dopasowanie po skrócie). |
phonezapytaniestring | Dokładny telefon (dopasowanie po skrócie). |
Odpowiedzi
200OKPola odpowiedziNazwa Opis dataContact[]Wymaganydata[].idstringIdentyfikator osoby. data[].namestringImię i nazwisko. data[].phonestringTelefon w formacie E.164, pusty gdy nieznany. data[].emailstringE-mail, pusty gdy nieznany. data[].tagsstring[]Tagi. data[].sms_optoutbooleanPrawda, gdy SMS-y do tej osoby są zablokowane. data[].first_sourcestringSkąd osoba przyszła po raz pierwszy („Zamówienie w sklepie”, „Ręcznie”, API…). data[].status_idstring | nullIdentyfikator statusu wewnętrznego (GET /contact-statuses), null gdy brak. Nigdy nie trafia do Mety. data[].owner_idstring | nullIdentyfikator użytkownika — opiekuna osoby. data[].last_activity_atstring (date-time) | nullCzas ostatniej aktywności. data[].created_atstring (date-time)Czas utworzenia. data[].updated_atstring (date-time)Ostatnia zmiana; używaj z updated_since.data[].ordersobjectCo osoba kupiła w sklepie. data[].orders.countintegerKupione, nieanulowane zamówienia ze sklepu. data[].orders.valuenumberIch wartość w currency.data[].orders.currencystringWaluta większości zamówień. data[].orders.first_atstring (date-time) | nullCzas pierwszego zamówienia. data[].orders.last_atstring (date-time) | nullCzas ostatniego zamówienia. next_cursorstring | nullWymaganyPrzekaż jako cursor, by pobrać następną stronę; null na ostatniej stronie.has_morebooleanWymaganyPrawda, gdy istnieje kolejna strona. 400Nieprawidłowe dane (validation_error,invalid_json,invalid_cursor).401Brak, nieznany, unieważniony lub wygasły klucz (unauthorized,key_revoked,key_expired).403Klucz nie ma uprawnienia (insufficient_scope,details.required_scope).429Ponad 120 żądań na minutę tym kluczem (rate_limited); odczekajRetry-Aftersekund.
Przykład
curl "https://app.basketly.io/api/v1/contacts" \
-H "Authorization: Bearer $API_KEY"const response = await fetch('https://app.basketly.io/api/v1/contacts', {
headers: {
Authorization: `Bearer ${process.env.API_KEY}`,
},
})
if (!response.ok) throw new Error((await response.json()).error.message)
const data = await response.json()
console.log(data)import os
import requests
response = requests.get(
"https://app.basketly.io/api/v1/contacts",
headers={
"Authorization": f"Bearer {os.environ['API_KEY']}",
},
timeout=30,
)
response.raise_for_status()
print(response.json())<?php
$ch = curl_init('https://app.basketly.io/api/v1/contacts');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('API_KEY'),
],
]);
$data = json_decode(curl_exec($ch), true);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($status >= 400) {
throw new RuntimeException($data['error']['message']);
}
print_r($data);/contactsDodaj osobę
Dodaje osobę jak „Dodaj osobę” w panelu.
Uprawnienie: contacts:write
Parametry
| Nazwa | Opis |
|---|---|
Idempotency-Keynagłówekstring | Unikalny klucz (1–255 widocznych znaków ASCII). Powtórzenie POST z tym samym kluczem i treścią w ciągu 24 godzin zwraca zapisaną odpowiedź z Idempotent-Replayed: true.Maks. długość: 255 |
Treść żądania application/json
| Nazwa | Opis |
|---|---|
namestring | Imię i nazwisko (do 200 znaków).Maks. długość: 200 |
phonestring | Telefon z numerem kierunkowym, np. +48 600 857 482, albo 9 cyfr. |
emailstring | Adres e-mail.Maks. długość: 254 |
tagsstring[] | Tagi. |
Odpowiedzi
201UtworzonoPola odpowiedziNazwa Opis idstringIdentyfikator osoby. namestringImię i nazwisko. phonestringTelefon w formacie E.164, pusty gdy nieznany. emailstringE-mail, pusty gdy nieznany. tagsstring[]Tagi. sms_optoutbooleanPrawda, gdy SMS-y do tej osoby są zablokowane. first_sourcestringSkąd osoba przyszła po raz pierwszy („Zamówienie w sklepie”, „Ręcznie”, API…). status_idstring | nullIdentyfikator statusu wewnętrznego (GET /contact-statuses), null gdy brak. Nigdy nie trafia do Mety. owner_idstring | nullIdentyfikator użytkownika — opiekuna osoby. last_activity_atstring (date-time) | nullCzas ostatniej aktywności. created_atstring (date-time)Czas utworzenia. updated_atstring (date-time)Ostatnia zmiana; używaj z updated_since.ordersobjectCo osoba kupiła w sklepie. orders.countintegerKupione, nieanulowane zamówienia ze sklepu. orders.valuenumberIch wartość w currency.orders.currencystringWaluta większości zamówień. orders.first_atstring (date-time) | nullCzas pierwszego zamówienia. orders.last_atstring (date-time) | nullCzas ostatniego zamówienia. 400Nieprawidłowe dane (validation_error,invalid_json,invalid_cursor).401Brak, nieznany, unieważniony lub wygasły klucz (unauthorized,key_revoked,key_expired).403Klucz nie ma uprawnienia (insufficient_scope,details.required_scope).409Konflikt z aktualnym stanem (conflict,contact_exists,contact_merged,event_conflict,source_paused,idempotency_in_progress).413Treść ponad 64 KB (payload_too_large).422Idempotency-Key użyty z inną treścią (idempotency_key_reused).429Ponad 120 żądań na minutę tym kluczem (rate_limited); odczekajRetry-Aftersekund.
Przykład
curl -X POST "https://app.basketly.io/api/v1/contacts" \
-H "Authorization: Bearer $API_KEY" \
-H "Idempotency-Key: 5f0c7a2e-8d41-4b6a-9e3f-1c2d3e4f5a6b" \
-H "Content-Type: application/json" \
-d '{
"name": "Anna Nowak",
"phone": "+48600100200",
"email": "anna@example.com",
"tags": [
"vip"
]
}'const response = await fetch('https://app.basketly.io/api/v1/contacts', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.API_KEY}`,
'Idempotency-Key': '5f0c7a2e-8d41-4b6a-9e3f-1c2d3e4f5a6b',
'Content-Type': 'application/json',
},
body: JSON.stringify({
"name": "Anna Nowak",
"phone": "+48600100200",
"email": "anna@example.com",
"tags": [
"vip"
]
}),
})
if (!response.ok) throw new Error((await response.json()).error.message)
const data = await response.json()
console.log(data)import os
import requests
response = requests.post(
"https://app.basketly.io/api/v1/contacts",
headers={
"Authorization": f"Bearer {os.environ['API_KEY']}",
"Idempotency-Key": "5f0c7a2e-8d41-4b6a-9e3f-1c2d3e4f5a6b",
},
json={
"name": "Anna Nowak",
"phone": "+48600100200",
"email": "anna@example.com",
"tags": ["vip"],
},
timeout=30,
)
response.raise_for_status()
print(response.json())<?php
$ch = curl_init('https://app.basketly.io/api/v1/contacts');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('API_KEY'),
'Idempotency-Key: 5f0c7a2e-8d41-4b6a-9e3f-1c2d3e4f5a6b',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'name' => 'Anna Nowak',
'phone' => '+48600100200',
'email' => 'anna@example.com',
'tags' => ['vip'],
]),
]);
$data = json_decode(curl_exec($ch), true);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($status >= 400) {
throw new RuntimeException($data['error']['message']);
}
print_r($data);/contacts/{id}Pobierz osobę
Scalona karta zwraca 409 contact_merged z details.merged_into.
Uprawnienie: contacts:read
Parametry
| Nazwa | Opis |
|---|---|
idścieżkastringWymagany | Identyfikator rekordu. |
Odpowiedzi
200OKPola odpowiedziNazwa Opis idstringIdentyfikator osoby. namestringImię i nazwisko. phonestringTelefon w formacie E.164, pusty gdy nieznany. emailstringE-mail, pusty gdy nieznany. tagsstring[]Tagi. sms_optoutbooleanPrawda, gdy SMS-y do tej osoby są zablokowane. first_sourcestringSkąd osoba przyszła po raz pierwszy („Zamówienie w sklepie”, „Ręcznie”, API…). status_idstring | nullIdentyfikator statusu wewnętrznego (GET /contact-statuses), null gdy brak. Nigdy nie trafia do Mety. owner_idstring | nullIdentyfikator użytkownika — opiekuna osoby. last_activity_atstring (date-time) | nullCzas ostatniej aktywności. created_atstring (date-time)Czas utworzenia. updated_atstring (date-time)Ostatnia zmiana; używaj z updated_since.ordersobjectCo osoba kupiła w sklepie. orders.countintegerKupione, nieanulowane zamówienia ze sklepu. orders.valuenumberIch wartość w currency.orders.currencystringWaluta większości zamówień. orders.first_atstring (date-time) | nullCzas pierwszego zamówienia. orders.last_atstring (date-time) | nullCzas ostatniego zamówienia. 400Nieprawidłowe dane (validation_error,invalid_json,invalid_cursor).401Brak, nieznany, unieważniony lub wygasły klucz (unauthorized,key_revoked,key_expired).403Klucz nie ma uprawnienia (insufficient_scope,details.required_scope).404Brak takiego rekordu w Twojej organizacji (not_found).409Konflikt z aktualnym stanem (conflict,contact_exists,contact_merged,event_conflict,source_paused,idempotency_in_progress).429Ponad 120 żądań na minutę tym kluczem (rate_limited); odczekajRetry-Aftersekund.
Przykład
curl "https://app.basketly.io/api/v1/contacts/abc123" \
-H "Authorization: Bearer $API_KEY"/contacts/{id}Zmień dane osoby
Zmienia imię, telefon, e-mail lub tagi; każda zmiana to wpis w historii.
Uprawnienie: contacts:write
Parametry
| Nazwa | Opis |
|---|---|
idścieżkastringWymagany | Identyfikator rekordu. |
Treść żądania application/json
| Nazwa | Opis |
|---|---|
namestring | Imię i nazwisko. |
phonestring | Telefon; pusty tekst usuwa go (musi zostać telefon lub e-mail). |
emailstring | E-mail; pusty tekst usuwa go. |
tagsstring[] | Zastępuje wszystkie tagi. |
Odpowiedzi
200OKPola odpowiedziNazwa Opis idstringIdentyfikator osoby. namestringImię i nazwisko. phonestringTelefon w formacie E.164, pusty gdy nieznany. emailstringE-mail, pusty gdy nieznany. tagsstring[]Tagi. sms_optoutbooleanPrawda, gdy SMS-y do tej osoby są zablokowane. first_sourcestringSkąd osoba przyszła po raz pierwszy („Zamówienie w sklepie”, „Ręcznie”, API…). status_idstring | nullIdentyfikator statusu wewnętrznego (GET /contact-statuses), null gdy brak. Nigdy nie trafia do Mety. owner_idstring | nullIdentyfikator użytkownika — opiekuna osoby. last_activity_atstring (date-time) | nullCzas ostatniej aktywności. created_atstring (date-time)Czas utworzenia. updated_atstring (date-time)Ostatnia zmiana; używaj z updated_since.ordersobjectCo osoba kupiła w sklepie. orders.countintegerKupione, nieanulowane zamówienia ze sklepu. orders.valuenumberIch wartość w currency.orders.currencystringWaluta większości zamówień. orders.first_atstring (date-time) | nullCzas pierwszego zamówienia. orders.last_atstring (date-time) | nullCzas ostatniego zamówienia. 400Nieprawidłowe dane (validation_error,invalid_json,invalid_cursor).401Brak, nieznany, unieważniony lub wygasły klucz (unauthorized,key_revoked,key_expired).403Klucz nie ma uprawnienia (insufficient_scope,details.required_scope).404Brak takiego rekordu w Twojej organizacji (not_found).409Konflikt z aktualnym stanem (conflict,contact_exists,contact_merged,event_conflict,source_paused,idempotency_in_progress).413Treść ponad 64 KB (payload_too_large).429Ponad 120 żądań na minutę tym kluczem (rate_limited); odczekajRetry-Aftersekund.
Przykład
curl -X PATCH "https://app.basketly.io/api/v1/contacts/abc123" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Anna Nowak",
"phone": "+48600100200",
"email": "anna@example.com",
"tags": [
"vip"
]
}'/contacts/{id}/notesDodaj notatkę
Dodaje notatkę, telefon lub spotkanie do historii osoby.
Uprawnienie: contacts:write
Parametry
| Nazwa | Opis |
|---|---|
idścieżkastringWymagany | Identyfikator rekordu. |
Idempotency-Keynagłówekstring | Unikalny klucz (1–255 widocznych znaków ASCII). Powtórzenie POST z tym samym kluczem i treścią w ciągu 24 godzin zwraca zapisaną odpowiedź z Idempotent-Replayed: true.Maks. długość: 255 |
Treść żądania application/json
| Nazwa | Opis |
|---|---|
kindstring | Rodzaj wpisu.Wartości: note, call, meetingDomyślnie: note |
textstringWymagany | Treść, 1–5000 znaków.Maks. długość: 5000 |
timestring (date-time) | Kiedy to było (domyślnie teraz); nie w przyszłości. |
Odpowiedzi
201UtworzonoPola odpowiedziNazwa Opis idstringIdentyfikator wpisu historii. contact_idstringIdentyfikator osoby. kindstringRodzaj wpisu. textstringTreść. timestring (date-time)Czas wpisu. 400Nieprawidłowe dane (validation_error,invalid_json,invalid_cursor).401Brak, nieznany, unieważniony lub wygasły klucz (unauthorized,key_revoked,key_expired).403Klucz nie ma uprawnienia (insufficient_scope,details.required_scope).404Brak takiego rekordu w Twojej organizacji (not_found).409Konflikt z aktualnym stanem (conflict,contact_exists,contact_merged,event_conflict,source_paused,idempotency_in_progress).413Treść ponad 64 KB (payload_too_large).422Idempotency-Key użyty z inną treścią (idempotency_key_reused).429Ponad 120 żądań na minutę tym kluczem (rate_limited); odczekajRetry-Aftersekund.
Przykład
curl -X POST "https://app.basketly.io/api/v1/contacts/abc123/notes" \
-H "Authorization: Bearer $API_KEY" \
-H "Idempotency-Key: 5f0c7a2e-8d41-4b6a-9e3f-1c2d3e4f5a6b" \
-H "Content-Type: application/json" \
-d '{
"kind": "call",
"text": "Asked when order 1001 will ship."
}'/contacts/{id}/sms-optoutZablokuj lub dopuść SMS-y
Utrzymuje listę „nie wysyłaj” i wszystkie osoby z tym samym telefonem w zgodzie.
Uprawnienie: contacts:write
Parametry
| Nazwa | Opis |
|---|---|
idścieżkastringWymagany | Identyfikator rekordu. |
Idempotency-Keynagłówekstring | Unikalny klucz (1–255 widocznych znaków ASCII). Powtórzenie POST z tym samym kluczem i treścią w ciągu 24 godzin zwraca zapisaną odpowiedź z Idempotent-Replayed: true.Maks. długość: 255 |
Treść żądania application/json
| Nazwa | Opis |
|---|---|
sms_optoutbooleanWymagany | true blokuje SMS-y na telefon osoby (dla wszystkich osób z tym numerem), false ponownie je dopuszcza. |
Odpowiedzi
200OKPola odpowiedziNazwa Opis idstringIdentyfikator osoby. namestringImię i nazwisko. phonestringTelefon w formacie E.164, pusty gdy nieznany. emailstringE-mail, pusty gdy nieznany. tagsstring[]Tagi. sms_optoutbooleanPrawda, gdy SMS-y do tej osoby są zablokowane. first_sourcestringSkąd osoba przyszła po raz pierwszy („Zamówienie w sklepie”, „Ręcznie”, API…). status_idstring | nullIdentyfikator statusu wewnętrznego (GET /contact-statuses), null gdy brak. Nigdy nie trafia do Mety. owner_idstring | nullIdentyfikator użytkownika — opiekuna osoby. last_activity_atstring (date-time) | nullCzas ostatniej aktywności. created_atstring (date-time)Czas utworzenia. updated_atstring (date-time)Ostatnia zmiana; używaj z updated_since.ordersobjectCo osoba kupiła w sklepie. orders.countintegerKupione, nieanulowane zamówienia ze sklepu. orders.valuenumberIch wartość w currency.orders.currencystringWaluta większości zamówień. orders.first_atstring (date-time) | nullCzas pierwszego zamówienia. orders.last_atstring (date-time) | nullCzas ostatniego zamówienia. 400Nieprawidłowe dane (validation_error,invalid_json,invalid_cursor).401Brak, nieznany, unieważniony lub wygasły klucz (unauthorized,key_revoked,key_expired).403Klucz nie ma uprawnienia (insufficient_scope,details.required_scope).404Brak takiego rekordu w Twojej organizacji (not_found).409Konflikt z aktualnym stanem (conflict,contact_exists,contact_merged,event_conflict,source_paused,idempotency_in_progress).413Treść ponad 64 KB (payload_too_large).422Idempotency-Key użyty z inną treścią (idempotency_key_reused).429Ponad 120 żądań na minutę tym kluczem (rate_limited); odczekajRetry-Aftersekund.
Przykład
curl -X POST "https://app.basketly.io/api/v1/contacts/abc123/sms-optout" \
-H "Authorization: Bearer $API_KEY" \
-H "Idempotency-Key: 5f0c7a2e-8d41-4b6a-9e3f-1c2d3e4f5a6b" \
-H "Content-Type: application/json" \
-d '{
"sms_optout": true
}'/contacts/searchSzukaj osób z filtrami panelu
Lista Klienci z jej filtrami: wartości jednego filtra to alternatywy (lista po przecinku), filtry łączą się. Każda zła wartość to 400. Działa jako osoba, która utworzyła klucz: obowiązuje jej rola, scope=mine oznacza jej własną pracę.
Uprawnienie: contacts:read
Parametry
| Nazwa | Opis |
|---|---|
qzapytaniestring | Imię, e-mail albo telefon. |
pagezapytanieinteger | Strona, 1 = pierwsza. |
per_pagezapytanieinteger | Osób na stronie: 10, 25 (domyślnie), 50 albo 100. |
ownerzapytaniestring | me, any, none albo identyfikatory członków. |
statuszapytaniestring | Identyfikatory statusów albo none. |
tagzapytaniestring | Tag. |
sourcezapytaniestring | Nazwa pierwszego źródła. |
buyerzapytaniestring | yes = ma opłacone zamówienie, no = brak.Wartości: yes, no |
orders_minzapytaniestring | Co najmniej tyle opłaconych zamówień. |
orders_maxzapytaniestring | Najwyżej tyle opłaconych zamówień. |
spent_minzapytaniestring | Wydał co najmniej. |
spent_maxzapytaniestring | Wydał najwyżej. |
last_orderzapytaniestring | Ostatni zakup w okresie.Wartości: 30d, 90d, 180d, 365d |
inactive_buyerzapytaniestring | Kupował, ale nie w ostatnich N dniach.Wartości: 30, 60, 90, 180, 365 |
first_orderzapytaniestring | Pierwszy zakup w okresie.Wartości: 30d, 90d |
productzapytaniestring | Kupił produkt o tym id (można powtórzyć). |
createdzapytaniestring | today, 7d, 30d albo 90d (albo dni created_from / created_to). |
activityzapytaniestring | Ostatnia aktywność: today, 7d, 30d, 90d (albo activity_from / activity_to). |
inactive_dayszapytanieinteger | Bez aktywności co najmniej tyle dni. |
taskszapytaniestring | open, overdue albo none. |
phonezapytaniestring | yes albo no. |
emailzapytaniestring | yes albo no. |
optoutzapytaniestring | yes albo no. |
duplicatezapytaniestring | yes albo no. |
sortzapytaniestring | activity, activity_asc, created, created_asc, spent, spent_asc, orders, orders_asc, aov (średnie zamówienie), aov_asc, last_order, last_order_asc, first_order albo first_order_asc. Rosnące sortowania zakupów stawiają osoby bez zamówień na końcu. |
Odpowiedzi
200OKPola odpowiedziNazwa Opis dataobject[]Osoby: id, imię, status, opiekun, tagi, ostatnia aktywność, dodano (created), zamówienia (liczba, wartość, pierwsze i ostatnie), shops (rodzaje źródeł opłaconych zamówień), duplicate (podejrzenie duplikatu), open_tasks i overdue_tasks (dla członków widzących zadania). per_pageintegerOsób na stronie. totalintegerWszystkie pasujące osoby. pageintegerNumer strony. 400Nieprawidłowe dane (validation_error,invalid_json,invalid_cursor).401Brak, nieznany, unieważniony lub wygasły klucz (unauthorized,key_revoked,key_expired).403Klucz nie ma uprawnienia (insufficient_scope,details.required_scope).429Ponad 120 żądań na minutę tym kluczem (rate_limited); odczekajRetry-Aftersekund.
Przykład
curl "https://app.basketly.io/api/v1/contacts/search" \
-H "Authorization: Bearer $API_KEY"/contact-statusesLista statusów
Wewnętrzne statusy organizacji. Działa jako osoba, która utworzyła klucz: obowiązuje jej rola, scope=mine oznacza jej własną pracę.
Uprawnienie: contacts:read
Odpowiedzi
200OKPola odpowiedziNazwa Opis statusesobject[]Statusy: id, name, archived, sort, people. 400Nieprawidłowe dane (validation_error,invalid_json,invalid_cursor).401Brak, nieznany, unieważniony lub wygasły klucz (unauthorized,key_revoked,key_expired).403Klucz nie ma uprawnienia (insufficient_scope,details.required_scope).429Ponad 120 żądań na minutę tym kluczem (rate_limited); odczekajRetry-Aftersekund.
Przykład
curl "https://app.basketly.io/api/v1/contact-statuses" \
-H "Authorization: Bearer $API_KEY"/contacts/{id}/statusUstaw status
Ustawia status wewnętrzny (wpis w historii). Nigdy nie trafia do Mety; uruchamiają się automatyzacje statusu. Działa jako osoba, która utworzyła klucz: obowiązuje jej rola, scope=mine oznacza jej własną pracę.
Uprawnienie: contacts:write
Parametry
| Nazwa | Opis |
|---|---|
idścieżkastringWymagany | Identyfikator rekordu. |
Idempotency-Keynagłówekstring | Unikalny klucz (1–255 widocznych znaków ASCII). Powtórzenie POST z tym samym kluczem i treścią w ciągu 24 godzin zwraca zapisaną odpowiedź z Idempotent-Replayed: true.Maks. długość: 255 |
Treść żądania application/json
| Nazwa | Opis |
|---|---|
statusstringWymagany | Identyfikator statusu albo "", by wyczyścić. |
Odpowiedzi
200OKPola odpowiedziNazwa Opis statusstringIdentyfikator statusu ("" = brak). ownerstringIdentyfikator opiekuna. 400Nieprawidłowe dane (validation_error,invalid_json,invalid_cursor).401Brak, nieznany, unieważniony lub wygasły klucz (unauthorized,key_revoked,key_expired).403Klucz nie ma uprawnienia (insufficient_scope,details.required_scope).404Brak takiego rekordu w Twojej organizacji (not_found).409Konflikt z aktualnym stanem (conflict,contact_exists,contact_merged,event_conflict,source_paused,idempotency_in_progress).413Treść ponad 64 KB (payload_too_large).422Idempotency-Key użyty z inną treścią (idempotency_key_reused).429Ponad 120 żądań na minutę tym kluczem (rate_limited); odczekajRetry-Aftersekund.
Przykład
curl -X POST "https://app.basketly.io/api/v1/contacts/abc123/status" \
-H "Authorization: Bearer $API_KEY" \
-H "Idempotency-Key: 5f0c7a2e-8d41-4b6a-9e3f-1c2d3e4f5a6b" \
-H "Content-Type: application/json" \
-d '{
"status": "purchase"
}'/contacts/{id}/historyHistoria osoby
Zamówienia, telefony, notatki, statusy, zadania i SMS-y osoby. Działa jako osoba, która utworzyła klucz: obowiązuje jej rola, scope=mine oznacza jej własną pracę.
Uprawnienie: contacts:read
Parametry
| Nazwa | Opis |
|---|---|
idścieżkastringWymagany | Identyfikator rekordu. |
pagezapytanieinteger | Strona, 1 = najnowsze. |
Odpowiedzi
200OKPola odpowiedziNazwa Opis dataobject[]Wpisy: kind, time, actor, summary, details. pageintegerNumer strony ( ?page=).morebooleanIstnieje starsza strona. 400Nieprawidłowe dane (validation_error,invalid_json,invalid_cursor).401Brak, nieznany, unieważniony lub wygasły klucz (unauthorized,key_revoked,key_expired).403Klucz nie ma uprawnienia (insufficient_scope,details.required_scope).404Brak takiego rekordu w Twojej organizacji (not_found).429Ponad 120 żądań na minutę tym kluczem (rate_limited); odczekajRetry-Aftersekund.
Przykład
curl "https://app.basketly.io/api/v1/contacts/abc123/history" \
-H "Authorization: Bearer $API_KEY"/segmentsLista segmentów
Zapisane segmenty klientów (filtry Klientów z nazwą) i gotowe segmenty sklepu, każdy z liczbą osób widocznych dla członka i — dla zapisanych — stanem grupy odbiorców Meta i listy Klaviyo. filters segmentu to parametry /contacts/search. Działa jako osoba, która utworzyła klucz: obowiązuje jej rola, scope=mine oznacza jej własną pracę.
Uprawnienie: contacts:read
Odpowiedzi
200OK400Nieprawidłowe dane (validation_error,invalid_json,invalid_cursor).401Brak, nieznany, unieważniony lub wygasły klucz (unauthorized,key_revoked,key_expired).403Klucz nie ma uprawnienia (insufficient_scope,details.required_scope).429Ponad 120 żądań na minutę tym kluczem (rate_limited); odczekajRetry-Aftersekund.
Przykład
curl "https://app.basketly.io/api/v1/segments" \
-H "Authorization: Bearer $API_KEY"Konwersje
Konwersje wysyłane do Meta i ich wysyłki.
202 z POST /events znaczy tylko tyle, że konwersja trafiła do kolejki wysyłek do Meta. Status wysyłki accepted to potwierdzenie odbioru przez Meta. Żadne z nich nie dowodzi, że kampania optymalizuje się na tych danych ani że konwersja zostanie przypisana reklamie.
/eventsLista zdarzeń
Konwersje z wysyłkami; treść zdarzeń nigdy nie jest zwracana.
Uprawnienie: events:read
Parametry
| Nazwa | Opis |
|---|---|
limitzapytanieinteger | Rozmiar strony, 1–100 (domyślnie 25).Domyślnie: 25Zakres: 1–100 |
cursorzapytaniestring | next_cursor z poprzedniej strony. |
orderzapytaniestring | Sortowanie po updated_at (potem id): desc od najnowszych (domyślnie) lub asc.Wartości: asc, descDomyślnie: desc |
updated_sincezapytaniestring (date-time) | Tylko rekordy zmienione w tym czasie ISO 8601 lub później. |
sourcezapytaniestring | Identyfikator źródła. |
statuszapytaniestring | Twój status. |
external_idzapytaniestring | Twój identyfikator rekordu. |
Odpowiedzi
200OKPola odpowiedziNazwa Opis dataEvent[]Wymaganydata[].idstringIdentyfikator zdarzenia. data[].source_idstringIdentyfikator źródła. data[].external_idstringTwój identyfikator rekordu. data[].statusstringTwój status. data[].meta_event_idstringIdentyfikator deduplikacji Meta. data[].event_timestring (date-time) | nullCzas zdarzenia. data[].valuenumber | nullWartość. data[].currencystringWaluta. data[].deliveriesDelivery[]Wysyłki tego zdarzenia. data[].deliveries[].idstringIdentyfikator wysyłki. data[].deliveries[].event_idstringIdentyfikator zdarzenia w Basketly. data[].deliveries[].target_idstringIdentyfikator odbiorcy Meta (połączenia z datasetem). data[].deliveries[].dataset_idstringIdentyfikator datasetu (piksela) Meta. data[].deliveries[].event_namestringNazwa zdarzenia Meta, np. Purchase, AddToCart. data[].deliveries[].meta_event_idstringevent_id wysłane do Meta. data[].deliveries[].modestringtestalbolive.data[].deliveries[].statusstringStatus wysyłki.Wartości: pending,sending,retry,accepted,failed,cancelleddata[].deliveries[].attemptsintegerDotychczasowe próby. data[].deliveries[].last_errorstringOstatni błąd, pusty gdy brak. data[].deliveries[].accepted_atstring (date-time) | nullKiedy Meta przyjęła wysyłkę (odbiór, nie dowód atrybucji). data[].deliveries[].next_attempt_atstring (date-time) | nullNastępna próba. data[].deliveries[].created_atstring (date-time)Czas utworzenia. data[].deliveries[].updated_atstring (date-time)Ostatnia zmiana. data[].created_atstring (date-time)Czas utworzenia. data[].updated_atstring (date-time)Ostatnia zmiana. next_cursorstring | nullWymaganyPrzekaż jako cursor, by pobrać następną stronę; null na ostatniej stronie.has_morebooleanWymaganyPrawda, gdy istnieje kolejna strona. 400Nieprawidłowe dane (validation_error,invalid_json,invalid_cursor).401Brak, nieznany, unieważniony lub wygasły klucz (unauthorized,key_revoked,key_expired).403Klucz nie ma uprawnienia (insufficient_scope,details.required_scope).429Ponad 120 żądań na minutę tym kluczem (rate_limited); odczekajRetry-Aftersekund.
Przykład
curl "https://app.basketly.io/api/v1/events" \
-H "Authorization: Bearer $API_KEY"/eventsWyślij konwersję
Przyjmowanie konwersji serwer–serwer. Aktywne przepływy źródła mapują status na zdarzenia Meta i dodają jedną wysyłkę na dataset; zasady deduplikacji bez zmian. Odpowiedź 202: w kolejce, jeszcze nie wysłane.
Uprawnienie: events:write
Parametry
| Nazwa | Opis |
|---|---|
Idempotency-Keynagłówekstring | Unikalny klucz (1–255 widocznych znaków ASCII). Powtórzenie POST z tym samym kluczem i treścią w ciągu 24 godzin zwraca zapisaną odpowiedź z Idempotent-Replayed: true.Maks. długość: 255 |
Treść żądania application/json
| Nazwa | Opis |
|---|---|
sourcestringWymagany | Identyfikator źródła Arkusz Google lub sklepu Twojej organizacji (Połączenia → szczegóły źródła). |
external_idstringWymagany | Twój identyfikator rekordu (numer zamówienia…), do 128 znaków.Maks. długość: 128 |
statusstringWymagany | Twój status zamapowany na zdarzenie Meta przez przepływ źródła, np. QUALIFIED albo purchase.Maks. długość: 80 |
consentbooleanWymagany | Musi być true: potwierdzasz podstawę prawną przesłania danych. |
event_timeinteger | string (date-time) | Sekundy Unix lub ISO 8601; najwyżej 7 dni wstecz. |
event_idstring | Identyfikator deduplikacji Meta; bez niego powstaje z source + external_id + status. |
emailstring | E-mail klienta (haszowany SHA-256 przed zapisem). |
phonestring | Telefon klienta w E.164 (haszowany). |
lead_idstring | Identyfikator leada Meta klienta, jeśli go masz; trafia do Mety jako dane klienta. |
user_idstring | Twój identyfikator klienta (haszowany jako external_id). |
fbpstring | Ciasteczko _fbp. |
fbcstring | Ciasteczko _fbc. |
event_source_urlstring | Adres strony konwersji. |
tracking_idstring | Identyfikator śledzenia kolektora (źródła sklepów). |
client_ip_addressstring | IP klienta. |
client_user_agentstring | User agent klienta. |
valuenumber | Wartość konwersji (wymagana dla Purchase). |
currencystring | Waluta ISO 4217 (wymagana z wartością). |
content_idsstring[] | Identyfikatory produktów. |
Odpowiedzi
202Przyjęto do kolejkiPola odpowiedziNazwa Opis event_idstringIdentyfikator zdarzenia w Basketly. deliveries_createdintegerNowe wysyłki dodane do kolejki dla datasetów Meta. duplicatesintegerWysyłki pominięte jako duplikaty. sending_enabledbooleanfalse, gdy serwer nie wysyła do Meta (tylko kolejka). 400Nieprawidłowe dane (validation_error,invalid_json,invalid_cursor).401Brak, nieznany, unieważniony lub wygasły klucz (unauthorized,key_revoked,key_expired).403Klucz nie ma uprawnienia (insufficient_scope,details.required_scope).404Brak takiego rekordu w Twojej organizacji (not_found).409Konflikt z aktualnym stanem (conflict,contact_exists,contact_merged,event_conflict,source_paused,idempotency_in_progress).413Treść ponad 64 KB (payload_too_large).422Idempotency-Key użyty z inną treścią (idempotency_key_reused).429Ponad 120 żądań na minutę tym kluczem (rate_limited); odczekajRetry-Aftersekund.
Przykład
curl -X POST "https://app.basketly.io/api/v1/events" \
-H "Authorization: Bearer $API_KEY" \
-H "Idempotency-Key: 5f0c7a2e-8d41-4b6a-9e3f-1c2d3e4f5a6b" \
-H "Content-Type: application/json" \
-d '{
"source": "src_abc123",
"external_id": "order-1001",
"status": "purchase",
"consent": true,
"event_time": "2026-10-08T10:00:00Z",
"email": "anna@example.com",
"phone": "+48600100200",
"value": 1200,
"currency": "PLN"
}'const response = await fetch('https://app.basketly.io/api/v1/events', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.API_KEY}`,
'Idempotency-Key': '5f0c7a2e-8d41-4b6a-9e3f-1c2d3e4f5a6b',
'Content-Type': 'application/json',
},
body: JSON.stringify({
"source": "src_abc123",
"external_id": "order-1001",
"status": "purchase",
"consent": true,
"event_time": "2026-10-08T10:00:00Z",
"email": "anna@example.com",
"phone": "+48600100200",
"value": 1200,
"currency": "PLN"
}),
})
if (!response.ok) throw new Error((await response.json()).error.message)
const data = await response.json()
console.log(data)import os
import requests
response = requests.post(
"https://app.basketly.io/api/v1/events",
headers={
"Authorization": f"Bearer {os.environ['API_KEY']}",
"Idempotency-Key": "5f0c7a2e-8d41-4b6a-9e3f-1c2d3e4f5a6b",
},
json={
"source": "src_abc123",
"external_id": "order-1001",
"status": "purchase",
"consent": True,
"event_time": "2026-10-08T10:00:00Z",
"email": "anna@example.com",
"phone": "+48600100200",
"value": 1200,
"currency": "PLN",
},
timeout=30,
)
response.raise_for_status()
print(response.json())<?php
$ch = curl_init('https://app.basketly.io/api/v1/events');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('API_KEY'),
'Idempotency-Key: 5f0c7a2e-8d41-4b6a-9e3f-1c2d3e4f5a6b',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'source' => 'src_abc123',
'external_id' => 'order-1001',
'status' => 'purchase',
'consent' => true,
'event_time' => '2026-10-08T10:00:00Z',
'email' => 'anna@example.com',
'phone' => '+48600100200',
'value' => 1200,
'currency' => 'PLN',
]),
]);
$data = json_decode(curl_exec($ch), true);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($status >= 400) {
throw new RuntimeException($data['error']['message']);
}
print_r($data);/events/{id}Pobierz zdarzenie
Jedna konwersja ze statusem każdej wysyłki.
Uprawnienie: events:read
Parametry
| Nazwa | Opis |
|---|---|
idścieżkastringWymagany | Identyfikator rekordu. |
Odpowiedzi
200OKPola odpowiedziNazwa Opis idstringIdentyfikator zdarzenia. source_idstringIdentyfikator źródła. external_idstringTwój identyfikator rekordu. statusstringTwój status. meta_event_idstringIdentyfikator deduplikacji Meta. event_timestring (date-time) | nullCzas zdarzenia. valuenumber | nullWartość. currencystringWaluta. deliveriesDelivery[]Wysyłki tego zdarzenia. deliveries[].idstringIdentyfikator wysyłki. deliveries[].event_idstringIdentyfikator zdarzenia w Basketly. deliveries[].target_idstringIdentyfikator odbiorcy Meta (połączenia z datasetem). deliveries[].dataset_idstringIdentyfikator datasetu (piksela) Meta. deliveries[].event_namestringNazwa zdarzenia Meta, np. Purchase, AddToCart. deliveries[].meta_event_idstringevent_id wysłane do Meta. deliveries[].modestringtestalbolive.deliveries[].statusstringStatus wysyłki.Wartości: pending,sending,retry,accepted,failed,cancelleddeliveries[].attemptsintegerDotychczasowe próby. deliveries[].last_errorstringOstatni błąd, pusty gdy brak. deliveries[].accepted_atstring (date-time) | nullKiedy Meta przyjęła wysyłkę (odbiór, nie dowód atrybucji). deliveries[].next_attempt_atstring (date-time) | nullNastępna próba. deliveries[].created_atstring (date-time)Czas utworzenia. deliveries[].updated_atstring (date-time)Ostatnia zmiana. created_atstring (date-time)Czas utworzenia. updated_atstring (date-time)Ostatnia zmiana. 400Nieprawidłowe dane (validation_error,invalid_json,invalid_cursor).401Brak, nieznany, unieważniony lub wygasły klucz (unauthorized,key_revoked,key_expired).403Klucz nie ma uprawnienia (insufficient_scope,details.required_scope).404Brak takiego rekordu w Twojej organizacji (not_found).429Ponad 120 żądań na minutę tym kluczem (rate_limited); odczekajRetry-Aftersekund.
Przykład
curl "https://app.basketly.io/api/v1/events/abc123" \
-H "Authorization: Bearer $API_KEY"/deliveriesLista wysyłek
Status wysyłek do Meta, np. status=failed&updated_since=…, by śledzić błędy.
Uprawnienie: events:read
Parametry
| Nazwa | Opis |
|---|---|
limitzapytanieinteger | Rozmiar strony, 1–100 (domyślnie 25).Domyślnie: 25Zakres: 1–100 |
cursorzapytaniestring | next_cursor z poprzedniej strony. |
orderzapytaniestring | Sortowanie po updated_at (potem id): desc od najnowszych (domyślnie) lub asc.Wartości: asc, descDomyślnie: desc |
updated_sincezapytaniestring (date-time) | Tylko rekordy zmienione w tym czasie ISO 8601 lub później. |
statuszapytaniestring | Status wysyłki.Wartości: pending, sending, retry, accepted, failed, cancelled |
eventzapytaniestring | Identyfikator zdarzenia. |
targetzapytaniestring | Identyfikator odbiorcy. |
Odpowiedzi
200OKPola odpowiedziNazwa Opis dataDelivery[]Wymaganydata[].idstringIdentyfikator wysyłki. data[].event_idstringIdentyfikator zdarzenia w Basketly. data[].target_idstringIdentyfikator odbiorcy Meta (połączenia z datasetem). data[].dataset_idstringIdentyfikator datasetu (piksela) Meta. data[].event_namestringNazwa zdarzenia Meta, np. Purchase, AddToCart. data[].meta_event_idstringevent_id wysłane do Meta. data[].modestringtestalbolive.data[].statusstringStatus wysyłki.Wartości: pending,sending,retry,accepted,failed,cancelleddata[].attemptsintegerDotychczasowe próby. data[].last_errorstringOstatni błąd, pusty gdy brak. data[].accepted_atstring (date-time) | nullKiedy Meta przyjęła wysyłkę (odbiór, nie dowód atrybucji). data[].next_attempt_atstring (date-time) | nullNastępna próba. data[].created_atstring (date-time)Czas utworzenia. data[].updated_atstring (date-time)Ostatnia zmiana. next_cursorstring | nullWymaganyPrzekaż jako cursor, by pobrać następną stronę; null na ostatniej stronie.has_morebooleanWymaganyPrawda, gdy istnieje kolejna strona. 400Nieprawidłowe dane (validation_error,invalid_json,invalid_cursor).401Brak, nieznany, unieważniony lub wygasły klucz (unauthorized,key_revoked,key_expired).403Klucz nie ma uprawnienia (insufficient_scope,details.required_scope).429Ponad 120 żądań na minutę tym kluczem (rate_limited); odczekajRetry-Aftersekund.
Przykład
curl "https://app.basketly.io/api/v1/deliveries" \
-H "Authorization: Bearer $API_KEY"/conversions/balanceBilans zakupów
Dzień po dniu: opłacone zamówienia sklepu, zakupy przyjęte przez Basketly i na każde miejsce docelowe (odbiorca Meta, GA4, TikTok, Google Ads, Microsoft Ads, Pinterest, Klaviyo — do Klaviyo tylko zakupy z e-mailem) zakupy przyjęte, z błędem i czekające, z najczęstszymi powodami błędów. Działa jako osoba, która utworzyła klucz: obowiązuje jej rola, scope=mine oznacza jej własną pracę.
Uprawnienie: events:read
Parametry
| Nazwa | Opis |
|---|---|
dayszapytaniestring | Okres: 7, 14, 30 (domyślnie) albo 90 dni.Wartości: 7, 14, 30, 90 |
Odpowiedzi
200OK400Nieprawidłowe dane (validation_error,invalid_json,invalid_cursor).401Brak, nieznany, unieważniony lub wygasły klucz (unauthorized,key_revoked,key_expired).403Klucz nie ma uprawnienia (insufficient_scope,details.required_scope).429Ponad 120 żądań na minutę tym kluczem (rate_limited); odczekajRetry-Aftersekund.
Przykład
curl "https://app.basketly.io/api/v1/conversions/balance" \
-H "Authorization: Bearer $API_KEY"Zadania
Zadania.
/tasksLista zadań
Otwarte zadania wg terminu. Działa jako osoba, która utworzyła klucz: obowiązuje jej rola, scope=mine oznacza jej własną pracę.
Uprawnienie: tasks:read
Parametry
| Nazwa | Opis |
|---|---|
scopezapytaniestring | Czyja praca: mine, user (z user) albo all.Wartości: mine, user, allDomyślnie: mine |
userzapytaniestring | Identyfikator członka dla scope=user. |
Odpowiedzi
200OKPola odpowiedziNazwa Opis dataobject[]Zadania wg terminu. countsobjectLiczby na sekcję (po terminie, dziś, później, bez terminu). truncatedbooleanPonad 500 otwartych zadań. 400Nieprawidłowe dane (validation_error,invalid_json,invalid_cursor).401Brak, nieznany, unieważniony lub wygasły klucz (unauthorized,key_revoked,key_expired).403Klucz nie ma uprawnienia (insufficient_scope,details.required_scope).429Ponad 120 żądań na minutę tym kluczem (rate_limited); odczekajRetry-Aftersekund.
Przykład
curl "https://app.basketly.io/api/v1/tasks" \
-H "Authorization: Bearer $API_KEY"/contacts/{id}/tasksDodaj zadanie
Dodaje zadanie osobie, jak „Dodaj zadanie” na karcie. Działa jako osoba, która utworzyła klucz: obowiązuje jej rola, scope=mine oznacza jej własną pracę.
Uprawnienie: tasks:write
Parametry
| Nazwa | Opis |
|---|---|
idścieżkastringWymagany | Identyfikator rekordu. |
Idempotency-Keynagłówekstring | Unikalny klucz (1–255 widocznych znaków ASCII). Powtórzenie POST z tym samym kluczem i treścią w ciągu 24 godzin zwraca zapisaną odpowiedź z Idempotent-Replayed: true.Maks. długość: 255 |
Treść żądania application/json
| Nazwa | Opis |
|---|---|
titlestringWymagany | Tytuł zadania.Maks. długość: 200 |
notestring | Notatka. |
due_datestring | Dzień terminu RRRR-MM-DD (strefa organizacji); bez niego bez terminu. |
due_timestring | Godzina HH:MM; bez niej koniec dnia. |
assigneestring | Identyfikator członka (domyślnie opiekun osoby albo osoba klucza). |
Odpowiedzi
201UtworzonoPola odpowiedziNazwa Opis idstringWymaganyIdentyfikator nowego rekordu. 400Nieprawidłowe dane (validation_error,invalid_json,invalid_cursor).401Brak, nieznany, unieważniony lub wygasły klucz (unauthorized,key_revoked,key_expired).403Klucz nie ma uprawnienia (insufficient_scope,details.required_scope).404Brak takiego rekordu w Twojej organizacji (not_found).409Konflikt z aktualnym stanem (conflict,contact_exists,contact_merged,event_conflict,source_paused,idempotency_in_progress).413Treść ponad 64 KB (payload_too_large).422Idempotency-Key użyty z inną treścią (idempotency_key_reused).429Ponad 120 żądań na minutę tym kluczem (rate_limited); odczekajRetry-Aftersekund.
Przykład
curl -X POST "https://app.basketly.io/api/v1/contacts/abc123/tasks" \
-H "Authorization: Bearer $API_KEY" \
-H "Idempotency-Key: 5f0c7a2e-8d41-4b6a-9e3f-1c2d3e4f5a6b" \
-H "Content-Type: application/json" \
-d '{
"title": "example"
}'/tasks/{id}/doneOznacz zadanie jako zrobione
Zamyka zadanie, opcjonalnie z wpisem w historii. Wyślij {}, jeśli bez wpisu. Działa jako osoba, która utworzyła klucz: obowiązuje jej rola, scope=mine oznacza jej własną pracę.
Uprawnienie: tasks:write
Parametry
| Nazwa | Opis |
|---|---|
idścieżkastringWymagany | Identyfikator rekordu. |
Idempotency-Keynagłówekstring | Unikalny klucz (1–255 widocznych znaków ASCII). Powtórzenie POST z tym samym kluczem i treścią w ciągu 24 godzin zwraca zapisaną odpowiedź z Idempotent-Replayed: true.Maks. długość: 255 |
Treść żądania application/json
| Nazwa | Opis |
|---|---|
entryobject | Opcjonalny wpis w historii zapisany razem z zadaniem (np. rozmowa, która je zamknęła). |
entry.kindstringWymagany | Rodzaj wpisu.Wartości: note, call, meeting |
entry.textstringWymagany | Treść. |
Odpowiedzi
204Zrobione400Nieprawidłowe dane (validation_error,invalid_json,invalid_cursor).401Brak, nieznany, unieważniony lub wygasły klucz (unauthorized,key_revoked,key_expired).403Klucz nie ma uprawnienia (insufficient_scope,details.required_scope).404Brak takiego rekordu w Twojej organizacji (not_found).409Konflikt z aktualnym stanem (conflict,contact_exists,contact_merged,event_conflict,source_paused,idempotency_in_progress).413Treść ponad 64 KB (payload_too_large).422Idempotency-Key użyty z inną treścią (idempotency_key_reused).429Ponad 120 żądań na minutę tym kluczem (rate_limited); odczekajRetry-Aftersekund.
Przykład
curl -X POST "https://app.basketly.io/api/v1/tasks/abc123/done" \
-H "Authorization: Bearer $API_KEY" \
-H "Idempotency-Key: 5f0c7a2e-8d41-4b6a-9e3f-1c2d3e4f5a6b" \
-H "Content-Type: application/json" \
-d '{
"entry": {
"kind": "call",
"text": "Asked when order 1001 will ship."
}
}'/tasks/{id}/postponePrzełóż zadanie
Przesuwa termin o dni albo na datę. Działa jako osoba, która utworzyła klucz: obowiązuje jej rola, scope=mine oznacza jej własną pracę.
Uprawnienie: tasks:write
Parametry
| Nazwa | Opis |
|---|---|
idścieżkastringWymagany | Identyfikator rekordu. |
Idempotency-Keynagłówekstring | Unikalny klucz (1–255 widocznych znaków ASCII). Powtórzenie POST z tym samym kluczem i treścią w ciągu 24 godzin zwraca zapisaną odpowiedź z Idempotent-Replayed: true.Maks. długość: 255 |
Treść żądania application/json
| Nazwa | Opis |
|---|---|
daysinteger | Przesuń o 1–30 dni.Zakres: 1–30 |
due_datestring | Albo nowy dzień RRRR-MM-DD. |
due_timestring | Z due_date: godzina HH:MM. |
Odpowiedzi
204Przełożone400Nieprawidłowe dane (validation_error,invalid_json,invalid_cursor).401Brak, nieznany, unieważniony lub wygasły klucz (unauthorized,key_revoked,key_expired).403Klucz nie ma uprawnienia (insufficient_scope,details.required_scope).404Brak takiego rekordu w Twojej organizacji (not_found).409Konflikt z aktualnym stanem (conflict,contact_exists,contact_merged,event_conflict,source_paused,idempotency_in_progress).413Treść ponad 64 KB (payload_too_large).422Idempotency-Key użyty z inną treścią (idempotency_key_reused).429Ponad 120 żądań na minutę tym kluczem (rate_limited); odczekajRetry-Aftersekund.
Przykład
curl -X POST "https://app.basketly.io/api/v1/tasks/abc123/postpone" \
-H "Authorization: Bearer $API_KEY" \
-H "Idempotency-Key: 5f0c7a2e-8d41-4b6a-9e3f-1c2d3e4f5a6b" \
-H "Content-Type: application/json" \
-d '{
"days": 1,
"due_date": "example",
"due_time": "example"
}'Integracje
Gdzie sklep sprzedaje, reklamuje się i wysyła katalog.
/integrationsLista integracji
Wszystkie miejsca, z którymi łączy się sklep, według kategorii, ze stanem; łączenie zostaje w panelu. Działa jako osoba, która utworzyła klucz: obowiązuje jej rola, scope=mine oznacza jej własną pracę.
Uprawnienie: integrations:read
Odpowiedzi
200OK400Nieprawidłowe dane (validation_error,invalid_json,invalid_cursor).401Brak, nieznany, unieważniony lub wygasły klucz (unauthorized,key_revoked,key_expired).403Klucz nie ma uprawnienia (insufficient_scope,details.required_scope).429Ponad 120 żądań na minutę tym kluczem (rate_limited); odczekajRetry-Aftersekund.
Przykład
curl "https://app.basketly.io/api/v1/integrations" \
-H "Authorization: Bearer $API_KEY"/getting-startedPierwsze kroki
Lista pierwszych kroków organizacji: podłączony sklep, odbiorca Meta, działający przepływ do Meta, feed produktowy, odczytane konto reklamowe Meta, inne platformy (opcjonalnie) — każdy ze stanem liczonym z danych organizacji i adresem w panelu, w którym się go wykonuje. Działa jako osoba, która utworzyła klucz: obowiązuje jej rola, scope=mine oznacza jej własną pracę.
Uprawnienie: integrations:read
Odpowiedzi
200OK400Nieprawidłowe dane (validation_error,invalid_json,invalid_cursor).401Brak, nieznany, unieważniony lub wygasły klucz (unauthorized,key_revoked,key_expired).403Klucz nie ma uprawnienia (insufficient_scope,details.required_scope).429Ponad 120 żądań na minutę tym kluczem (rate_limited); odczekajRetry-Aftersekund.
Przykład
curl "https://app.basketly.io/api/v1/getting-started" \
-H "Authorization: Bearer $API_KEY"/mapMapa połączeń
Cała konfiguracja sklepu tylko do odczytu: skąd przychodzą dane (źródła sklepu, feedy, logowania), co robi z nimi Basketly (zamówienia, produkty, konwersje, segmenty, automatyzacje, szablony) i dokąd trafiają (odbiorcy Meta, GA4/TikTok/Pinterest/Klaviyo, grupy odbiorców Meta i listy Klaviyo, formaty feedów, API, agenci), ze stanem każdego elementu i połączenia. Działa jako osoba, która utworzyła klucz: obowiązuje jej rola, scope=mine oznacza jej własną pracę.
Uprawnienie: integrations:read
Odpowiedzi
200OK400Nieprawidłowe dane (validation_error,invalid_json,invalid_cursor).401Brak, nieznany, unieważniony lub wygasły klucz (unauthorized,key_revoked,key_expired).403Klucz nie ma uprawnienia (insufficient_scope,details.required_scope).429Ponad 120 żądań na minutę tym kluczem (rate_limited); odczekajRetry-Aftersekund.
Przykład
curl "https://app.basketly.io/api/v1/map" \
-H "Authorization: Bearer $API_KEY"Zamówienia
Zamówienia ze sklepu z pozycjami i kupującymi.
/ordersLista zamówień
Zamówienia ze sklepu z okresu (dni w strefie organizacji, domyślnie ostatnie 30), domyślnie kupione, z filtrami i sortowaniem listy Zamówienia. Kilka wartości jednego filtra = dowolna z nich, filtry łączą się; błędna wartość to 400. Działa jako osoba, która utworzyła klucz: obowiązuje jej rola, scope=mine oznacza jej własną pracę.
Uprawnienie: orders:read
Parametry
| Nazwa | Opis |
|---|---|
fromzapytaniestring | Pierwszy dzień RRRR-MM-DD. |
tozapytaniestring | Ostatni dzień RRRR-MM-DD (zakres do 366 dni). |
statuszapytaniestring | Które zamówienia: bought (domyślnie), unpaid, cancelled albo all; lista po przecinku = dowolny z nich.Domyślnie: bought |
contactzapytaniestring | Zamówienia tej osoby (wszystkie daty, jeśli nie podano from/to). |
qzapytaniestring | Fragment numeru zamówienia albo pełny e-mail lub telefon kupującego (dopasowanie po skrócie). |
sourcezapytaniestring | Lista identyfikatorów źródeł sklepu po przecinku (facets.sources). |
shop_statuszapytaniestring | Nazwa statusu w sklepie; powtórz dla kilku (facets.shop_statuses). |
status_typezapytaniestring | Lista po przecinku: new, open, closed, cancelled. |
paidzapytaniestring | Znacznik opłacenia ze sklepu.Wartości: yes, no |
total_minzapytaniestring | Wartość zamówienia co najmniej (w walucie zamówienia). |
total_maxzapytaniestring | Wartość zamówienia najwyżej. |
platformzapytaniestring | Lista platform źródła reklamy po przecinku: meta, google_ads, microsoft_ads, tiktok, pinterest, openai_ads, email, comparison, other, direct, unknown (unknown obejmuje zamówienia bez źródła). |
campaignzapytaniestring | Klucz kampanii (identyfikator kampanii albo utm:<utm_campaign> — klucze z ad_facets); powtórz dla kilku. |
ad_sourcezapytaniestring | yes = znana platforma reklamy, no = wejście bezpośrednie albo nieznane.Wartości: yes, no |
meta_sendzapytaniestring | Lista po przecinku: accepted, failed, waiting, none — co stało się z zakupem wysłanym do Mety. |
productzapytaniestring | Pozycja, której nazwa zawiera ten tekst albo której kod, EAN lub identyfikator z katalogu jest mu równy. |
countryzapytaniestring | Lista kodów kraju dostawy po przecinku. |
sortzapytaniestring | Kolejność listy.Wartości: placed, placed_asc, total, total_asc, items, items_asc, paid, paid_ascDomyślnie: placed |
per_pagezapytanieinteger | Zamówień na stronę.Wartości: 10, 25, 50, 100Domyślnie: 50 |
pagezapytanieinteger | Strona, 1 = pierwsza. |
Odpowiedzi
200OKPola odpowiedziNazwa Opis ordersobject[]Zamówienia: id, number, placed_at, status, status_type (new, open, closed, cancelled), paid, bought, cancelled, currency, total, shipping, items, city, buyer {id, name}, source_name, source_kind (shoper, idosell, baselinker, woocommerce, shopify…), lines (liczba pozycji), first_product {name, variant, content_id, quantity, product (id rekordu albo puste), image}, sends ([{destination meta | ga4 | tiktok | pinterest | klaviyo | openai_ads | google_ads | microsoft_ads, status accepted | failed | waiting | skipped}] — najgorszy wynik na miejsce docelowe), ad_source. ad_source= odczytanie Basketly (ostatnie kliknięcie reklamy w wizytach kupującego), nigdy atrybucja platformy: platform (meta | google_ads | microsoft_ads | tiktok | pinterest | openai_ads | email | comparison | other | direct | unknown), method (click_id | utm | ids | feed | referrer | none), link (server = tracking_id w zamówieniu, browser = linkOrder na stronie podziękowania, shop = dane sklepu o wejściu, none), deduced, campaign / adset / ad {id, name}, resolved (ids | names | empty), utm {source, medium, campaign, content, term, id}, click_at, clicks (identyfikatory kliknięć z wizyty: fbc, gclid, gbraid, wbraid, msclkid, ttclid, ttp, epik, oppref, obref), referrer (host), landing (ścieżka), first_touch, feed {id, name, channel, product} (feed i produkt katalogu z otagowanego linku, z którego przyszła wizyta).ad_facetsobjectZamówienia wyboru (przed filtrami platformy / kampanii) na platformę reklamy ( platforms: platform, orders) i na kampanię (campaigns: platform, key, name, orders; najwyżej 100).facetsobjectZamówienia okresu (wszystkie stany, przed pozostałymi filtrami) na sklep ( sources: id, name, kind, orders), status sklepu (shop_statuses: status, status_type, orders) i kraj dostawy (countries: country, orders); najwyżej 100 każdego.page_sizeintegerZamówień na stronę (per_page). totalintegerWszystkie pasujące zamówienia. summaryobjectKupione zamówienia, nieopłacone, anulowane, sztuki, przychód na walutę, średni koszyk, kupujący, nowi i powracający. 400Nieprawidłowe dane (validation_error,invalid_json,invalid_cursor).401Brak, nieznany, unieważniony lub wygasły klucz (unauthorized,key_revoked,key_expired).403Klucz nie ma uprawnienia (insufficient_scope,details.required_scope).429Ponad 120 żądań na minutę tym kluczem (rate_limited); odczekajRetry-Aftersekund.
Przykład
curl "https://app.basketly.io/api/v1/orders" \
-H "Authorization: Bearer $API_KEY"/orders/{id}Pobierz zamówienie
Jedno zamówienie z pozycjami, kupującym, źródłem reklamy i miejscami, do których poszedł zakup. Działa jako osoba, która utworzyła klucz: obowiązuje jej rola, scope=mine oznacza jej własną pracę.
Uprawnienie: orders:read
Parametry
| Nazwa | Opis |
|---|---|
idścieżkastringWymagany | Identyfikator rekordu. |
Odpowiedzi
200OK400Nieprawidłowe dane (validation_error,invalid_json,invalid_cursor).401Brak, nieznany, unieważniony lub wygasły klucz (unauthorized,key_revoked,key_expired).403Klucz nie ma uprawnienia (insufficient_scope,details.required_scope).404Brak takiego rekordu w Twojej organizacji (not_found).429Ponad 120 żądań na minutę tym kluczem (rate_limited); odczekajRetry-Aftersekund.
Przykład
curl "https://app.basketly.io/api/v1/orders/abc123" \
-H "Authorization: Bearer $API_KEY"Produkty
Produkty z diagnozą i ręcznymi poprawkami.
/productsLista produktów
Aktywne produkty organizacji albo jednego feedu, po 50 na stronę (albo per_page), z diagnozą, pochodzeniem, kategorią Google, poprawkami, wynikami okresu i trendem sprzedaży. Wartości jednego filtra łączy LUB, filtry — I. Działa jako osoba, która utworzyła klucz: obowiązuje jej rola, scope=mine oznacza jej własną pracę.
Uprawnienie: products:read
Parametry
| Nazwa | Opis |
|---|---|
feedzapytaniestring | Tylko produkty tego feedu. |
qzapytaniestring | Tytuł, SKU, dokładny EAN albo dokładny identyfikator katalogowy. |
originzapytaniestring | Lista (po przecinku) identyfikatorów źródeł sklepów albo feedów, z których pochodzą produkty (facets.origins). |
categoryzapytaniestring | Kategoria sklepu, dokładnie; powtórz dla kilku (facets.categories). |
brandzapytaniestring | Marka, dokładnie; powtórz dla kilku (facets.brands). |
availabilityzapytaniestring | Lista (po przecinku): in_stock, out_of_stock, preorder, backorder, unknown. |
price_minzapytaniestring | Najniższa cena dla kupującego (cena promocyjna, jeśli jest). |
price_maxzapytaniestring | Najwyższa cena dla kupującego. |
score_minzapytanieinteger | Najniższa ocena jakości 0–100. |
score_maxzapytanieinteger | Najwyższa ocena jakości 0–100. |
issuezapytaniestring | Lista kodów problemów (po przecinku); pasuje dowolny. |
statuszapytaniestring | Lista najgorszych problemów (po przecinku): error, warning, clean. |
fixeszapytaniestring | Lista (po przecinku): auto (automatyczne poprawki Basketly naprawiają problem), manual (ręczna poprawka), none. |
googlezapytaniestring | Lista (po przecinku): set (wychodzi z feedów z kategorią Google: wybraną przez człowieka, własną albo pewną automatyczną), review (automatyczna, pewność poniżej 60), none (Basketly dobiera ją po nazwie przy budowie feedu). |
exposurezapytaniestring | Lista (po przecinku): none = bez emisji w reklamach katalogowych w okresie, low = poniżej 100 wyświetleń (razem z bez emisji), shown = pokazywane. |
saleszapytaniestring | yes = kupowany w okresie, no = niekupowany.Wartości: yes, no |
sortzapytaniestring | title (domyślnie), title_desc, score (najgorsze najpierw), score_desc, price, stock, issues, synced albo z okresu impressions, clicks, ctr, units, revenue, views — od największych; _asc = od najmniejszych.Wartości: title, title_desc, score, score_desc, price, price_asc, stock, stock_asc, issues, issues_asc, synced, synced_asc, impressions, impressions_asc, clicks, clicks_asc, ctr, ctr_asc, units, units_asc, revenue, revenue_asc, views, views_asc |
dayszapytaniestring | Okres statystyk: 7, 14, 30 (domyślnie) albo 90 dni.Wartości: 7, 14, 30, 90 |
per_pagezapytanieinteger | Produktów na stronę: 10, 25, 50 (domyślnie) albo 100. |
facetszapytaniestring | 1 dodaje facets: pochodzenia, kategorie, marki, dostępność, google i poprawki z liczbą produktów.Wartości: 1 |
pagezapytanieinteger | Strona, 1 = pierwsza. |
Odpowiedzi
200OKPola odpowiedziNazwa Opis productsobject[]Produkty: id, external_id, tytuł, cena, cena promocyjna, dostępność, stan, ocena 0–100, najgorszy problem, problemy, errors, warnings, origin_name, origin_kind, google {id, path, by person|own|auto|title|none, confidence, review — wybór automatyczny albo po nazwie poniżej 60 do sprawdzenia}, fixes {auto, manual}, statystyki okresu, trend (kupione sztuki dziennie, tygodniowo powyżej 30 dni). totalintegerWszystkie pasujące produkty. summaryobjectLiczby wyboru: błędy, ostrzeżenia, średnia ocena, problemy wg kodu. per_pageintegerProduktów na stronę. facetsobjectPrzy facets=1: pochodzenia (id, name, kind, products), kategorie i marki (name, products; 500 najliczniejszych) oraz liczby dostępności, google (set, review, none) i poprawek (auto, manual) całego wyboru. 400Nieprawidłowe dane (validation_error,invalid_json,invalid_cursor).401Brak, nieznany, unieważniony lub wygasły klucz (unauthorized,key_revoked,key_expired).403Klucz nie ma uprawnienia (insufficient_scope,details.required_scope).429Ponad 120 żądań na minutę tym kluczem (rate_limited); odczekajRetry-Aftersekund.
Przykład
curl "https://app.basketly.io/api/v1/products" \
-H "Authorization: Bearer $API_KEY"/products/performanceWyniki katalogu
Produkty bez emisji, ze słabą emisją i pokazywane w reklamach katalogowych, najlepiej sprzedające się i najczęściej pokazywane bez sprzedaży. Działa jako osoba, która utworzyła klucz: obowiązuje jej rola, scope=mine oznacza jej własną pracę.
Uprawnienie: products:read
Parametry
| Nazwa | Opis |
|---|---|
dayszapytaniestring | Okres statystyk: 7, 14, 30 (domyślnie) albo 90 dni.Wartości: 7, 14, 30, 90 |
Odpowiedzi
200OK400Nieprawidłowe dane (validation_error,invalid_json,invalid_cursor).401Brak, nieznany, unieważniony lub wygasły klucz (unauthorized,key_revoked,key_expired).403Klucz nie ma uprawnienia (insufficient_scope,details.required_scope).429Ponad 120 żądań na minutę tym kluczem (rate_limited); odczekajRetry-Aftersekund.
Przykład
curl "https://app.basketly.io/api/v1/products/performance" \
-H "Authorization: Bearer $API_KEY"/products/{product}/statsWyniki produktu
Jeden produkt w reklamach (rozbicie Mety na produkty), w sklepie (skrypt Basketly) i w sprzedaży (zamówienia), dzień po dniu. Działa jako osoba, która utworzyła klucz: obowiązuje jej rola, scope=mine oznacza jej własną pracę.
Uprawnienie: products:read
Parametry
| Nazwa | Opis |
|---|---|
productścieżkastringWymagany | Identyfikator produktu. |
dayszapytaniestring | Okres statystyk: 7, 14, 30 (domyślnie) albo 90 dni.Wartości: 7, 14, 30, 90 |
Odpowiedzi
200OK400Nieprawidłowe dane (validation_error,invalid_json,invalid_cursor).401Brak, nieznany, unieważniony lub wygasły klucz (unauthorized,key_revoked,key_expired).403Klucz nie ma uprawnienia (insufficient_scope,details.required_scope).404Brak takiego rekordu w Twojej organizacji (not_found).429Ponad 120 żądań na minutę tym kluczem (rate_limited); odczekajRetry-Aftersekund.
Przykład
curl "https://app.basketly.io/api/v1/products/abc123/stats" \
-H "Authorization: Bearer $API_KEY"/products/{product}Pobierz produkt
Kartoteka produktu z panelu. Działa jako osoba, która utworzyła klucz: obowiązuje jej rola, scope=mine oznacza jej własną pracę.
Uprawnienie: products:read
Parametry
| Nazwa | Opis |
|---|---|
productścieżkastringWymagany | Identyfikator produktu. |
Odpowiedzi
200OK400Nieprawidłowe dane (validation_error,invalid_json,invalid_cursor).401Brak, nieznany, unieważniony lub wygasły klucz (unauthorized,key_revoked,key_expired).403Klucz nie ma uprawnienia (insufficient_scope,details.required_scope).404Brak takiego rekordu w Twojej organizacji (not_found).429Ponad 120 żądań na minutę tym kluczem (rate_limited); odczekajRetry-Aftersekund.
Przykład
curl "https://app.basketly.io/api/v1/products/abc123" \
-H "Authorization: Bearer $API_KEY"/products/{product}/overridesUstaw ręczne poprawki
Wartości wpisane ręcznie wygrywają z poprawkami, regułami i przepływami w każdym feedzie. Działa jako osoba, która utworzyła klucz: obowiązuje jej rola, scope=mine oznacza jej własną pracę.
Uprawnienie: products:write
Parametry
| Nazwa | Opis |
|---|---|
productścieżkastringWymagany | Identyfikator produktu. |
Treść żądania application/json
| Nazwa | Opis |
|---|---|
overridesobjectWymagany | Atrybut → wartość wpisana ręcznie; wygrywa w każdym feedzie i zostaje po kolejnym pobraniu. "" usuwa atrybut. Zastępuje wszystkie ręczne poprawki (wyślij te, które mają zostać). id nie można zmienić. |
Odpowiedzi
200OK400Nieprawidłowe dane (validation_error,invalid_json,invalid_cursor).401Brak, nieznany, unieważniony lub wygasły klucz (unauthorized,key_revoked,key_expired).403Klucz nie ma uprawnienia (insufficient_scope,details.required_scope).404Brak takiego rekordu w Twojej organizacji (not_found).429Ponad 120 żądań na minutę tym kluczem (rate_limited); odczekajRetry-Aftersekund.
Przykład
curl -X PUT "https://app.basketly.io/api/v1/products/abc123/overrides" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"overrides": {}
}'/guidelinesLista wytycznych
Zasady dostawców dotyczące danych produktów ze źródłami i liczbą produktów, które łamią każdą. Działa jako osoba, która utworzyła klucz: obowiązuje jej rola, scope=mine oznacza jej własną pracę.
Uprawnienie: products:read
Odpowiedzi
200OK400Nieprawidłowe dane (validation_error,invalid_json,invalid_cursor).401Brak, nieznany, unieważniony lub wygasły klucz (unauthorized,key_revoked,key_expired).403Klucz nie ma uprawnienia (insufficient_scope,details.required_scope).429Ponad 120 żądań na minutę tym kluczem (rate_limited); odczekajRetry-Aftersekund.
Przykład
curl "https://app.basketly.io/api/v1/guidelines" \
-H "Authorization: Bearer $API_KEY"/products/{product}/title-suggestionsZaproponuj tytuły
Prosi AI (MiniMax) o 1–3 lepsze tytuły zgodne z wytycznymi tytułów; wysyłane są tylko atrybuty produktu, każdą propozycję sprawdzają ponownie sprawdzenia tytułu Basketly. Nic nie jest zapisywane. Zużywa dzienny budżet AI organizacji (429 po jego wyczerpaniu, także ponad 30 wywołań na godzinę). Działa jako osoba, która utworzyła klucz: obowiązuje jej rola, scope=mine oznacza jej własną pracę.
Uprawnienie: products:write
Parametry
| Nazwa | Opis |
|---|---|
productścieżkastringWymagany | Identyfikator produktu. |
Odpowiedzi
200OK400Nieprawidłowe dane (validation_error,invalid_json,invalid_cursor).401Brak, nieznany, unieważniony lub wygasły klucz (unauthorized,key_revoked,key_expired).403Klucz nie ma uprawnienia (insufficient_scope,details.required_scope).404Brak takiego rekordu w Twojej organizacji (not_found).429Ponad 120 żądań na minutę tym kluczem (rate_limited); odczekajRetry-Aftersekund.502MiniMax nie odpowiedział albo nie dał tytułu zgodnego z wytycznymi (upstream_error).503Sugestie AI są wyłączone na tym serwerze: brak klucza MiniMax (unavailable).
Przykład
curl -X POST "https://app.basketly.io/api/v1/products/abc123/title-suggestions" \
-H "Authorization: Bearer $API_KEY"/meta-catalog/statusStatus produktów w katalogu
Dla najwyżej 500 identyfikatorów produktów: status weryfikacji, dostępność, widoczność i przynależność do zestawów produktów w wybranych katalogach Meta, z powodem z katalogu, dla którego produkt nie ma emisji. Działa jako osoba, która utworzyła klucz: obowiązuje jej rola, scope=mine oznacza jej własną pracę.
Uprawnienie: products:read
Parametry
| Nazwa | Opis |
|---|---|
content_idszapytaniestringWymagany | Lista identyfikatorów produktów (retailer_id w katalogu) po przecinku, najwyżej 500. |
Odpowiedzi
200OK400Nieprawidłowe dane (validation_error,invalid_json,invalid_cursor).401Brak, nieznany, unieważniony lub wygasły klucz (unauthorized,key_revoked,key_expired).403Klucz nie ma uprawnienia (insufficient_scope,details.required_scope).429Ponad 120 żądań na minutę tym kluczem (rate_limited); odczekajRetry-Aftersekund.
Przykład
curl "https://app.basketly.io/api/v1/meta-catalog/status" \
-H "Authorization: Bearer $API_KEY"Feedy
Feedy produktowe, ich reguły, przepływy i kategorie Google.
/products/unseen-flowFeed z produktów bez emisji
Tworzy przepływ feedu z produktów, które reklamy katalogowe pokazały mniej niż below razy w ostatnich days dniach. Działa jako osoba, która utworzyła klucz: obowiązuje jej rola, scope=mine oznacza jej własną pracę.
Uprawnienie: feeds:write
Parametry
| Nazwa | Opis |
|---|---|
Idempotency-Keynagłówekstring | Unikalny klucz (1–255 widocznych znaków ASCII). Powtórzenie POST z tym samym kluczem i treścią w ciągu 24 godzin zwraca zapisaną odpowiedź z Idempotent-Replayed: true.Maks. długość: 255 |
Treść żądania application/json
| Nazwa | Opis |
|---|---|
daysintegerWymagany | Okres: 7, 14, 30 albo 90 dni.Wartości: 7, 14, 30, 90 |
belownumberWymagany | Liczba wyświetleń, poniżej której produkt ma słabą emisję (≥ 1). |
Odpowiedzi
200OK400Nieprawidłowe dane (validation_error,invalid_json,invalid_cursor).401Brak, nieznany, unieważniony lub wygasły klucz (unauthorized,key_revoked,key_expired).403Klucz nie ma uprawnienia (insufficient_scope,details.required_scope).409Konflikt z aktualnym stanem (conflict,contact_exists,contact_merged,event_conflict,source_paused,idempotency_in_progress).413Treść ponad 64 KB (payload_too_large).422Idempotency-Key użyty z inną treścią (idempotency_key_reused).429Ponad 120 żądań na minutę tym kluczem (rate_limited); odczekajRetry-Aftersekund.
Przykład
curl -X POST "https://app.basketly.io/api/v1/products/unseen-flow" \
-H "Authorization: Bearer $API_KEY" \
-H "Idempotency-Key: 5f0c7a2e-8d41-4b6a-9e3f-1c2d3e4f5a6b" \
-H "Content-Type: application/json" \
-d '{
"days": 7,
"below": 1
}'/feedsLista feedów
Wszystkie feedy ze stanem i adresem wyjścia. Działa jako osoba, która utworzyła klucz: obowiązuje jej rola, scope=mine oznacza jej własną pracę.
Uprawnienie: feeds:read
Odpowiedzi
200OKPola odpowiedziNazwa Opis feedsobject[]Feedy jak w GET /feeds/{id}, bez listy pól, z category_coverage{covered, products}: produkty, które wychodzą z feedu z kategorią Google (jak w zakładce Kategorie Google), null, gdy nie da się policzyć.400Nieprawidłowe dane (validation_error,invalid_json,invalid_cursor).401Brak, nieznany, unieważniony lub wygasły klucz (unauthorized,key_revoked,key_expired).403Klucz nie ma uprawnienia (insufficient_scope,details.required_scope).429Ponad 120 żądań na minutę tym kluczem (rate_limited); odczekajRetry-Aftersekund.
Przykład
curl "https://app.basketly.io/api/v1/feeds" \
-H "Authorization: Bearer $API_KEY"/feedsDodaj feed
Jak „Dodaj feed”: z adresu (pobieranie w kolejce), ze sklepu, z innych feedów albo jako przepływ (startuje z wybranymi feedami połączonymi w wyjściu albo z całym płótnem). Wgrywanie pliku zostaje w panelu. Działa jako osoba, która utworzyła klucz: obowiązuje jej rola, scope=mine oznacza jej własną pracę.
Uprawnienie: feeds:write
Parametry
| Nazwa | Opis |
|---|---|
Idempotency-Keynagłówekstring | Unikalny klucz (1–255 widocznych znaków ASCII). Powtórzenie POST z tym samym kluczem i treścią w ciągu 24 godzin zwraca zapisaną odpowiedź z Idempotent-Replayed: true.Maks. długość: 255 |
Treść żądania application/json
| Nazwa | Opis |
|---|---|
namestringWymagany | 2–120 znaków. |
inputstringWymagany | Skąd brać produkty.Wartości: url, source, feeds, flow |
urlstring | input=url: adres feedu (http/https). |
sourcestring | input=source: identyfikator podłączonego sklepu. |
refresh_hoursinteger | input=url: pobieranie co 0 (nigdy), 1, 3, 6, 12 albo 24 godziny.Wartości: 0, 1, 3, 6, 12, 24 |
parentsstring[] | input=feeds albo flow: 1–10 feedów z własnymi produktami, w kolejności ważności. |
graphobject | input=flow: całe płótno (jak w PUT /feeds/{id}/flow) zamiast parents. |
outputstring | Format wyjścia: "" Google/Meta XML, ceneo, csv, openai (CSV dla ChatGPT Ads).Wartości: `, ceneo, csv, openai` |
Odpowiedzi
200OK400Nieprawidłowe dane (validation_error,invalid_json,invalid_cursor).401Brak, nieznany, unieważniony lub wygasły klucz (unauthorized,key_revoked,key_expired).403Klucz nie ma uprawnienia (insufficient_scope,details.required_scope).409Konflikt z aktualnym stanem (conflict,contact_exists,contact_merged,event_conflict,source_paused,idempotency_in_progress).413Treść ponad 64 KB (payload_too_large).422Idempotency-Key użyty z inną treścią (idempotency_key_reused).429Ponad 120 żądań na minutę tym kluczem (rate_limited); odczekajRetry-Aftersekund.
Przykład
curl -X POST "https://app.basketly.io/api/v1/feeds" \
-H "Authorization: Bearer $API_KEY" \
-H "Idempotency-Key: 5f0c7a2e-8d41-4b6a-9e3f-1c2d3e4f5a6b" \
-H "Content-Type: application/json" \
-d '{
"name": "Anna Nowak",
"input": "url",
"url": "https://example.com/webhooks"
}'/feeds/{id}Pobierz feed
Feed z atrybutami; przepływ z płótnem. Działa jako osoba, która utworzyła klucz: obowiązuje jej rola, scope=mine oznacza jej własną pracę.
Uprawnienie: feeds:read
Parametry
| Nazwa | Opis |
|---|---|
idścieżkastringWymagany | Identyfikator rekordu. |
Odpowiedzi
200OK400Nieprawidłowe dane (validation_error,invalid_json,invalid_cursor).401Brak, nieznany, unieważniony lub wygasły klucz (unauthorized,key_revoked,key_expired).403Klucz nie ma uprawnienia (insufficient_scope,details.required_scope).404Brak takiego rekordu w Twojej organizacji (not_found).429Ponad 120 żądań na minutę tym kluczem (rate_limited); odczekajRetry-Aftersekund.
Przykład
curl "https://app.basketly.io/api/v1/feeds/abc123" \
-H "Authorization: Bearer $API_KEY"/feeds/{id}Zmień feed
Nazwa, adres, częstotliwość pobierania, automatyczne poprawki, źródła, format wyjścia, tagowanie linków (pominięte pola link_tagging zostają). Działa jako osoba, która utworzyła klucz: obowiązuje jej rola, scope=mine oznacza jej własną pracę.
Uprawnienie: feeds:write
Parametry
| Nazwa | Opis |
|---|---|
idścieżkastringWymagany | Identyfikator rekordu. |
Treść żądania application/json
| Nazwa | Opis |
|---|---|
namestring | 2–120 znaków. |
urlstring | Tylko input=url. |
refresh_hoursinteger | Tylko input=url.Wartości: 0, 1, 3, 6, 12, 24 |
autofixboolean | Automatyczne poprawki włączone lub wyłączone (feedy z regułami). |
parentsstring[] | Tylko input=feeds. |
outputstring | Format wyjścia (bloczek wyjścia przepływu się dostosuje).Wartości: `, ceneo, csv, openai` |
link_taggingLinkTagging | |
link_tagging.enabledboolean | Tagowanie linków produktów w feedzie wyjściowym (ostatni krok przed podaniem). Nowe feedy startują włączone; feedy sprzed tego ustawienia zostają wyłączone, dopóki ktoś nie włączy. |
link_tagging.presetstring | marker = tylko znacznik Basketly bk_f/bk_pid; meta, google, ceneo = parametry kanału; custom = własne. Zestaw bez params bierze swoje parametry.Wartości: marker, meta, google, ceneo, custom |
link_tagging.paramsstring | Szablon parametrów dopisywanych do linków, np. utm_source=facebook&utm_content={id}. Znaczniki {id}, {item_group_id}, {brand}, {product_type}, {feed} (nazwa feedu jako slug) wypełnia produkt (zakodowane w URL); każde inne {…} albo {{…}} to makro kanału (ValueTrack Google, Meta) podawane bez zmian. bk_f/bk_pid są zarezerwowane. Parametrów, które link już ma, nigdy nie zastępujemy. |
link_tagging.ads_redirectboolean | Google: parametry trafiają tylko do ads_redirect (kliknięcia reklam produktowych; z linku, gdy produkt go nie ma), link i mobile_link dostają tylko znacznik. Pomijane dla Ceneo. |
Odpowiedzi
200OK400Nieprawidłowe dane (validation_error,invalid_json,invalid_cursor).401Brak, nieznany, unieważniony lub wygasły klucz (unauthorized,key_revoked,key_expired).403Klucz nie ma uprawnienia (insufficient_scope,details.required_scope).404Brak takiego rekordu w Twojej organizacji (not_found).413Treść ponad 64 KB (payload_too_large).429Ponad 120 żądań na minutę tym kluczem (rate_limited); odczekajRetry-Aftersekund.
Przykład
curl -X PATCH "https://app.basketly.io/api/v1/feeds/abc123" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Anna Nowak",
"url": "https://example.com/webhooks"
}'/feeds/{id}/link-tagging/previewPodgląd tagowania linków
Taguje linki jednego produktu z feedu szkicem ustawienia (pominięte pola = zapisane). Nic nie jest zapisywane. Działa jako osoba, która utworzyła klucz: obowiązuje jej rola, scope=mine oznacza jej własną pracę.
Uprawnienie: feeds:read
Parametry
| Nazwa | Opis |
|---|---|
idścieżkastringWymagany | Identyfikator rekordu. |
Treść żądania application/json
| Nazwa | Opis |
|---|---|
enabledboolean | Tagowanie linków produktów w feedzie wyjściowym (ostatni krok przed podaniem). Nowe feedy startują włączone; feedy sprzed tego ustawienia zostają wyłączone, dopóki ktoś nie włączy. |
presetstring | marker = tylko znacznik Basketly bk_f/bk_pid; meta, google, ceneo = parametry kanału; custom = własne. Zestaw bez params bierze swoje parametry.Wartości: marker, meta, google, ceneo, custom |
paramsstring | Szablon parametrów dopisywanych do linków, np. utm_source=facebook&utm_content={id}. Znaczniki {id}, {item_group_id}, {brand}, {product_type}, {feed} (nazwa feedu jako slug) wypełnia produkt (zakodowane w URL); każde inne {…} albo {{…}} to makro kanału (ValueTrack Google, Meta) podawane bez zmian. bk_f/bk_pid są zarezerwowane. Parametrów, które link już ma, nigdy nie zastępujemy. |
ads_redirectboolean | Google: parametry trafiają tylko do ads_redirect (kliknięcia reklam produktowych; z linku, gdy produkt go nie ma), link i mobile_link dostają tylko znacznik. Pomijane dla Ceneo. |
Odpowiedzi
200OK400Nieprawidłowe dane (validation_error,invalid_json,invalid_cursor).401Brak, nieznany, unieważniony lub wygasły klucz (unauthorized,key_revoked,key_expired).403Klucz nie ma uprawnienia (insufficient_scope,details.required_scope).404Brak takiego rekordu w Twojej organizacji (not_found).413Treść ponad 64 KB (payload_too_large).429Ponad 120 żądań na minutę tym kluczem (rate_limited); odczekajRetry-Aftersekund.
Przykład
curl -X POST "https://app.basketly.io/api/v1/feeds/abc123/link-tagging/preview" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"enabled": true,
"preset": "marker",
"params": "example",
"ads_redirect": true
}'/feeds/{id}/rulesZapisz reguły feedu
Zastępuje reguły feedu (nie przepływu); feed wyjściowy używa ich od razu. Działa jako osoba, która utworzyła klucz: obowiązuje jej rola, scope=mine oznacza jej własną pracę.
Uprawnienie: feeds:write
Parametry
| Nazwa | Opis |
|---|---|
idścieżkastringWymagany | Identyfikator rekordu. |
Treść żądania application/json
| Nazwa | Opis |
|---|---|
rulesobject[]Wymagany | Reguły w kolejności: id, name, off, match (""/all/any), when [{field, op, value, to}], then i else [{type, field, value, with, from}]. Zastępuje wszystkie reguły. Odrzucane dla przepływów. |
Odpowiedzi
200OK400Nieprawidłowe dane (validation_error,invalid_json,invalid_cursor).401Brak, nieznany, unieważniony lub wygasły klucz (unauthorized,key_revoked,key_expired).403Klucz nie ma uprawnienia (insufficient_scope,details.required_scope).404Brak takiego rekordu w Twojej organizacji (not_found).413Treść ponad 64 KB (payload_too_large).429Ponad 120 żądań na minutę tym kluczem (rate_limited); odczekajRetry-Aftersekund.
Przykład
curl -X PUT "https://app.basketly.io/api/v1/feeds/abc123/rules" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"rules": [
{}
]
}'/feeds/{id}/flowZapisz przepływ feedu
Zastępuje płótno przepływu; feed wyjściowy i jego format zmieniają się od razu. Działa jako osoba, która utworzyła klucz: obowiązuje jej rola, scope=mine oznacza jej własną pracę.
Uprawnienie: feeds:write
Parametry
| Nazwa | Opis |
|---|---|
idścieżkastringWymagany | Identyfikator rekordu. |
Treść żądania application/json
| Nazwa | Opis |
|---|---|
graphobjectWymagany | Płótno {nodes: [{id, type, label, config, x, y}], edges: [{from, port, to}]}. Typy bloczków: input {feed, processed}, filter i branch {match, when}, change {actions}, autofix, categories, output {format}. Wyjścia: out; branch yes/no. Dokładnie jedno wyjście; każdy bloczek na drodze od wejścia do wyjścia; bez pętli; każdy feed raz. Odrzucone płótno zwraca 400 z node_id. |
Odpowiedzi
200OK400Nieprawidłowe dane (validation_error,invalid_json,invalid_cursor).401Brak, nieznany, unieważniony lub wygasły klucz (unauthorized,key_revoked,key_expired).403Klucz nie ma uprawnienia (insufficient_scope,details.required_scope).404Brak takiego rekordu w Twojej organizacji (not_found).413Treść ponad 64 KB (payload_too_large).429Ponad 120 żądań na minutę tym kluczem (rate_limited); odczekajRetry-Aftersekund.
Przykład
curl -X PUT "https://app.basketly.io/api/v1/feeds/abc123/flow" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"graph": {}
}'/feeds/{id}/previewPodgląd feedu
Uruchamia niezapisane reguły albo niezapisane płótno na wszystkich produktach i zwraca, co by się zmieniło. Nic nie jest zapisywane. Działa jako osoba, która utworzyła klucz: obowiązuje jej rola, scope=mine oznacza jej własną pracę.
Uprawnienie: feeds:read
Parametry
| Nazwa | Opis |
|---|---|
idścieżkastringWymagany | Identyfikator rekordu. |
Treść żądania application/json
| Nazwa | Opis |
|---|---|
rulesobject[] | Reguły do sprawdzenia (feedy z regułami). |
graphobject | Płótno do sprawdzenia (przepływy). |
Odpowiedzi
200OK400Nieprawidłowe dane (validation_error,invalid_json,invalid_cursor).401Brak, nieznany, unieważniony lub wygasły klucz (unauthorized,key_revoked,key_expired).403Klucz nie ma uprawnienia (insufficient_scope,details.required_scope).404Brak takiego rekordu w Twojej organizacji (not_found).413Treść ponad 64 KB (payload_too_large).429Ponad 120 żądań na minutę tym kluczem (rate_limited); odczekajRetry-Aftersekund.
Przykład
curl -X POST "https://app.basketly.io/api/v1/feeds/abc123/preview" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"rules": [
{}
],
"graph": {}
}'/feeds/{id}/fetchPobierz teraz
Dodaje pobranie feedu do kolejki (feedy z feedów i przepływy: ich wejść). Działa jako osoba, która utworzyła klucz: obowiązuje jej rola, scope=mine oznacza jej własną pracę.
Uprawnienie: feeds:write
Parametry
| Nazwa | Opis |
|---|---|
idścieżkastringWymagany | Identyfikator rekordu. |
Idempotency-Keynagłówekstring | Unikalny klucz (1–255 widocznych znaków ASCII). Powtórzenie POST z tym samym kluczem i treścią w ciągu 24 godzin zwraca zapisaną odpowiedź z Idempotent-Replayed: true.Maks. długość: 255 |
Odpowiedzi
204W kolejce400Nieprawidłowe dane (validation_error,invalid_json,invalid_cursor).401Brak, nieznany, unieważniony lub wygasły klucz (unauthorized,key_revoked,key_expired).403Klucz nie ma uprawnienia (insufficient_scope,details.required_scope).404Brak takiego rekordu w Twojej organizacji (not_found).409Konflikt z aktualnym stanem (conflict,contact_exists,contact_merged,event_conflict,source_paused,idempotency_in_progress).422Idempotency-Key użyty z inną treścią (idempotency_key_reused).429Ponad 120 żądań na minutę tym kluczem (rate_limited); odczekajRetry-Aftersekund.
Przykład
curl -X POST "https://app.basketly.io/api/v1/feeds/abc123/fetch" \
-H "Authorization: Bearer $API_KEY" \
-H "Idempotency-Key: 5f0c7a2e-8d41-4b6a-9e3f-1c2d3e4f5a6b"/feeds/{id}/categoriesKategorie feedu
Kategorie sklepu z kategorią Google, którą dostaje każda — wybraną przez człowieka, automatycznie z pewnością albo po nazwie każdego produktu — i podpowiedziami. Działa jako osoba, która utworzyła klucz: obowiązuje jej rola, scope=mine oznacza jej własną pracę.
Uprawnienie: feeds:read
Parametry
| Nazwa | Opis |
|---|---|
idścieżkastringWymagany | Identyfikator rekordu. |
Odpowiedzi
200OK400Nieprawidłowe dane (validation_error,invalid_json,invalid_cursor).401Brak, nieznany, unieważniony lub wygasły klucz (unauthorized,key_revoked,key_expired).403Klucz nie ma uprawnienia (insufficient_scope,details.required_scope).404Brak takiego rekordu w Twojej organizacji (not_found).429Ponad 120 żądań na minutę tym kluczem (rate_limited); odczekajRetry-Aftersekund.
Przykład
curl "https://app.basketly.io/api/v1/feeds/abc123/categories" \
-H "Authorization: Bearer $API_KEY"/feeds/{id}/categoriesZapisz kategorie feedu
Zapisuje kategorię Google i własną nazwę dla każdej kategorii sklepu; pozycje bez auto są wyborem człowieka i wygrywają z automatycznym. Działa jako osoba, która utworzyła klucz: obowiązuje jej rola, scope=mine oznacza jej własną pracę.
Uprawnienie: feeds:write
Parametry
| Nazwa | Opis |
|---|---|
idścieżkastringWymagany | Identyfikator rekordu. |
Treść żądania application/json
| Nazwa | Opis |
|---|---|
categoriesobject[]Wymagany | [{name, google, own, auto, confidence, broad}] — kategoria sklepu, numer kategorii Google (0 = brak), własna nazwa ("" = bez zmian); bez auto kategoria Google jest wyborem człowieka i nigdy nie zmienia się sama; z auto: true Basketly może ją przeliczyć. Zastępuje całą listę. |
Odpowiedzi
200OK400Nieprawidłowe dane (validation_error,invalid_json,invalid_cursor).401Brak, nieznany, unieważniony lub wygasły klucz (unauthorized,key_revoked,key_expired).403Klucz nie ma uprawnienia (insufficient_scope,details.required_scope).404Brak takiego rekordu w Twojej organizacji (not_found).413Treść ponad 64 KB (payload_too_large).429Ponad 120 żądań na minutę tym kluczem (rate_limited); odczekajRetry-Aftersekund.
Przykład
curl -X PUT "https://app.basketly.io/api/v1/feeds/abc123/categories" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"categories": [
{}
]
}'/feeds/{id}/categoriesZmień wybrane kategorie feedu
Zmienia tylko podane wiersze: kategoria Google człowieka, zatwierdzenie automatycznej, powrót do automatycznej, własna nazwa. Odpowiada zmienionymi wierszami i podsumowaniem wszystkich. Działa jako osoba, która utworzyła klucz: obowiązuje jej rola, scope=mine oznacza jej własną pracę.
Uprawnienie: feeds:write
Parametry
| Nazwa | Opis |
|---|---|
idścieżkastringWymagany | Identyfikator rekordu. |
Treść żądania application/json
| Nazwa | Opis |
|---|---|
changesobject[]Wymagany | 1–500 wierszy do zmiany: [{name, google?, confirm?, restore?, own?}] — name = kategoria sklepu jak w GET; jedno z: google (numer kategorii Google: wybór człowieka, od teraz wygrywa), confirm: true (bieżący wybór automatyczny staje się wyborem człowieka) albo restore: true (powrót do automatycznego wyboru Basketly, wybranego od nowa), i/lub own (własna nazwa, "" usuwa). Pozostałe wiersze zostają bez zmian. |
Odpowiedzi
200OK400Nieprawidłowe dane (validation_error,invalid_json,invalid_cursor).401Brak, nieznany, unieważniony lub wygasły klucz (unauthorized,key_revoked,key_expired).403Klucz nie ma uprawnienia (insufficient_scope,details.required_scope).404Brak takiego rekordu w Twojej organizacji (not_found).429Ponad 120 żądań na minutę tym kluczem (rate_limited); odczekajRetry-Aftersekund.
Przykład
curl -X PATCH "https://app.basketly.io/api/v1/feeds/abc123/categories" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"changes": [
{}
]
}'/google-categoriesSzukaj kategorii Google
Znajduje kategorie taksonomii produktów Google po słowach polskich lub angielskich albo po numerze (do pola google kategorii feedu). Działa jako osoba, która utworzyła klucz: obowiązuje jej rola, scope=mine oznacza jej własną pracę.
Uprawnienie: feeds:read
Parametry
| Nazwa | Opis |
|---|---|
qzapytaniestring | Słowa albo numer kategorii, do 100 znaków. |
Odpowiedzi
200OK400Nieprawidłowe dane (validation_error,invalid_json,invalid_cursor).401Brak, nieznany, unieważniony lub wygasły klucz (unauthorized,key_revoked,key_expired).403Klucz nie ma uprawnienia (insufficient_scope,details.required_scope).429Ponad 120 żądań na minutę tym kluczem (rate_limited); odczekajRetry-Aftersekund.
Przykład
curl "https://app.basketly.io/api/v1/google-categories" \
-H "Authorization: Bearer $API_KEY"/google-taxonomyWersja taksonomii Google
Której wersji taksonomii produktów Google używa Basketly, ile ma kategorii i kiedy ostatnio sprawdzono u Google (co tydzień samo). Działa jako osoba, która utworzyła klucz: obowiązuje jej rola, scope=mine oznacza jej własną pracę.
Uprawnienie: feeds:read
Odpowiedzi
200OK400Nieprawidłowe dane (validation_error,invalid_json,invalid_cursor).401Brak, nieznany, unieważniony lub wygasły klucz (unauthorized,key_revoked,key_expired).403Klucz nie ma uprawnienia (insufficient_scope,details.required_scope).429Ponad 120 żądań na minutę tym kluczem (rate_limited); odczekajRetry-Aftersekund.
Przykład
curl "https://app.basketly.io/api/v1/google-taxonomy" \
-H "Authorization: Bearer $API_KEY"/google-taxonomy/refreshSprawdź taksonomię Google teraz
Dodaje zadanie w tle, które pobiera taksonomię Google (polską i angielską) i włącza poprawną nowszą wersję. Tylko właściciel albo administrator organizacji. Działa jako osoba, która utworzyła klucz: obowiązuje jej rola, scope=mine oznacza jej własną pracę.
Uprawnienie: feeds:write
Odpowiedzi
202OK400Nieprawidłowe dane (validation_error,invalid_json,invalid_cursor).401Brak, nieznany, unieważniony lub wygasły klucz (unauthorized,key_revoked,key_expired).403Klucz nie ma uprawnienia (insufficient_scope,details.required_scope).429Ponad 120 żądań na minutę tym kluczem (rate_limited); odczekajRetry-Aftersekund.
Przykład
curl -X POST "https://app.basketly.io/api/v1/google-taxonomy/refresh" \
-H "Authorization: Bearer $API_KEY"/feeds/{id}/categories/autoPrzelicz kategorie automatycznie
Wybiera od nowa kategorię Google każdej kategorii sklepu, której nie wybrał człowiek (Basketly robi to sam po każdym odczycie produktów; to przelicza także istniejące wybory). Wybory ludzi zostają. Odpowiada jak GET. Działa jako osoba, która utworzyła klucz: obowiązuje jej rola, scope=mine oznacza jej własną pracę.
Uprawnienie: feeds:write
Parametry
| Nazwa | Opis |
|---|---|
idścieżkastringWymagany | Identyfikator rekordu. |
Odpowiedzi
200OK400Nieprawidłowe dane (validation_error,invalid_json,invalid_cursor).401Brak, nieznany, unieważniony lub wygasły klucz (unauthorized,key_revoked,key_expired).403Klucz nie ma uprawnienia (insufficient_scope,details.required_scope).404Brak takiego rekordu w Twojej organizacji (not_found).429Ponad 120 żądań na minutę tym kluczem (rate_limited); odczekajRetry-Aftersekund.
Przykład
curl -X POST "https://app.basketly.io/api/v1/feeds/abc123/categories/auto" \
-H "Authorization: Bearer $API_KEY"Szablony grafik
Szablony grafik do reklam katalogowych.
/templatesLista szablonów grafik
Szablony, którymi reguła feedu albo bloczek przepływu rysuje grafiki produktów. Działa jako osoba, która utworzyła klucz: obowiązuje jej rola, scope=mine oznacza jej własną pracę.
Uprawnienie: templates:read
Odpowiedzi
200OKPola odpowiedziNazwa Opis templatesobject[]Szablony: id, name, format, updated. 400Nieprawidłowe dane (validation_error,invalid_json,invalid_cursor).401Brak, nieznany, unieważniony lub wygasły klucz (unauthorized,key_revoked,key_expired).403Klucz nie ma uprawnienia (insufficient_scope,details.required_scope).429Ponad 120 żądań na minutę tym kluczem (rate_limited); odczekajRetry-Aftersekund.
Przykład
curl "https://app.basketly.io/api/v1/templates" \
-H "Authorization: Bearer $API_KEY"/templates/performanceWyniki szablonów
Wyniki w reklamach produktów z feedów, które używają każdego szablonu. Działa jako osoba, która utworzyła klucz: obowiązuje jej rola, scope=mine oznacza jej własną pracę.
Uprawnienie: templates:read
Parametry
| Nazwa | Opis |
|---|---|
fromzapytaniestring | Pierwszy dzień RRRR-MM-DD (domyślnie 30 dni temu). |
tozapytaniestring | Ostatni dzień RRRR-MM-DD. |
Odpowiedzi
200OK400Nieprawidłowe dane (validation_error,invalid_json,invalid_cursor).401Brak, nieznany, unieważniony lub wygasły klucz (unauthorized,key_revoked,key_expired).403Klucz nie ma uprawnienia (insufficient_scope,details.required_scope).429Ponad 120 żądań na minutę tym kluczem (rate_limited); odczekajRetry-Aftersekund.
Przykład
curl "https://app.basketly.io/api/v1/templates/performance" \
-H "Authorization: Bearer $API_KEY"/templates/{id}Pobierz szablon grafiki
Jeden szablon z warstwami. Działa jako osoba, która utworzyła klucz: obowiązuje jej rola, scope=mine oznacza jej własną pracę.
Uprawnienie: templates:read
Parametry
| Nazwa | Opis |
|---|---|
idścieżkastringWymagany | Identyfikator rekordu. |
Odpowiedzi
200OK400Nieprawidłowe dane (validation_error,invalid_json,invalid_cursor).401Brak, nieznany, unieważniony lub wygasły klucz (unauthorized,key_revoked,key_expired).403Klucz nie ma uprawnienia (insufficient_scope,details.required_scope).404Brak takiego rekordu w Twojej organizacji (not_found).429Ponad 120 żądań na minutę tym kluczem (rate_limited); odczekajRetry-Aftersekund.
Przykład
curl "https://app.basketly.io/api/v1/templates/abc123" \
-H "Authorization: Bearer $API_KEY"Raporty
Liczby kampanii i kreacji.
/campaigns/reportRaport kampanii
Wydatki, zakupy, wartość zakupów, koszt zakupu i ROAS na kampanię, zestaw lub reklamę — liczby ze strony Kampanie.
Uprawnienie: campaigns:read
Parametry
| Nazwa | Opis |
|---|---|
fromzapytaniestring | Pierwszy dzień RRRR-MM-DD (domyślnie 30 dni temu). |
tozapytaniestring | Ostatni dzień RRRR-MM-DD (zakres do 366 dni). |
levelzapytaniestring | Poziom wierszy.Wartości: campaign, adset, adDomyślnie: campaign |
campaignzapytaniestring | Tylko ta kampania (dla poziomu adset/ad). |
adsetzapytaniestring | Tylko ten zestaw (poziom ad). |
ad_accountzapytaniestring | Tylko to konto reklamowe Mety (act_… albo sam numer); sumy sklepu pojawiają się wtedy tylko, gdy to jedyne konto organizacji. |
Odpowiedzi
200OKPola odpowiedziNazwa Opis fromstringPierwszy dzień (strefa czasowa organizacji). tostringOstatni dzień. levelstringPoziom wierszy.Wartości: campaign,adset,adtotalsobject[]Sumy w każdej walucie: currenti poprzedni okres tej samej długości (previous). Bez filtra kampanii/zestawu zawierają też opłacone zamówienia sklepu z okresu (shop_orders,shop_revenue) imer= przychód sklepu / wydatki. Sumy i wiersze mają teżbaskety_orders,baskety_revenue,baskety_currency: opłacone zamówienia, których źródłem reklamy (odczytanie Basketly z wizyt kupującego) jest kampania / zestaw / reklama Mety z wiersza — inna liczba niż zakupy Mety, nigdy do nich nie dodawana.rowsarray Each row also names its Meta ad account: `ad_account_id` and `ad_account_name` (empty until read).Wiersz na kampanię / zestaw / reklamę ze status(stan w Mecie),optimization(na co optymalizują jego zestawy:labelpo polsku — standardowe zdarzenia Mety po polsku, np. „Zdarzenie: Zakup (zbiór …)” —eventi przy celu na zdarzenieevent_name= techniczna nazwa w Mecie, np. Purchase,short= cel słowami bez zbioru na plakietkę, np. „Zakup”) imetrics: spend, purchases, purchase_value, cost_per_purchase, roas (zakupy i ich wartość według raportu Mety); dostarczanie zsumowane z dni okresu — impressions, clicks (wszystkie kliknięcia), cpm (wydatki / wyświetlenia × 1000), link_clicks, ctr (kliknięcia linku / wyświetlenia, ułamek), cpc (wydatki / kliknięcie linku; liczby linków tylko z dni odczytanych z kliknięciami linku, wcześniej null), wideo plays_3s, thruplays, p25, p50, p75, p100, hook_rate (odtworzenia 3 s / wyświetlenia) i hold_rate (ThruPlay / odtworzenia 3 s; null dla obrazów); koszty i wskaźniki są null przy zerowym dzielniku. Zasięgu i częstotliwości nie ma (dziennego zasięgu nie da się zsumować). Do tegobaskety_orders/baskety_revenueze źródła zamówień. Sumy mają te same pola dostarczania.syncsobject[]Stan synchronizacji wydatków na konto reklamowe: ad_account_id(act_…),ad_account_name(nazwa konta w Mecie; pusta, dopóki następny odczyt wydatków jej nie zapisze),currency,last_success,last_errororazjob, gdy konto czeka albo jest czytane.comparisonobjectJak sumy porównują się z poprzednim okresem: {mode whole|same_hour, until, previous_until, spend_without_today, spend_to, previous_spend_to}. Okres kończący się dziś porównuje liczby Mety i MER po pełnych dniach (bez dzisiejszego w obu okresach), a zamówienia sklepu i Basketly do tej samej godziny; comparekażdej sumy to bieżące liczby do zestawienia zprevious(currentnadal obejmuje dzisiejszy dzień).shopsstring[]Rodzaje podłączonych sklepów (shoper, idosell, baselinker…), z których zamówień pochodzą liczby sklepu. 400Nieprawidłowe dane (validation_error,invalid_json,invalid_cursor).401Brak, nieznany, unieważniony lub wygasły klucz (unauthorized,key_revoked,key_expired).403Klucz nie ma uprawnienia (insufficient_scope,details.required_scope).429Ponad 120 żądań na minutę tym kluczem (rate_limited); odczekajRetry-Aftersekund.
Przykład
curl "https://app.basketly.io/api/v1/campaigns/report" \
-H "Authorization: Bearer $API_KEY"/creatives/reportRaport kreacji
Metryki na grupę kreacji z trendem tygodniowym i regułą zmęczenia — liczby ze strony Kreacje.
Uprawnienie: creatives:read
Parametry
| Nazwa | Opis |
|---|---|
fromzapytaniestring | Pierwszy dzień RRRR-MM-DD. |
tozapytaniestring | Ostatni dzień RRRR-MM-DD. |
formatzapytaniestring | Format kreacji. |
campaignzapytaniestring | Identyfikator kampanii Meta. |
ad_accountzapytaniestring | Identyfikator konta reklamowego. |
tagzapytaniestring | Filtr tagu wymiar:wartość (hook, creator, offer). |
weekszapytanieinteger | Liczba tygodni trendu, 4–8. |
channelzapytaniestring | meta (domyślnie) = grupy kreacji Mety; google_ads, microsoft_ads, tiktok, pinterest albo openai_ads = reklamy tej platformy (i zasoby Google) z liczbami platformy — odpowiedź to wtedy obiekt ChannelCreatives.Wartości: meta, google_ads, microsoft_ads, tiktok, pinterest, openai_ads |
activezapytaniestring | 1 = tylko aktywne reklamy. |
Odpowiedzi
200OKPola odpowiedziNazwa Opis fromstringPierwszy dzień. tostringOstatni dzień. weeksarray[]Zakresy tygodni użyte do trendu. rowsarray `ad_accounts` lists the Meta ad account ids of the group and `ad_account_names` their names in the same order (empty until read).Wiersz na grupę kreacji (ten sam film, obraz lub kreacja) z metrykami, trendem tygodniowym, oceną zmęczenia i tagami. baskety_orders/baskety_revenue(wbaskety_currency): opłacone zamówienia sklepu z okresu, których źródłem reklamowym (odczyt Basketly z ostatniego kliknięcia w wizytach kupującego) jest jedna z reklam kreacji — inna liczba niż zakupy Mety, nigdy do nich nie dodawana.totalsobject[]Sumy w każdej walucie. compare_totalsobject[]Bieżące sumy do zestawienia z previous_totals: gdy okres kończy się dziś, te same kreacje po pełnych dniach bez dzisiejszego (Meta podaje dane za dzień); w przeciwnym razie równetotals. Puste dla okresu tylko z dzisiejszego dnia (nie ma czego porównać).comparisonobjectJak sumy porównują się z poprzednim okresem: {mode whole|same_hour, until, previous_until, spend_without_today, spend_to, previous_spend_to}; previous_totals pomijają wtedy odpowiadający dzień na końcu. previous_totalsobject[]Sumy w każdej walucie tych samych (przefiltrowanych) kreacji z okresu tej samej długości tuż przed from(porównanie pod podsumowaniem Kreacji; gdy okres kończy się dziś, bez jego ostatniego dnia — zob.comparison).syncsobject[]Stan synchronizacji wydatków na konto reklamowe: ad_account_id(act_…),ad_account_name(nazwa konta w Mecie; pusta, dopóki następny odczyt wydatków jej nie zapisze),currency,last_success,last_errororazjob, gdy konto czeka albo jest czytane.400Nieprawidłowe dane (validation_error,invalid_json,invalid_cursor).401Brak, nieznany, unieważniony lub wygasły klucz (unauthorized,key_revoked,key_expired).403Klucz nie ma uprawnienia (insufficient_scope,details.required_scope).429Ponad 120 żądań na minutę tym kluczem (rate_limited); odczekajRetry-Aftersekund.
Przykład
curl "https://app.basketly.io/api/v1/creatives/report" \
-H "Authorization: Bearer $API_KEY"/reports/salesRaport sprzedaży
Sprzedaż sklepu w okresie obok poprzedniego: zamówienia, przychód w głównej walucie, średnie zamówienie, kupujący nowi/powracający, wydatki w Mecie, zakupy, ROAS, MER, wydatki na zamówienie, zakupy przyjęte do wysyłki, wydatki w Google Ads / Microsoft Ads według ich raportów, dzień po dniu, 10 najlepszych produktów i verdict — jedno zdanie o okresie (od niego zacznij czytanie Raportów). Źródła nigdy nie są łączone. Działa jako osoba, która utworzyła klucz: obowiązuje jej rola, scope=mine oznacza jej własną pracę.
Uprawnienie: campaigns:read
Parametry
| Nazwa | Opis |
|---|---|
fromzapytaniestring | Pierwszy dzień RRRR-MM-DD (domyślnie 30 dni temu). |
tozapytaniestring | Ostatni dzień RRRR-MM-DD (do 366 dni). |
Odpowiedzi
200OK400Nieprawidłowe dane (validation_error,invalid_json,invalid_cursor).401Brak, nieznany, unieważniony lub wygasły klucz (unauthorized,key_revoked,key_expired).403Klucz nie ma uprawnienia (insufficient_scope,details.required_scope).429Ponad 120 żądań na minutę tym kluczem (rate_limited); odczekajRetry-Aftersekund.
Przykład
curl "https://app.basketly.io/api/v1/reports/sales" \
-H "Authorization: Bearer $API_KEY"/reports/channelsKanały i sklep
Każdy kanał w okresie obok sklepu: łączne wydatki, MER i koszt zamówienia ze wszystkich kanałów, liczby każdego kanału według jego platformy (nigdy nie sumowane między platformami), zamówienia Basketly z ostatniego kliknięcia na źródło (udziały sumują się do 100%), suma własnych konwersji platform obok zamówień sklepu, dzień po dniu przychód i wydatki na kanał — Raporty → Sprzedaż. Działa jako osoba, która utworzyła klucz: obowiązuje jej rola, scope=mine oznacza jej własną pracę.
Uprawnienie: campaigns:read
Parametry
| Nazwa | Opis |
|---|---|
fromzapytaniestring | Pierwszy dzień RRRR-MM-DD (domyślnie 30 dni temu). |
tozapytaniestring | Ostatni dzień RRRR-MM-DD (do 366 dni). |
Odpowiedzi
200OK400Nieprawidłowe dane (validation_error,invalid_json,invalid_cursor).401Brak, nieznany, unieważniony lub wygasły klucz (unauthorized,key_revoked,key_expired).403Klucz nie ma uprawnienia (insufficient_scope,details.required_scope).429Ponad 120 żądań na minutę tym kluczem (rate_limited); odczekajRetry-Aftersekund.
Przykład
curl "https://app.basketly.io/api/v1/reports/channels" \
-H "Authorization: Bearer $API_KEY"/reports/product-channelsKanały × produkty
Każdy produkt wobec każdego kanału, który go pokazuje — Raporty → Kanały × produkty: na kanał wyświetlenia, kliknięcia, wydatki, CTR i własne konwersje platformy na produkt tam, gdzie je podaje (Meta nie: null), zamówienia Basketly z ostatniego kliknięcia zawierające produkt, sztuki na 100 kliknięć i udział w wyświetleniach kanału; sztuki, przychód, odsłony, koszyki, stan i dni zapasu sklepu; najlepszy kanał, podział wydatków i źródeł. Nigdy nie sumuje konwersji platform. Działa jako osoba, która utworzyła klucz: obowiązuje jej rola, scope=mine oznacza jej własną pracę.
Uprawnienie: campaigns:read
Parametry
| Nazwa | Opis |
|---|---|
fromzapytaniestring | Pierwszy dzień RRRR-MM-DD (domyślnie 30 dni temu). |
tozapytaniestring | Ostatni dzień RRRR-MM-DD (do 366 dni). |
channelzapytaniestring | Tylko produkty z liczbami w tym kanale; sortowanie po wydatkach i zamówieniach czyta ten kanał.Wartości: meta, google_ads, microsoft_ads, tiktok, pinterest, openai_ads |
sortzapytaniestring | Kolejność (końcówka _asc = rosnąco).Wartości: spend, orders, best, units, revenue, spend_asc, orders_asc, best_asc, units_asc, revenue_ascDomyślnie: spend |
pagezapytaniestring | Strona od 1. |
per_pagezapytaniestring | Wierszy na stronę: 10, 25, 50 albo 100.Domyślnie: 50 |
content_idzapytaniestring | Jeden produkt po identyfikatorze z katalogu. |
Odpowiedzi
200OK400Nieprawidłowe dane (validation_error,invalid_json,invalid_cursor).401Brak, nieznany, unieważniony lub wygasły klucz (unauthorized,key_revoked,key_expired).403Klucz nie ma uprawnienia (insufficient_scope,details.required_scope).429Ponad 120 żądań na minutę tym kluczem (rate_limited); odczekajRetry-Aftersekund.
Przykład
curl "https://app.basketly.io/api/v1/reports/product-channels" \
-H "Authorization: Bearer $API_KEY"/channels/reportRaport kanału
Bez channel sumy każdego kanału (Kampanie → Wszystkie kanały); z channel kampanie tego kanału (grupy reklam, reklamy, gdzie odczytane) z liczbami platformy i zamówieniami Basketly z ostatniego kliknięcia — jeden słownik dla Mety, Google Ads, Microsoft Ads, TikToka i Pinteresta. Działa jako osoba, która utworzyła klucz: obowiązuje jej rola, scope=mine oznacza jej własną pracę.
Uprawnienie: campaigns:read
Parametry
| Nazwa | Opis |
|---|---|
fromzapytaniestring | Pierwszy dzień RRRR-MM-DD (domyślnie 30 dni temu). |
tozapytaniestring | Ostatni dzień RRRR-MM-DD (do 366 dni). |
channelzapytaniestring | Jeden kanał płatny; puste = sumy wszystkich kanałów.Wartości: meta, google_ads, microsoft_ads, tiktok, pinterest, openai_ads |
levelzapytaniestring | Poziom wierszy.Wartości: campaign, adgroup, adDomyślnie: campaign |
parentzapytaniestring | Kampania grup reklam / grupa reklam reklam. |
Odpowiedzi
200OK400Nieprawidłowe dane (validation_error,invalid_json,invalid_cursor).401Brak, nieznany, unieważniony lub wygasły klucz (unauthorized,key_revoked,key_expired).403Klucz nie ma uprawnienia (insufficient_scope,details.required_scope).429Ponad 120 żądań na minutę tym kluczem (rate_limited); odczekajRetry-Aftersekund.
Przykład
curl "https://app.basketly.io/api/v1/channels/report" \
-H "Authorization: Bearer $API_KEY"/manual-spendKoszty spoza platform reklamowych
Koszty wpisane przez zespół (porównywarki, narzędzie e-mail, agencja, inne) na miesiąc. Kwota miesiąca rozkłada się równo na jego dni i wchodzi do łącznych wydatków, MER i kosztu zamówienia (GET /reports/channels: wiersze z manual), nigdy do liczb platformy. Działa jako osoba, która utworzyła klucz: obowiązuje jej rola, scope=mine oznacza jej własną pracę.
Uprawnienie: campaigns:read
Odpowiedzi
200OK400Nieprawidłowe dane (validation_error,invalid_json,invalid_cursor).401Brak, nieznany, unieważniony lub wygasły klucz (unauthorized,key_revoked,key_expired).403Klucz nie ma uprawnienia (insufficient_scope,details.required_scope).429Ponad 120 żądań na minutę tym kluczem (rate_limited); odczekajRetry-Aftersekund.
Przykład
curl "https://app.basketly.io/api/v1/manual-spend" \
-H "Authorization: Bearer $API_KEY"/manual-spendDodaj koszt spoza platform reklamowych
Dodaje koszt jednego miesiąca. Nic nie jest wysyłane; zmieniają się tylko łączne wydatki i MER. Działa jako osoba, która utworzyła klucz: obowiązuje jej rola, scope=mine oznacza jej własną pracę.
Uprawnienie: campaigns:write
Parametry
| Nazwa | Opis |
|---|---|
Idempotency-Keynagłówekstring | Unikalny klucz (1–255 widocznych znaków ASCII). Powtórzenie POST z tym samym kluczem i treścią w ciągu 24 godzin zwraca zapisaną odpowiedź z Idempotent-Replayed: true.Maks. długość: 255 |
Treść żądania application/json
| Nazwa | Opis |
|---|---|
channelstring | comparison, email, agency albo other.Wartości: comparison, email, agency, other |
namestring | Czego dotyczy koszt, do 80 znaków (wymagane dla other). |
monthstring | RRRR-MM. |
amountnumber | Więcej niż 0, najwyżej 1 000 000 000. |
currencystring | Kod ISO (domyślnie główna waluta sklepu). |
notestring | Do 500 znaków. |
Odpowiedzi
201UtworzonoPola odpowiedziNazwa Opis idstringIdentyfikator wpisu. channelstringRodzaj kosztu: comparison (porównywarki), email (narzędzie e-mail), agency (agencja), other (inne).Wartości: comparison,email,agency,othernamestringCzego dotyczy koszt (wymagane dla other). monthstringMiesiąc RRRR-MM; kwota rozkłada się równo na jego dni. amountnumberKwota za miesiąc. currencystringKod waluty ISO. notestringNotatka. createdstring (date-time)Utworzono. updatedstring (date-time)Zmieniono. 400Nieprawidłowe dane (validation_error,invalid_json,invalid_cursor).401Brak, nieznany, unieważniony lub wygasły klucz (unauthorized,key_revoked,key_expired).403Klucz nie ma uprawnienia (insufficient_scope,details.required_scope).429Ponad 120 żądań na minutę tym kluczem (rate_limited); odczekajRetry-Aftersekund.
Przykład
curl -X POST "https://app.basketly.io/api/v1/manual-spend" \
-H "Authorization: Bearer $API_KEY" \
-H "Idempotency-Key: 5f0c7a2e-8d41-4b6a-9e3f-1c2d3e4f5a6b" \
-H "Content-Type: application/json" \
-d '{
"name": "Anna Nowak",
"currency": "PLN"
}'/manual-spend/{id}Zmień koszt spoza platform reklamowych
Zmienia dowolne pole jednego wpisu. Działa jako osoba, która utworzyła klucz: obowiązuje jej rola, scope=mine oznacza jej własną pracę.
Uprawnienie: campaigns:write
Parametry
| Nazwa | Opis |
|---|---|
idścieżkastringWymagany | Identyfikator rekordu. |
Treść żądania application/json
| Nazwa | Opis |
|---|---|
channelstring | comparison, email, agency albo other.Wartości: comparison, email, agency, other |
namestring | Czego dotyczy koszt. |
monthstring | RRRR-MM. |
amountnumber | Kwota za miesiąc. |
currencystring | Kod ISO. |
notestring | Notatka. |
Odpowiedzi
200OKPola odpowiedziNazwa Opis idstringIdentyfikator wpisu. channelstringRodzaj kosztu: comparison (porównywarki), email (narzędzie e-mail), agency (agencja), other (inne).Wartości: comparison,email,agency,othernamestringCzego dotyczy koszt (wymagane dla other). monthstringMiesiąc RRRR-MM; kwota rozkłada się równo na jego dni. amountnumberKwota za miesiąc. currencystringKod waluty ISO. notestringNotatka. createdstring (date-time)Utworzono. updatedstring (date-time)Zmieniono. 400Nieprawidłowe dane (validation_error,invalid_json,invalid_cursor).401Brak, nieznany, unieważniony lub wygasły klucz (unauthorized,key_revoked,key_expired).403Klucz nie ma uprawnienia (insufficient_scope,details.required_scope).404Brak takiego rekordu w Twojej organizacji (not_found).429Ponad 120 żądań na minutę tym kluczem (rate_limited); odczekajRetry-Aftersekund.
Przykład
curl -X PATCH "https://app.basketly.io/api/v1/manual-spend/abc123" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Anna Nowak",
"currency": "PLN"
}'/manual-spend/{id}Usuń koszt spoza platform reklamowych
Usuwa jeden wpis na stałe. Działa jako osoba, która utworzyła klucz: obowiązuje jej rola, scope=mine oznacza jej własną pracę.
Uprawnienie: campaigns:write
Parametry
| Nazwa | Opis |
|---|---|
idścieżkastringWymagany | Identyfikator rekordu. |
Odpowiedzi
200OKPola odpowiedziNazwa Opis deletedstringWymaganyIdentyfikator usuniętego wpisu. 400Nieprawidłowe dane (validation_error,invalid_json,invalid_cursor).401Brak, nieznany, unieważniony lub wygasły klucz (unauthorized,key_revoked,key_expired).403Klucz nie ma uprawnienia (insufficient_scope,details.required_scope).404Brak takiego rekordu w Twojej organizacji (not_found).429Ponad 120 żądań na minutę tym kluczem (rate_limited); odczekajRetry-Aftersekund.
Przykład
curl -X DELETE "https://app.basketly.io/api/v1/manual-spend/abc123" \
-H "Authorization: Bearer $API_KEY"/reports/insightsWnioski z raportów
Wszystkie wnioski okresu z reguł (sprzedaż, trajektorie produktów, produkty-magnesy, zatowarowanie, otagowane feedy) z liczbami i proponowanym działaniem, najważniejsze pierwsze. Działa jako osoba, która utworzyła klucz: obowiązuje jej rola, scope=mine oznacza jej własną pracę.
Uprawnienie: campaigns:read
Parametry
| Nazwa | Opis |
|---|---|
fromzapytaniestring | Pierwszy dzień RRRR-MM-DD (domyślnie 30 dni temu). |
tozapytaniestring | Ostatni dzień RRRR-MM-DD (do 366 dni). |
channelzapytaniestring | Tylko wnioski o tym kanale (liczniki channels nadal obejmują wszystkie wnioski).Wartości: meta, google_ads, microsoft_ads, tiktok, pinterest, email, comparison, other, direct, unknown |
Odpowiedzi
200OK400Nieprawidłowe dane (validation_error,invalid_json,invalid_cursor).401Brak, nieznany, unieważniony lub wygasły klucz (unauthorized,key_revoked,key_expired).403Klucz nie ma uprawnienia (insufficient_scope,details.required_scope).429Ponad 120 żądań na minutę tym kluczem (rate_limited); odczekajRetry-Aftersekund.
Przykład
curl "https://app.basketly.io/api/v1/reports/insights" \
-H "Authorization: Bearer $API_KEY"/reports/insights/{key}Oznacz wniosek
Oznacza jeden wniosek tylko dla twórcy klucza, jak menu ⋯ w Raportach: zrobione, odłożone do dnia, nie dotyczy albo znów otwarte. Inni członkowie nadal go widzą; powtórzenie tego samego stanu niczego nie zmienia. Nie zmienia danych organizacji, więc wystarcza uprawnienie do odczytu raportów. Działa jako osoba, która utworzyła klucz: obowiązuje jej rola, scope=mine oznacza jej własną pracę.
Uprawnienie: campaigns:read
Parametry
| Nazwa | Opis |
|---|---|
keyścieżkastringWymagany | Klucz wniosku (key) z GET /reports/insights. |
Treść żądania application/json
| Nazwa | Opis |
|---|---|
statestringWymagany | done, snoozed, dismissed albo open, żeby przywrócić wniosek.Wartości: open, done, snoozed, dismissed |
untilstring (date) | Tylko snoozed: dzień powrotu wniosku, RRRR-MM-DD (od jutra do roku; domyślnie 7 dni od dziś). |
Odpowiedzi
200OKPola odpowiedziNazwa Opis keystringKlucz wniosku. statestringStan po zmianie.Wartości: open,done,snoozed,dismisseduntilstringDzień końca odłożenia albo pusty. 400Nieprawidłowe dane (validation_error,invalid_json,invalid_cursor).401Brak, nieznany, unieważniony lub wygasły klucz (unauthorized,key_revoked,key_expired).403Klucz nie ma uprawnienia (insufficient_scope,details.required_scope).429Ponad 120 żądań na minutę tym kluczem (rate_limited); odczekajRetry-Aftersekund.
Przykład
curl -X PUT "https://app.basketly.io/api/v1/reports/insights/abc123" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"state": "open"
}'/reports/productsTrajektorie produktów
Wyświetlenia, kliknięcia i wydatki produktu w reklamach katalogowych Mety obok sprzedanych sztuk i przychodu z zamówień sklepu, dzień po dniu (powyżej 31 dni tydzień po tygodniu), z trendami, zmianą tydzień do tygodnia, wzorcem i wnioskami — każdy produkt z wyświetleniami, sprzedażą albo odsłonami w okresie (do 5000), szukany, filtrowany, sortowany i stronicowany na serwerze (total, listed, matched, capped). Kliknięcia i sprzedaż stoją obok siebie, bez atrybucji. Działa jako osoba, która utworzyła klucz: obowiązuje jej rola, scope=mine oznacza jej własną pracę.
Uprawnienie: campaigns:read
Parametry
| Nazwa | Opis |
|---|---|
fromzapytaniestring | Pierwszy dzień RRRR-MM-DD (domyślnie 30 dni temu). |
tozapytaniestring | Ostatni dzień RRRR-MM-DD (do 366 dni). |
bucketzapytaniestring | day albo week (domyślnie day do 31 dni, powyżej week).Wartości: day, week |
qzapytaniestring | Tekst w nazwie albo identyfikatorze produktu; szuka we wszystkich produktach okresu, nie tylko na pierwszej stronie. |
patternzapytaniestring | Tylko te wzorce (powtórz albo rozdziel przecinkami); patterns w odpowiedzi nadal liczy wszystkie produkty.Wartości: clicks_up_sales_flat, sales_rising, interest_without_sales, both_rising, sales_without_ads, sales_falling, both_falling, clicks_falling, steady, thin |
sortzapytaniestring | Kolejność (końcówka _asc = rosnąco).Wartości: impressions, clicks, ctr, spend, units, revenue, clicks_trend, units_trend, name, impressions_asc, clicks_asc, ctr_asc, spend_asc, units_asc, revenue_asc, clicks_trend_asc, units_trend_asc, name_ascDomyślnie: impressions |
pagezapytaniestring | Strona od 1. |
per_pagezapytaniestring | Produktów na stronę, 1–500.Domyślnie: 150 |
Odpowiedzi
200OK400Nieprawidłowe dane (validation_error,invalid_json,invalid_cursor).401Brak, nieznany, unieważniony lub wygasły klucz (unauthorized,key_revoked,key_expired).403Klucz nie ma uprawnienia (insufficient_scope,details.required_scope).429Ponad 120 żądań na minutę tym kluczem (rate_limited); odczekajRetry-Aftersekund.
Przykład
curl "https://app.basketly.io/api/v1/reports/products" \
-H "Authorization: Bearer $API_KEY"/reports/products/detailTrajektoria produktu
Trajektoria jednego produktu, każdy dzień okresu, z jego wnioskami. Działa jako osoba, która utworzyła klucz: obowiązuje jej rola, scope=mine oznacza jej własną pracę.
Uprawnienie: campaigns:read
Parametry
| Nazwa | Opis |
|---|---|
idzapytaniestringWymagany | Identyfikator produktu z katalogu (content_id). |
fromzapytaniestring | Pierwszy dzień RRRR-MM-DD (domyślnie 30 dni temu). |
tozapytaniestring | Ostatni dzień RRRR-MM-DD (do 366 dni). |
Odpowiedzi
200OK400Nieprawidłowe dane (validation_error,invalid_json,invalid_cursor).401Brak, nieznany, unieważniony lub wygasły klucz (unauthorized,key_revoked,key_expired).403Klucz nie ma uprawnienia (insufficient_scope,details.required_scope).404Brak takiego rekordu w Twojej organizacji (not_found).429Ponad 120 żądań na minutę tym kluczem (rate_limited); odczekajRetry-Aftersekund.
Przykład
curl "https://app.basketly.io/api/v1/reports/products/detail" \
-H "Authorization: Bearer $API_KEY"/reports/magnetsProdukty-magnesy
Produkty, które ludzie oglądają albo klikają, ale rzadko kupują, a ci sami ludzie kupują inne produkty — z powiązanych wizyt skryptu sklepu i z zamówień z reklam katalogowych. Współwystępowanie, nie dowód przyczyny. Działa jako osoba, która utworzyła klucz: obowiązuje jej rola, scope=mine oznacza jej własną pracę.
Uprawnienie: campaigns:read
Parametry
| Nazwa | Opis |
|---|---|
fromzapytaniestring | Pierwszy dzień RRRR-MM-DD (domyślnie 30 dni temu). |
tozapytaniestring | Ostatni dzień RRRR-MM-DD (do 366 dni). |
Odpowiedzi
200OK400Nieprawidłowe dane (validation_error,invalid_json,invalid_cursor).401Brak, nieznany, unieważniony lub wygasły klucz (unauthorized,key_revoked,key_expired).403Klucz nie ma uprawnienia (insufficient_scope,details.required_scope).429Ponad 120 żądań na minutę tym kluczem (rate_limited); odczekajRetry-Aftersekund.
Przykład
curl "https://app.basketly.io/api/v1/reports/magnets" \
-H "Authorization: Bearer $API_KEY"/reports/unseenProdukty niewyświetlane
Produkty w katalogu (feed Basketly czytany przez Metę albo, bez niego, każdy aktywny produkt), dostępne i bez błędów Mety, których reklamy katalogowe nie pokazały w okresie — z przyczyną, dniami w feedzie, popytem w sklepie i wartością zapasu. Jedna strona listy; podsumowanie i wnioski obejmują cały katalog. Działa jako osoba, która utworzyła klucz: obowiązuje jej rola, scope=mine oznacza jej własną pracę.
Uprawnienie: campaigns:read
Parametry
| Nazwa | Opis |
|---|---|
fromzapytaniestring | Pierwszy dzień RRRR-MM-DD (domyślnie 30 dni temu). |
tozapytaniestring | Ostatni dzień RRRR-MM-DD (do 366 dni). |
reasonzapytaniestring | Lista po przecinku: not_in_feed, excluded_by_rule, out_of_stock, meta_error_check, meta_rejected, meta_pending, pending_sync, not_in_active_set, not_picked. |
exposurezapytaniestring | Lista po przecinku: none, low, shown (domyślnie none,low). |
eligiblezapytaniestring | yes albo no. |
feedzapytaniestring | Id feedu: produkty przez niego serwowane albo pominięte. |
categoryzapytaniestring | Kategoria sklepu, dokładnie (można powtórzyć). |
brandzapytaniestring | Marka, dokładnie (można powtórzyć). |
availabilityzapytaniestring | Lista po przecinku: in_stock, out_of_stock, preorder, backorder, unknown. |
saleszapytaniestring | yes albo no: sprzedane sztuki w okresie. |
viewszapytaniestring | yes albo no: odsłony w sklepie w okresie. |
qzapytaniestring | Tytuł, SKU albo id z katalogu. |
sortzapytaniestring | stock_value (domyślnie), units, views, revenue, impressions, days_in_feed, last_impression, title; _asc odwraca. |
pagezapytaniestring | Strona, od 1. |
per_pagezapytaniestring | 10, 25 (domyślnie), 50 albo 100. |
Odpowiedzi
200OK400Nieprawidłowe dane (validation_error,invalid_json,invalid_cursor).401Brak, nieznany, unieważniony lub wygasły klucz (unauthorized,key_revoked,key_expired).403Klucz nie ma uprawnienia (insufficient_scope,details.required_scope).429Ponad 120 żądań na minutę tym kluczem (rate_limited); odczekajRetry-Aftersekund.
Przykład
curl "https://app.basketly.io/api/v1/reports/unseen" \
-H "Authorization: Bearer $API_KEY"/reports/stock-adsWyprzedane z emisją
Produkty z wyświetleniami i wydatkami w dniach, gdy sklep podawał brak towaru (ze zmian dostępności z nocnych odczytów produktów), opóźnienie katalogu oraz produkty, które wróciły na stan co najmniej 3 dni temu i od tego czasu nie miały wyświetleń. Działa jako osoba, która utworzyła klucz: obowiązuje jej rola, scope=mine oznacza jej własną pracę.
Uprawnienie: campaigns:read
Parametry
| Nazwa | Opis |
|---|---|
fromzapytaniestring | Pierwszy dzień RRRR-MM-DD (domyślnie 30 dni temu). |
tozapytaniestring | Ostatni dzień RRRR-MM-DD (do 366 dni). |
Odpowiedzi
200OK400Nieprawidłowe dane (validation_error,invalid_json,invalid_cursor).401Brak, nieznany, unieważniony lub wygasły klucz (unauthorized,key_revoked,key_expired).403Klucz nie ma uprawnienia (insufficient_scope,details.required_scope).429Ponad 120 żądań na minutę tym kluczem (rate_limited); odczekajRetry-Aftersekund.
Przykład
curl "https://app.basketly.io/api/v1/reports/stock-ads" \
-H "Authorization: Bearer $API_KEY"/reports/concentrationKoncentracja emisji
Jak nierówno Meta rozkłada wyświetlenia reklam katalogowych na produkty zakresu (wszystko, konto reklamowe, kampania, zestaw albo reklama): ranking, udziały czołówki, Gini, HHI i efektywna liczba produktów, seria tygodniowa, okresy przed i po wyprzedaniu produktów z czołówki oraz wnioski. Zakupy z Mety tylko dla całego zakresu, nigdy na produkt. Działa jako osoba, która utworzyła klucz: obowiązuje jej rola, scope=mine oznacza jej własną pracę.
Uprawnienie: campaigns:read
Parametry
| Nazwa | Opis |
|---|---|
scopezapytaniestring | all (domyślnie), account, campaign, adset albo ad.Wartości: all, account, campaign, adset, ad |
idzapytaniestring | Identyfikator konta reklamowego (act_…), kampanii, zestawu albo reklamy; wymagany poza scope=all. Lista w options odpowiedzi. |
fromzapytaniestring | Pierwszy dzień RRRR-MM-DD (domyślnie 30 dni temu). |
tozapytaniestring | Ostatni dzień RRRR-MM-DD (do 366 dni). |
Odpowiedzi
200OK400Nieprawidłowe dane (validation_error,invalid_json,invalid_cursor).401Brak, nieznany, unieważniony lub wygasły klucz (unauthorized,key_revoked,key_expired).403Klucz nie ma uprawnienia (insufficient_scope,details.required_scope).429Ponad 120 żądań na minutę tym kluczem (rate_limited); odczekajRetry-Aftersekund.
Przykład
curl "https://app.basketly.io/api/v1/reports/concentration" \
-H "Authorization: Bearer $API_KEY"/reports/stockSygnały zatowarowania
Które produkty skończą się przed dostawą: tempo sprzedaży z 7/14/28 dni, dni zapasu, data braku towaru, punkt zamówienia, sugerowana ilość, poziom względem czasu dostawy i popyt z reklam katalogowych i skryptu sklepu. Stan to liczba ze sklepu z ostatniego odczytu plus podpisany szacunek Basketly; prognoza jest liniowa. Działa jako osoba, która utworzyła klucz: obowiązuje jej rola, scope=mine oznacza jej własną pracę.
Uprawnienie: campaigns:read
Parametry
| Nazwa | Opis |
|---|---|
fromzapytaniestring | Pierwszy dzień RRRR-MM-DD (domyślnie 30 dni temu). |
tozapytaniestring | Ostatni dzień RRRR-MM-DD (do 366 dni). |
levelzapytaniestring | Lista po przecinku: sold_out, critical, warning, watch, ok, overstock, thin. |
risingzapytaniestring | 1 = tylko produkty z rosnącymi kliknięciami albo koszykami. |
in_adszapytaniestring | 1 = tylko produkty z wyświetleniami w ostatnich 7 dniach. |
brandzapytaniestring | Tylko ta marka. |
categoryzapytaniestring | Kategoria zawiera ten tekst. |
sourcezapytaniestring | Rodzaj sklepu albo feed. |
lead_timezapytaniestring | Czas dostawy do symulacji w dniach (1–180); domyślnie ustawienie organizacji. |
Odpowiedzi
200OK400Nieprawidłowe dane (validation_error,invalid_json,invalid_cursor).401Brak, nieznany, unieważniony lub wygasły klucz (unauthorized,key_revoked,key_expired).403Klucz nie ma uprawnienia (insufficient_scope,details.required_scope).429Ponad 120 żądań na minutę tym kluczem (rate_limited); odczekajRetry-Aftersekund.
Przykład
curl "https://app.basketly.io/api/v1/reports/stock" \
-H "Authorization: Bearer $API_KEY"/reports/feed-ordersZamówienia z otagowanych feedów
Zamówienia, których wizyta trafiła przez otagowany link katalogu, na feed i na produkt wejścia, z zamówieniami na 100 kliknięć produktów feedu. Własny odczyt Basketly ze skryptu sklepu (wymaga oznaczania linków i skryptu), nie zakupy według Mety. Działa jako osoba, która utworzyła klucz: obowiązuje jej rola, scope=mine oznacza jej własną pracę.
Uprawnienie: campaigns:read
Parametry
| Nazwa | Opis |
|---|---|
fromzapytaniestring | Pierwszy dzień RRRR-MM-DD (domyślnie 30 dni temu). |
tozapytaniestring | Ostatni dzień RRRR-MM-DD (do 366 dni). |
Odpowiedzi
200OK400Nieprawidłowe dane (validation_error,invalid_json,invalid_cursor).401Brak, nieznany, unieważniony lub wygasły klucz (unauthorized,key_revoked,key_expired).403Klucz nie ma uprawnienia (insufficient_scope,details.required_scope).429Ponad 120 żądań na minutę tym kluczem (rate_limited); odczekajRetry-Aftersekund.
Przykład
curl "https://app.basketly.io/api/v1/reports/feed-orders" \
-H "Authorization: Bearer $API_KEY"/reports/product-setsZdrowie zestawów produktów
Dla każdego zestawu produktów wybranych katalogów Meta: liczba produktów, udział dostępnych, zatwierdzonych, odrzuconych i oczekujących, wydatki zestawów reklam, które go promują, i ostrzeżenia; do tego diagnostyka katalogu Mety. Wymaga opcjonalnego połączenia katalogu (catalog_management); bez niego connected jest false, a listy są puste. Działa jako osoba, która utworzyła klucz: obowiązuje jej rola, scope=mine oznacza jej własną pracę.
Uprawnienie: campaigns:read
Parametry
| Nazwa | Opis |
|---|---|
fromzapytaniestring | Pierwszy dzień RRRR-MM-DD (domyślnie 30 dni temu). |
tozapytaniestring | Ostatni dzień RRRR-MM-DD (do 366 dni). |
Odpowiedzi
200OK400Nieprawidłowe dane (validation_error,invalid_json,invalid_cursor).401Brak, nieznany, unieważniony lub wygasły klucz (unauthorized,key_revoked,key_expired).403Klucz nie ma uprawnienia (insufficient_scope,details.required_scope).429Ponad 120 żądań na minutę tym kluczem (rate_limited); odczekajRetry-Aftersekund.
Przykład
curl "https://app.basketly.io/api/v1/reports/product-sets" \
-H "Authorization: Bearer $API_KEY"/meta-catalogPołączenie katalogu Meta
Czy organizacja połączyła katalog Meta (opcjonalnie), które katalogi wybrała i jak poszedł ich ostatni odczyt. Działa jako osoba, która utworzyła klucz: obowiązuje jej rola, scope=mine oznacza jej własną pracę.
Uprawnienie: campaigns:read
Odpowiedzi
200OK400Nieprawidłowe dane (validation_error,invalid_json,invalid_cursor).401Brak, nieznany, unieważniony lub wygasły klucz (unauthorized,key_revoked,key_expired).403Klucz nie ma uprawnienia (insufficient_scope,details.required_scope).429Ponad 120 żądań na minutę tym kluczem (rate_limited); odczekajRetry-Aftersekund.
Przykład
curl "https://app.basketly.io/api/v1/meta-catalog" \
-H "Authorization: Bearer $API_KEY"/campaigns/productsProdukty w reklamach katalogowych
Wyniki na produkt z kampanii, grupy reklam albo reklamy według raportu platformy na produkt (domyślnie Meta; Google Ads, Microsoft Ads, TikTok przez platform), ze sprzedażą produktu w sklepie. Działa jako osoba, która utworzyła klucz: obowiązuje jej rola, scope=mine oznacza jej własną pracę.
Uprawnienie: campaigns:read
Parametry
| Nazwa | Opis |
|---|---|
fromzapytaniestring | Pierwszy dzień RRRR-MM-DD (domyślnie 30 dni temu). |
tozapytaniestring | Ostatni dzień RRRR-MM-DD. |
platformzapytaniestring | meta (domyślnie), google_ads, microsoft_ads albo tiktok. |
campaignzapytaniestring | Tylko ta kampania. |
adgroupzapytaniestring | Tylko ta grupa reklam (Google Ads, Microsoft Ads). |
adzapytaniestring | Tylko ta reklama. |
Odpowiedzi
200OK400Nieprawidłowe dane (validation_error,invalid_json,invalid_cursor).401Brak, nieznany, unieważniony lub wygasły klucz (unauthorized,key_revoked,key_expired).403Klucz nie ma uprawnienia (insufficient_scope,details.required_scope).429Ponad 120 żądań na minutę tym kluczem (rate_limited); odczekajRetry-Aftersekund.
Przykład
curl "https://app.basketly.io/api/v1/campaigns/products" \
-H "Authorization: Bearer $API_KEY"Automatyzacje
Automatyzacje organizacji i ich stan.
/automationsLista automatyzacji
Automatyzacje organizacji: nazwa, włączona/wyłączona, rodzaj wyzwalacza, wersja, autor, ostatnie uruchomienie, błędne kroki z ostatnich 24 godzin, uruchomienia, wysyłki i błędne kroki z ostatnich 30 dni, uruchomienia w toku i co każda może wysłać. Edycja i włączanie zostają w panelu. Działa jako osoba, która utworzyła klucz: obowiązuje jej rola, scope=mine oznacza jej własną pracę.
Uprawnienie: automations:read
Odpowiedzi
200OK400Nieprawidłowe dane (validation_error,invalid_json,invalid_cursor).401Brak, nieznany, unieważniony lub wygasły klucz (unauthorized,key_revoked,key_expired).403Klucz nie ma uprawnienia (insufficient_scope,details.required_scope).429Ponad 120 żądań na minutę tym kluczem (rate_limited); odczekajRetry-Aftersekund.
Przykład
curl "https://app.basketly.io/api/v1/automations" \
-H "Authorization: Bearer $API_KEY"Autodiagnostyka
Autodiagnostyka organizacji.
/diagnosticsOstatnia autodiagnostyka
Ostatnie uruchomienie autodiagnostyki ze wszystkimi sprawdzeniami. Działa jako osoba, która utworzyła klucz: obowiązuje jej rola, scope=mine oznacza jej własną pracę.
Uprawnienie: diagnostics:read
Odpowiedzi
200OK400Nieprawidłowe dane (validation_error,invalid_json,invalid_cursor).401Brak, nieznany, unieważniony lub wygasły klucz (unauthorized,key_revoked,key_expired).403Klucz nie ma uprawnienia (insufficient_scope,details.required_scope).429Ponad 120 żądań na minutę tym kluczem (rate_limited); odczekajRetry-Aftersekund.
Przykład
curl "https://app.basketly.io/api/v1/diagnostics" \
-H "Authorization: Bearer $API_KEY"/diagnostics/runUruchom autodiagnostykę
Jak „Sprawdź teraz”: dodaje uruchomienie do kolejki (albo od razu startuje czekające). Wynik odczytasz przez GET /diagnostics. Działa jako osoba, która utworzyła klucz: obowiązuje jej rola, scope=mine oznacza jej własną pracę.
Uprawnienie: diagnostics:write
Parametry
| Nazwa | Opis |
|---|---|
Idempotency-Keynagłówekstring | Unikalny klucz (1–255 widocznych znaków ASCII). Powtórzenie POST z tym samym kluczem i treścią w ciągu 24 godzin zwraca zapisaną odpowiedź z Idempotent-Replayed: true.Maks. długość: 255 |
Odpowiedzi
202W kolejcePola odpowiedziNazwa Opis jobobjectZadanie (numer, status). 400Nieprawidłowe dane (validation_error,invalid_json,invalid_cursor).401Brak, nieznany, unieważniony lub wygasły klucz (unauthorized,key_revoked,key_expired).403Klucz nie ma uprawnienia (insufficient_scope,details.required_scope).409Konflikt z aktualnym stanem (conflict,contact_exists,contact_merged,event_conflict,source_paused,idempotency_in_progress).422Idempotency-Key użyty z inną treścią (idempotency_key_reused).429Ponad 120 żądań na minutę tym kluczem (rate_limited); odczekajRetry-Aftersekund.
Przykład
curl -X POST "https://app.basketly.io/api/v1/diagnostics/run" \
-H "Authorization: Bearer $API_KEY" \
-H "Idempotency-Key: 5f0c7a2e-8d41-4b6a-9e3f-1c2d3e4f5a6b"Zadania w tle
Prace w tle.
/jobsLista zadań w tle
Odczyty zamówień, synchronizacje wydatków, arkuszy i inne prace w tle organizacji.
Uprawnienie: jobs:read
Parametry
| Nazwa | Opis |
|---|---|
limitzapytanieinteger | Rozmiar strony, 1–100 (domyślnie 25).Domyślnie: 25Zakres: 1–100 |
cursorzapytaniestring | next_cursor z poprzedniej strony. |
orderzapytaniestring | Sortowanie po updated_at (potem id): desc od najnowszych (domyślnie) lub asc.Wartości: asc, descDomyślnie: desc |
updated_sincezapytaniestring (date-time) | Tylko rekordy zmienione w tym czasie ISO 8601 lub później. |
statuszapytaniestring | Status zadania.Wartości: queued, running, done, failed, cancelled |
kindzapytaniestring | Rodzaje zadań po przecinku (pole kind, np. shoper_orders,feed_fetch). |
Odpowiedzi
200OKPola odpowiedziNazwa Opis dataJob[]Wymaganydata[].numberintegerNumer zadania w organizacji. data[].kindstringRodzaj zadania, np. ad_spend, shoper_orders, sheets_sync. data[].labelstringOpis. data[].statusstringStatus.Wartości: queued,running,done,failed,cancelleddata[].prioritystringuseralbobackground.data[].triggerstringCo je uruchomiło. data[].progressobjectLicznik donei opistext.data[].attemptsintegerPróby. data[].errorstringBłąd nieudanego zadania. data[].summarystringPodsumowanie wyniku. data[].run_afterstring (date-time) | nullNie wcześniej niż. data[].started_atstring (date-time) | nullStart. data[].finished_atstring (date-time) | nullKoniec. data[].createdstring (date-time)Czas utworzenia. data[].updated_atstring (date-time)Ostatnia zmiana. next_cursorstring | nullWymaganyPrzekaż jako cursor, by pobrać następną stronę; null na ostatniej stronie.has_morebooleanWymaganyPrawda, gdy istnieje kolejna strona. 400Nieprawidłowe dane (validation_error,invalid_json,invalid_cursor).401Brak, nieznany, unieważniony lub wygasły klucz (unauthorized,key_revoked,key_expired).403Klucz nie ma uprawnienia (insufficient_scope,details.required_scope).429Ponad 120 żądań na minutę tym kluczem (rate_limited); odczekajRetry-Aftersekund.
Przykład
curl "https://app.basketly.io/api/v1/jobs" \
-H "Authorization: Bearer $API_KEY"/jobs/{number}Pobierz zadanie
Jedno zadanie po numerze.
Uprawnienie: jobs:read
Parametry
| Nazwa | Opis |
|---|---|
numberścieżkaintegerWymagany | Numer zadania. |
Odpowiedzi
200OKPola odpowiedziNazwa Opis numberintegerNumer zadania w organizacji. kindstringRodzaj zadania, np. ad_spend, shoper_orders, sheets_sync. labelstringOpis. statusstringStatus.Wartości: queued,running,done,failed,cancelledprioritystringuseralbobackground.triggerstringCo je uruchomiło. progressobjectLicznik donei opistext.attemptsintegerPróby. errorstringBłąd nieudanego zadania. summarystringPodsumowanie wyniku. run_afterstring (date-time) | nullNie wcześniej niż. started_atstring (date-time) | nullStart. finished_atstring (date-time) | nullKoniec. createdstring (date-time)Czas utworzenia. updated_atstring (date-time)Ostatnia zmiana. 400Nieprawidłowe dane (validation_error,invalid_json,invalid_cursor).401Brak, nieznany, unieważniony lub wygasły klucz (unauthorized,key_revoked,key_expired).403Klucz nie ma uprawnienia (insufficient_scope,details.required_scope).404Brak takiego rekordu w Twojej organizacji (not_found).429Ponad 120 żądań na minutę tym kluczem (rate_limited); odczekajRetry-Aftersekund.
Przykład
curl "https://app.basketly.io/api/v1/jobs/42" \
-H "Authorization: Bearer $API_KEY"Webhooki
Zdarzenia wysyłane na Twój serwer.
/webhooksLista webhooków
Subskrypcje webhooków organizacji (do 10).
Uprawnienie: webhooks:read
Odpowiedzi
200OKPola odpowiedziNazwa Opis dataWebhook[]Wymaganydata[].idstringIdentyfikator webhooka. data[].urlstringAdres HTTPS, który odbiera POST-y. data[].descriptionstringTwój opis. data[].eventsstring[]Subskrybowane zdarzenia.Wartości: contact.created,delivery.faileddata[].activebooleanfalse wstrzymuje wysyłki. data[].last_statusintegerStatus HTTP ostatniej próby (0 = brak odpowiedzi). data[].last_errorstringOstatni błąd. data[].last_delivery_atstring (date-time) | nullOstatnia próba. data[].consecutive_failuresintegerNieudane próby z rzędu. data[].created_atstring (date-time)Czas utworzenia. data[].updated_atstring (date-time)Ostatnia zmiana. next_cursorstring | nullWymaganyPrzekaż jako cursor, by pobrać następną stronę; null na ostatniej stronie.has_morebooleanWymaganyPrawda, gdy istnieje kolejna strona. 400Nieprawidłowe dane (validation_error,invalid_json,invalid_cursor).401Brak, nieznany, unieważniony lub wygasły klucz (unauthorized,key_revoked,key_expired).403Klucz nie ma uprawnienia (insufficient_scope,details.required_scope).429Ponad 120 żądań na minutę tym kluczem (rate_limited); odczekajRetry-Aftersekund.
Przykład
curl "https://app.basketly.io/api/v1/webhooks" \
-H "Authorization: Bearer $API_KEY"/webhooksDodaj webhook
Subskrybuje adres HTTPS na zdarzenia. Sekret podpisu secret jest zwracany tylko tutaj.
Uprawnienie: webhooks:write
Parametry
| Nazwa | Opis |
|---|---|
Idempotency-Keynagłówekstring | Unikalny klucz (1–255 widocznych znaków ASCII). Powtórzenie POST z tym samym kluczem i treścią w ciągu 24 godzin zwraca zapisaną odpowiedź z Idempotent-Replayed: true.Maks. długość: 255 |
Treść żądania application/json
| Nazwa | Opis |
|---|---|
urlstringWymagany | Adres HTTPS (bez loginu i hasła, bez adresów prywatnych i lokalnych).Maks. długość: 2000 |
eventsstring[]Wymagany | Zdarzenia do odbierania.Wartości: contact.created, delivery.failed |
descriptionstring | Twój opis.Maks. długość: 200 |
Odpowiedzi
201UtworzonoPola odpowiedziNazwa Opis idstringIdentyfikator webhooka. urlstringAdres HTTPS, który odbiera POST-y. descriptionstringTwój opis. eventsstring[]Subskrybowane zdarzenia.Wartości: contact.created,delivery.failedactivebooleanfalse wstrzymuje wysyłki. last_statusintegerStatus HTTP ostatniej próby (0 = brak odpowiedzi). last_errorstringOstatni błąd. last_delivery_atstring (date-time) | nullOstatnia próba. consecutive_failuresintegerNieudane próby z rzędu. created_atstring (date-time)Czas utworzenia. updated_atstring (date-time)Ostatnia zmiana. secretstringWymaganySekret podpisu ( whsec_…). Widoczny tylko w tej odpowiedzi — zapisz go.400Nieprawidłowe dane (validation_error,invalid_json,invalid_cursor).401Brak, nieznany, unieważniony lub wygasły klucz (unauthorized,key_revoked,key_expired).403Klucz nie ma uprawnienia (insufficient_scope,details.required_scope).409Konflikt z aktualnym stanem (conflict,contact_exists,contact_merged,event_conflict,source_paused,idempotency_in_progress).413Treść ponad 64 KB (payload_too_large).422Idempotency-Key użyty z inną treścią (idempotency_key_reused).429Ponad 120 żądań na minutę tym kluczem (rate_limited); odczekajRetry-Aftersekund.
Przykład
curl -X POST "https://app.basketly.io/api/v1/webhooks" \
-H "Authorization: Bearer $API_KEY" \
-H "Idempotency-Key: 5f0c7a2e-8d41-4b6a-9e3f-1c2d3e4f5a6b" \
-H "Content-Type: application/json" \
-d '{
"url": "https://example.com/webhooks",
"events": [
"contact.created",
"delivery.failed"
]
}'/webhooks/{id}Pobierz webhook
Jedna subskrypcja z ostatnim wynikiem.
Uprawnienie: webhooks:read
Parametry
| Nazwa | Opis |
|---|---|
idścieżkastringWymagany | Identyfikator rekordu. |
Odpowiedzi
200OKPola odpowiedziNazwa Opis idstringIdentyfikator webhooka. urlstringAdres HTTPS, który odbiera POST-y. descriptionstringTwój opis. eventsstring[]Subskrybowane zdarzenia.Wartości: contact.created,delivery.failedactivebooleanfalse wstrzymuje wysyłki. last_statusintegerStatus HTTP ostatniej próby (0 = brak odpowiedzi). last_errorstringOstatni błąd. last_delivery_atstring (date-time) | nullOstatnia próba. consecutive_failuresintegerNieudane próby z rzędu. created_atstring (date-time)Czas utworzenia. updated_atstring (date-time)Ostatnia zmiana. 400Nieprawidłowe dane (validation_error,invalid_json,invalid_cursor).401Brak, nieznany, unieważniony lub wygasły klucz (unauthorized,key_revoked,key_expired).403Klucz nie ma uprawnienia (insufficient_scope,details.required_scope).404Brak takiego rekordu w Twojej organizacji (not_found).429Ponad 120 żądań na minutę tym kluczem (rate_limited); odczekajRetry-Aftersekund.
Przykład
curl "https://app.basketly.io/api/v1/webhooks/abc123" \
-H "Authorization: Bearer $API_KEY"/webhooks/{id}Zmień webhook
Zmienia adres, zdarzenia, opis lub wstrzymuje; wznowienie zeruje licznik błędów.
Uprawnienie: webhooks:write
Parametry
| Nazwa | Opis |
|---|---|
idścieżkastringWymagany | Identyfikator rekordu. |
Treść żądania application/json
| Nazwa | Opis |
|---|---|
urlstring | Nowy adres. |
eventsstring[] | Nowa lista zdarzeń.Wartości: contact.created, delivery.failed |
descriptionstring | Twój opis. |
activeboolean | Wstrzymaj lub wznów. |
Odpowiedzi
200OKPola odpowiedziNazwa Opis idstringIdentyfikator webhooka. urlstringAdres HTTPS, który odbiera POST-y. descriptionstringTwój opis. eventsstring[]Subskrybowane zdarzenia.Wartości: contact.created,delivery.failedactivebooleanfalse wstrzymuje wysyłki. last_statusintegerStatus HTTP ostatniej próby (0 = brak odpowiedzi). last_errorstringOstatni błąd. last_delivery_atstring (date-time) | nullOstatnia próba. consecutive_failuresintegerNieudane próby z rzędu. created_atstring (date-time)Czas utworzenia. updated_atstring (date-time)Ostatnia zmiana. 400Nieprawidłowe dane (validation_error,invalid_json,invalid_cursor).401Brak, nieznany, unieważniony lub wygasły klucz (unauthorized,key_revoked,key_expired).403Klucz nie ma uprawnienia (insufficient_scope,details.required_scope).404Brak takiego rekordu w Twojej organizacji (not_found).413Treść ponad 64 KB (payload_too_large).429Ponad 120 żądań na minutę tym kluczem (rate_limited); odczekajRetry-Aftersekund.
Przykład
curl -X PATCH "https://app.basketly.io/api/v1/webhooks/abc123" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://example.com/webhooks",
"events": [
"contact.created",
"delivery.failed"
],
"active": false
}'/webhooks/{id}Usuń webhook
Usuwa subskrypcję i jej wysyłki w kolejce.
Uprawnienie: webhooks:write
Parametry
| Nazwa | Opis |
|---|---|
idścieżkastringWymagany | Identyfikator rekordu. |
Odpowiedzi
204Usunięto400Nieprawidłowe dane (validation_error,invalid_json,invalid_cursor).401Brak, nieznany, unieważniony lub wygasły klucz (unauthorized,key_revoked,key_expired).403Klucz nie ma uprawnienia (insufficient_scope,details.required_scope).404Brak takiego rekordu w Twojej organizacji (not_found).429Ponad 120 żądań na minutę tym kluczem (rate_limited); odczekajRetry-Aftersekund.
Przykład
curl -X DELETE "https://app.basketly.io/api/v1/webhooks/abc123" \
-H "Authorization: Bearer $API_KEY"/webhooks/{id}/testWyślij próbny ping
Dodaje do kolejki podpisane zdarzenie ping, by sprawdzić odbiornik i weryfikację podpisu.
Uprawnienie: webhooks:write
Parametry
| Nazwa | Opis |
|---|---|
idścieżkastringWymagany | Identyfikator rekordu. |
Idempotency-Keynagłówekstring | Unikalny klucz (1–255 widocznych znaków ASCII). Powtórzenie POST z tym samym kluczem i treścią w ciągu 24 godzin zwraca zapisaną odpowiedź z Idempotent-Replayed: true.Maks. długość: 255 |
Odpowiedzi
202W kolejcePola odpowiedziNazwa Opis delivery_idstringWysyłka zdarzenia pingdodana do kolejki.400Nieprawidłowe dane (validation_error,invalid_json,invalid_cursor).401Brak, nieznany, unieważniony lub wygasły klucz (unauthorized,key_revoked,key_expired).403Klucz nie ma uprawnienia (insufficient_scope,details.required_scope).404Brak takiego rekordu w Twojej organizacji (not_found).409Konflikt z aktualnym stanem (conflict,contact_exists,contact_merged,event_conflict,source_paused,idempotency_in_progress).422Idempotency-Key użyty z inną treścią (idempotency_key_reused).429Ponad 120 żądań na minutę tym kluczem (rate_limited); odczekajRetry-Aftersekund.
Przykład
curl -X POST "https://app.basketly.io/api/v1/webhooks/abc123/test" \
-H "Authorization: Bearer $API_KEY" \
-H "Idempotency-Key: 5f0c7a2e-8d41-4b6a-9e3f-1c2d3e4f5a6b"/webhooks/{id}/rotate-secretWymień sekret podpisu
Od razu wymienia sekret podpisu; nowy secret jest zwracany tylko tutaj. Wysyłki czekające w kolejce zostaną podpisane nowym sekretem.
Uprawnienie: webhooks:write
Parametry
| Nazwa | Opis |
|---|---|
idścieżkastringWymagany | Identyfikator rekordu. |
Idempotency-Keynagłówekstring | Unikalny klucz (1–255 widocznych znaków ASCII). Powtórzenie POST z tym samym kluczem i treścią w ciągu 24 godzin zwraca zapisaną odpowiedź z Idempotent-Replayed: true.Maks. długość: 255 |
Odpowiedzi
200OKPola odpowiedziNazwa Opis idstringIdentyfikator webhooka. urlstringAdres HTTPS, który odbiera POST-y. descriptionstringTwój opis. eventsstring[]Subskrybowane zdarzenia.Wartości: contact.created,delivery.failedactivebooleanfalse wstrzymuje wysyłki. last_statusintegerStatus HTTP ostatniej próby (0 = brak odpowiedzi). last_errorstringOstatni błąd. last_delivery_atstring (date-time) | nullOstatnia próba. consecutive_failuresintegerNieudane próby z rzędu. created_atstring (date-time)Czas utworzenia. updated_atstring (date-time)Ostatnia zmiana. secretstringWymaganySekret podpisu ( whsec_…). Widoczny tylko w tej odpowiedzi — zapisz go.400Nieprawidłowe dane (validation_error,invalid_json,invalid_cursor).401Brak, nieznany, unieważniony lub wygasły klucz (unauthorized,key_revoked,key_expired).403Klucz nie ma uprawnienia (insufficient_scope,details.required_scope).404Brak takiego rekordu w Twojej organizacji (not_found).409Konflikt z aktualnym stanem (conflict,contact_exists,contact_merged,event_conflict,source_paused,idempotency_in_progress).422Idempotency-Key użyty z inną treścią (idempotency_key_reused).429Ponad 120 żądań na minutę tym kluczem (rate_limited); odczekajRetry-Aftersekund.
Przykład
curl -X POST "https://app.basketly.io/api/v1/webhooks/abc123/rotate-secret" \
-H "Authorization: Bearer $API_KEY" \
-H "Idempotency-Key: 5f0c7a2e-8d41-4b6a-9e3f-1c2d3e4f5a6b"/webhooks/{id}/deliveriesLista wysyłek webhooka
Ostatnie próby (przechowywane 30 dni), od najnowszych.
Uprawnienie: webhooks:read
Parametry
| Nazwa | Opis |
|---|---|
idścieżkastringWymagany | Identyfikator rekordu. |
limitzapytanieinteger | Rozmiar strony, 1–100 (domyślnie 25).Domyślnie: 25Zakres: 1–100 |
cursorzapytaniestring | next_cursor z poprzedniej strony. |
orderzapytaniestring | Sortowanie po updated_at (potem id): desc od najnowszych (domyślnie) lub asc.Wartości: asc, descDomyślnie: desc |
updated_sincezapytaniestring (date-time) | Tylko rekordy zmienione w tym czasie ISO 8601 lub później. |
Odpowiedzi
200OKPola odpowiedziNazwa Opis dataWebhookDelivery[]Wymaganydata[].idstringIdentyfikator wysyłki (nagłówek X-Baskety-Delivery). data[].webhook_idstringIdentyfikator webhooka. data[].eventstringTyp zdarzenia. data[].event_idstringIdentyfikator zdarzenia ( evt_…, ten sam dla wszystkich webhooków jednego zdarzenia).data[].statusstringStatus.Wartości: pending,sending,retry,delivered,failed,cancelleddata[].attemptsintegerPróby. data[].response_statusintegerStatus HTTP ostatniej próby. data[].last_errorstringOstatni błąd. data[].next_attempt_atstring (date-time) | nullNastępna próba. data[].delivered_atstring (date-time) | nullDostarczono. data[].created_atstring (date-time)Czas utworzenia. data[].updated_atstring (date-time)Ostatnia zmiana. next_cursorstring | nullWymaganyPrzekaż jako cursor, by pobrać następną stronę; null na ostatniej stronie.has_morebooleanWymaganyPrawda, gdy istnieje kolejna strona. 400Nieprawidłowe dane (validation_error,invalid_json,invalid_cursor).401Brak, nieznany, unieważniony lub wygasły klucz (unauthorized,key_revoked,key_expired).403Klucz nie ma uprawnienia (insufficient_scope,details.required_scope).404Brak takiego rekordu w Twojej organizacji (not_found).429Ponad 120 żądań na minutę tym kluczem (rate_limited); odczekajRetry-Aftersekund.
Przykład
curl "https://app.basketly.io/api/v1/webhooks/abc123/deliveries" \
-H "Authorization: Bearer $API_KEY"Webhooki
Webhook wysyła POST z JSON-em na Twój adres HTTPS, gdy coś zmieni się w organizacji. Organizacja może mieć do 10 webhooków. Sekret podpisu (whsec_…) dostajesz tylko w odpowiedzi na utworzenie webhooka. Te same webhooki dodasz, przetestujesz, wstrzymasz i usuniesz też w panelu, na stronie API w sekcji Webhooki, z historią wysyłek każdego.
Dostarczamy co najmniej raz: to samo zdarzenie może przyjść kilka razy, więc pomijaj id, które już obsłużyłeś. Treść zawiera tylko identyfikatory i stany, nigdy imion, telefonów ani e-maili; szczegóły pobierz przez GET.
Zdarzenia
contact.created
Dodano osobę (zamówienie w sklepie, ręcznie, przez API, automatyzacją).
{
"id": "evt_9f2c4b1a7d3e5f60a1b2c3d4",
"type": "contact.created",
"created_at": "2026-10-08T10:00:00Z",
"organization_id": "org123",
"data": {
"contact_id": "abc123",
"first_source": "Zamówienie w sklepie"
}
}delivery.failed
Wysyłka konwersji do Meta ostatecznie się nie powiodła.
{
"id": "evt_9f2c4b1a7d3e5f60a1b2c3d4",
"type": "delivery.failed",
"created_at": "2026-10-08T10:00:00Z",
"organization_id": "org123",
"data": {
"delivery_id": "d123",
"event_id": "e123",
"target_id": "t123",
"dataset_id": "123456789",
"event_name": "Purchase",
"mode": "live",
"error": "Połącz konto Meta ponownie lub sprawdź token."
}
}Nagłówki
| Nagłówek | Opis |
|---|---|
X-Baskety-Signature | sha256= + hex HMAC-SHA256 z {X-Baskety-Timestamp}.{surowa treść} kluczem sekretu webhooka. |
X-Baskety-Timestamp | Sekundy Unix próby; odrzucaj starsze niż 5 minut. |
X-Baskety-Event | Typ zdarzenia. |
X-Baskety-Delivery | Identyfikator wysyłki (inny dla każdego webhooka, ten sam przy ponowieniach). |
Potwierdzenie i ponowienia
- Odpowiedz dowolnym kodem 2xx w ciągu 15 sekund. Najpierw zapisz zdarzenie, a dłuższą pracę wykonaj później.
- Inna odpowiedź albo brak odpowiedzi to ponowienie: łącznie do 8 prób, kolejne po 1 min, 5 min, 30 min, 2 h, 6 h, 12 h i 24 h.
X-Baskety-Deliveryjest ten sam przy każdej próbie danej wysyłki; historię prób pokazujeGET /webhooks/{id}/deliveries.
Weryfikacja podpisu
- Odczytaj surową treść żądania, zanim cokolwiek ją sparsuje.
- Odrzuć żądanie, gdy znacznik czasu jest starszy niż 5 minut.
- Policz HMAC-SHA256 z
{timestamp}.{surowa treść}kluczem sekretu i porównaj z nagłówkiem podpisu (sha256=<hex>) w stałym czasie.
import crypto from 'node:crypto'
import http from 'node:http'
const secret = process.env.WEBHOOK_SECRET // whsec_…
function verify(rawBody, timestamp, signature) {
const age = Math.abs(Date.now() / 1000 - Number(timestamp))
if (!timestamp || !(age <= 300)) return false
const expected = 'sha256=' + crypto.createHmac('sha256', secret)
.update(`${timestamp}.`)
.update(rawBody)
.digest('hex')
const a = Buffer.from(String(signature ?? ''))
const b = Buffer.from(expected)
return a.length === b.length && crypto.timingSafeEqual(a, b)
}
http.createServer((req, res) => {
const chunks = []
req.on('data', chunk => chunks.push(chunk))
req.on('end', () => {
const raw = Buffer.concat(chunks) // surowa treść, przed parsowaniem JSON
if (!verify(raw, req.headers['x-baskety-timestamp'], req.headers['x-baskety-signature'])) {
res.writeHead(401).end()
return
}
const event = JSON.parse(raw.toString('utf8'))
// pomiń event.id, które już obsłużyłeś, i odpowiedz szybko
res.writeHead(200).end()
})
}).listen(3000)import hashlib
import hmac
import os
import time
from flask import Flask, abort, request
app = Flask(__name__)
SECRET = os.environ["WEBHOOK_SECRET"].encode() # whsec_…
@app.post("/webhooks")
def webhook():
raw = request.get_data() # surowa treść, przed parsowaniem JSON
timestamp = request.headers.get("X-Baskety-Timestamp", "")
signature = request.headers.get("X-Baskety-Signature", "")
if not timestamp.isdigit() or abs(time.time() - int(timestamp)) > 300:
abort(401)
expected = "sha256=" + hmac.new(SECRET, timestamp.encode() + b"." + raw, hashlib.sha256).hexdigest()
if not hmac.compare_digest(expected, signature):
abort(401)
event = request.get_json()
# pomiń event.id, które już obsłużyłeś, i odpowiedz szybko
return "", 200<?php
$secret = getenv('WEBHOOK_SECRET'); // whsec_…
$raw = file_get_contents('php://input'); // surowa treść, przed parsowaniem JSON
$timestamp = $_SERVER['HTTP_X_BASKETY_TIMESTAMP'] ?? '';
$signature = $_SERVER['HTTP_X_BASKETY_SIGNATURE'] ?? '';
if (!ctype_digit($timestamp) || abs(time() - (int) $timestamp) > 300) {
http_response_code(401);
exit;
}
$expected = 'sha256=' . hash_hmac('sha256', $timestamp . '.' . $raw, $secret);
if (!hash_equals($expected, $signature)) {
http_response_code(401);
exit;
}
$event = json_decode($raw, true);
// pomiń event.id, które już obsłużyłeś, i odpowiedz szybko
http_response_code(200);Utworzenie i test
Utwórz webhook, zapisz secret z odpowiedzi, a potem wyślij próbny ping, żeby sprawdzić odbiornik i weryfikację podpisu.
curl -X POST "https://app.basketly.io/api/v1/webhooks" \
-H "Authorization: Bearer $API_KEY" \
-H "Idempotency-Key: 5f0c7a2e-8d41-4b6a-9e3f-1c2d3e4f5a6b" \
-H "Content-Type: application/json" \
-d '{
"url": "https://example.com/webhooks",
"events": [
"contact.created",
"delivery.failed"
]
}'curl -X POST "https://app.basketly.io/api/v1/webhooks/abc123/test" \
-H "Authorization: Bearer $API_KEY" \
-H "Idempotency-Key: 5f0c7a2e-8d41-4b6a-9e3f-1c2d3e4f5a6b"Historia zmian
- 1.3.0 · : Wiele kanałów reklamowych: GET /channels/report (wszystkie kanały albo kampanie jednej platformy: Meta, Google Ads, Microsoft Ads, TikTok, Pinterest), GET /reports/channels (tabela Kanały z MER łącznym i sumą deklaracji platform), GET /reports/product-channels (produkty × kanały), koszty spoza platform reklamowych (GET i POST /manual-spend, PATCH i DELETE /manual-spend/{id}), GET /getting-started (pierwsze kroki); parametr `channel` w GET /creatives/report i GET /reports/insights, `platform` i `adgroup` w GET /campaigns/products. Zmiany wyłącznie dodające pola i operacje.
- 1.2.0 · : Usunięte funkcje leadowe: GET /leads, GET /leads/{id}, POST /contacts/{id}/stage, uprawnienia leads:read i leads:answers, zdarzenia webhooków lead.created i contact.stage_changed oraz pola etapu, cyklu, pierwszej reklamy i kandydatów na opiekuna w osobach. Klucz z usuniętym uprawnieniem działa dalej dla pozostałych.
- 1.1.0 · : Mój dzień, zadania, statusy, historia osoby, wyszukiwanie z filtrami Klientów, Raporty, Obsługa leadów, gotowość kampanii i autodiagnostyka; uprawnienia tasks, reports i diagnostics; serwer MCP dla agentów AI.
- 1.0.0 · : Pierwsza publiczna wersja.