# Call Lifecycle

> The states a masked call moves through from initiation to termination, and how to poll for terminal states.

Source: https://edesy.in/docs/number-masking/getting-started/call-lifecycle

A call moves through these states from initiation to termination. Poll the [call status endpoint](https://edesy.in/docs/number-masking/api-reference/get-call-status) until you see a terminal state, or subscribe to [webhooks](https://edesy.in/docs/number-masking/api-reference/webhooks) to be notified on each transition.

## Happy path

```
initiated → ringing → answered → in-progress → completed
```

| Status | Meaning |
|--------|---------|
| `initiated` | Call request accepted; dialing Party A. |
| `ringing` | Party A's phone is ringing. |
| `answered` | Party A picked up; bridging Party B. |
| `in-progress` | Both parties connected and talking. |
| `completed` | Call ended normally. Recording available shortly. |

## Terminal failure states

| Status | Meaning |
|--------|---------|
| `failed` | Carrier or system error. See `hangup_cause` for details. |
| `no-answer` | Party A did not pick up within the ring timeout. |

## Polling

Poll `GET /v1/masking/calls/:call_sid` every **2–3 seconds**. Stop polling once `status` is one of the three terminal values: `completed`, `failed`, or `no-answer`.

For a runnable polling loop, see the [Complete Example](https://edesy.in/docs/number-masking/getting-started/complete-example). To avoid polling entirely, use [Webhooks](https://edesy.in/docs/number-masking/api-reference/webhooks).
