E-Invoice API
Guides

Sandbox and live

One base URL, two environments, selected by your key prefix.

There is one base URL:

https://api.e-invoice.smartlist.uz/api/v1.8.2

No sandbox subdomain, no ?mode=test, no environment header. Which environment you reach is decided entirely by the key you send:

Key prefixReachesDocuments are
of_test_Sandboxfixtures — realistic shapes, not really processed
of_live_Liveprocessed by the real Mustang service

Switching environments means changing one string in your config. There is no second URL to keep in sync, and no way to point at the live service by accident while still holding a test key.

Why it is safe to decide this from the key

The prefix is only how the request is routed. It is not what makes the separation trustworthy — a prefix is just text, and text can be forged.

What makes it hold is that the routing decision is checked again, further in. The gateway independently derives the environment from the key, compares it against the environment recorded for that key when it was issued, and compares both against which service the request was actually routed to. If any of the three disagree the request is rejected with ENV_MISMATCH and never reaches the upstream.

So a forged of_live_ prefix does not get you into the live service — it gets you a 401, because the key behind it is not a live key. And a genuine test key that somehow arrives at the live service is rejected there too, rather than being quietly processed.

What differs in the sandbox

  • Responses are fixtures. Correctly shaped and correctly typed, but not the result of really converting or validating your document. Do not assert on the specific values.
  • Lower rate limit. The sandbox is a public surface — this site's playground calls it — so it is capped harder than a live key.
  • Separate quota. Sandbox calls do not consume your production allowance.

What is identical

Paths, request bodies, content types, status codes, error shapes, headers. Anything your integration depends on structurally behaves the same in both, so a request that works in the sandbox works live.

The playground on every endpoint page sends real requests to the real URL above. Paste an of_test_ key into it and you are exercising the exact path your production code will take, minus the live processing.

On this page