Verdicting as a service

Disputes made easy.

Submit policy, claim and evidence. Get one verdict with a structured proof.

npm @dispution/sdk planned interface

Approved / Manual review / Rejected

ONE REQUEST ONE VERDICT
Policy
Returns and deliveryVersion active when the dispute occurred.
Evidence
3 recordsOrder, carrier update and customer claim.
Verdict
Manual reviewWas safe-place delivery authorised?
Inputpolicy + facts
Outputclosed state
Proofstructured

// The decision system

One request. A bounded path to one verdict.

Four bounded stages. Uncertainty never becomes a guess.

POST /v1/disputes · request lifecyclesame pipeline for sync and async
01 / ADMISSION

Validate before spend.

Authenticate, validate, count and reserve before inference.

size ceiling 40k tokenswrite replay idempotent
02 / CONTEXT

Version policy facts.

Verified sources are captured passively. Each dispute pins the version active at occurrence.

intake daily + automaticprovenance immutable
03 / COURT

Route scrutiny upward.

Each seat gets a three-attempt cross-provider chain. Degradation is named and confidence is capped.

failover 3 attempts / seatscrutiny floor-preserving
04 / SETTLEMENT

Return a complete proof.

Persist proof; deliver by polling or signed webhook.

outcome schema proof.v1
413
Never truncate decisive input

Reject before evidence is dropped.

3×
Failover is included

Every live plan + scrutiny; no surcharge.

202
Async by default

One pollable verdict resource.

200
Manual review is a result

Proof includes the human question.

// Integration surface

Designed to fit the code you already ship.

One typed contract for submission, polling and results.

npm@dispution/sdkinterface preview
import { Dispution } from "@dispution/sdk";

const client = new Dispution({
  apiKey: process.env.DISPUTION_API_KEY
});

const verdict = await client.disputes.create({
  occurredAt: "2026-08-16T10:04:00Z",
  claim: {
    summary: "Order arrived at the wrong address."
  },
  evidence: [{
    id: "ev_01", type: "record", content: record
  }]
});

if (verdict.state === "manual_review") {
  queueForReview(verdict.proof.reviewReason);
}
from dispution import Dispution

client = Dispution()

verdict = client.disputes.create(
    occurred_at="2026-08-16T10:04:00Z",
    claim={
        "summary": "Order arrived at the wrong address."
    },
    evidence=[{
        "id": "ev_01",
        "type": "record",
        "content": record
    }]
)

if verdict.state == "manual_review":
    queue_for_review(verdict.proof.review_reason)
# Illustrative, non-routable request shape
curl --request POST 
  "https://api.example.invalid/v1/disputes" 
  --header "Authorization: Bearer $DISPUTION_API_KEY" 
  --header "Idempotency-Key: case_0192" 
  --header "Content-Type: application/json" 
  --data '{
    "occurred_at": "2026-08-16T10:04:00Z",
    "claim": { "summary": "Wrong address." },
    "evidence": [{ "id": "ev_01", "type": "record" }]
  }'
{
  "verdict_id": "vd_01K3M9...",
  "schema_version": "1",
  "state": "manual_review",
  "confidence": 0.84,
  "threshold": 0.90,
  "proof": {
    "review_reason": "material_fact_missing",
    "review_question": "Was safe-place delivery authorised?",
    "evidence_manifest": ["ev_01"]
  }
}

// Structured proof

The decision is only the first line.

Verdict, evidence trail, policy references and uncertainty.

Full label and machine state
Length-addressed decisive evidence
Confidence reason and uncertainty
Immutable engine and policy provenance
PROOF / vd_01K3M9…
Approved

Summaryconfidence 0.94

Filed on time. Carrier data confirms the wrong postcode.

01
Inside the policy window.

Order timeline + customer claim.

§ 4.1
02
Address mismatch confirmed.

Carrier postcode differs.

§ 4.3
ev_01 · bytes 84 - 140sha256:ad81…

Delivery event recorded at postcode 101 00, not the destination postcode 186 00.

// Subscription tiers

Buy capacity. Never a different answer.

Same benches and proof rules on every plan.

Dispution Free simulation

$0

Deterministic integration testing.

Simulation onlyNo live decision units
  • 2 seats
  • 4 test-only API keys
  • 1 webhook endpoint
  • 1 policy source
  • 3 months test retention
Start simulating

Metered usage

$0 idle

$3 active month, then $0.05 / unit.

Uncapped usageRate-card settlement
  • 15 seats
  • 25 API keys
  • 10 webhook endpoints
  • 10 policy sources
  • Up to 60 months retention
Choose Metered

Professional prepaid

$39 / month

Live capacity for small teams.

850 unitsIncluded each period
  • 5 seats
  • 10 API keys
  • 3 webhook endpoints
  • 3 policy sources
  • Up to 24 months retention
Choose Professional

Business prepaid

$399 / month

Largest self-serve allowance.

12,000 unitsIncluded each period
  • 50 seats
  • 100 API keys
  • 25 webhook endpoints
  • 25 policy sources
  • Up to 84 months retention
Choose Business
No automatic prepaid overage

Usage stops before surprise spend.

Extra units stay available

$0.05 each; no expiry while open.

Paid plans include a sandbox

Real bench + deterministic simulation.

// Privacy / data standards

Privacy is a system property.

Where case data may exist - and for how long.

Case-data lifecyclecurrent contract
Synchronous evidence
Request memory only

Policy, claim and evidence.

Never persisted

No storage, queues or telemetry.

Asynchronous evidence
Worker-encrypted private R2

Deleted on completion; 48-hour worst-case lifecycle backstop.

Never placed on the Queue

Pointer, nonce, key and hash only.

Durable result
Verdict, proof and SHA-256 manifest

Findings, provenance and usage facts.

No raw reasoning

No excerpts, prompts or model output.

Generated reports
Rendered and streamed on demand

Generated for authorised viewers.

Never stored or cached

No durable report bytes.

Current handling contracts - not claims of an external certification. Operational output, not legal advice.

// Start with the shape

Build around a decision, not a black box.

Start with deterministic simulation.