# Read an enrichment

> GET /merchant/v1/enrichments/{enrichment_id}: a free read of a past result, what it returns, who can make it, and when it returns 404 or 410.

`GET /merchant/v1/enrichments/{enrichment_id}` returns the stored result of a past enrichment. **Reading is free and never bills.** It requires the `enrich:read` scope.

## Example

```bash
curl -sS "https://api.noryo.app/merchant/v1/enrichments/enr_ffe80956-cc3e-4e1f-b4b6-724ad231fbb7" \
  -H "Authorization: Bearer $NORYO_API_KEY"
```

```json
{
  "enrichment_id": "enr_ffe80956-cc3e-4e1f-b4b6-724ad231fbb7",
  "merchant": {
    "name": "McDonald's",
    "category": "alimentation.restaurant",
    "location": { "city": "PARIS", "postal_code": "75018" },
    "logo_url": "https://www.mcdonalds.fr/apple-touch-icon.png",
    "confidence": 0.96
  },
  "enrichment": { "status": "resolved", "reason": null, "environment": "sandbox", "source": "noryo", "customized": false },
  "retrieval": { "billable": false, "units": 0 },
  "original": { "billable": false, "units": 1 }
}
```

## Two objects for two questions

| Object | Question | Value |
|---|---|---|
| `retrieval` | What does **this read** cost? | Always `{ "billable": false, "units": 0 }` |
| `original` | What did the enrichment cost when it happened? | `billable` and `units` of the original call |

The read carries no `usage` object: these two objects take its place. `merchant` and `enrichment` have the same shape as on creation. See [Enrichment](https://developer.noryo.app/en-GB/merchant/models/enrichment).

## What reading an identifier returns

Each `enrichment_id` designates **its own** result, frozen. After a refresh, the old identifier still returns the old result and the new identifier returns the new one: the read does not follow the transaction's "current result". To know the latest result, keep the identifier returned by the refresh (body or `Location` header). See [Lifecycle](https://developer.noryo.app/en-GB/merchant/enrichments/lifecycle).

## Who can read

Any API key with the `enrich:read` scope, in the **same workspace** and the **same environment** as the key that created the enrichment. The original key no longer needs to exist.

## When the read fails

| Status | Code | When |
|---|---|---|
| `404` | [`enrichment_not_found`](https://developer.noryo.app/en-GB/errors/enrichment_not_found) | Unknown or malformed identifier, from another workspace or another environment. The cases are deliberately indistinguishable. |
| `410` | [`result_content_expired`](https://developer.noryo.app/en-GB/errors/result_content_expired) | The content has passed its 90-day retention. The body repeats the `enrichment_id`. See [Retention and 410](https://developer.noryo.app/en-GB/merchant/retention). |
| `403` | [`insufficient_scope`](https://developer.noryo.app/en-GB/errors/insufficient_scope) | The key lacks `enrich:read` |
| `401` | [`invalid_api_key`](https://developer.noryo.app/en-GB/errors/invalid_api_key) | Key missing, unknown or revoked |
| `429` | [`rate_limited`](https://developer.noryo.app/en-GB/errors/rate_limited) | Rate-limit bucket empty |

```json
{
  "type": "https://developer.noryo.app/errors/enrichment_not_found",
  "title": "Enrichment not found",
  "status": 404,
  "code": "enrichment_not_found",
  "detail": "No enrichment matches this identifier in this workspace.",
  "request_id": "req_…"
}
```

Nothing reveals that an `enr_` exists elsewhere: a `404` never says "forbidden".

## Rate

A read consumes a rate-limit token, like a create call. A successful `GET` response carries the `Noryo-RateLimit-*` headers, like a successful `POST`. See [Rate limits](https://developer.noryo.app/en-GB/merchant/rate-limits).

> **Note** A read is not an archive. The content disappears after 90 days: store what you need on your side.

---

Canonical page: https://developer.noryo.app/en-GB/merchant/enrichments/read
