Endpoints
All three require thedetermination:read capability. Your organization API key
(x-api-key) has it.
DETERMINATION tier there are two more, covered in
Telling us what you paid:
page, limit (max 100), status, kind, policyId.
404 NOT_FOUND — identical to an id that
does not exist, so the endpoint never confirms that someone else’s id is real.
Response — three facts, never collapsed into one status
A determination answers three separate questions, and merging them is how integrations go wrong. The response keeps them as three sibling objects:determined— what MicroCrop determined. Signed, hashed, anchored, and independently verifiable from the evidence package.settlement— whether MicroCrop settled. On theDETERMINATIONtier it states explicitly that MicroCrop deliberately did not settle, and what the policy owes.partnerReport— what you tell MicroCrop happened. Always labelled partner-attested and not verified by MicroCrop. Never merged intosettlement.
settlement.status values: NOT_SETTLED_BY_MICROCROP, NO_PAYOUT_DUE (Tier 1) and
SETTLEMENT_PENDING, SETTLEMENT_IN_PROGRESS, SETTLEMENT_SUBMITTED_ON_CHAIN,
SETTLEMENT_BLOCKED_UNDERFUNDED, SETTLEMENT_FAILED (Tier 2).
amountOwed — your currency, no exchange rate
On the DETERMINATION tier you settle the farmer yourself, in local currency. So the
amount is derived from the policy you sold, not converted from any crypto figure:
sumInsuredMinor being policy.sumInsured in minor units of policy.currency.
amountMinoris authoritative and is a decimal string in minor units ("1650000"= 16,500.00 KES).amountis a human convenience string. Neither is ever a JSON number.- Multiplication happens before division, and the result is truncated toward
zero — never rounded up. The rule is stated in
basisso you can reproduce the figure byte-for-byte in any language. - There is no FX call in this path and no USDC anywhere in a
DETERMINATION-tier response. - If
policy.currencyhas no registered minor-unit exponent,amountOwedisnullandamountOwedUnavailableReasonexplains why. MicroCrop will not guess a scale for a monetary obligation.
triggered is reported separately from the amount. When a determination measures
damage below the methodology’s thresholdBp, triggered is false, amountOwed is
zero, and settlement.status is NO_PAYOUT_DUE — the determination itself succeeded.
Evidence package
?download=1 to receive it as a file attachment.
The package is chain-neutral and currency-neutral by construction: it contains no USDC
amount and no chain domain, in either tier. Verify it independently by recomputing the
SHA-256 of the canonical body (RFC 8785 / JCS subset, minified UTF-8, keys sorted) and
recovering the signer from the signature over that hash.
Telling us what you paid
Under theDETERMINATION tier you settle the farmer, off-platform and off your own
balance sheet. MicroCrop never moves that money and never sees it. This endpoint is how
you put your own statement of what happened next to our determination, so the record is
complete for your regulator and your reinsurer.
POST requires the settlement:report capability; GET requires determination:read.
It is only available on policies sold under DETERMINATION. Reporting against a policy
MicroCrop settles itself returns 403 NOT_PARTNER_SETTLED — there the Payout record is
the authoritative settlement fact and an unverified claim must not sit beside it.
Bounds we do enforce
- Never more than we determined. A single report cannot exceed the
amountOwed, and neither can the sum of all live reports on a determination. Instalments are fine — two partial reports that add up to the amount owed are accepted; a second full one is not. settledAtcannot be in the future, and cannot precede the determination itself.
Corrections
Reports are append-only. Nothing is ever edited. To correct one, POST a new report with a newpartnerReference and supersedesReportId set to the id of the report it
replaces. The old row is stamped (supersededAt, supersededByReportId) with every value
it was attested with intact, and the whole chain stays visible on GET. Each new report —
corrections included — emits determination.settlement_report_recorded with
correction: true, so your subscribers can replace rather than append.
The reporting window
When a Tier 1 determination triggers and something is owed, it is stampedAWAITING_PARTNER_REPORT with a due date (30 days by default; the operator sets
PARTNER_SETTLEMENT_REPORT_DUE_DAYS). The due date is frozen at issue, so changing the
setting never re-ages determinations already issued. If nothing arrives by then the
determination becomes OVERDUE and
determination.settlement_report_overdue fires once.
A determination that did not trigger, or that owes zero, creates no reporting duty and
is never chased.
OVERDUE is a reporting state and nothing more. MicroCrop did not settle the policy,
owes nothing on it, and has moved no money.Getting notified
Rather than polling, subscribe to thedetermination.delivered
webhook. It fires once per determination and carries the same amountOwed block.
determination.settlement_report_recorded and
determination.settlement_report_overdue track the Tier 1 reporting
state above.