Insurance claims

Check a claim against the supplied policy and history, then show a claims reviewer which amounts, dates and explanations still need attention.

For claims operations, special investigation units and third-party administrators.

Where it fits in your workflow

Use this when a new claim enters assessment or a claim-payment decision is ready for review. The claim checks cover policy period and status, stated perils, limits, item totals, reporting time, related claims and claimant/provider identifiers. Payment decisions have their own checks for the assessed amount, payee and independent approval.

  1. Bring the policy to the claim. Supply the policy version and status relevant to the loss date, including perils, deductibles, limits and reporting window. Match its currency to the claim; do not assume the service retrieves a policy from a policy number.
  2. Review both the numbers and the story. The engine checks dates and amounts directly. Whether a narrative describes the peril, and whether the claimed items fit that loss, are separate judgment questions with explicit qualification requirements.
  3. Check the payment as its own decision. After assessment, submit a pay_claim item with the claim, claimant and provider records. Review the amount net of deductible, the receiving account and the relationship between adjuster and approver before releasing funds in your system.

What to send

  • Claim and loss. Claim ID, policy and claimant IDs, loss and reporting dates, claimed peril, currency, amount, itemized losses and the claimant’s narrative.
  • Applicable policy. Coverage period, status and status date when needed, covered perils, peril limits, sum insured, deductible and reporting window.
  • Parties and history. Claimant and provider identifiers needed for comparison, plus related claim records. Provide only the identifiers needed for the checks you intend to run.
  • Payment decision. For pay_claim, supply the assessed claim, amount paid, payee details and approval information. A claim verification alone does not verify a later payment.

Use POST /api/v1/verify for one item or POST /api/v1/audits for a population with shared context. See the request structure.

A water-damage claim with an item to clarify

The recorded claim totals $6,840.00 after a kitchen hose failure. It includes flooring, drying equipment, kitchen units and a $1,500.00 garden patio furniture set. The policy covers water damage, has a $500.00 deductible and a $25,000.00 water-damage limit. The loss was reported two days after it occurred.

The recorded result is uncertain. Seven direct checks hold, including the item sum, policy period, reporting window and limit. The narrative/peril and item-consistency questions remain unqualified. A reviewer can follow up on how the patio furniture relates to the reported kitchen and hallway damage; the sample does not establish that the furniture is invalid or that the claim should be denied.

Recorded verdict: uncertain. The table below comes from the saved response.

CheckRecorded outcomeFacts or explanation
The loss date falls inside the policy period, and the policy was active on that date.holds{"start_date": "2026-03-01", "end_date": "2027-02-28", "status": "active"}
The claimed peril is one the policy covers.holds{"peril": "water_damage"}
The amount claimed, net of the deductible, is within the limit for the peril.holds{"limit": "25000.00", "limit_source": "peril_limit", "deductible": "500.00", "net": "6340.00"}
The claimed items add up to the amount claimed.holds{"items_total": "6840.00", "amount_claimed": "6840.00", "item_count": 4}
The claim was reported within the policy's reporting window after the loss.holds{"days_to_report": 2, "window_days": 30}
No other claim on the policy for the same peril has a loss within 3 days and an amount within 10%.holds{"compared_with": 0}
The claimant and the provider share no bank account, phone, email or address.holds{"compared": ["bank_account", "phone", "email", "address"]}
The loss narrative describes the claimed peril.unqualifiedThis question is not yet qualified for the running model; its answer is recorded but decides nothing.
The claimed items are consistent with the loss described.unqualifiedThis question is not yet qualified for the running model; its answer is recorded but decides nothing.

Recorded from the production service on 2026-10-03T04:20:20Z. It was recorded with insurance-claims@1; a request naming insurance-claims now runs insurance-claims@2, so its test labels and configuration differ. The use-case page lists what changed between versions. This page displays a saved example, not a new verification request. Sensitive identifiers are masked in public examples.

Inspect the request and full recorded response

Request

{
  "use_case": "insurance-claims",
  "item": {
    "type": "claim",
    "id": "CLM-58213",
    "data": {
      "policy_id": "POL-1182",
      "claimant_id": "CL-77",
      "provider_id": "PRV-14",
      "loss_date": "2026-08-14",
      "reported_date": "2026-08-16",
      "peril": "water_damage",
      "amount_claimed": "6840.00",
      "currency": "USD",
      "items": [
        {
          "description": "Replace water-damaged laminate flooring in kitchen and hallway",
          "amount": "2950.00"
        },
        {"description": "Drying equipment hire, five days", "amount": "890.00"},
        {"description": "Replace swollen base units under the sink", "amount": "1500.00"},
        {"description": "Garden patio furniture set", "amount": "1500.00"}
      ],
      "narrative": "Overnight the braided hose feeding the kitchen sink tap split. In the morning there was water across the kitchen and the hallway. The laminate floor has lifted and the base units under the sink have swollen. A drying company ran dehumidifiers for five days.",
      "assessed_amount": "5340.00",
      "adjuster_id": "ADJ-9"
    }
  },
  "context": {
    "records": {
      "policy": [
        {
          "id": "POL-1182",
          "holder_id": "CL-77",
          "product": "home",
          "inception_date": "2023-03-01",
          "start_date": "2026-03-01",
          "end_date": "2027-02-28",
          "status": "active",
          "covered_perils": ["fire", "storm", "water_damage", "theft", "vandalism", "glass"],
          "limits": {"water_damage": "25000.00", "theft": "10000.00"},
          "deductible": "500.00",
          "sum_insured": "350000.00",
          "reporting_window_days": 30,
          "currency": "USD"
        }
      ],
      "claimant": [
        {
          "id": "CL-77",
          "name": "Dana Whitfield",
          "phone": "(masked)",
          "email": "(masked)",
          "address": "(masked)",
          "bank_account": "(masked)"
        }
      ],
      "provider": [
        {
          "id": "PRV-14",
          "name": "Dry Right Restoration",
          "kind": "restoration",
          "phone": "(masked)",
          "email": "(masked)",
          "address": "(masked)",
          "bank_account": "(masked)"
        }
      ],
      "claim": []
    }
  }
}

Response

{
  "id": "ver_a353206b5024dd1e",
  "object": "verification",
  "created_at": "2026-10-03T04:20:20Z",
  "use_case": "insurance-claims@1",
  "item": {"type": "claim", "id": "CLM-58213"},
  "verdict": "uncertain",
  "probability_true": "0.0000",
  "probability_basis": "calibrated",
  "certainty": null,
  "undecided": [
    {
      "assertion": "narrative_matches_peril",
      "reason": "unqualified",
      "message": "This question is not yet qualified for the running model; its answer is recorded but decides nothing."
    },
    {
      "assertion": "items_consistent",
      "reason": "unqualified",
      "message": "This question is not yet qualified for the running model; its answer is recorded but decides nothing."
    }
  ],
  "assertions": [
    {
      "id": "policy_in_force",
      "test": "procedure:policy_in_force@1",
      "outcome": "holds",
      "error_bound": "0",
      "facts": {"start_date": "2026-03-01", "end_date": "2027-02-28", "status": "active"},
      "evidence": [
        "/item/data/loss_date",
        "/context/records/policy/0/start_date",
        "/context/records/policy/0/end_date",
        "/context/records/policy/0/status",
        "/context/records/policy/0/status_date"
      ]
    },
    {
      "id": "peril_covered",
      "test": "procedure:peril_covered@1",
      "outcome": "holds",
      "error_bound": "0",
      "facts": {"peril": "water_damage"},
      "evidence": ["/item/data/peril", "/context/records/policy/0/covered_perils"]
    },
    {
      "id": "within_limit",
      "test": "procedure:within_limit@1",
      "outcome": "holds",
      "error_bound": "0",
      "facts": {
        "limit": "25000.00",
        "limit_source": "peril_limit",
        "deductible": "500.00",
        "net": "6340.00"
      },
      "evidence": [
        "/item/data/amount_claimed",
        "/item/data/peril",
        "/context/records/policy/0/covered_perils",
        "/context/records/policy/0/limits/water_damage",
        "/context/records/policy/0/sum_insured",
        "/context/records/policy/0/deductible"
      ]
    },
    {
      "id": "items_sum",
      "test": "procedure:items_sum@1",
      "outcome": "holds",
      "error_bound": "0",
      "facts": {"items_total": "6840.00", "amount_claimed": "6840.00", "item_count": 4},
      "evidence": ["/item/data/items", "/item/data/amount_claimed"]
    },
    {
      "id": "reported_in_time",
      "test": "procedure:reported_in_time@1",
      "outcome": "holds",
      "error_bound": "0",
      "facts": {"days_to_report": 2, "window_days": 30},
      "evidence": [
        "/item/data/loss_date",
        "/item/data/reported_date",
        "/context/records/policy/0/reporting_window_days"
      ]
    },
    {
      "id": "not_duplicate",
      "test": "procedure:not_duplicate@1",
      "outcome": "holds",
      "error_bound": "0",
      "facts": {"compared_with": 0},
      "evidence": [
        "/item/data/policy_id",
        "/item/data/peril",
        "/item/data/loss_date",
        "/item/data/amount_claimed"
      ]
    },
    {
      "id": "claimant_independent_of_provider",
      "test": "procedure:claimant_independent_of_provider@1",
      "outcome": "holds",
      "error_bound": "0",
      "facts": {"compared": ["bank_account", "phone", "email", "address"]},
      "evidence": [
        "/item/data/claimant_id",
        "/item/data/provider_id",
        "/context/records/claimant/0/bank_account",
        "/context/records/provider/0/bank_account",
        "/context/records/claimant/0/phone",
        "/context/records/provider/0/phone",
        "/context/records/claimant/0/email",
        "/context/records/provider/0/email",
        "/context/records/claimant/0/address",
        "/context/records/provider/0/address"
      ]
    },
    {
      "id": "narrative_matches_peril",
      "test": "question:narrative_matches_peril@1",
      "outcome": "unqualified",
      "message": "This question is not yet qualified for the running model; its answer is recorded but decides nothing.",
      "answer": {"p_yes": "0.942824"},
      "evidence": ["/item/data/peril", "/item/data/narrative"]
    },
    {
      "id": "items_consistent",
      "test": "question:items_consistent@1",
      "outcome": "unqualified",
      "message": "This question is not yet qualified for the running model; its answer is recorded but decides nothing.",
      "answer": {"p_yes": "0.008637"},
      "facts_given": {
        "item_count": 4,
        "peril": "escape of water from pipes, tanks or appliances"
      },
      "evidence": ["/item/data/narrative", "/item/data/items"]
    }
  ],
  "indicators": [],
  "risk": {
    "points": "0.00",
    "probability": "0.0100",
    "basis": "prior",
    "base_rate": "0.01",
    "reasons": []
  },
  "scope": {
    "stratum": null,
    "evidence": "supplied",
    "skipped": [],
    "certainty_target": "0.995",
    "deterministic_only_verdict": "uncertain"
  },
  "configuration": "cfg_9c9005a39bbd",
  "input_sha256": "7d39eacb97bbb6a55e62862e27e5cf85ecf379a8aca889fbf91841f12d8a3ec6",
  "usage": {"questions_asked": 2, "questions_cached": 0, "model_ms": 3078}
}

Supported records and checks

These definitions are generated from the registered use-case pack. A procedure computes a result from the supplied data; a question can decide a check only when it is qualified for the model and meets its thresholds. The descriptions name the checks; they do not authenticate the underlying business events. Supplied fields, defaults and comparison populations determine what each procedure can establish. Risk weights help prioritize review and are not probabilities.

  • claim: An insurance claim against a policy.
  • pay_claim: A decision to pay a claim.

claim

An insurance claim against a policy. Required data fields: policy_id, claimant_id, loss_date, reported_date, peril, amount_claimed, currency, items, narrative.

AssertionRequiresDecided byRisk weight
policy_in_forceThe loss date falls inside the policy period, and the policy was active on that date.procedure3.0
peril_coveredThe claimed peril is one the policy covers.procedure2.0
within_limitThe amount claimed, net of the deductible, is within the limit for the peril.procedure1.0
items_sumThe claimed items add up to the amount claimed.procedure1.0
reported_in_timeThe claim was reported within the policy's reporting window after the loss.procedure0.8
not_duplicateNo other claim on the policy for the same peril has a loss within 3 days and an amount within 10%.procedure2.5
claimant_independent_of_providerThe claimant and the provider share no bank account, phone, email or address.procedure3.0
narrative_matches_perilThe loss narrative describes the claimed peril.procedure, then question narrative_matches_peril@1 if undecided2.5
items_consistentThe claimed items are consistent with the loss described.procedure, then question items_consistent@1 if undecided1.5
IndicatorFires whenFamilyWeight
early_claim@1The loss falls within 30 days of the policy's inception.policy_age1.2
frequent_claimant@1The claimant has 3 or more claims within 12 months.claim_history1.0
provider_concentration@1The provider appears on claims from at least 5 unrelated claimants within 90 days.provider1.0
round_amount@2The amount claimed is a multiple of the unit for its currency and at least the minimum for it (default: 100.00 and 500.00 in USD, EUR and GBP).amount_shape0.4
near_limit@1The amount net of the deductible is within 5% at or below the limit.amount_shape0.5
late_report@1Reported more than half-way through the reporting window, and within it.timing0.3

pay_claim

A decision to pay a claim. Required data fields: actor, at, on, outcome, amount, currency, payee.

AssertionRequiresDecided byRisk weight
payment_within_assessedThe amount paid does not exceed the assessed amount net of the deductible.procedure2.0
payee_matchesThe payment went to the claimant or the provider on the claim, and to their account on file.procedure3.0
approver_independentThe approver is not the adjuster who assessed the claim.procedure1.5

Judgment questions and qualification

QuestionAsksStatusHoldout error bounds
items_consistent@1Are the claimed items consistent with the loss described?no published qualification–
narrative_matches_peril@1Does this loss narrative describe the claimed peril?no published qualification–

The table describes published evaluation evidence. For the qualification attached to the running service, inspect this use case’s live definition. A model answer can be recorded without deciding a check. How qualification works.

Scope and limits

  • The engine reads the structured policy terms supplied in the request. It does not fetch a policy, establish the authenticity of supporting documents or resolve every exclusion in a policy wording.
  • A payment account match compares supplied party and account records. It does not independently establish who owns the account or whether the instruction to change it was authentic.
  • A match between claimant and provider identifiers is evidence for the specified independence check, not a general conclusion about intent. Missing identifiers may leave the comparison unresolved.
  • The result concerns the listed checks and supplied scope. Coverage, settlement and investigation decisions remain in your claims workflow.

A true verdict means all applicable, unskipped checks hold within the decision gates; false means at least one qualifying failure decided the item. Other assertions can remain unresolved even with a false verdict. An uncertain verdict means the evidence and decision gates do not support a decided result. Review the assertion outcomes and evidence before taking a business action. Read the decision method.

Published evaluation results

These measurements use synthetic populations with generator-stated truth. Coverage is the share receiving true or false verdicts, not measured accuracy on your records. Read the metrics and their limits.

Results for insurance-claims@2.

ConfigurationItemsDecided coverageCoverage gain (pp)Uncertain per 1,000True, rules: errors / nTrue, with modelFalse, rulesFalse, with model
Rules only485346.8%0.0 pp531.60 / 1763, ≤ 0.17%–0 / 510, ≤ 0.59%–
With smalldecide 00607d88f6e1:float32-cpu485346.8%0.0 pp531.60 / 1763, ≤ 0.17%–0 / 510, ≤ 0.59%–

Faults

FaultItemsFalse verdictsFalse or uncertain
diverted_account35100.0%100.0%
duplicate_claim80100.0%100.0%
items_inconsistent440.0%100.0%
items_total_mismatch39100.0%100.0%
loss_outside_period41100.0%100.0%
narrative_mismatch410.0%100.0%
over_limit40100.0%100.0%
overpayment34100.0%100.0%
peril_not_covered46100.0%100.0%
policy_lapsed40100.0%100.0%
provider_link33100.0%100.0%
reported_late41100.0%100.0%
self_approved43100.0%100.0%
wrong_payee38100.0%100.0%

Look-alikes

Look-alikeItemsFalse verdictsUncertain
account_formatting160.0%0.0%
amount_at_limit180.0%100.0%
approver_other_adjuster200.0%0.0%
cancelled_after_loss180.0%100.0%
deductible_absorbs_excess180.0%100.0%
loss_on_policy_boundary170.0%100.0%
paid_above_claimed190.0%0.0%
paid_to_provider200.0%0.0%
provider_same_street210.0%100.0%
repeat_claim_later180.0%100.0%
repeat_claim_other_peril180.0%100.0%
reported_on_last_day160.0%100.0%
round_amount_itemized180.0%100.0%

Holdout seeds 101, 102, 103, 104, 105, 106, 107, 108, 109, 110; dataset SHA-256 92adb019c9a07cb6….

Run identity and dataset
ConfigurationRecorded atSource commitModel artifact SHA-256Dtype
deterministic_only2026-10-07T04:08:41+00:00c7df92be8350d7e6afb7e5b6be60917e7e872b10nonenone
smalldecide:00607d88f6e1:float32-cpu2026-10-07T04:12:53+00:00fda990f7052cbaf109483fea678cde178c92900f00607d88f6e152b471e557f6a814471ab5a6faf900cae427d8b3d50d4614be17float32-cpu

Dataset SHA-256: 92adb019c9a07cb60a1b2b6f5d520020fea866ed529b3d8d75aed92334c277f9.

Versions

A request naming insurance-claims runs the current version. Name a version, such as insurance-claims@1, to keep the checks you integrated against; a superseded version stays served unchanged. Test labels in a response carry the version that ran them.

VersionWhat it checks differently
insurance-claims@2The current version, used when a request names insurance-claims alone. The round-amount indicator compares a claim's amount only with a unit and a minimum in its own currency, since no exchange rate is assumed: round_units and round_minimums map a three-letter currency code to an amount, defaulting to 100.00 and 500.00 in USD, EUR and GBP, so a claim in a currency they do not list, such as JPY, fires no round-amount indicator. The two maps must list the same currencies. Every other check is version 1's: limits, deductibles, duplicates and payments were already compared only in the claim's currency.
insurance-claims@1Superseded, and still served unchanged to requests that name insurance-claims@1. One round_unit (100.00) and one round_minimum (500.00) apply to a claim in any currency.

Schemas and integration

Every item, record and reference schema is at GET /api/v1/use-cases/insurance-claims.

Supported context record types: policy, claimant, provider, claim, pay_claim.

Start with a reviewable sample

Begin with one product and a consistent policy export. Review ordinary claims, out-of-period losses, missing evidence and ambiguous narratives before using the results to prioritize a larger review queue.

Try the console · API quickstart · Full API reference

From the blog