# Retention and 410

> How long Noryo keeps what: result content 90 days, idempotency 24 hours, raw descriptor never. What a 410 says and what survives the purge.

Noryo Merchant API is not an archive. It keeps the content of a result long enough to read it back, then purges it.

## Retention periods

| Data | Retention |
|---|---|
| Content of a result (`merchant`, readable status) | 90 days |
| Idempotency memory (response bound to an `Idempotency-Key`) | 24 hours |
| Raw descriptor (`descriptor`) | Not retained |
| Accounting record | Kept for its own legal duration |

**The raw descriptor is not retained.** Retention is 0 days: no column of the module can store it, and it never appears in a log. Only a fingerprint of its canonical form is kept, to recognise a transaction already seen.

## The 410

After 90 days, a read returns:

```json
{
  "type": "https://developer.noryo.app/errors/result_content_expired",
  "title": "Result content expired",
  "status": 410,
  "code": "result_content_expired",
  "detail": "The result content was purged and is no longer available.",
  "request_id": "req_…",
  "enrichment_id": "enr_ffe80956-cc3e-4e1f-b4b6-724ad231fbb7"
}
```

The body repeats the `enrichment_id` concerned. It does not say which retention class applied: that is internal.

A `410` is not a `404`: it proves the result existed and was purged. An identifier that never existed, or that belongs to another workspace, returns `404`.

A `not_found` result has no content to purge: its read keeps returning `200` with `merchant: null`, never `410`, and so does sending its transaction again.

## The 410 on a create call

Sending again with `POST` a transaction already known (same `external_transaction_id`, same input) whose current content has been purged also returns `410 result_content_expired`. This refusal is not billed. To get a readable result again, refresh the transaction: see [Refresh](https://developer.noryo.app/en-GB/merchant/refresh).

## What survives

The identity, the ledger line, the units, the price and the accounting timestamps all survive: you can still prove what you bought and when. Only the content is gone.

| Item | After the purge |
|---|---|
| `enrichment_id` | Still recognised: `410` |
| Transaction (`external_transaction_id`) | Still recognised: deduplication and refresh possible |
| Billed usage | Unchanged |
| Content | Purged |

## What is up to you

**Store what you need on your side.** If your product shows a merchant's name on last year's transaction, record `merchant` when you receive it, together with the `enrichment_id` and the `request_id`. Reading the API again does not replace your own storage.

| Keep | Why |
|---|---|
| `merchant` (name, category, logo, location) | The content expires after 90 days |
| `enrichment.status` and `confidence` | To know later what the result was worth |
| `enrichment_id` | To read or refresh |
| `Noryo-Request-Id` | To find the attempt with support |

---

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