Damage assessment
How much of the plot was damaged after a hail, flood or drought event — with the preliminary step that avoids spending quota on a calculation that cannot be made yet.
Answers: how much of this plot was damaged after this event? It is the most expensive of the three products and the only one with three steps, because it has a problem the others do not: after an event, there may not be usable satellite imagery yet.
Three steps, and why
sequenceDiagram
participant C as Your system
participant A as API
C->>A: POST /v1/damage/feasibility
A-->>C: 200 · { status: ready | pending_post_imagery | cloud_blocked }
Note over C: if not ready, do not spend: retry later
C->>A: POST /v1/damage/assessments
A-->>C: 202 · job enqueued
C->>A: POST /v1/damage/reports { assessmentId }
A-->>C: 202 · job enqueued
The first step consumes no quota and therefore requires no
Idempotency-Key: it only queries the scene catalogue. Calling it before
assessing saves you from paying for a calculation that would answer "not yet".
1. Can it be assessed yet?
curl -s -X POST "$BASE/v1/damage/feasibility" \
-H "Authorization: Bearer $UCOTRON_API_KEY" \
-H "content-type: application/json" \
-d '{
"ring": [[-59.95,-35.05],[-59.94,-35.05],[-59.94,-35.06],[-59.95,-35.06],[-59.95,-35.05]],
"peril": "granizo",
"eventDate": "2026-02-15"
}'peril is given in Spanish: granizo (hail), inundacion (flood) or
sequia (drought). Any other value returns unsupported_peril.
status | What it means | What to do |
|---|---|---|
ready | Usable pre- and post-event scenes exist | Assess |
pending_post_imagery | The satellite has not passed since the event | Retry after nextExpectedPass (revisit is ~5 days) |
cloud_blocked | Post-event imagery exists but is cloud-covered | Retry after retryAfter |
unsupported_peril | That peril is not assessed by satellite | Do not insist |
invalid_event | Future date, or inverted window | Fix the request |
Drought almost always returns ready: it is computed against a multi-year
climatology and needs no specific post-event scene.
2. Compute the damage
Where aoi_ref comes from
It references a plot that already exists, not a geometry sent with the request. This is the only place where damage assessment differs from the other two products, which take coordinates in the same call.
There are three demo plots, adjacent to one another, in both environments:
| Reference | Area | Where it is |
|---|---|---|
demo:lote-1 | 101.4 ha | the one used by the examples on this page |
demo:lote-2 | 137.0 ha | borders lot 1 to the east |
demo:lote-3 | 116.6 ha | borders lot 1 to the south |
They are adjacent on purpose: hail does not respect fence lines, and assessing two neighbouring plots for the same event is the case you will want to try. Each has its own area, so the two assessments return different results and content-based deduplication does not conflate them.
A reference outside that table — demo:lote-9, say — ends failed with
aoi_not_found: the request is fine, that plot simply does not exist.
Registering your own plots
curl -s -X POST "$BASE/v1/aois" \
-H "Authorization: Bearer $UCOTRON_API_KEY" \
-H "content-type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"name": "Campo El Ombú",
"ring": [[-59.724109,-34.121614],[-59.722668,-34.121166],
[-59.720789,-34.122512],[-59.722606,-34.123115]],
"labels": ["season-2026", "soy"]
}'It returns the aoiRef you assess with:
{
"aoiRef": "org:campo-el-ombu-a1b2c3",
"version": 1,
"hectares": 3.29,
"ring": [[-59.724109,-34.121614], "…", [-59.724109,-34.121614]]
}The ring does not need to be closed: if the last point does not repeat the
first, we close it on save. What does matter is the order — [lng, lat],
longitude first, with the same Google Maps trap described in the
buildings guide.
Three things worth knowing about registration:
- We compute the area from the polygon, and that is the figure the assessment reports. A client-supplied value is not accepted: if the declared area and the geometry disagreed, every damage percentage would be wrong.
- Plots are versioned.
versionstarts at 1 and increments on every geometry edit. An assessment cites the plot and its version, so an already-issued dossier keeps showing the plot it measured even if you redraw it later. Idempotency-Keyis required. Without it, a retry after a timeout would create two plots with the same polygon and different references, and you would not know which to cite.
Registration does not run in the sandbox. That environment has no database, so a plot loaded there would not exist for the assessment citing it. It answers
501saying so. Register your plots against production.
curl -s -X POST "$BASE/v1/damage/assessments" \
-H "Authorization: Bearer $UCOTRON_API_KEY" \
-H "content-type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"parameters": {
"aoi_ref": "demo:lote-1",
"aoiVersion": 1,
"event_ref": "ev-granizo-2026-02-15",
"peril": "granizo",
"eventDate": "2026-02-15",
"threshold": 0.18,
"licenceTier": "unverified"
}
}'Returns 202. The result carries damaged hectares, affected percentage and the
provenance: which windows were compared, how many scenes on each side, and at
what cloud cut.
aoiVersion is part of the calculation's identity: redrawing the plot is a
different assessment, and it has to be — an assessment over an old geometry
would assert something about an area that is no longer the plot.
3. Issue the dossier
curl -s -X POST "$BASE/v1/damage/reports" \
-H "Authorization: Bearer $UCOTRON_API_KEY" \
-H "content-type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{"assessmentId":"job_footprint_…","locale":"en-US"}'assessmentId is the job id from step 2, already succeeded. The dossier
cites that assessment: the compared windows and the scenes used come from it,
and that is what the document declares.
What the dossier contains
In this order, because it is the one an assessor follows to support a conclusion:
- Summary — plot, event, net affected area and predominant severity.
- Event and method — index, sensor, threshold, compared windows and scenes.
- Map — the plot in orange and the damage footprint in red, vectorised pixel by pixel over the satellite image.
- Spectral indices — the mean index before and after, with its change. The sign matters: negative is a drop, which is what damage produces.
- Severity by zone — how much area fell into severe, moderate and light damage. A plot with 40 % affected is not adjusted the same way if it is all light as if a third of it is lost.
- Differential diagnosis — the breakdown that explains the figure.
- Observables, legal framework and methodology, and provenance with hash and signature.
The raw / control / net breakdown
The step 2 result carries damageBreakdown, and the dossier prints it:
| Component | What it is |
|---|---|
rawHectares | Everything that dropped past the threshold, cause aside |
controlHectares | What also dropped one year earlier, over the same window and with the crop at the same stage: senescence, harvest, rotation |
netHectares | The difference — the damage attributed to the event |
The correction is not cosmetic. In a frost, much of the index drop is the crop drying down as it does every year, and the figure worth assessing is the excess: reporting the raw number can overstate the claim several times over.
When controlFound is false there was no baseline to compare against.
That is not a control of zero: net equals raw and the document says so
explicitly, so it reads as an upper bound rather than a measurement.
What breaks
| What happens | Response | Why |
|---|---|---|
peril in English, or an unsupported one | unsupported_peril | It is given in Spanish: granizo, inundacion, sequia |
eventDate in the future | invalid_event | You cannot assess something that has not happened |
| Assessing without checking feasibility, with the post-event scene still clouded | the job fails | This is exactly why step 1 exists and is free |
Missing Idempotency-Key on steps 2 or 3 | 428 | Both consume quota. Step 1 does not require it |
An assessmentId for a job that has not finished | the job fails | The dossier cites a closed assessment, not one in flight |
| The plot does not exist in your organization | 404 | Same answer as a non-existent route, on purpose |
The full table of status codes is in Jobs, delivery and errors.
What it asserts, and what it does not
- It compares pre- and post-event scenes over the same plot. What it detects is a change in spectral response consistent with damage.
- For hail and frost it also applies an interannual control at matched phenology: the same window one year earlier over the same plot. A pixel counts as damaged only if it dropped this year and did not drop the year before, so the crop's normal evolution is discounted rather than added to the claim.
- The differential diagnosis may include an interpretation written automatically over the report's figures. That text stays outside the content hash and the document says so: the signature covers the figures, which are the part that can be reproduced.
- Cloud cover degrades the result. The report states the cut used and how many scenes remained on each side.
- Flood is currently detected with optical indices: under persistent cloud, sensitivity drops. Radar (which sees through cloud) is a pending improvement and is declared as a limitation in the document.
- Resolution is 10 m: damage in patches smaller than that is not resolved individually.
It is reproducible technical evidence about affected area. It does not replace a field inspection nor set an indemnity amount.
