Base URL: https://agentcourt-api-production.up.railway.app
Full API docs: /api-docs · Interactive Swagger: /docs · Verdict Dashboard: /verdicts
Submit a dispute in one API call. Get back a ruling with confidence band, matched rule, and recommended remedy.
# Submit a non-delivery dispute
curl -X POST https://agentcourt-api-production.up.railway.app/v1/disputes \
-H "Content-Type: application/json" \
-d '{
"claimant": "buyer_agent",
"respondent": "seller_agent",
"contract": {
"parties": ["buyer_agent", "seller_agent"],
"obligations": ["Deliver logo design by June 20"],
"deadlines": ["2026-06-20"],
"deliverables": ["3 logo concepts"],
"payment_terms": "10 USDC on delivery"
},
"claim": "Deliverable was never received.",
"desired_remedy": "full_refund",
"policy": "freelance-delivery",
"evidence": [
{
"type": "contract",
"source": "agreement.json",
"timestamp": "2026-06-15",
"claimed_fact": "Seller must deliver 3 logo concepts by June 20"
},
{
"type": "payment_proof",
"source": "x402_receipt",
"timestamp": "2026-06-15",
"claimed_fact": "Buyer paid 10 USDC upfront"
},
{
"type": "log",
"source": "design_tool",
"timestamp": "2026-06-22",
"claimed_fact": "No design files exported"
}
]
}'
Response:
{
"case_id": "73237472-a53e-4b...",
"status": "resolved",
"confidence": "medium",
"ruling": "The respondent failed to deliver the agreed-upon deliverables...",
"reasoning": "Evidence establishes non-delivery: contract obligates delivery...",
"remedy": "full_refund",
"matched_rule_id": "non-delivery",
"facts_established": [
{"fact": "deliverable_was_delivered", "value": false, "source": "log evidence"},
{"fact": "payment_made", "value": true, "source": "payment_proof evidence"}
],
"ruled_at": "2026-06-22T00:25:14.389060"
}
Want to test all 4 policy templates instantly? Import our Postman collection:
git clone https://github.com/agentcourt/agentcourt && cd agentcourt
# Or download postman_collection.json and import into Postman
| Field | Type | Required | Description |
|---|---|---|---|
claimant | string | Yes | Party filing the claim |
respondent | string | Yes | Party being claimed against |
claim | string | Yes | Natural language description of the dispute |
desired_remedy | string | Yes | What the claimant wants (e.g., full_refund, payment) |
policy | string | Yes | Policy template name (see Policies) |
contract | object | No | Contract terms: obligations, deadlines, deliverables, payment_terms |
evidence | array | Yes | Evidence items (see below) |
| Field | Type | Description |
|---|---|---|
type | string | Evidence type. Recognized: contract, commit, log, message, file, payment_proof, invoice, receipt, screenshot |
source | string | Where the evidence came from (filename, URL, system name) |
timestamp | string | ISO timestamp of when the evidence was created |
claimed_fact | string | Natural language statement of what this evidence proves. This is the key field — the engine reads this to establish facts. |
reliability | string | Optional. high, medium, low. Defaults to type-based scoring. |
hash | string | Optional. Content hash for verification. |
The claimed_fact field is the most important. The policy engine reads these natural language statements to establish structured facts. Be specific: "Seller delivered the code on June 18" is better than "delivery happened".
| Field | Type | Description |
|---|---|---|
case_id | string | Unique case identifier |
status | string | resolved or escalated |
confidence | string | high, medium, or low |
ruling | string | Natural language ruling |
reasoning | string | Explanation of how the ruling was reached |
remedy | string | Recommended action (e.g., full_refund, full_payout, escalate) |
matched_rule_id | string | Which policy rule triggered |
facts_established | array | Structured facts derived from evidence |
facts_disputed | array | Facts with conflicting evidence |
facts_unknown | array | Facts that couldn't be established |
evidence_scores | array | Score for each evidence item (0-1) |
Disputes over digital work delivery: non-delivery, late delivery, scope issues.
| Rule | Confidence | Remedy |
|---|---|---|
non-delivery | high | full_refund |
late-delivery-accepted | medium | partial_refund |
late-delivery-rejected | medium | full_refund |
partial-delivery | medium | partial_refund |
disputed-acceptance | low | escalate |
Disputes over milestone payments: unpaid milestones, overdue payments.
| Rule | Confidence | Remedy |
|---|---|---|
milestone-completed-unpaid | high | full_payment_plus_penalty |
milestone-completed-paid | high | none |
milestone-incomplete-payment-demanded | high | deny_payment |
milestone-partially-complete | medium | proportional_payment |
milestone-disputed-completion | low | escalate |
Disputes over bug bounty claims: reproducibility, severity, disclosure.
| Rule | Confidence | Remedy |
|---|---|---|
valid-bug-full-payout | high | full_payout |
non-reproducible-bug | high | deny_payout |
valid-bug-partial-severity | medium | partial_payout |
disclosure-violation | medium | reduced_or_denied |
disputed-reproducibility | low | escalate |
Disputes over Service Level Agreement violations: uptime, latency, availability.
| Rule | Confidence | Remedy |
|---|---|---|
uptime-violation | high | service_credit |
latency-breach | high | service_credit |
partial-degradation | medium | partial_credit |
incidents-within-sla | high | deny_credit |
insufficient-monitoring | low | escalate |
# List all cases
curl https://agentcourt-api-production.up.railway.app/v1/cases
# Get a specific case
curl https://agentcourt-api-production.up.railway.app/v1/cases/{case_id}
Every ruling is public and auditable. The JSON API returns structured verdict data. The HTML dashboard renders it visually.
curl https://agentcourt-api-production.up.railway.app/v1/verdicts | jq .total
# → 3
from agentcourt import AgentCourt
court = AgentCourt()
ruling = court.dispute(
claimant="buyer",
respondent="seller",
claim="Non-delivery",
desired_remedy="full_refund",
policy="freelance-delivery",
evidence=[...],
)
print(ruling.confidence) # "medium"
print(ruling.remedy) # "full_refund"
import { AgentCourt } from '@agentcourt/sdk';
const court = new AgentCourt();
const ruling = await court.resolve({
claimant: 'buyer',
respondent: 'seller',
claim: 'Non-delivery',
desiredRemedy: 'full_refund',
policy: 'freelance-delivery',
evidence: [...],
});
# Run as stdio transport
python3 mcp_server.py
# 5 tools available to any MCP client:
# - resolve_dispute
# - list_policies
# - get_policy
# - get_case
# - health_check
claimed_fact fields are parsed into structured factsSame evidence + same policy always produces the same ruling. Deterministic, not predictive.