# Read one resource from a frozen export

`GET /api/v1/data/snapshots/{snapshotId}/{resource}` - [human page](https://aicdapi.com/api-reference#readCivicSnapshotPage)

**Release status.** Limited availability

Charges normal request and burst allowances, not an additional export. Save each page before advancing. Cursor is bound to the resource and snapshot.

**Authentication.** Customer API key: `Authorization: Bearer aicd_...`. A browser session does not authenticate this endpoint. Required scope: `civic:export`.

### Parameters

| Field | Type | Required | Bounds | Description |
| --- | --- | --- | --- | --- |
| `path snapshotId` | string (uuid) | yes |  |  |
| `path resource` | one of 11 values | yes |  |  |
| `query cursor` | string | no | length 1..512 |  |
| `query limit` | integer | no | >= 1, default `100` |  |

### Example request

```bash
curl -X GET 'https://aicdapi.com/api/v1/data/snapshots/{snapshotId}/{resource}' \
  -H "Authorization: Bearer $AICD_API_KEY"
```

### Response 200

Frozen resource page.

| Field | Type | Required | Bounds | Description |
| --- | --- | --- | --- | --- |
| `data` | object | yes |  |  |
| `data.items` | object[] | yes |  |  |
| `meta` | object | yes |  |  |
| `meta.nextCursor` | any | yes |  |  |
| `meta.hasMore` | boolean | yes |  |  |

### Errors

| Status | `error.code` | Description |
| --- | --- | --- |
| **400** | `invalid_parameter` | Invalid parameter, duplicate query field or malformed JSON. |
| **401** | `unauthorized` | Missing, invalid, expired or revoked credential. |
| **403** | `billing_channel_unset`, `billing_entitlement_required`, `forbidden` | Customer lacks the required grant. |
| **404** | `not_found` | Snapshot does not exist, belongs to another customer, or expired. |
| **410** |  | Cursor is older than the retained replay floor; start a new snapshot. |
| **413** | `response_too_large` | Request or response exceeds its size cap; reduce the page limit. |
| **429** | `rate_limited` | A per-account request, burst or export allowance was exhausted, or the account-wide abuse ceiling was reached. The abuse ceiling is account-wide, is not charged against the paid quota, and is charged after the identity lookup and before a revoked, expired, unpaid, or scope-denied rejection is decided. |
| **500** | `internal_error` | Unexpected operation failure; the response contains no private database details. |
| **503** | `authentication_unavailable` | Authentication, limit store or feed state is unavailable. |
| **504** | `timeout` | Database statement or request deadline exceeded. |

### Behaviour

- **Pagination.** Opaque cursor pagination, bound to the snapshot id and the resource in the path.
- **Limits.** Counted against the minute and burst allowances on your account. The hourly export allowance is not consumed by this read.
- **Retry-After.** Sent on 429 only, as whole seconds.
- **Caching.** Customer responses must not be cached.
