> ## Documentation Index
> Fetch the complete documentation index at: https://docs.microcrop.app/llms.txt
> Use this file to discover all available pages before exploring further.

# Report what you paid the farmer (DETERMINATION tier only)

> Record YOUR statement of how you settled this determination off-platform, off your own balance sheet. MicroCrop stores and echoes the statement and NEVER verifies it: `verificationStatus` is structurally one-valued (`UNVERIFIED`) and every response restates `verifiedByMicrocrop: false`. Nothing here moves money — no Payout, no Transaction, no policy status change. Idempotent on (determinationId, partnerReference): resending a reference returns the stored report with `replayed: true`. Reports are append-only; a correction is a NEW report carrying `supersedesReportId`. There is no USDC field in either direction and no exchange rate is ever applied. Requires the `settlement:report` capability.



## OpenAPI

````yaml /api-reference/openapi.json post /determinations/{determinationId}/settlement-report
openapi: 3.1.0
info:
  title: MicroCrop Partner API
  version: 1.0.0
  description: >-
    Parametric crop & livestock insurance API for integrating partners. All
    requests authenticate with an organization API key in the `x-api-key`
    header.
servers:
  - url: https://app.microcrop.app/api
    description: Production (Base mainnet)
security:
  - apiKey: []
tags:
  - name: Farmers
  - name: Plots
  - name: Herds
  - name: Policies
  - name: Payments
  - name: Payouts
  - name: Organization
  - name: Determinations
paths:
  /determinations/{determinationId}/settlement-report:
    post:
      tags:
        - Determinations
      summary: Report what you paid the farmer (DETERMINATION tier only)
      description: >-
        Record YOUR statement of how you settled this determination
        off-platform, off your own balance sheet. MicroCrop stores and echoes
        the statement and NEVER verifies it: `verificationStatus` is
        structurally one-valued (`UNVERIFIED`) and every response restates
        `verifiedByMicrocrop: false`. Nothing here moves money — no Payout, no
        Transaction, no policy status change. Idempotent on (determinationId,
        partnerReference): resending a reference returns the stored report with
        `replayed: true`. Reports are append-only; a correction is a NEW report
        carrying `supersedesReportId`. There is no USDC field in either
        direction and no exchange rate is ever applied. Requires the
        `settlement:report` capability.
      parameters:
        - $ref: '#/components/parameters/determinationId'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PartnerSettlementReport'
      responses:
        '200':
          description: Replayed — the stored report, returned unchanged
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Envelope'
        '201':
          description: Recorded
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Envelope'
        '400':
          description: >-
            Validation failed, the currency does not match the policy, or the
            amount exceeds what this determination establishes as owed —
            individually or summed across all live reports
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '403':
          description: >-
            NOT_PARTNER_SETTLED — MicroCrop settles this policy itself, so its
            Payout record is the authoritative settlement fact
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          $ref: '#/components/responses/NotFound'
components:
  parameters:
    determinationId:
      name: determinationId
      in: path
      required: true
      schema:
        type: string
        format: uuid
  schemas:
    PartnerSettlementReport:
      type: object
      required:
        - partnerReference
        - outcome
        - method
        - settledAmountMinor
        - settlementCurrency
        - settledAt
        - attestingOfficerName
        - attestingOfficerTitle
      properties:
        partnerReference:
          type: string
          minLength: 3
          maxLength: 128
          description: >-
            YOUR settlement reference — M-Pesa code, bank reference, receipt
            number. With the determination id this is the idempotency key, so it
            must be stable per payment: a fresh value per attempt posts two
            attestations that the same money moved once.
          example: QK73HG9XYZ
        outcome:
          type: string
          enum:
            - SETTLED_FULL
            - SETTLED_PARTIAL
            - DECLINED
        method:
          type: string
          enum:
            - MOBILE_MONEY
            - BANK_TRANSFER
            - CASH
            - ACCOUNT_CREDIT
            - IN_KIND
            - OTHER
        settledAmountMinor:
          type: string
          pattern: ^(0|[1-9]\d*)$
          description: >-
            Minor units of settlementCurrency as a canonical decimal STRING — no
            sign, no decimal point, no exponent, no leading zeros. Never a JSON
            number: this is an exact integer and a double loses precision at
            scale.
          example: '1650000'
        settlementCurrency:
          type: string
          minLength: 3
          maxLength: 3
          description: >-
            ISO 4217. Must equal the policy's own currency; a mismatch is a 400,
            never an FX conversion.
          example: KES
        settledAt:
          type: string
          format: date-time
          description: >-
            Cannot be in the future, and cannot precede the determination
            itself.
        attestingOfficerName:
          type: string
          minLength: 2
          maxLength: 200
        attestingOfficerTitle:
          type: string
          minLength: 2
          maxLength: 200
        attestingOfficerEmail:
          type: string
          format: email
          maxLength: 320
        shortfallReason:
          type: string
          maxLength: 2000
          description: Required when and only when outcome is SETTLED_PARTIAL.
        declineReason:
          type: string
          maxLength: 2000
          description: >-
            Required when and only when outcome is DECLINED, which must also
            record settledAmountMinor "0".
        evidenceRef:
          type: string
          maxLength: 512
          description: >-
            A pointer to your own receipt. MicroCrop never fetches, resolves or
            validates it.
        evidenceHash:
          type: string
          maxLength: 128
        notes:
          type: string
          maxLength: 2000
        supersedesReportId:
          type: string
          format: uuid
          description: >-
            The live report this one corrects. Reports are append-only: the
            superseded row is stamped, never rewritten.
    Envelope:
      type: object
      properties:
        success:
          type: boolean
          example: true
        data:
          type: object
    Error:
      type: object
      properties:
        success:
          type: boolean
          example: false
        error:
          type: object
          properties:
            code:
              type: string
              example: INVALID_INPUT
            message:
              type: string
            details: {}
  responses:
    NotFound:
      description: Not found
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
  securitySchemes:
    apiKey:
      type: apiKey
      in: header
      name: x-api-key

````