Billing
Billing is by the monthly peak of active parcels, never by request count. Query the same parcel a thousand times and it costs nothing extra: the API is meant to be called often. The only per-unit charges are the ones listed under metered units.
| Plan | Parcels included | Products | Rate limits (standard / write / expensive per min) | Price per month |
|---|---|---|---|---|
| Sandbox | 10 own (plus 20 shared) | all | 60 / 10 / 2 | free, never billed |
| Starter | 1 000 | parcels, indices, weather | 600 / 60 / 5 | EUR 490 |
| Growth | 10 000 | + sar, thermal, yield, damage, index | 2 000 / 200 / 20 | EUR 1 900 |
| Scale | 50 000 | + risk, cap | 6 000 / 600 / 60 | EUR 4 900 |
| Enterprise | unlimited | all, SLA credits, optional dedicated environment | 20 000 / 2 000 / 200 (negotiable) | from EUR 9 000 |
Parcels above the included quota:
| Plan | Overage per parcel per month |
|---|---|
| Starter | not available - the 1 001st parcel answers 429 parcel_quota_exceeded |
| Growth | EUR 0.30 |
| Scale | EUR 0.22 |
| Enterprise | EUR 0.18 |
An annual contract carries a 15 % discount and is billed yearly; an annual plan can move to monthly only when the annual period ends.
The parcel peak rule
Section titled “The parcel peak rule”Once a day, at 00:05 UTC, we count your active parcels (monitored and not deleted) and keep the maximum for the billing period:
active = COUNT(parcels WHERE monitoring AND deleted_at IS NULL)period.parcels_peak = MAX(period.parcels_peak, active)The invoice line for parcels uses parcels_peak, not an average. Two
consequences worth planning for:
- Deleting a parcel frees the quota, not the peak. Removing 600 parcels on the 20th makes room for 600 new ones, but the period is still billed on the earlier peak. Delete before the period starts if you want a smaller invoice.
- Uploading 50 000 parcels for one day costs the same as keeping them all month. Import what you intend to monitor.
GET /v1/account shows parcels_active, parcels_peak, overage_parcels,
period_start and period_end at any time, so you can see the number before
the invoice does. overage_parcels is how far the peak sits above
parcel_quota. A plan or quota upgrade applies to the current period
immediately - the overage is recomputed against the new quota - while a
downgrade only takes effect from the next period. When a period ends, its
overage is invoiced once, at the per-parcel overage price in force at that
moment; a later price change never touches a closed period.
Metered units
Section titled “Metered units”| Unit | Price | When it is charged |
|---|---|---|
| Damage assessment | EUR 35 (Enterprise: EUR 22 from the 500th assessment in a calendar year) | when the job finishes with status: completed and confidence >= 0.40 |
| Damage certificate (PDF) | included | issued when confidence >= 0.50; not a separate charge |
| Historical backfill | EUR 0.03 per parcel per year of history | when a live parcel’s history is backfilled beyond the included window |
| Parametric index definition | EUR 600 per index per year | once, at POST /v1/index-definitions/{id}/publish; backtests included |
| Integration support | EUR 1 200 one-off | optional; waived on an annual contract |
| Dedicated environment | EUR 1 500 per month | Enterprise option |
The unit price is fixed at the moment of the event and written into the usage record, so a later price change never rewrites history.
What is never billed
Section titled “What is never billed”- Anything done with a sandbox key. Every sandbox usage event is written
with
billable: false. - Results we could not honestly produce. A damage assessment that ends as
insufficient_data, or withconfidencebelow 0.40, is recorded for audit and costs nothing. Any call that ends in422 insufficient_data,baseline_not_ready,insufficient_resolutionorvegetation_maskedcarries theX-Agrovisio-Not-Billableheader (its value is the error type), so a metered call can be matched to the missing usage charge in your own logs. - Idempotent replays. Repeating a POST with the same
Idempotency-Keyreturns the stored result withIdempotent-Replay: trueand is never charged twice. Publishing an index definition twice is charged once. - Draft index definitions, their evaluations and their backtests. Only publication starts the annual fee.
- Requests. There is no per-request price on any plan.
The certificate band
Section titled “The certificate band”Confidence is billed from 0.40 and certified from 0.50. In the band between
them an assessment is charged but has no certificate: the JSON result is
complete and defensible, the PDF is withheld because a signed document would
lend the number more weight than the data carries. Branch on certificate
being present; never assume the PDF exists because the assessment was billed.
Changing plans
Section titled “Changing plans”- Upgrade takes effect immediately, with proration: credit for the unused part of the old plan, charge for the new one.
- Downgrade takes effect at the start of the next period. If the current
parcels_peakis above the target plan’s quota the downgrade is refused with409 quota_exceeded_for_plan- delete parcels first, or pick a bigger plan.
Invoices, tax and overdue payment
Section titled “Invoices, tax and overdue payment”An invoice is generated at the end of each period with one line per item: plan, overage, metered units. Each line references the usage event interval it was built from, and the portal lets you download the usage events of a period as CSV. VAT is applied by country and VAT number (reverse charge for EU businesses with a valid number).
Usage is reconciled daily: the sum of billable usage events is compared with the billing provider’s usage record, and an invoice is never issued automatically while the two disagree.
An overdue invoice escalates in three steps, all visible in the API before anything is switched off:
| Days overdue | What happens |
|---|---|
| 7 | every response carries X-Agrovisio-Warning: payment_overdue; GET /v1/account shows payment_overdue_since |
| 14 | the account is suspended: every endpoint answers 402 payment_required except GET /v1/account, which keeps reporting the state (detail.status: "suspended") |
| 45 | the account is closed; GET /v1/account answers 402 as well |
Settling the invoice clears payment_overdue_since and restores access
automatically.
