---
title: "Retry failed broadcast recipients"
method: POST
path: "/api/broadcasts/{id}/retry"
tags: ["Broadcasts"]
---

# Retry failed broadcast recipients

`POST /api/broadcasts/{id}/retry`

## Request

- Base URL: `https://api.setluca.com`
- URL: `https://api.setluca.com/api/broadcasts/{id}/retry`
- Auth: one of:
  - API key in cookie `luca.session_token`
  - API key in header `x-api-key`
  - HTTP bearer

Sends again to the recipients whose delivery failed, and leaves the successful ones alone.

**API key scopes:** `broadcasts:write`. You also need an `Idempotency-Key` header.

## Path parameters

- `id` string, uuid, required

## Headers

- `Luca-API-Version` '1'

## Request body

- BroadcastRetry
  - `reason` string
  - `failedOnly` boolean

## Response `200`

ok

- BroadcastDetail
  - `id` string, uuid, required
  - `campaignId` string, uuid, required
  - `campaignVersionId` string, uuid, nullable, required
  - `name` string, required
  - `status` 'draft' | 'previewed' | 'approved' | 'running' | 'paused' | 'cancelled' | 'completed' | 'failed', required
  - `personalizationMode` 'same_message' | 'personalized_light' | 'personalized_ai', required
  - `totalRecipients` integer, required
  - `canarySize` integer, required
  - `batchSize` integer, required
  - `sentCount` integer, required
  - `failedCount` integer, required
  - `skippedCount` integer, required
  - `previewVersion` string, nullable, required
  - `createdAt` string, required
  - `updatedAt` string, required
  - `segment` object, required
    - `mode` 'all' | 'any'
    - `rules` object[]
      - `field` 'channel' | 'tags' | 'stage' | 'score' | 'sourceCampaignId' | 'sourceTrigger' | 'lastMessageAt' | 'lastReplyAt' | 'bookingStatus' | 'crmField' | 'consent' | 'timezone' | 'localTime' | 'blacklisted', required
      - `operator` 'equals' | 'not_equals' | 'contains' | 'not_contains' | 'in' | 'not_in' | 'greater_than' | 'less_than' | 'before' | 'after' | 'exists' | 'missing', required
      - `value` unknown
      - `path` string
    - `groups` object[]
      - `mode` 'all' | 'any'
      - `rules` object[]
        - `field` 'channel' | 'tags' | 'stage' | 'score' | 'sourceCampaignId' | 'sourceTrigger' | 'lastMessageAt' | 'lastReplyAt' | 'bookingStatus' | 'crmField' | 'consent' | 'timezone' | 'localTime' | 'blacklisted', required
        - `operator` 'equals' | 'not_equals' | 'contains' | 'not_contains' | 'in' | 'not_in' | 'greater_than' | 'less_than' | 'before' | 'after' | 'exists' | 'missing', required
        - `value` unknown
        - `path` string
    - `channel` string
    - `channels` string[]
    - `stage` string
    - `stages` string[]
    - `tagsAny` string[]
    - `tagsAll` string[]
    - `minScore` integer
    - `maxScore` integer
    - `includeLeadIds` string[]
    - `excludeLeadIds` string[]
    - `limit` integer
  - `segmentSnapshot` object, required
    - `leadIds` string[]
    - `leads` object[]
      - `leadId` string, uuid, required
      - `channel` string, required
      - `channelAccountId` string, uuid
      - `externalUserId` string, required
      - `displayName` string, nullable, required
      - `stage` string, required
      - `tags` string[], required
      - `score` integer, required
      - `customFields` object, required
      - `lastSeenAt` string, required
      - `messageBody` string
      - `templatePart` object, nullable
        - `id` string, uuid, required
        - `type` 'template', required
        - `templateId` string, required
        - `name` string, required
        - `language` string, required
        - `versionHash` string, required
        - `parameters` union[], required
          - union
            - object
              - …
            - object
              - …
        - `renderedPreview` string, required
        - `providerMetadata` object
      - `templateMapping` object, nullable
        - `templateId` string, required
        - `templateBindings` union[]
          - union
            - object
              - …
            - object
              - …
            - object
              - …
      - `messageBlocker` string
      - `consent` union
        - object
          - `basis` 'explicit_marketing', required
          - `consentId` string, uuid, required
          - `evidenceId` string, required
          - `grantedAt` string, required
          - `checkedAt` string, required
        - object
          - `basis` 'prior_inbound', required
          - `conversationId` string, uuid, required
          - `channelAccountId` string, uuid, required
          - `lastInboundAt` string, required
          - `checkedAt` string, required
    - `excludedCount` integer
    - `exclusionReasonCounts` object
    - `excludedRecipients` object[]
      - `leadId` string, uuid, required
      - `displayName` string, nullable, required
      - `channel` string, required
      - `reason` string, required
    - `providerLimits` object[]
      - `channel` string, required
      - `provider` string, required
      - `estimatedRecipients` integer, required
      - `limitPerBatch` integer, required
      - `risk` 'low' | 'medium' | 'high', required
    - `totalMatched` integer
    - `accountSelectionRequired` string[]
    - `canaryBypassAllowed` boolean
    - `canaryBypassReason` string
    - `generatedAt` string
  - `safetyReport` object, required
    - `ok` boolean
    - `warnings` string[]
    - `blockers` string[]
    - `findings` object[]
      - `code` string, required
      - `action` 'review' | 'block', required
      - `message` string, required
      - `source` string, required
      - `path` string
      - `nodeId` string
      - `confidence` number
      - `evidence` string
    - `thresholds` object
      - `failureRate` number, required
      - `minimumAttempts` integer, required
      - `canaryFailureRate` number, required
      - `canaryRequiredAboveRecipients` integer, required
    - `canaryRequired` boolean
    - `canaryBypassAllowed` boolean
    - `checkedAt` string
  - `sampleMessages` object[], required
    - `leadId` string, uuid, required
    - `channel` string, required
    - `body` string, required
  - `approvedAt` string, nullable, required
  - `launchedAt` string, nullable, required
  - `pausedAt` string, nullable, required
  - `cancelledAt` string, nullable, required
  - `completedAt` string, nullable, required
  - `recipients` object[]
    - `id` string, uuid, required
    - `leadId` string, uuid, required
    - `status` 'pending' | 'processing' | 'enrolled' | 'sent' | 'skipped' | 'failed' | 'cancelled', required
    - `canary` boolean, required
    - `messageBody` string, nullable, required
    - `failureReason` string, nullable, required
    - `providerMessageId` string, nullable, required
    - `providerAcceptedAt` string, nullable, required
    - `sentAt` string, nullable, required
    - `createdAt` string, required
    - `updatedAt` string, required
  - `recipientsTruncated` boolean
  - `retryBlockedReason` 'provider_acceptance_unknown', nullable
  - `recipientCounts` object
    - `cancelled` integer
    - `enrolled` integer
    - `failed` integer
    - `pending` integer
    - `processing` integer
    - `sent` integer
    - `skipped` integer
  - `canaryRecipientCounts` object
    - `cancelled` integer
    - `enrolled` integer
    - `failed` integer
    - `pending` integer
    - `processing` integer
    - `sent` integer
    - `skipped` integer

## Other responses

- `400`: bad request
- `401`: unauthorized
- `404`: not found
- `429`: rate limited
- `500`: internal error
- `503`: service unavailable

---

[API](https://skmtc.dev/setluca/apis/luca-api.md) · [All operations](https://skmtc.dev/setluca/apis/luca-api/llms.txt) · [OpenAPI document](https://skmtc.dev/setluca/apis/luca-api/revisions/90a200e4100b?raw)
