# Environments

> Sandbox and Production share a URL and a contract; the key decides the environment. What is isolated between the two, and how to check it in a response.

Noryo Merchant API has two environments, `sandbox` and `production`. They share the same base URL and the same API surface: there is no Sandbox host. **The key decides.**

| Key prefix | Environment |
|---|---|
| `nry_mer_sbx_` | `sandbox` |
| `nry_mer_live_` | `production` |

## The prefix declares, the server confirms

The prefix is a declaration, not an authority. The server finds the registered key, reads its environment, and compares it with the prefix presented. A Sandbox key presented with the `nry_mer_live_` prefix (or the other way round) is refused with `401 invalid_api_key`, with no silent correction. On Noryo's side, a key cannot be registered with a prefix that contradicts its environment.

## Checking the environment in a response

Every result repeats the environment that produced it:

```json
"enrichment": { "status": "resolved", "environment": "sandbox", "…": "…" }
```

If your Production code receives `"environment": "sandbox"`, it is using the wrong key.

## What is isolated

Everything the API memorises is scoped to a workspace **and** an environment.

| Item | Isolation |
|---|---|
| Results | An `enrichment_id` can only be read with a key of the same workspace and the same environment; otherwise `404 enrichment_not_found`, indistinguishable from an unknown identifier |
| `Idempotency-Key` | The same idempotency key is independent in Sandbox and in Production |
| `external_transaction_id` | Economic deduplication is separate per environment: the same identifier can exist in both |
| Rate | One token bucket per key; a Sandbox key and a Production key never share a bucket |
| Allowance | The 2,000-unit allowance only exists in Sandbox |
| Billing | A Sandbox call can never bill a Production account |

## What does not differ

Both environments use the same resolution engine, the same resolution policy, the same validation, idempotency and retention rules, and the same error codes. An integration that is correct in Sandbox behaves the same way in Production; only the key, billing and rate limits change. See [Sandbox](https://developer.noryo.app/en-GB/merchant/sandbox).

## Access

| | Sandbox | Production |
|---|---|---|
| Getting the key | [API keys](https://platform.noryo.app/keys) page of Platform | Only possible once the Production application is approved; Platform does not create Production keys |
| Specific refusals | `402 sandbox_quota_exhausted` | `403 production_not_enabled`, `402 no_active_subscription` |

`503 pricing_not_activated` is not specific to either environment: both can return it. See [Going live](https://developer.noryo.app/en-GB/merchant/going-live).

> **Note** Keep one configuration entry per environment (key and base URL) rather than a switch in your code. The base URL is currently the same for both, but the host is not part of the contract.

---

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