
# Broadcasts API

En **broadcast** er én udgående afsendelse: et publikum, en åbningsbesked, én kanal og en tidsplan. Valgfrit navngiver den også den AI-agent, der håndterer de svar, der kommer retur. Broadcasts API'et lader dig oprette, prissætte, starte og overvåge disse afsendelser fra din egen kode i stedet for fra dashboardet. For selve produktet, se [Broadcasts-guiden](../broadcasts/broadcasts.md).

- **Base URL** — `https://api.youraiconnector.com/v1`
- **Autentificering** — din API-nøgle (se [Autentificering](authentication.md))
- **Fejl & paginering** — se [Fejl & Paginering](errors-and-pagination.md)

Alle eksempler herunder viser `?apiKey=` forespørgselsformen i cURL og `X-API-Key` headeren i JavaScript og Python — begge virker på alle slutpunkter.

> **I API-udforskeren.** Hvert endpoint på denne side findes i den publicerede OpenAPI-specifikation, så du kan gennemse dens præcise felter og køre live-forespørgsler i [API-udforskeren](reference.md).


---

## Hvordan en afsendelse sammensættes

At sende en broadcast kræver fire kald, ikke ét:

1. **Opret** broadcasten med dens publikum, kanal og tidsplan — den starter som en `Draft`.
2. **Indstil åbningsbeskeden.** På WhatsApp Business betyder det at indsende en skabelon til godkendelse (eller vælge en, du allerede har fået godkendt). På alle andre kanaler er det almindelig tekst.
3. **Estimer omkostningen**, hvis du vil tjekke prisen, før du bruger noget (valgfrit).
4. **Start den.** Start-handlingen kører et fuldt tjek — publikum, besked, skabelongodkendelse, forbundet afsender — og starter enten afsendelsen eller fortæller dig præcis, hvad der mangler.

Intet bliver sendt, før du kalder start.

---

## Broadcast-objektet

```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
}
```

**Tidsstempler returneres som epoch-millisekunder** (`execution_date`, `created_at`, `last_modified_at`, …), og enhver kontaktreference returneres som en stistreng som `contacts/uid_whatsapp_15551234567`.

### Felter du indstiller

| Felt | Beskrivelse |
|---|---|
| `name` | Hvad broadcasten kaldes i dashboardet. |
| `channel` | Den ene kanal, som denne broadcast sender på: `whatsapp`, `whatsapp_web`, `sms`, `instagram`, `messenger`, `facebook`, `telegram`, `instagram_private`, `line`, `viber`, `imessage`, `email`, `chat_widget`, `custom_channel`. En broadcast har præcis én kanal — for at sende det samme et andet sted, [dupliker den til en anden kanal](#duplicate-a-broadcast). `tiktok` og `skool` er kun til svar og kan aldrig bruges til broadcast. |
| `agent_id` | Den AI-agent, der besvarer svar. Lad den være `null`, så lander svar i din team-indbakke i stedet. |
| `list_id` | Kontaktlisten, der skal sendes til. Dette er måden, du indstiller publikummet på via API'et — se [Kontakter](contacts.md) for oprettelse og udfyldelse af lister. |
| `list_name` | Visningsnavn vist ved siden af broadcasten. Kosmetisk. |
| `send_to_new_list_members` | `true` holder broadcasten aktiv, så alle, der tilføjes listen senere, også får åbningsbeskeden. |
| `whats_app_template` | Åbningsbeskeden. På WhatsApp Business er det en rigtig godkendt skabelon; på alle andre kanaler bruges dens `body` som den almindelige åbningstekst. Indstil den via [skabelon-endpoints](#the-opening-message), ikke manuelt. |
| `opener_media` | Ét billede eller én video sendt med åbningsbeskeden. Send altid hele objektet (eller `null` for at fjerne det) — skrivning af individuelle felter indeni afvises. Ikke understøttet på SMS. |
| `execution_date` | Hvornår der skal sendes. Send et ISO 8601-tidsstempel eller epoch-millisekunder. En fremtidig dato planlægger afsendelsen; udelad den (eller brug en fortidig) for at sende, så snart du starter. |
| `drip_mode` | `true` fordeler afsendelsen i batches over tid i stedet for alt på én gang. |
| `time_critical` | `true` fravælger den automatiske fordeling, der aktiveres over 50 kontakter — til et varmt publikum, der har brug for beskeden nu. Det ophæver ikke kanalens egen daglige afsendelsesgrænse. |
| `batch_size` | Hvor mange kontakter pr. batch ved drypvis afsendelse. |
| `follow_up_config` | Opfølgningskæden for kontakter, der aldrig svarer. |

Alt, hvad du sender som `user_id`, `id`, `status` eller `source_campaign_id`, ignoreres ved oprettelse og fjernes ved opdatering — status bevæger sig kun gennem start-, pause- og genoptag-endpoints nedenfor.

### Felter platformen vedligeholder

`status`, `total_contacts_sent`, `unique_contacts_replied`, `overall_reply_rate`, `credits_used`, `paused_reason`, `completion_summary`, batch-tællerne og `contacts` (de individuelle kontakter tilknyttet fra dashboardet, læst tilbage som stistrenge). Læs dem, skriv ikke til dem.

### Statusser

| Status | Betydning |
|---|---|
| `Draft` | Bliver bygget. Intet er planlagt. |
| `Pending Approval` | Lanceret, men dens WhatsApp-skabelon afventer stadig en beslutning. Den begynder at sende af sig selv, når skabelonen er godkendt — du behøver ikke at lancere igen. |
| `Scheduled` | Lanceret med en fremtidig `execution_date`. |
| `Sending` | Sender aktivt (en udsendelse, der er klar til nye listemedlemmer, forbliver her, mens den venter på dem). |
| `Paused` | Sat på pause — af dig eller automatisk af et sikkerhedstjek. |
| `Sent` | Færdig. |
| `Failed` | Færdig med mere end halvdelen af afsendelserne mislykkede. |

---

## Opret en udsendelse

`POST /broadcasts` — opretter en `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"])
```

**Svar** (`201`)

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

---

## List udsendelser

`GET /broadcasts` — hver udsendelse på kontoen, nyeste først.

**Forespørgselsparametre**

| Parameter | Påkrævet | Beskrivelse |
|---|---|---|
| `status` | Nej | Returner kun udsendelser med én status, f.eks. `Sending`. Match stavemåden i [statustabellen](#statuses) præcist. |

```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"]
```

**Svar** (`200`)

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

---

## Hent en udsendelse

`GET /broadcasts/{broadcastId}` — returnerer `{ "success": true, "broadcast": { ... } }`. Brug den til at forespørge på en igangværende afsendelse: `total_contacts_sent`, `unique_contacts_replied`, `overall_reply_rate` og `credits_used` opdateres løbende. |

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

En udsendelse, der ikke findes på din konto, returnerer `404`.

---

## Opdater en udsendelse

`PUT /broadcasts/{broadcastId}` — send kun de felter, du ønsker at ændre. Du kan også adressere en enkelt nøgle inde i et indlejret objekt med en punktum-sti, f.eks. `"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" }),
});
```

En tom krop returnerer `400`. To regler, der er værd at kende:

- **`opener_media` er alt-eller-intet.** Send det komplette objekt, eller `null` for at fjerne vedhæftningen. En punktum-sti ind i den (`opener_media.name`) afvises med `400`, fordi en delvist opdateret vedhæftning ville beskrive en fil, der ikke er der.
- **Status kan ikke redigeres.** Brug [lancering](#launch-a-broadcast), [pause](#pause-and-resume) og [genoptag](#pause-and-resume).

---

## Åbningsbeskeden

Hver udsendelse har sin åbner i `whats_app_template`. Hvad det betyder, afhænger af kanalen:

- **WhatsApp Business** — det skal være en skabelon, som WhatsApp har godkendt. Brug et af de to endpoints nedenfor.
- **Alle andre kanaler** (WhatsApp Web, SMS, Instagram, Messenger, Telegram, …) — det samme felts `body` er blot den tekst, der sendes. Ved at indsende den via endpointet nedenfor gemmes den og markeres som klar uden at involvere WhatsApp overhovedet.

### Indsend en skabelon til godkendelse

`POST /broadcasts/{broadcastId}/template`

| Felt | Påkrævet | Beskrivelse |
|---|---|---|
| `body` | Ja | Beskedteksten, op til 1024 tegn. Brug `{{variable}}` pladsholdere til personalisering. |
| `name` | Nej | Skabelonnavn. Standard er udsendelsens navn. |
| `language` | Nej | Sprogkode. Standard er `en`. |
| `category` | Nej | `marketing` (standard), `utility`, `authentication` eller `authentication-international`. Dette er, hvad afsendelsen prissættes efter, så vær ærlig. |
| `variables` | Nej | Pladsholdernavnene i den rækkefølge, de optræder. Udelad det, så læses de fra brødteksten — hvilket normalt er det, du ønsker, da afsendelsen udfylder dem fra hver kontakt. |

```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"
  }'
```

**Svar** (`200`)

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

`template_status` er hvad WhatsApp siger: `pending` mens den bliver gennemset, `approved` når den er klar til brug, `rejected` hvis den blev afvist. På en ikke-WhatsApp-kanal kommer den direkte tilbage som `approved` med `template_sid: null` — intet der skal gennemses.

Ting der vil stoppe dig:

- Indsendelse mens en tidligere skabelon stadig er under gennemgang returnerer `400`. Vent på afgørelsen først.
- Redigering af en skabelon, der i øjeblikket er godkendt, holder den godkendte version aktiv, indtil den nye kommer tilbage, så en kørende udsendelse aldrig mister sin åbner.
- På et WhatsApp-nummer, der er forbundet direkte via Meta, kan en udsendelse med et vedhæftet billede eller video ikke indsendes (`400`) — vedhæftede filer understøttes på den administrerede WhatsApp Business-linje og på WhatsApp Web.

### Brug en skabelon, du allerede har fået godkendt

`POST /broadcasts/{broadcastId}/template/select` — kopierer en allerede godkendt skabelon fra dit [skabelonbibliotek](templates.md) til udsendelsen, så der er intet at vente på.

| Felt | Påkrævet | Beskrivelse |
|---|---|---|
| `template_id` | Ja | Id'et på en godkendt skabelon på din konto. |

```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" }'
```

**Svar** (`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"
}
```

Godkendelsen verificeres på vores side ud fra biblioteksposten — du sender kun id'et. Du får en `400`, hvis udsendelsen ikke er et WhatsApp-udkast, hvis skabelonen ikke er godkendt, hvis det er en opfølgningsskabelon frem for en åbner, eller hvis udsendelsen har en vedhæftet fil (biblioteksskabeloner er kun tekst). Et skabelon-id, der ikke findes på din konto, returnerer `404`.

---

## Estimer omkostningerne

`POST /broadcasts/{broadcastId}/estimate-cost` — prissætter afsendelsen, før du forpligter dig til den. Tilgængelig på `whatsapp` og `sms` udsendelser; enhver anden kanal returnerer `400`. Udsendelsen kræver en `list_id`, da estimatet tæller modtagerne.

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

**WhatsApp-svar** (`200`) — kreditter, opdelt efter destinationsland:

```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
  }
}
```

**SMS-svar** (`200`) — amerikanske dollars, baseret på live Twilio-priser for din egen Twilio-konto:

```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
  }
}
```

**Læs `billing_mode` før du viser et nummer.** Det fortæller dig, hvem der bliver faktureret:

| `billing_mode` | Hvem betaler | Hvad tallene betyder |
|---|---|---|
| `credits` | Din <span data-t="appName">Your AI Connector</span>-konto | `totalTemplateCost` og tallene pr. land er kreditter. |
| `twilio_direct` | Din egen Twilio-konto | `estimatedCostUsd` er hvad Twilio vil opkræve dig. |
| `meta_waba_direct` | Din egen WhatsApp Business-konto, faktureret af Meta | Hvert kredit-tal kommer tilbage som `null` — bevidst, så det aldrig forveksles med "gratis". Lande- og kontaktantal er stadig nøjagtige. |

SMS uden tilsluttede Twilio-legitimationsoplysninger returnerer stadig segmentantallet med `estimatedCostUsd: 0` — der er ingen priser at slå op.

---

## Start en udsendelse

`POST /broadcasts/{broadcastId}/launch`

Start-processen tjekker alt først og går derefter videre med udsendelsen. Der findes ingen delvis start: enten starter den, eller også ændres intet, og du får en fejlmeddelelse, der forklarer hvorfor.

**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())
```

**Svar** (`200`)

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

`status` er hvor udsendelsen landede:

- `Scheduled` — `execution_date` ligger i fremtiden.
- `Sending` — den startede nu.
- `Pending Approval` — WhatsApp-skabelonen er stadig til gennemsyn. Den sendes automatisk, så snart skabelonen er godkendt; kald ikke start igen.

Kun en `Draft` (eller en `Pending Approval`-udsendelse, hvis skabelon siden er blevet godkendt) kan startes — alt andet returnerer `400`.

### Hvorfor en start afvises

Hver af disse kommer tilbage som `400` med en letforståelig `error`-besked:

| Problem | Hvad skal rettes |
|---|---|
| Intet publikum | Angiv `list_id` (eller vedhæft kontakter) før start. |
| Ingen åbningsbesked | Angiv åbneren — se [Åbningsbeskeden](#the-opening-message). |
| Vedhæftning på SMS | SMS kan ikke indeholde et billede eller en video. Fjern vedhæftningen eller flyt udsendelsen til WhatsApp. |
| Vedhæftning matcher ikke den godkendte skabelon | På WhatsApp ligger mediet inde i den godkendte skabelon, så at udskifte vedhæftningen bagefter betyder, at skabelonen skal indsendes på ny. |
| Skabelon afvist | Omskriv beskeden og indsend den igen. |
| Skabelon aldrig indsendt | Indsend den (eller vælg en godkendt) først. |
| Skabelon godkendt, men mangler på din WhatsApp-konto | Normalt en skabelon godkendt før nummeret var færdig med at forbinde. Indsend den igen. |
| Ingen forbundet afsender til kanalen | Forbind kanalen først — se [Kanaler](channels.md). |
| Kun-svar-kanal | TikTok og Skool tillader ikke en virksomhed at starte en samtale, så de kan ikke bruges til udsendelser. |
| Allerede klargjort | Udsendelsen har allerede en planlagt afsendelse. Sæt den på pause før du starter igen. |
| Venter stadig på godkendelse | Den sendes automatisk, når skabelonen er godkendt. |
| WhatsApp Business-konto blokeret af Meta | Meta har stoppet virksomhedsinitierede samtaler på din egen WhatsApp Business-konto — normalt et problem med betalingsmetoden. Ret det i Metas Business Manager. |
| Startet fra en klassisk kampagne | Start den fra kampagneeditoren i stedet. Se [klassiske kampagner i Udsendelser](#broadcasts-that-mirror-a-classic-campaign). |

---

## Pause og genoptag

`POST /broadcasts/{broadcastId}/pause` stopper en `Sending`- eller `Scheduled`-udsendelse og fjerner alt, der ligger i kø.

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

Hvis du sætter en `Pending Approval`-udsendelse på pause, føres den tilbage til `Draft` i stedet – intet var planlagt endnu, så der er intet at genoptage. Enhver anden status returnerer `400`.

`POST /broadcasts/{broadcastId}/resume` genstarter en `Paused`-udsendelse:

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

**Svar** (`200`)

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

Den genoptages i `Sending` eller tilbage i `Scheduled`, hvis dens `execution_date` stadig ligger i fremtiden. Kun en `Paused`-udsendelse kan genoptages.

---

## Fortsæt afsendelse efter pause pga. lavt engagement

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

Mens en udsendelse sendes i batches, måler vi, hvor mange personer der svarede på hver batch, før vi starter den næste. Hvis næsten ingen svarer, sætter udsendelsen sig selv på pause – en afsendelse, der bliver ved med at sende ud i stilhed, er den hurtigste måde at få et nummer filtreret eller blokeret på. Det er knappen **Fortsæt alligevel** i dashboardet.

Da svarraten, der forårsagede pausen, ikke kan ændre sig, mens udsendelsen er stoppet, ville en almindelig [genoptagelse](#pause-and-resume) bare blive sat på pause igen ved næste tjek. Dette endpoint er beslutningen om at fortsætte alligevel: Det registrerer tilsidesættelsen på den pågældende udsendelse og ophæver pausen i samme kald, hvis udsendelsen var sat på pause pga. lavt engagement.

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

**Svar** (`200`)

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

- `resumed: true` – udsendelsen blev sat på pause pga. lavt engagement og kører nu igen; `status` er der, hvor den blev genoptaget.
- `resumed: false` – intet blev ophævet, tilsidesættelsen er blot registreret til fremtidige tjek. Det er, hvad du får, hvis udsendelsen aldrig blev sat på pause, eller blev sat på pause af en anden årsag (du satte den manuelt på pause, en afsendelsesgrænse blev nået, eller for mange afsendelser fejlede). Disse pauser ophæves ikke her – genoptag den selv, når du har håndteret årsagen.

Tilsidesættelsen gælder kun for denne udsendelse. Det er ikke en kontoindstilling, og det er sikkert at kalde den to gange.

---

## Dupliker en udsendelse

`POST /broadcasts/{broadcastId}/duplicate` – kopierer målgruppen, beskeden og indstillingerne til en ny `Draft`. Alt vedrørende den forrige kørsel (tællere, batches, tidsplan, svarstatistik) starter forfra.

| Felt | Påkrævet | Beskrivelse |
|---|---|---|
| `to_channel` | Nej | Opret kopien på en anden kanal. Dette er måden, du sender det samme på to kanaler – en udsendelse har kun nogensinde én. |

```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" }'
```

**Svar** (`201`)

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

En kopi arver aldrig en live WhatsApp-godkendelse: På en WhatsApp-kopi skal skabelonen bekræftes af dig, og ved en kopi til en anden kanal fjernes den, og teksten bliver til den almindelige åbner. Kopiering til SMS fjerner også eventuelle vedhæftede filer, da SMS ikke kan sende dem.

---

## Slet en udsendelse

`DELETE /broadcasts/{broadcastId}`

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

En `Sending` eller `Scheduled` udsendelse afvises med `400` — sæt den på pause først.

---

## Udsendelser, der spejler en klassisk kampagne

Klassiske kampagner, der sender beskeder, vises også i Udsendelser, og API'et returnerer dem sammen med native udsendelser (de bærer et `source_campaign_id`). De opfører sig lidt anderledes, fordi kampagnen forbliver ansvarlig:

- **Redigering** af målgruppe, besked eller tidsplan fungerer og skrives direkte til kampagnen.
- **Kanal, svar-agent, vedhæftet fil og alle kørselstællere er skrivebeskyttede** her — `400` hvis du forsøger at ændre dem. Skift dem i kampagnen.
- **Start** returnerer `400`, der henviser dig til kampagneditoren.
- **Pause og genoptag** fungerer og påvirker kampagnen.
- **Slet** returnerer `400` — slet kampagnen i stedet, så forsvinder dens Udsendelser-post sammen med den.
- **Dupliker** giver dig en uafhængig native udsendelse, hvilket er den understøttede måde at flytte en gennemprøvet kampagne på.

---

## Fejl

Mislykkede anmodninger returnerer `{"success": false, "error": "<message>"}` med disse statusser:

| Status | Betydning |
|---|---|
| `400` | Noget ved anmodningen eller udsendelsens tilstand er forkert — et manglende felt, en ugyldig vedhæftet fil eller en start/pause/genoptag/slet, der ikke er tilladt i udsendelsens nuværende status. `error`-beskeden angiver årsagen. |
| `401` | Manglende eller ugyldig API-nøgle. |
| `403` | Din plan inkluderer ikke API-adgang. |
| `404` | Ingen sådan udsendelse på din konto (eller, ved valg af skabelon, ingen sådan skabelon). |
| `429` | Hastighedsbegrænset. Vent og prøv igen. |
| `500` | Noget gik galt på vores side. Prøv igen efter en kort ventetid. |

---

## Næste skridt

- [Guide til udsendelser](../broadcasts/broadcasts.md) — produktet bag disse endpoints, inklusive tempo og sikkerhedsadfærd
- [Kontakter API](contacts.md) — opbyg listen, som en udsendelse sendes til
- [Skabeloner API](templates.md) — administrer de godkendte WhatsApp-skabeloner, du kan vælge imellem
- [Webhooks API](webhooks.md) — abonner på `Broadcast Started` og `Broadcast Completed` i stedet for at polle
