
# API transmisji

**Transmisja** to jedna wysyłka wychodząca: odbiorcy, wiadomość otwierająca, jeden kanał i harmonogram. Opcjonalnie określa również agenta AI, który obsługuje otrzymane odpowiedzi. API transmisji pozwala tworzyć, wyceniać, uruchamiać i monitorować te wysyłki z poziomu własnego kodu, zamiast korzystać z pulpitu nawigacyjnego. Informacje o samym produkcie znajdują się w [przewodniku po transmisjach](../broadcasts/broadcasts.md).

- **Podstawowy adres URL** — `https://api.youraiconnector.com/v1`
- **Uwierzytelnianie** — Twój klucz API (zobacz [Uwierzytelnianie](authentication.md))
- **Błędy i stronicowanie** — zobacz [Błędy i stronicowanie](errors-and-pagination.md)

Wszystkie poniższe przykłady pokazują formularz zapytania `?apiKey=` w cURL oraz nagłówek `X-API-Key` w JavaScript i Pythonie — oba działają w każdym punkcie końcowym.

> **W eksploratorze API.** Każdy punkt końcowy na tej stronie znajduje się w opublikowanej specyfikacji OpenAPI, dzięki czemu możesz przeglądać jego dokładne pola i uruchamiać zapytania na żywo w [eksploratorze API](reference.md).


---

## Jak skonstruowana jest wysyłka

Wysłanie transmisji składa się z czterech wywołań, a nie jednego:

1. **Utwórz** transmisję z jej odbiorcami, kanałem i harmonogramem — zaczyna się jako `Draft`.
2. **Ustaw wiadomość otwierającą.** W przypadku WhatsApp Business oznacza to przesłanie szablonu do zatwierdzenia (lub wybranie takiego, który został już zatwierdzony). Na każdym innym kanale jest to zwykły tekst.
3. **Oszacuj koszt**, jeśli chcesz sprawdzić cenę przed wydaniem jakichkolwiek środków (opcjonalnie).
4. **Uruchom ją.** Uruchomienie przeprowadza pełną kontrolę — odbiorców, wiadomości, zatwierdzenia szablonu, połączonego nadawcy — i albo rozpoczyna wysyłkę, albo informuje dokładnie, czego brakuje.

Nic nie zostanie wysłane, dopóki nie wywołasz uruchomienia.

---

## Obiekt transmisji

```json
{
  "id": "bcd123abc456",
  "name": "June promo",
  "status": "Draft",
  "channel": "whatsapp",
  "agent_id": "agt_789",
  "list_id": "lst_456",
  "list_name": "Newsletter subscribers",
  "total_contacts": 240,
  "send_to_new_list_members": false,
  "whats_app_template": {
    "body": "Hi {{first_name}}, our June offer is live.",
    "status": "approved",
    "sid": "HX0123...",
    "language": "en",
    "category": "marketing",
    "variables": ["first_name"]
  },
  "execution_date": 1781000000000,
  "drip_mode": true,
  "time_critical": false,
  "total_contacts_sent": 0,
  "credits_used": 0,
  "created_at": 1780900000000,
  "last_modified_at": 1780900000000
}
```

**Znaczniki czasu są zwracane jako milisekundy epoki** (`execution_date`, `created_at`, `last_modified_at`, …), a każde odniesienie do kontaktu jest zwracane jako ciąg ścieżki, np. `contacts/uid_whatsapp_15551234567`.

### Pola, które ustawiasz

| Pole | Opis |
|---|---|
| `name` | Nazwa transmisji w pulpicie nawigacyjnym. |
| `channel` | Jeden kanał, przez który wysyłana jest ta transmisja: `whatsapp`, `whatsapp_web`, `sms`, `instagram`, `messenger`, `facebook`, `telegram`, `instagram_private`, `line`, `viber`, `imessage`, `email`, `chat_widget`, `custom_channel`. Transmisja ma dokładnie jeden kanał — aby wysłać to samo gdzie indziej, [zduplikuj ją na inny kanał](#duplicate-a-broadcast). `tiktok` i `skool` służą wyłącznie do odpowiedzi i nigdy nie mogą być użyte do transmisji. |
| `agent_id` | Agent AI, który odpowiada na wiadomości. Pozostaw jako `null`, a odpowiedzi trafią do skrzynki odbiorczej Twojego zespołu. |
| `list_id` | Lista kontaktów, do których ma zostać wysłana wiadomość. W ten sposób ustawiasz odbiorców z poziomu API — zobacz [Kontakty](contacts.md), aby dowiedzieć się, jak tworzyć i wypełniać listy. |
| `list_name` | Nazwa wyświetlana obok transmisji. Kosmetyczna. |
| `send_to_new_list_members` | `true` utrzymuje transmisję w stanie aktywnym, dzięki czemu każdy, kto zostanie dodany do listy później, również otrzyma wiadomość otwierającą. |
| `whats_app_template` | Wiadomość otwierająca. W WhatsApp Business jest to zatwierdzony szablon; na każdym innym kanale jego `body` jest używane jako zwykły tekst otwierający. Ustawiaj to przez [punkty końcowe szablonów](#the-opening-message), a nie ręcznie. |
| `opener_media` | Jeden obraz lub wideo wysyłane z wiadomością otwierającą. Zawsze wysyłaj cały obiekt (lub `null`, aby go usunąć) — zapisywanie poszczególnych kluczy wewnątrz niego jest odrzucane. Nieobsługiwane w SMS. |
| `execution_date` | Kiedy wysłać. Wyślij znacznik czasu ISO 8601 lub milisekundy epoki. Przyszła data zaplanuje wysyłkę; pomiń ją (lub użyj daty z przeszłości), aby wysłać natychmiast po uruchomieniu. |
| `drip_mode` | `true` rozkłada wysyłkę na partie w czasie, zamiast wysyłać wszystko naraz. |
| `time_critical` | `true` rezygnuje z automatycznego rozkładania, które włącza się powyżej 50 kontaktów — dla rozgrzanej grupy odbiorców, która potrzebuje wiadomości teraz. Nie znosi to dziennego limitu wysyłek danego kanału. |
| `batch_size` | Ile kontaktów na partię podczas wysyłki stopniowej. |
| `follow_up_config` | Łańcuch działań następczych dla kontaktów, które nigdy nie odpowiedzą. |

Wszystko, co wyślesz jako `user_id`, `id`, `status` lub `source_campaign_id`, jest ignorowane przy tworzeniu i usuwane przy aktualizacji — status zmienia się tylko poprzez poniższe punkty końcowe uruchamiania, wstrzymywania i wznawiania.

### Pola utrzymywane przez platformę

`status`, `total_contacts_sent`, `unique_contacts_replied`, `overall_reply_rate`, `credits_used`, `paused_reason`, `completion_summary`, liczniki partii oraz `contacts` (poszczególne kontakty dołączone z pulpitu nawigacyjnego, odczytywane jako ciągi ścieżek). Odczytuj je, nie zapisuj.

### Statusy

| Status | Znaczenie |
|---|---|
| `Draft` | W trakcie tworzenia. Nic nie jest zaplanowane. |
| `Pending Approval` | Uruchomiono, ale szablon WhatsApp wciąż oczekuje na decyzję. Wysyłka rozpocznie się automatycznie po zatwierdzeniu szablonu — nie musisz uruchamiać jej ponownie. |
| `Scheduled` | Uruchomiono z przyszłą `execution_date`. |
| `Sending` | Aktywnie wysyłane (transmisja przygotowana dla nowych członków listy pozostaje w tym stanie, oczekując na nich). |
| `Paused` | Wstrzymane — przez Ciebie lub automatycznie przez kontrolę bezpieczeństwa. |
| `Sent` | Zakończono. |
| `Failed` | Zakończono, przy czym ponad połowa wysyłek nie powiodła się. |

---

## Utwórz transmisję

`POST /broadcasts` — tworzy `Draft`.

**cURL**

```bash
curl -X POST "https://api.youraiconnector.com/v1/broadcasts?apiKey=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "June promo",
    "channel": "whatsapp",
    "list_id": "lst_456",
    "agent_id": "agt_789",
    "drip_mode": true,
    "execution_date": "2026-06-15T09:00:00.000Z"
  }'
```

**JavaScript**

```javascript
const res = await fetch("https://api.youraiconnector.com/v1/broadcasts", {
  method: "POST",
  headers: { "X-API-Key": "YOUR_API_KEY", "Content-Type": "application/json" },
  body: JSON.stringify({
    name: "June promo",
    channel: "whatsapp",
    list_id: "lst_456",
    agent_id: "agt_789",
    drip_mode: true,
    execution_date: "2026-06-15T09:00:00.000Z",
  }),
});
const { broadcast_id } = await res.json();
```

**Python**

```python
import requests

res = requests.post(
    "https://api.youraiconnector.com/v1/broadcasts",
    headers={"X-API-Key": "YOUR_API_KEY"},
    json={
        "name": "June promo",
        "channel": "whatsapp",
        "list_id": "lst_456",
        "agent_id": "agt_789",
        "drip_mode": True,
        "execution_date": "2026-06-15T09:00:00.000Z",
    },
)
print(res.json()["broadcast_id"])
```

**Odpowiedź** (`201`)

```json
{ "success": true, "broadcast_id": "bcd123abc456" }
```

---

## Wyświetl listę transmisji

`GET /broadcasts` — każda transmisja na koncie, od najnowszej. |

**Parametry zapytania**

| Parametr | Wymagany | Opis |
|---|---|---|
| `status` | Nie | Zwraca tylko transmisje o określonym statusie, np. `Sending`. Pisownia musi być dokładnie zgodna z [tabelą statusów](#statuses). |

```bash
curl "https://api.youraiconnector.com/v1/broadcasts?apiKey=YOUR_API_KEY&status=Sending"
```

```javascript
const res = await fetch("https://api.youraiconnector.com/v1/broadcasts?status=Sending", {
  headers: { "X-API-Key": "YOUR_API_KEY" },
});
const { broadcasts } = await res.json();
```

```python
res = requests.get(
    "https://api.youraiconnector.com/v1/broadcasts",
    headers={"X-API-Key": "YOUR_API_KEY"},
    params={"status": "Sending"},
)
broadcasts = res.json()["broadcasts"]
```

**Odpowiedź** (`200`)

```json
{ "success": true, "broadcasts": [{ "id": "bcd123abc456", "name": "June promo", "status": "Sending", "...": "..." }] }
```

---

## Pobierz transmisję

`GET /broadcasts/{broadcastId}` — zwraca `{ "success": true, "broadcast": { ... } }`. Użyj tego, aby odpytywać trwającą wysyłkę: `total_contacts_sent`, `unique_contacts_replied`, `overall_reply_rate` oraz `credits_used` aktualizują się w trakcie jej trwania. |

```bash
curl "https://api.youraiconnector.com/v1/broadcasts/bcd123abc456?apiKey=YOUR_API_KEY"
```

Transmisja, która nie istnieje na Twoim koncie, zwraca `404`.

---

## Zaktualizuj transmisję

`PUT /broadcasts/{broadcastId}` — wyślij tylko te pola, które chcesz zmienić. Możesz również odwołać się do pojedynczego klucza wewnątrz zagnieżdżonego obiektu za pomocą ścieżki kropkowej, np. `"whats_app_template.body"`.

```bash
curl -X PUT "https://api.youraiconnector.com/v1/broadcasts/bcd123abc456?apiKey=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "name": "June promo (v2)", "execution_date": "2026-06-16T09:00:00.000Z" }'
```

```javascript
await fetch("https://api.youraiconnector.com/v1/broadcasts/bcd123abc456", {
  method: "PUT",
  headers: { "X-API-Key": "YOUR_API_KEY", "Content-Type": "application/json" },
  body: JSON.stringify({ name: "June promo (v2)", execution_date: "2026-06-16T09:00:00.000Z" }),
});
```

Puste ciało żądania zwraca `400`. Warto znać dwie zasady:

- **`opener_media` działa na zasadzie wszystko albo nic.** Wyślij kompletny obiekt lub `null`, aby usunąć załącznik. Ścieżka kropkowa do niego (`opener_media.name`) zostanie odrzucona z błędem `400`, ponieważ częściowo zaktualizowany załącznik opisywałby plik, którego nie ma.
- **Statusu nie można edytować.** Użyj [uruchomienia](#launch-a-broadcast), [wstrzymania](#pause-and-resume) i [wznowienia](#pause-and-resume).

---

## Wiadomość otwierająca

Każda transmisja zawiera swój element otwierający w `whats_app_template`. To, co to oznacza, zależy od kanału:

- **WhatsApp Business** — musi to być szablon zatwierdzony przez WhatsApp. Użyj jednego z dwóch poniższych punktów końcowych.
- **Każdy inny kanał** (WhatsApp Web, SMS, Instagram, Messenger, Telegram, …) — pole `body` tego samego elementu to po prostu tekst, który zostanie wysłany. Przesłanie go przez poniższy punkt końcowy zapisuje go i oznacza jako gotowy, bez udziału WhatsApp.

### Prześlij szablon do zatwierdzenia

`POST /broadcasts/{broadcastId}/template`

| Pole | Wymagane | Opis |
|---|---|---|
| `body` | Tak | Treść wiadomości, do 1024 znaków. Użyj symboli zastępczych `{{variable}}` do personalizacji. |
| `name` | Nie | Nazwa szablonu. Domyślnie przyjmuje nazwę transmisji. |
| `language` | Nie | Kod języka. Domyślnie `en`. |
| `category` | Nie | `marketing` (domyślnie), `utility`, `authentication` lub `authentication-international`. Od tego zależy cena wysyłki, więc podawaj prawdziwe dane. |
| `variables` | Nie | Nazwy symboli zastępczych w kolejności ich występowania. Pomiń to, a zostaną odczytane z treści — co zazwyczaj jest pożądane, ponieważ wysyłka uzupełnia je dla każdego kontaktu. |

```bash
curl -X POST "https://api.youraiconnector.com/v1/broadcasts/bcd123abc456/template?apiKey=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "body": "Hi {{first_name}}, our June offer is live until Friday.",
    "language": "en",
    "category": "marketing"
  }'
```

**Odpowiedź** (`200`)

```json
{ "success": true, "broadcast_id": "bcd123abc456", "template_status": "pending", "template_sid": "HX0123..." }
```

`template_status` to odpowiedź WhatsApp: `pending` podczas sprawdzania, `approved` gdy jest gotowy do użycia, `rejected` jeśli został odrzucony. W przypadku kanału innego niż WhatsApp, odpowiedź wraca natychmiast jako `approved` z `template_sid: null` — nie ma nic do sprawdzania.

Co może Cię powstrzymać:

- Przesłanie szablonu, gdy poprzedni jest w trakcie sprawdzania, zwróci `400`. Najpierw poczekaj na decyzję.
- Edycja zatwierdzonego szablonu sprawia, że poprzednia wersja pozostaje aktywna do momentu zatwierdzenia nowej, dzięki czemu trwająca transmisja nigdy nie traci swojego elementu otwierającego.
- W przypadku numeru WhatsApp połączonego bezpośrednio przez Meta, transmisji z załączonym obrazem lub wideo nie można przesłać (`400`) — załączniki są obsługiwane w zarządzanym kanale WhatsApp Business oraz w WhatsApp Web.

### Użyj szablonu, który został już zatwierdzony

`POST /broadcasts/{broadcastId}/template/select` — kopiuje zatwierdzony już szablon z Twojej [biblioteki szablonów](templates.md) do transmisji, więc nie trzeba na nic czekać.

| Pole | Wymagane | Opis |
|---|---|---|
| `template_id` | Tak | Identyfikator zatwierdzonego szablonu na Twoim koncie. |

```bash
curl -X POST "https://api.youraiconnector.com/v1/broadcasts/bcd123abc456/template/select?apiKey=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "template_id": "tpl_abc123" }'
```

**Odpowiedź** (`200`)

```json
{
  "success": true,
  "broadcast_id": "bcd123abc456",
  "template_status": "approved",
  "template_sid": "HX0123...",
  "body": "Hi {{first_name}}, our June offer is live until Friday.",
  "name": "june_promo",
  "language": "en",
  "variables": ["first_name"],
  "category": "marketing"
}
```

Zatwierdzenie jest weryfikowane po naszej stronie na podstawie rekordu w bibliotece — przesyłasz tylko identyfikator. Otrzymasz `400`, jeśli transmisja nie jest szkicem WhatsApp, jeśli szablon nie jest zatwierdzony, jeśli jest to szablon uzupełniający, a nie otwierający, lub jeśli transmisja zawiera załącznik (szablony z biblioteki są tylko tekstowe). Identyfikator szablonu, którego nie ma na Twoim koncie, zwróci `404`.

---

## Oszacuj koszt

`POST /broadcasts/{broadcastId}/estimate-cost` — wycenia wysyłkę przed jej zatwierdzeniem. Dostępne dla transmisji `whatsapp` i `sms`; każdy inny kanał zwróci `400`. Transmisja wymaga `list_id`, ponieważ szacunek uwzględnia grupę odbiorców.

```bash
curl -X POST "https://api.youraiconnector.com/v1/broadcasts/bcd123abc456/estimate-cost?apiKey=YOUR_API_KEY"
```

**Odpowiedź WhatsApp** (`200`) — kredyty, z podziałem na kraj docelowy:

```json
{
  "success": true,
  "channel": "whatsapp",
  "billing_mode": "credits",
  "data": {
    "countries": [
      { "countryCode": "31", "name": "Netherlands", "iso": "NL", "flag": "🇳🇱", "contactCount": 180, "costPerContact": 1.2, "subtotal": 216 },
      { "countryCode": "1", "name": "United States", "iso": "US", "flag": "🇺🇸", "contactCount": 60, "costPerContact": 0.9, "subtotal": 54 }
    ],
    "totalContacts": 240,
    "totalTemplateCost": 270,
    "templateCategory": "marketing",
    "billing_mode": "credits",
    "service_messages_billable_soon": false
  }
}
```

**Odpowiedź SMS** (`200`) — dolary amerykańskie, na podstawie aktualnych cen Twilio dla Twojego własnego konta Twilio:

```json
{
  "success": true,
  "channel": "sms",
  "billing_mode": "twilio_direct",
  "data": {
    "totalContacts": 240,
    "messageLength": 118,
    "segmentsPerMessage": 1,
    "totalSegments": 240,
    "estimatedCostUsd": 1.788,
    "priceUnit": "USD",
    "billedByTwilio": true,
    "billing_mode": "twilio_direct",
    "service_messages_billable_soon": false
  }
}
```

**Przeczytaj `billing_mode`, zanim wyświetlisz numer.** Informuje on, kto jest obciążany kosztami:

| `billing_mode` | Kto płaci | Co oznaczają te liczby |
|---|---|---|
| `credits` | Twoje konto <span data-t="appName">Your AI Connector</span> | `totalTemplateCost` oraz liczby dla poszczególnych krajów to kredyty. |
| `twilio_direct` | Twoje własne konto Twilio | `estimatedCostUsd` to kwota, którą obciąży Cię Twilio. |
| `meta_waba_direct` | Twoje własne konto WhatsApp Business, rozliczane przez Meta | Każda liczba kredytów wraca jako `null` — celowo, aby nigdy nie pomylić jej z „darmową”. Liczby krajów i kontaktów pozostają dokładne. |

SMS bez podłączonych danych uwierzytelniających Twilio nadal zwraca liczbę segmentów, z `estimatedCostUsd: 0` — nie ma żadnych cen do sprawdzenia.

---

## Uruchom transmisję

`POST /broadcasts/{broadcastId}/launch`

Uruchomienie najpierw sprawdza wszystko, a dopiero potem kontynuuje transmisję. Nie ma możliwości częściowego uruchomienia: albo się rozpocznie, albo nic się nie zmieni i otrzymasz komunikat o błędzie z wyjaśnieniem przyczyny.

**cURL**

```bash
curl -X POST "https://api.youraiconnector.com/v1/broadcasts/bcd123abc456/launch?apiKey=YOUR_API_KEY"
```

**JavaScript**

```javascript
const res = await fetch("https://api.youraiconnector.com/v1/broadcasts/bcd123abc456/launch", {
  method: "POST",
  headers: { "X-API-Key": "YOUR_API_KEY" },
});
const data = await res.json();
if (!data.success) console.error(data.error);
```

**Python**

```python
res = requests.post(
    "https://api.youraiconnector.com/v1/broadcasts/bcd123abc456/launch",
    headers={"X-API-Key": "YOUR_API_KEY"},
)
print(res.json())
```

**Odpowiedź** (`200`)

```json
{ "success": true, "broadcast_id": "bcd123abc456", "status": "Scheduled" }
```

`status` to miejsce, w którym wylądowała transmisja:

- `Scheduled` — `execution_date` jest w przyszłości.
- `Sending` — rozpoczęła się teraz.
- `Pending Approval` — szablon WhatsApp jest nadal w trakcie weryfikacji. Wyśle się automatycznie, gdy tylko szablon zostanie zatwierdzony; nie wywołuj ponownie uruchomienia.

Uruchomić można tylko transmisję `Draft` (lub `Pending Approval`, której szablon został w międzyczasie zatwierdzony) — każda inna zwróci `400`.

### Dlaczego uruchomienie zostało odrzucone

Każdy z tych przypadków zwraca `400` wraz z komunikatem `error` napisanym prostym językiem:

| Problem | Co naprawić |
|---|---|
| Brak odbiorców | Ustaw `list_id` (lub dołącz kontakty) przed uruchomieniem. |
| Brak wiadomości powitalnej | Ustaw wiadomość powitalną — zobacz [Wiadomość powitalna](#the-opening-message). |
| Załącznik w wiadomości SMS | SMS nie może zawierać obrazu ani wideo. Usuń załącznik lub przenieś transmisję do WhatsApp. |
| Załącznik nie pasuje do zatwierdzonego szablonu | W WhatsApp multimedia znajdują się wewnątrz zatwierdzonego szablonu, więc zmiana załącznika po fakcie oznacza konieczność ponownego przesłania szablonu. |
| Szablon odrzucony | Przepisz wiadomość i prześlij ją ponownie. |
| Szablon nigdy nie został przesłany | Najpierw prześlij go (lub wybierz zatwierdzony). |
| Szablon zatwierdzony, ale brak go na Twoim koncie WhatsApp | Zazwyczaj dotyczy to szablonu zatwierdzonego przed zakończeniem łączenia numeru. Prześlij go ponownie. |
| Brak połączonego nadawcy dla kanału | Najpierw połącz kanał — zobacz [Kanały](channels.md). |
| Kanał tylko do odpowiedzi | TikTok i Skool nie pozwalają firmie na rozpoczynanie konwersacji, więc nie można na nich prowadzić transmisji. |
| Już uzbrojona | Transmisja ma już zaplanowaną wysyłkę. Wstrzymaj ją przed ponownym uruchomieniem. |
| Wciąż oczekuje na zatwierdzenie | Wyśle się automatycznie, gdy szablon zostanie zatwierdzony. |
| Konto WhatsApp Business zablokowane przez Meta | Meta wstrzymała konwersacje inicjowane przez firmę na Twoim koncie WhatsApp Business — zazwyczaj jest to problem z metodą płatności. Napraw to w Meta Business Manager. |
| Rozpoczęto z klasycznej kampanii | Uruchom ją z edytora kampanii. Zobacz [klasyczne kampanie w Transmisjach](#broadcasts-that-mirror-a-classic-campaign). |

---

## Wstrzymywanie i wznawianie

`POST /broadcasts/{broadcastId}/pause` zatrzymuje transmisję `Sending` lub `Scheduled` i usuwa wszystko, co znajduje się w kolejce.

```bash
curl -X POST "https://api.youraiconnector.com/v1/broadcasts/bcd123abc456/pause?apiKey=YOUR_API_KEY"
```

Wstrzymanie transmisji `Pending Approval` powoduje jej powrót do stanu `Draft` — nic nie zostało jeszcze zaplanowane, więc nie ma czego wznawiać. Każdy inny status zwraca `400`.

`POST /broadcasts/{broadcastId}/resume` restartuje transmisję `Paused`:

```bash
curl -X POST "https://api.youraiconnector.com/v1/broadcasts/bcd123abc456/resume?apiKey=YOUR_API_KEY"
```

**Odpowiedź** (`200`)

```json
{ "success": true, "broadcast_id": "bcd123abc456" }
```

Wznawia ją do stanu `Sending` lub z powrotem do `Scheduled`, jeśli jej `execution_date` wciąż przypada w przyszłości. Wznowić można tylko transmisję `Paused`.

---

## Kontynuuj wysyłkę po wstrzymaniu z powodu niskiego zaangażowania

`POST /broadcasts/{broadcastId}/override-engagement-guard`

Podczas gdy transmisja jest wysyłana w partiach, mierzymy, ile osób odpowiedziało na każdą z nich, zanim rozpoczniemy kolejną. Jeśli prawie nikt nie odpowiada, transmisja wstrzymuje się automatycznie — wysyłka, która jest kontynuowana w ciszy, to najszybszy sposób na przefiltrowanie lub zablokowanie numeru. Służy do tego przycisk **Kontynuuj mimo wszystko** w panelu nawigacyjnym.

Ponieważ wskaźnik odpowiedzi, który spowodował wstrzymanie, nie może się zmienić, gdy transmisja jest zatrzymana, zwykłe [wznowienie](#pause-and-resume) spowodowałoby ponowne wstrzymanie przy następnym sprawdzeniu. Ten punkt końcowy to decyzja o kontynuowaniu mimo wszystko: rejestruje on obejście dla tej konkretnej transmisji i znosi wstrzymanie w tym samym wywołaniu, jeśli transmisja została wstrzymana z powodu niskiego zaangażowania.

```bash
curl -X POST "https://api.youraiconnector.com/v1/broadcasts/bcd123abc456/override-engagement-guard?apiKey=YOUR_API_KEY"
```

**Odpowiedź** (`200`)

```json
{ "success": true, "broadcast_id": "bcd123abc456", "status": "Sending", "resumed": true }
```

- `resumed: true` — transmisja została wstrzymana z powodu niskiego zaangażowania i jest teraz ponownie uruchomiona; `status` to stan, do którego została wznowiona.
- `resumed: false` — nic nie zostało zniesione, obejście jest po prostu rejestrowane do przyszłych kontroli. Otrzymasz to, jeśli transmisja nigdy nie została wstrzymana lub została wstrzymana z innego powodu (wstrzymałeś ją ręcznie, osiągnięto limit wysyłki lub zbyt wiele wysyłek zakończyło się błędem). Takie wstrzymania nie są tutaj znoszone — wznów ją samodzielnie po usunięciu przyczyny.

Obejście dotyczy tylko tej transmisji. Nie jest to ustawienie konta i można je bezpiecznie wywołać dwukrotnie.

---

## Duplikuj transmisję

`POST /broadcasts/{broadcastId}/duplicate` — kopiuje odbiorców, wiadomość i ustawienia do nowej `Draft`. Wszystko, co dotyczy poprzedniego uruchomienia (liczniki, partie, harmonogram, statystyki odpowiedzi), zaczyna się od nowa.

| Pole | Wymagane | Opis |
|---|---|---|
| `to_channel` | Nie | Utwórz kopię na innym kanale. W ten sposób wysyłasz to samo na dwóch kanałach — transmisja zawsze ma tylko jeden. |

```bash
curl -X POST "https://api.youraiconnector.com/v1/broadcasts/bcd123abc456/duplicate?apiKey=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "to_channel": "sms" }'
```

**Odpowiedź** (`201`)

```json
{ "success": true, "broadcast_id": "bcd999new111", "source_broadcast_id": "bcd123abc456" }
```

Kopia nigdy nie dziedziczy aktywnego zatwierdzenia WhatsApp: w kopii WhatsApp szablon wymaga Twojego potwierdzenia, a w kopii na inny kanał jest usuwany, a tekst staje się zwykłym otwieraczem. Kopiowanie do SMS usuwa również wszelkie załączniki, ponieważ SMS nie może ich wysyłać.

---

## Usuń transmisję

`DELETE /broadcasts/{broadcastId}`

```bash
curl -X DELETE "https://api.youraiconnector.com/v1/broadcasts/bcd123abc456?apiKey=YOUR_API_KEY"
```

Transmisja `Sending` lub `Scheduled` została odrzucona z błędem `400` — najpierw ją wstrzymaj.

---

## Transmisje odzwierciedlające kampanię klasyczną

Kampanie klasyczne, które wysyłają wiadomości, pojawiają się również w Transmisjach, a API zwraca je wraz z natywnymi transmisjami (posiadają one `source_campaign_id`). Zachowują się one nieco inaczej, ponieważ to kampania pozostaje nadrzędna:

- **Edycja** grupy odbiorców, wiadomości lub harmonogramu działa i jest zapisywana w kampanii.
- **Kanał, agent odpowiedzi, załącznik oraz wszystkie liczniki uruchomień są tutaj tylko do odczytu** — otrzymasz `400`, jeśli spróbujesz je zmienić. Zmień je w kampanii.
- **Uruchomienie** zwraca `400`, kierując do edytora kampanii.
- **Wstrzymanie i wznowienie** działają i mają wpływ na kampanię.
- **Usunięcie** zwraca `400` — zamiast tego usuń kampanię, a jej wpis w Transmisjach zniknie wraz z nią.
- **Duplikowanie** tworzy niezależną transmisję natywną, co jest zalecanym sposobem przenoszenia sprawdzonych kampanii.

---

## Błędy

Nieudane żądania zwracają `{"success": false, "error": "<message>"}` z następującymi statusami:

| Status | Znaczenie |
|---|---|
| `400` | Coś jest nie tak z żądaniem lub stanem transmisji — brakujące pole, nieprawidłowy załącznik lub próba uruchomienia/wstrzymania/wznowienia/usunięcia, która jest niedozwolona w bieżącym statusie transmisji. Komunikat `error` wskazuje przyczynę. |
| `401` | Brakujący lub nieprawidłowy klucz API. |
| `403` | Twój plan nie obejmuje dostępu do API. |
| `404` | Brak takiej transmisji na Twoim koncie (lub w przypadku wyboru szablonu, brak takiego szablonu). |
| `429` | Ograniczenie częstotliwości zapytań (rate limit). Odczekaj i spróbuj ponownie. |
| `500` | Wystąpił błąd po naszej stronie. Spróbuj ponownie po krótkiej chwili. |

---

## Następne kroki

- [Przewodnik po transmisjach](../broadcasts/broadcasts.md) — produkt stojący za tymi punktami końcowymi, w tym informacje o tempie wysyłki i zachowaniach związanych z bezpieczeństwem
- [API kontaktów](contacts.md) — budowanie listy, do której wysyłana jest transmisja
- [API szablonów](templates.md) — zarządzanie zatwierdzonymi szablonami WhatsApp, które możesz wybrać
- [API webhooków](webhooks.md) — subskrybuj `Broadcast Started` i `Broadcast Completed` zamiast odpytywać API
