---
title: List issues
description: List certificate issues for a certificate with search and pagination
method: GET
path: /api/v1/workspaces/{slug}/certificates/{id}/issues
group: Issues
scopes: certificates:read
---

# List issues

# List issues

Lists issues (recipients) for one certificate. Supports search and offset pagination.

## Authorization

```http
Authorization: Bearer vc_...
```

Requires `certificates:read` (or full access) and an active Pro seat.

## Path parameters

  
- `slug*` string — Workspace slug Example: `acme`.

  
- `id*` UUID — Certificate id Example: `550e8400-e29b-41d4-a716-446655440000`.

## Query parameters

  
- `search?` string — Filter by recipient name or email Example: `ada`.

  
- `status?` string — Filter by recipient status: `issued`, `expired`, `waiting_for_publish`, `ready_to_send`, `awaiting_form_response`, `awaiting_review`, or `changes_requested`. See [Recipient status](#recipient-status). Example: `issued`.

  
- `template_version?` integer — Only recipients issued against this template version. Omit or pass `0` for every version. Example: `2`.

  
- `limit?` integer — Page size (1–200). Defaults to `50`. Example: `50`.

  
- `offset?` integer — Number of items to skip. Defaults to `0`. Example: `0`.

## Recipient status

A recipient's status is derived from the issue, the certificate, and any unlock form, so it always reflects who has to act next.

| Status | Meaning |
| --- | --- |
| `issued` | The certificate is live and the recipient can view, download, and share it. |
| `expired` | The certificate's expiry has passed and it no longer verifies. |
| `waiting_for_publish` | Queued on a draft certificate. Publishing delivers everyone waiting. |
| `ready_to_send` | Pending on a live certificate, waiting on you to release it. |
| `awaiting_form_response` | The recipient has an unlock link and has not completed it yet. |
| `awaiting_review` | The recipient submitted their unlock form and it is waiting on your review. |
| `changes_requested` | Their unlock response was rejected and they need to resubmit. |

## Request

```bash
curl "https://api.verifycate.com/api/v1/workspaces/acme/certificates/550e8400-e29b-41d4-a716-446655440000/issues?limit=50&offset=0" \
  -H "Authorization: Bearer vc_your_api_key"
```

```javascript
const id = "550e8400-e29b-41d4-a716-446655440000";
const res = await fetch(
  `https://api.verifycate.com/api/v1/workspaces/acme/certificates/${id}/issues?limit=50&offset=0`,
  { headers: { Authorization: "Bearer vc_your_api_key" } },
);
const page = await res.json();
```

```go
url := "https://api.verifycate.com/api/v1/workspaces/acme/certificates/550e8400-e29b-41d4-a716-446655440000/issues?limit=50&offset=0"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Set("Authorization", "Bearer vc_your_api_key")
```

```python
import urllib.request

url = "https://api.verifycate.com/api/v1/workspaces/acme/certificates/550e8400-e29b-41d4-a716-446655440000/issues?limit=50&offset=0"
req = urllib.request.Request(url, headers={"Authorization": "Bearer vc_your_api_key"})
with urllib.request.urlopen(req) as res:
    print(res.read().decode())
```

## Response schema

- `items*` array — 
- `limit*` integer — 
- `offset*` integer — 
- `total*` integer — 

## Response

### 200

```json
{
  "items": [
    {
      "id": "9b2c1d4e-5f67-4890-a123-456789abcdef",
      "certificate_id": "550e8400-e29b-41d4-a716-446655440000",
      "public_id": "vc_pub_ada01",
      "recipient_email": "ada@example.com",
      "recipient_name": "Ada Lovelace",
      "attributes": { "course": "Mathematics" },
      "status": "pending",
      "issued_at": null,
      "expires_at": null,
      "template_version": null,
      "created_at": "2026-09-03T08:10:00Z",
      "updated_at": "2026-09-03T08:10:00Z"
    }
  ],
  "total": 1,
  "limit": 50,
  "offset": 0
}
```
