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

# POST /v1/capsules/{id}/resume — Resume a paused capsule

> POST /v1/capsules/{id}/resume — Restore a paused capsule from its snapshot. Boots a fresh VM and restores state. Returns the updated capsule.

Use this endpoint to restore a paused capsule from its snapshot. Wrenn boots a fresh Firecracker VM, loads the saved filesystem, and uses userfaultfd (UFFD) for lazy memory page loading so the capsule is ready to accept commands quickly. The capsule resumes exactly where it left off — running processes, in-memory state, and all.

## Endpoint

```http theme={null}
POST https://app.wrenn.dev/api/v1/capsules/{id}/resume
```

## Authentication

Pass your API key in the `X-API-Key` header.

```http theme={null}
X-API-Key: wrn_your_key
```

## Path parameters

<ParamField path="id" type="string" required>
  The ID of the capsule to resume (e.g., `cl-abc123`). The capsule must be in `paused` status.
</ParamField>

## Response

Returns `200 OK` with the updated capsule object. The `status` field will be `"running"` once the VM has booted and the internal agent is ready.

<ResponseField name="id" type="string" required>
  Unique capsule ID, prefixed with `cl-`.
</ResponseField>

<ResponseField name="status" type="string" required>
  Will be `"running"` after the capsule has fully resumed.
</ResponseField>

<ResponseField name="template" type="string" required>
  Name of the template the capsule was created from.
</ResponseField>

<ResponseField name="vcpus" type="integer" required>
  Number of virtual CPUs allocated.
</ResponseField>

<ResponseField name="memory_mb" type="integer" required>
  Memory allocated, in MiB.
</ResponseField>

<ResponseField name="timeout_sec" type="integer" required>
  Inactivity TTL in seconds.
</ResponseField>

<ResponseField name="created_at" type="string" required>
  ISO 8601 timestamp of when the capsule was originally created.
</ResponseField>

<ResponseField name="last_updated" type="string" required>
  ISO 8601 timestamp of when the capsule last changed status.
</ResponseField>

<ResponseField name="started_at" type="string">
  ISO 8601 timestamp of when the capsule most recently reached `running` status.
</ResponseField>

### Example response

```json theme={null}
{
  "id": "cl-abc123",
  "status": "running",
  "template": "base-python",
  "vcpus": 2,
  "memory_mb": 1024,
  "timeout_sec": 300,
  "created_at": "2024-11-01T10:00:00Z",
  "started_at": "2024-11-01T10:10:02Z",
  "last_active_at": "2024-11-01T10:10:02Z",
  "last_updated": "2024-11-01T10:10:02Z"
}
```

## curl

```bash theme={null}
curl --request POST \
  --url https://app.wrenn.dev/api/v1/capsules/cl-abc123/resume \
  --header 'X-API-Key: wrn_your_key'
```

## Python SDK

The SDK handles resume transparently when you call `Capsule.connect()` on a paused capsule:

```python theme={null}
from wrenn import Capsule

# connect() automatically resumes a paused capsule
capsule = Capsule.connect("cl-abc123")
print(capsule.status)  # "running"
```

You can also resume explicitly on an existing instance:

```python theme={null}
capsule = Capsule.connect("cl-abc123")
capsule.pause()   # pause it first
capsule.resume()  # resume from the paused state
print(capsule.status)  # "running"
```

## Error responses

| Status             | Description                                                                 |
| ------------------ | --------------------------------------------------------------------------- |
| `401 Unauthorized` | Missing or invalid `X-API-Key`.                                             |
| `404 Not Found`    | No capsule with the given ID exists in your team.                           |
| `409 Conflict`     | The capsule is not in `paused` status. Only paused capsules can be resumed. |
