> ## 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.

# List / Create Retry Policies

> Account-level rulebooks for redialling unanswered outbound calls

A retry policy says, per outcome, how long to wait and how many times to redial, and can cap how often any one number is called. Assign one to an agent as `defaultRetryPolicyId`, or pass its `id` as `retry_policy_id` when [triggering a call](/api-reference/outbound-calls/create). See [Retry Policies](/functions/retry-policies) for how a chain of attempts behaves.

`GET /v1/retry-policies` returns every policy on the account. `POST` creates one.

## Request Body (POST)

<ParamField body="name" type="string" required>
  Unique within the account. Up to 100 characters.
</ParamField>

<ParamField body="rules" type="object">
  Per-outcome rules, keyed `no_answer`, `busy`, `voicemail` and `failed`. An omitted outcome is never retried, and `completed` can never be retried. Unknown keys are rejected.

  Each rule:

  | Field | Type | Range | Description |
  | - | - | - | - |
  | `delay_seconds` | integer | 60 – 604800 | Wait before the next attempt |
  | `max_attempts` | integer | 1 – 10 | Total attempts, counting the first call |
  | `backoff` | string | `linear` (default) or `exponential` | `exponential` doubles the wait on every attempt, capped at 7 days |
</ParamField>

<ParamField body="contact_policy" type="object | null">
  Hard caps per destination number, enforced across the account: `max_attempts_per_day` (1–50), `max_attempts_per_week` (1–200), `min_seconds_between_attempts` (0–604800). A trigger that would break one is refused with `409 policy_violation`; a retry that would is cancelled.
</ParamField>

<ParamField body="on_exhausted" type="string" default="end">
  What happens when a chain uses up its attempts without reaching a person: `end`, `webhook` (POST a `retries_exhausted` event), or `notify_email`.
</ParamField>

<ParamField body="on_exhausted_target" type="string | null">
  Required unless `on_exhausted` is `end`: an `https://` URL for `webhook`, an email address for `notify_email`.
</ParamField>

<ParamField body="reschedule_out_of_window" type="boolean" default="false">
  When an agent with [calling hours](/functions/outbound-compliance#calling-hours) is asked to call outside them, queue the call for the next window (`202`, status `scheduled`) instead of refusing it with `409 out_of_window`.
</ParamField>

## Response

Each policy carries `id`, `name`, `rules`, `contact_policy`, `on_exhausted`, `on_exhausted_target`, `reschedule_out_of_window`, `created_at` and `updated_at`.

<RequestExample>
  ```bash cURL (create) theme={null}
  curl -X POST "https://api.telzino.com/v1/retry-policies" \
    -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
    -H "Content-Type: application/json" \
    -d '{
      "name": "Standard",
      "rules": {
        "no_answer": { "delay_seconds": 10800, "max_attempts": 3, "backoff": "linear" },
        "busy":      { "delay_seconds": 1200,  "max_attempts": 4, "backoff": "exponential" },
        "voicemail": { "delay_seconds": 86400, "max_attempts": 2 }
      },
      "contact_policy": { "max_attempts_per_day": 3, "max_attempts_per_week": 7, "min_seconds_between_attempts": 1800 },
      "on_exhausted": "webhook",
      "on_exhausted_target": "https://your-system.com/telzino/retries-exhausted"
    }'
  ```

  ```bash cURL (list) theme={null}
  curl "https://api.telzino.com/v1/retry-policies" \
    -H "Authorization: Bearer YOUR_ACCESS_TOKEN"
  ```
</RequestExample>

<ResponseExample>
  ```json 201 theme={null}
  {
    "id": "7f1c2a9e-5d3b-4c8e-9a1f-2b3c4d5e6f70",
    "name": "Standard",
    "rules": {
      "no_answer": { "delay_seconds": 10800, "max_attempts": 3, "backoff": "linear" },
      "busy": { "delay_seconds": 1200, "max_attempts": 4, "backoff": "exponential" },
      "voicemail": { "delay_seconds": 86400, "max_attempts": 2 }
    },
    "contact_policy": { "max_attempts_per_day": 3, "max_attempts_per_week": 7, "min_seconds_between_attempts": 1800 },
    "on_exhausted": "webhook",
    "on_exhausted_target": "https://your-system.com/telzino/retries-exhausted",
    "reschedule_out_of_window": false,
    "created_at": "2026-09-01T12:00:00.000Z",
    "updated_at": "2026-09-01T12:00:00.000Z"
  }
  ```

  ```json 409 theme={null}
  {
    "error": "conflict",
    "error_description": "A retry policy named \"Standard\" already exists"
  }
  ```
</ResponseExample>

| Code | Meaning |
| - | - |
| `400` | Invalid request (a rule out of range, a missing `on_exhausted_target`, an unknown key) |
| `403` | `insufficient_scope` — policies belong to the account, so an API key [limited to one reseller or organization](/api-reference/authentication#scoped-api-keys) can read them but not create them |
| `409` | A policy with that name already exists |


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