Sandbox (zz)
A synthetic jurisdiction for exercising every Kausate capability and testing webhook receivers against deterministic, free mock data
Overview
The Kausate Sandbox is a synthetic jurisdiction — code zz — that lets
you build and test against Kausate during development without touching a real
registry. It implements every Kausate capability against deterministic,
in‑process mock data, and its monitoring fires a webhook on every check so
you can test your webhook receiver on demand instead of waiting for a
real‑world registry change.
- No credentials, no setup — nothing to configure, no IP allow‑listing.
- Free — every sandbox SKU is zero‑credit; sandbox calls never consume credits or money, regardless of your plan.
- Deterministic — the same
kausateIdreturns the same data every time, so your assertions are stable (the one exception is the living companies described below, which evolve on purpose). - Opt‑in — the sandbox is enabled per organization. Ask us to turn it on for your org; it won't appear in your capability listing until then.
The sandbox is not a real registry. The data is fabricated and carries no accuracy guarantees — use it only to develop and test your integration.
The dataset
All sandbox companies use a kausateId of the form co_zz_…. You can discover
them with autocomplete or live search just like any other jurisdiction:
curl -H "X-API-Key: $API_KEY" \
"$BASE_URL/v2/companies/search/autocomplete?query=Sandbox&jurisdictionCode=zz"The sandbox is pre‑indexed with ~10,000 companies across three bands:
| Band | Sandbox number | What it's for |
|---|---|---|
| Roster | 000001–000005 | A handful of curated, rich edge cases (see below) |
| Bulk | 000006–010005 | ~10,000 deterministic companies for browsing, search, and pagination |
| Living | 700001–700050 | Companies whose data evolves over time — use these to drive the change‑detection monitor |
The five roster companies cover the shapes you'll want to test against:
| Company | Edge case |
|---|---|
| Sandbox Industries GmbH | a simple company — two individual shareholders, financials, documents |
| Sandbox Holding AG | a holding company |
| Sandbox Subsidiary Ltd | owned 75% by the holding + 25% by an individual → a multi‑level shareholder graph and UBO chain |
| Jane Doe Trading | a sole proprietorship — no shareholder block |
| Sandbox Defunct GmbH | an inactive / under‑external‑control company |
Every company in these bands is generated deterministically and always returns
the same data, so you can hard‑code the kausateIds you discover in your tests
without pre‑creating anything. The bands are the whole dataset — a co_zz_… id
from outside them isn't a sandbox company and won't resolve.
Exercising the capabilities
Every capability works against a sandbox company exactly as it does for a real
jurisdiction. Grab a kausateId from autocomplete, then call any endpoint —
for example a synchronous company report:
curl -H "X-API-Key: $API_KEY" -H "Kausate-Version: 2026-05-01" \
-X POST "$BASE_URL/v2/companies/report/sync" \
-d '{"kausateId": "co_zz_…"}'The same id works for search/live, finance, shareholder-graph, ubo,
documents/list + documents, and prefill. Use the multi‑level subsidiary
(Sandbox Subsidiary Ltd) to see a non‑trivial shareholder graph and UBO
chain.
Monitoring → a webhook on every check
The sandbox ships two monitoring sources so you can test your webhook receiver deterministically. Discover them for any sandbox company:
curl -H "X-API-Key: $API_KEY" \
"$BASE_URL/v2/monitors/sources?kausateId=co_zz_…"| Source | Behavior |
|---|---|
zz_sandbox.always_changing | Fires one generic change event every tick, for any sandbox company. Use it when you just want a steady webhook stream to test signing headers, retries, and payload shape. |
zz_sandbox.simulated | For a living company (700001–700050), each tick changes one real field, so you receive a different, realistic event_code in turn — NAME_CHANGED, COMPANY_STATUS_CHANGED, REGISTERED_ADDRESS_CHANGED, LEGAL_FORM_CHANGED, ACTIVITIES_CHANGED, and director changes. |
Then create a monitor and point it at your endpoint (or a webhook.site URL
while developing). scheduleCron is optional and defaults to monthly; set it
explicitly to control how fast the sandbox delivers:
curl -H "X-API-Key: $API_KEY" -H "Kausate-Version: 2026-05-01" \
-X POST "$BASE_URL/v2/monitors" \
-d '{
"kausateId": "co_zz_…", // a living company for varied events
"sources": ["zz_sandbox.simulated"],
"scheduleCron": "*/15 * * * *", // every 15 min ≈ 96 events/day
"webhookUrl": "https://your-server.com/webhooks/kausate"
}'The first tick records a baseline; every tick after that delivers a
monitor.change_detected webhook with the changed field in before / after
and the matching event_code. This lets you exercise your receiver's payload
parsing, signature verification, and retry handling without waiting for a real
registry change. See Monitoring & Webhooks for the
full webhook payload shape and delivery semantics.
Sandbox sources fire on every tick, so the cron you choose is the event rate.
A one‑minute cron (* * * * *) delivers roughly 1,440 events per day and
keeps retrying against an unreachable endpoint — pick the slowest cadence that
still exercises your receiver, and delete the monitor when you're done
testing (DELETE /v2/monitors/{id}).
Last updated on