# Retries, Test Calls and Run Again

> How Edesy voice campaigns retry calls the network refuses (1, 3, 10, 20 and 30 minutes, not counted against retry_attempts), auto pause and resume, the test-call endpoint, playing your own audio, and POST /v1/campaigns/{id}/duplicate to run a campaign again.

Source: https://edesy.in/docs/voice-api/campaigns/retries-test-call-and-run-again

A campaign has two kinds of retry. **Your retry attempts** (`retry_attempts`, `retry_delay_sec`) cover calls that rang but were not answered, or were busy. **Network retries** are automatic: when the network refuses a call before it can ring, Edesy calls the contact again later without using one of your attempts. This page covers both, the auto pause that protects your list during an outage, the test call, playing your own audio file, and running a finished campaign again.

## Network retries

| Item | Behaviour |
|---|---|
| Trigger | The network refuses the call within seconds, before it rings, or answers that it is over capacity |
| Schedule | About 1, 3, 10, 20 and 30 minutes after each refusal, with a small random spread |
| Limit | 5 network retries per contact, then the contact ends as `failed` |
| Your `retry_attempts` | Not used. A refused call gives the attempt back |
| Contact status while waiting | `retrying`, with the next retry time in the contact's `error` text |
| Cost | Free. A refused call never connects, so nothing is billed |

A normal outcome such as no answer, busy or a rejected call is not a network failure. Those use your `retry_attempts`, spaced `retry_delay_sec` apart.

## Auto pause and auto resume

If 10 calls in a row are refused, the campaign stops dialing so it does not fail the whole list:

1. If the campaign has a working [backup caller ID](https://edesy.in/docs/voice-api/campaigns/amd-fallback-caller-id-and-dnc), calls switch to it and the campaign keeps running.
2. Otherwise the campaign pauses with a network pause reason.
3. After 5 minutes it resumes by itself and tries again. Contacts keep their network-retry count, so a network that is still down ends them as `failed` instead of retrying forever.

Other pauses behave differently:

| Pause reason | Resumes automatically? |
|---|---|
| Network refusing calls | Yes, after 5 minutes |
| Calling window closed | Yes, when the window opens |
| Wallet balance ran out | No. Top up, then `POST /v1/campaigns/{id}/resume` |
| You paused it | No. `POST /v1/campaigns/{id}/resume` |

## Test call

```bash
curl -X POST https://voice-api.edesy.in/v1/campaigns/{id}/test-call \
  -H "Authorization: Bearer $EDESY_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "phone_number": "+9198XXXXXXXX" }'
```

- One call from the campaign's caller ID that plays exactly what a contact will hear. In the portal this is the **Call me** button on the review step.
- It does not touch the campaign's contacts, results or concurrency.
- It is billed like any other outbound call.
- Limits: one test call per campaign at a time (a double click is ignored), and 20 test calls an hour per workspace. Over the limit returns `429`.
- Agent-dialer campaigns have no message to play, so they have no test call. An empty wallet returns `402`.

## Play your own audio file

Set `audio_type: "audio"` and upload a WAV or MP3 with `POST /v1/campaigns/{id}/audio` (see [Create a Campaign](https://edesy.in/docs/voice-api/campaigns/create-a-campaign)). A recording has **no text-to-speech charge**: you pay only the Rs 0.70 per minute campaign rate.

For a single call rather than a campaign, `POST /v1/calls` accepts `audio_url`, an `https://` link to an MP3 or WAV file. The file is played when the callee answers, then the call ends, with no text-to-speech charge. `audio_url` must be `https://`; plain `http://` links are rejected. It cannot be combined with `text`, `url`, `voiceml`, `stream_url` or `application_id`.

```bash
curl -X POST https://voice-api.edesy.in/v1/calls \
  -H "Authorization: Bearer $EDESY_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "from": "+9180XXXXXXXX", "to": "+9198XXXXXXXX", "audio_url": "https://cdn.example.com/notice.mp3" }'
```

## Run again

```bash
curl -X POST https://voice-api.edesy.in/v1/campaigns/{id}/duplicate \
  -H "Authorization: Bearer $EDESY_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "audience": "unreached" }'
```

| `audience` | Contacts in the copy |
|---|---|
| `all` (default) | Every contact again |
| `unreached` | Only contacts not reached last time: unanswered, busy, failed or never dialed |
| `none` | No contacts. Upload a new list to the copy |

- The copy is a new campaign in `created` status, named with a `(rerun)` suffix. It keeps the settings and the message, so you don't upload the audio again. Start it with `POST /v1/campaigns/{id}/start`.
- Contacts are screened against your DNC list again, so numbers added since the first run are suppressed.
- The original keeps its own results and export.
- The backup caller ID is carried over only if it is still in your workspace. If the main caller ID has been released, the request fails with `400`.
- Payment-reminder campaigns cannot be run again yet.

## FAQ

### Do network retries use up my retry attempts?
No. Network retries are counted separately, up to 5 per contact. `retry_attempts` is only for unanswered and busy calls.

### Why did my campaign pause by itself?
10 calls in a row were refused and there was no working backup caller ID. It resumes after 5 minutes.

### Is a refused call billed?
No. Only answered calls are billed.

### Does the test call change my campaign's numbers?
No. It is not a contact, so it never appears in the campaign's stats or results CSV.

### Can I run a campaign again with a different message?
Run again keeps the message. To change it, create a new campaign.
