Sandbox
This content is not available in your language yet.
The sandbox is free, needs no card, has sandbox-level rate limits and is
never billed: every metered operation is recorded with billable: false.
It exists so that an integration can be built and certified end to end before
a live key is issued - and most teams keep running their CI against it after
going live.
sk_test_ keys are issued in the client portal. In a development environment
scripts/publicapi_sandbox_seed.py prints the deployment’s demo key (derived
from the deployment secret, so every deployment has its own); the
quickstart uses the one this site was verified with.
The demo key belongs to the account that owns the shared parcels - see
shared below for what that changes.
The 20 shared parcels
Section titled “The 20 shared parcels”All are real Lithuanian field boundaries from public LPIS data, chosen without any link to an owner or a holding. Each carries five years of Sentinel-1, Sentinel-2 and (where large enough) Sentinel-3 history, so every endpoint answers on the first call.
external_ref |
Crop / land use | Area | Scenario | Use it to see |
|---|---|---|---|---|
SBX-LODGING-1 |
winter wheat, arable | 21.6 ha | lodging | a lodging event (confidence 0.80) in GET .../sar/events for the window 2025-06-29 to 2025-07-05; damage assess for 2025-07-04 / storm returns damage_pct: 85.0 (CI 50-85) at confidence 0.405 - damage beyond doubt, direction_not_confirmed, no certificate (billed on a live key, not certified) |
SBX-LODGING-2 |
winter wheat, arable | 18.4 ha | lodging | a second lodging case with a different orbit geometry |
SBX-LODGING-3 |
winter rapeseed, arable | 28.1 ha | lodging | lodging on rapeseed, where the phenology window differs; damage assess for 2024-07-03 / storm returns damage_pct: 50.0 (CI 50-51.75) at confidence 0.5113 - the one storm case that is certified, by one hundredth |
SBX-MOWING-1 |
permanent grassland | 13.3 ha | mowing | two mowing events per season in GET .../sar/events (2025: 11 June and 29 July) |
SBX-MOWING-2 |
permanent grassland | 6.4 ha | mowing | grassland just above the 5 ha Sentinel-3 limit: thermal answers carry the resolution note (values below 20 ha mix in surrounding land cover) |
SBX-DROUGHT-1 |
spring barley, arable | 17.3 ha | drought 2023 | water-stress?season=2023 peaks at WSI 0.7353, stress_class: high, 21 consecutive stress days, LST anomaly +11 C; damage assess for 2023-07-20 / drought currently completes as status: insufficient_data (reason: no_ndvi_observations, confidence: null, billable: false) - the honest-failure path |
SBX-DROUGHT-2 |
winter wheat, arable | 16.9 ha | drought 2023 | the same drought on winter wheat |
SBX-SMALL-1 |
spring barley, arable | 1.7 ha | small | Sentinel-3 products answer 422 insufficient_resolution (detail.area_ha: 1.68, min_area_ha: 5.0); S1 and S2 products still work |
SBX-NEW-1 |
winter wheat, arable | 12.5 ha | no history | 422 baseline_not_ready on every anomaly; baseline=false answers 200 with series: [], observations: 0, because there are no scenes yet |
SBX-FIELD-01 |
winter wheat | 11.8 ha | normal | the quickstart parcel; damage assess for 2025-07-04 / storm returns damage_pct: 0.0 at confidence 0.58 with a certificate - the “nothing happened” proof |
SBX-FIELD-02 |
spring barley | 11.7 ha | normal | |
SBX-FIELD-03 |
winter rapeseed | 12.7 ha | normal | |
SBX-FIELD-04 |
maize | 13.8 ha | normal | a late crop: different phenology windows |
SBX-FIELD-05 |
winter wheat | 26.5 ha | normal | damage assess for 2024-07-19 / storm returns damage_pct: 0.0 at confidence 0.46 - no damage, but no_sar_baseline and direction_not_confirmed keep it below the certificate bar: billed, certificate: null |
SBX-FIELD-06 |
oats | 8.2 ha | normal | |
SBX-FIELD-07 |
winter wheat | 22.6 ha | normal | |
SBX-FIELD-08 |
spring barley | 10.7 ha | normal | |
SBX-FIELD-09 |
winter rapeseed | 11.3 ha | normal | |
SBX-FIELD-10 |
winter wheat | 46.7 ha | normal | the largest parcel; a good batch and portfolio member |
SBX-FIELD-11 |
maize | 11.3 ha | normal |
Areas are from the LPIS geometry and can shift slightly when the sandbox is
reseeded. parcel_id values are stable across reseeds; look them up once with
GET /v1/parcels?limit=25 and filter on external_ref. A sandbox key sees
these 20 plus the parcels it created itself - never another client’s - so
with a fresh key the list is exactly 20 rows; the shared parcels are the ones
whose external_ref starts with SBX-.
Every parcel carries a shared flag: true when the parcel belongs to another
account than your key’s. For a sandbox key you registered in the portal that is
every SBX-* parcel; they are read-only for you (DELETE answers 404, as
for any resource that is not yours) and are rebuilt every night. The demo key
printed by the seed script is the account that owns the set, so it sees the
same parcels with shared: false and GET /v1/account reports
parcels_in_environment: 20 for it (a key of your own starts at 0). Do not
delete shared parcels with the demo key; the reseed restores them, but every
other sandbox user loses the parcel until then.
The damage figures in the table are from fresh assessments run on 2026-10-03
(damage-1.0, config_hash e3f43ecf61375aa8) and are what the API answered
that day; a retuned method configuration gets a new config_hash and may move
a confidence by a few hundredths.
In the sandbox scene_id starts with SBX_ and satellite is the collection
name (sentinel-2-l2a, …): the history is modelled from the real seasonal
shape of each scenario so that the free sandbox does not spend Copernicus
processing units. Shapes, thresholds and code paths are identical to live.
The five prepared damage assessments
Section titled “The five prepared damage assessments”The seed also creates five assessments with claim references
SBX-CLAIM-2025-001 … SBX-CLAIM-2023-005 - the storm on SBX-LODGING-1
and the hail on SBX-LODGING-2 (both 2025-07-04), the storm on SBX-LODGING-3
(2024-07-03), the no-damage storm on SBX-FIELD-05 (2024-07-19) and the 2023
drought on SBX-DROUGHT-1 (2023-07-20). They are stored results from the
last reseed, and they can differ from what the same request answers today:
at the time of writing the stored SBX-CLAIM-2024-003 carries confidence
0.345 while a fresh LODGING-3 assessment answers 0.5113 with a certificate,
and the stored SBX-CLAIM-2023-005 carries 43.45 % at 0.7694 while a fresh
DROUGHT-1 assessment ends as insufficient_data. There is no list endpoint
for assessments; the seed script prints their ids.
The cases span the confidence scale on purpose. A storm assessment whose
optical series does not confirm the radar signal carries
direction_not_confirmed and a 0.8 confidence multiplier: on SBX-LODGING-1
that leaves 0.405 - above the 0.40 billing floor, below the
confidence >= 0.50 certificate bar, so a live key pays for an uncertified
number; on SBX-LODGING-3 it leaves 0.5113, one hundredth above the bar. Run
the requests fresh rather than trusting a stored SBX-CLAIM-* number. The
lesson is the same either way: your code must branch on certificate being
present, never assume the PDF.
Your own parcels
Section titled “Your own parcels”A sandbox key may create up to 10 additional parcels, with 24 months of history. Two things to expect:
- A parcel only has history if its geometry is one we already hold - parcels
are cached by geometry hash, so a re-drawn version of a shared parcel
inherits its data. A brand new field answers
baseline_not_readyand empty series, because the sandbox deliberately never triggers satellite processing. Live keys do trigger it. - The eleventh parcel answers
429 parcel_quota_exceededwithdetail{plan: "sandbox", quota: 10, active: 10, requested: 1}. A bulk import counts only the rows that would create a parcel - re-importing a file you already loaded is accepted at the limit. GET /v1/accountshowsparcel_quota: 10;parcels_activeandparcels_peakstay 0 because sandbox parcels are never billable.
Nightly reseed
Section titled “Nightly reseed”Every night the 20 shared parcels and their history are rebuilt and the
parcels you created with a sandbox key are cleared, together with their
jobs and assessments. The synthetic history is anchored to a fixed epoch, so a
reseed reproduces the same scenes on the same dates: the values you saw
yesterday are the values you see tomorrow, and a demo result only moves when
a method configuration (config_hash) changes. Nothing a sandbox client does
can damage the shared set, and nothing you store there survives more than a
day - treat the sandbox as disposable and keep your fixtures in your own
repository.
Sandbox versus live
Section titled “Sandbox versus live”Sandbox (sk_test_) |
Live (sk_live_) |
|
|---|---|---|
| Data | 20 shared LT parcels, 5 years of history | your parcels |
| Your own parcels | up to 10 extra, 24 months of history | plan quota |
| Copernicus calls | none - history is pre-seeded | real, queued and backfilled |
| Damage assessment | finishes in seconds (precomputed) | minutes, real processing |
| Billing | usage_event written, billable: false always |
billed |
| Rate limits | 60 standard / 10 write / 2 expensive per minute | per plan |
| Webhooks | delivered for real, signed | delivered, signed |
| Nightly | shared parcels rebuilt; your sandbox parcels cleared | untouched |
Test and live are separate worlds: a live key cannot see sandbox parcels and a
test key cannot see live ones. When you activate live in the portal your
sandbox key keeps working alongside the new sk_live_ key.
