> ## Documentation Index
> Fetch the complete documentation index at: https://docs.telzino.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Retry Policies

> Redial outbound calls that were not answered, on a cadence you choose, with caps that keep you compliant

By default an outbound call that is not answered is simply over: the result reaches your webhook and nothing dials again. A **retry policy** changes that. It says, per outcome, how long to wait and how many times to try, and it can cap how often any one number is called.

Retries are opt-in: an agent with no policy, placing a call with no policy, never redials.

## Creating a policy

Policies belong to the account and are managed at **Account Settings → Retry Policies** in the Dashboard, or through the [Retry Policies API](/api-reference/retry-policies/list-create). Each policy has a name (unique within the account) and:

**Rules** — one per outcome, for `no_answer`, `busy`, `voicemail` (the call reached a voicemail box, with or without leaving a message) and `failed`. An outcome with no rule is never retried; a call that reached a person is never retried either.

| Field | Range | Meaning |
| - | - | - |
| **Wait** (`delay_seconds`) | 60 s to 7 days | How long after the attempt to dial again |
| **Max attempts** (`max_attempts`) | 1 to 10 | Total attempts, counting the first call |
| **Spacing** (`backoff`) | `linear` or `exponential` | *Same wait each time*, or *Double each time*: with `exponential` the second wait is twice the first, the third four times, and so on, capped at 7 days |

**Contact limits** (`contact_policy`) — hard caps per destination number, enforced across the whole account: **Max calls per day** (`max_attempts_per_day`, up to 50), **Max calls per week** (`max_attempts_per_week`, up to 200), and a **Minimum gap** between attempts (`min_seconds_between_attempts`). A call that would break a cap is refused when it is triggered, with `409 policy_violation`, and a retry that would break one is cancelled instead of dialled.

**When attempts run out** (`on_exhausted`) — `end` (*Stop quietly*), `webhook` (*Call a webhook*), or `notify_email` (*Send an email*), with the URL or address in `on_exhausted_target`. See [escalation](#when-attempts-run-out).

**Reschedule out-of-window calls** (`reschedule_out_of_window`) — when the agent has [calling hours](/functions/outbound-compliance#calling-hours) and a call is triggered outside them, queue it for the next window instead of refusing it.

## Assigning a policy

* **Per agent:** choose a **Default retry policy** in the outbound agent's settings (Dashboard or Connect App), or set `defaultRetryPolicyId` through the Agents API. Every call that agent places follows it.
* **Per call:** pass `retry_policy_id` when you [trigger the call](/api-reference/outbound-calls/create). It overrides the agent's default for that call only.

The policy is copied onto the call when it is created. Editing or deleting a policy later changes future calls, never a chain that is already in flight.

## How a retry chain works

Each retry is a **new outbound call** that inherits everything that defined the original — number, agent, context, greeting, voicemail message, AMD and IVR settings, callback URL — and keeps its own transcript, recording and detection result.

* The retry is created with status `scheduled` and a `next_attempt_at`; it dials when that time arrives.
* `attempt_number` counts up from 1. `parent_call_id` points at the attempt before it and `root_call_id` at the first call of the chain, so you can group a chain in your own system. Your `metadata` is echoed on every attempt, with a reserved `_telzino_retry` key carrying the same two values.
* Each attempt fires your result webhook on its own.
* Reports → **Outbound Calls** shows the attempt number and, for a scheduled retry, when it will dial, with a **Cancel** button.

## Stopping retries

* **Opt-out.** If the callee asks not to be called again — the agent is given a tool for exactly this on outbound calls, and the transcript is also checked for clear phrases such as *"stop calling me"* or *"take me off your list"* — the call is marked `opt_out_detected`, every queued retry to that number is cancelled, and the result webhook reports it. Add the number to the [suppression list](/functions/outbound-compliance#suppression-list) to stop future campaigns as well; opting out does not do that on its own.
* **Cancel one scheduled retry:** the **Cancel** button in the report, or `DELETE /v1/agents/{agentId}/outbound-calls/{callId}` on a call whose status is `scheduled` ([reference](/api-reference/outbound-calls/delete)).
* **Cancel every scheduled retry to a number:** [`DELETE /v1/outbound-calls/queued?to_number=…`](/api-reference/outbound-calls/cancel-queued), for do-not-call handling when all you know is the number.

A retry that has already started dialling is not affected by any of these.

## When attempts run out

With `on_exhausted: webhook`, Telzino POSTs one event to your URL when the last attempt of a chain ends without reaching a person:

```json theme={null}
{
  "event": "retries_exhausted",
  "outbound_call_id": "4c0e7f7e-…",
  "root_call_id": "0fc6daf8-…",
  "agent_id": "aadcdc82-…",
  "to_number": "+18135551234",
  "attempts": 3,
  "final_status": "no_answer",
  "environment": "production"
}
```

With `notify_email`, an email with the same facts is sent to the address you gave, from the account's own configured email server. Delivery is best-effort and is not retried.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.