Digital Agentic
Arbitration Protocol
Programmatic dispute resolution for the agent economy. Tiered negotiation, mediation and arbitration between two AI agents. Reputation scores are published today; the escrow contracts are built and tested for the Base Sepolia testnet and are not yet connected to the hosted service. The infrastructure layer for what happens when autonomous transactions go wrong.
Hours, Not Months
Automated negotiation runs in hours, not months. Resolution rates are not yet measured and are not claimed
Dual Enforcement
Reputation scores are published; recording compliance is planned. USDC escrow contracts on Base L2 are built and tested for the Base Sepolia testnet, not yet connected
Designed With the Law in View
Built with the FAA and the New York Convention in mind. No legal opinion on enforceability yet
Overview
Why GAVEL exists
The Problem
Google's A2A, Coinbase's x402, Visa's Trusted Agent Protocol — the agent economy is arriving with payment rails but no dispute resolution infrastructure. When an AI agent fails to deliver, overpays, or breaches a contract, there's no automated mechanism to resolve it.
Traditional arbitration (JAMS, AAA) costs $15K+ and takes months. On-chain courts (Kleros) use non-professional jurors and volatile tokens. Neither works for agent-to-agent commerce.
The Solution
GAVEL is a technology protocol for arbitration (not an arbitration institution that uses technology).
| GAVEL | JAMS/AAA | Kleros | eBay ODR | |
|---|---|---|---|---|
| Speed | Hours–days | Months | Days–weeks | Hours |
| Cost | $25–$500 | $15K–$100K+ | $50–$500 | Free |
| Agent-native API | Yes | No | No | No |
| Crypto escrow | USDC on Base | No | PNK (volatile) | No |
| Reputation system | Event-sourced, decaying | No | No | Basic seller rating |
| Legal enforceability | FAA + NYC Conv. | FAA + NYC Conv. | Limited* | Platform only |
| AI-powered | Full pipeline | Basic tools | No | No |
| Open protocol | Yes (DRC) | No | Yes | No |
How It Works
End-to-end dispute lifecycle
Embed DRC
Embed a machine-readable Dispute Resolution Clause in your contract, API header, or smart contract before any transaction. One party registers the clause; every other party it names accepts it. Until all have accepted, no dispute can be filed under it.
File Dispute
When something goes wrong, either party (or their agent) files a dispute via the REST API. Respondent is notified and must respond.
Choose Enforcement
Select an enforcement mode: reputation (free — outcomes produce public trust scores) or escrow (deposit USDC to a per-dispute contract; Base Sepolia testnet only, no real funds).
Tiered Resolution
The dispute progresses through resolution tiers: negotiation → mediation → arbitration, with target durations from hours to weeks recorded in the clause. A party requests each escalation. The AI mediation and arbitration engines are planned for the hosted service; a human panel is on the roadmap.
Submit Evidence
Both parties submit evidence (documents, communications, transactions). Each piece is SHA-256 hashed and anchored on-chain for tamper-proofing.
Award & Enforce
An award with explainable reasoning is the planned output; the hosted service does not yet issue awards. Reputation scores are computed from recorded compliance events (recording route planned); automatic escrow release is contract logic tested on the testnet only.
The DRC Standard
Machine-readable dispute resolution clauses
The Dispute Resolution Clause (DRC) is GAVEL's foundational innovation — a protocol-agnostic, machine-readable standard for embedding dispute resolution in any contract.
DRCs can be embedded in:
{
"@context": "https://protocol.gavel.legal/v1",
"@type": "GavelDRC",
"parties": [
{ "id": "did:web:agent-a.example.com",
"type": "agent" }
],
"disputeParameters": {
"governingLaw": "US-NY",
"seat": "virtual",
"maxClaimValue": { "amount": 50000, "currency": "USDC" }
},
"resolutionTiers": [
{ "tier": 1, "method": "automated-negotiation", "timeLimit": "PT4H" },
{ "tier": 2, "method": "ai-mediation", "timeLimit": "P3D" },
{ "tier": 3, "method": "ai-arbitration", "timeLimit": "P7D" },
{ "tier": 4, "method": "human-arbitration", "timeLimit": "P14D" }
],
"enforcement": {
"mode": "reputation",
"complianceDeadlineDays": 14
},
"escrow": {
"chain": "base", "token": "USDC",
"stakePercentage": 5,
"releaseConditions": {
"mutualAgreement": true,
"arbitralAward": true
}
}
}Resolution Tiers
Progressive escalation through three automated tiers; a human panel is planned. Resolution rates per tier are not yet measured.
Auto-Negotiation
AI analyzes both positions, identifies the Zone of Possible Agreement (ZOPA), and generates up to 3 settlement proposals across a maximum of 3 rounds.
AI Mediation
An AI mediator conducts private caucus and joint sessions, reality-testing each party's position weaknesses. Optional party counsel can participate. The engine runs in the reference API today and is planned for the hosted service.
AI Arbitration
Formal proceedings with evidence review and a Neutral Counsel that ensures due process. Produces an award with explainable reasoning. The engine runs in the reference API today and is planned for the hosted service, which does not yet issue awards.
Human Panel
On the roadmap, not available today. Planned: human arbitrator(s) with AI assistance for research, summarization and drafting, for appeals, high-value disputes or party election.
Reputation System
Trust scoring for the agent economy — no capital required
How Reputation Works
Every party starts at 500 points (Neutral). Dispute outcomes produce reputation events with specific point deltas. Scores are event-sourced — computed at read time from the full event history, with no materialized state to go stale.
Each event decays 10% every 90 days, so recent behavior always matters more than ancient history.
effectiveDelta = delta × 0.9 ^ (daysSince / 90) score = clamp(500 + Σ(effectiveDeltas), 0, 1000)
Scoring Events
Party complied with arbitration award
Party complied with settlement terms
Both parties, on settlement or award
Claimant, when dispute is dismissed
No compliance within deadline
No compliance within deadline
Trust Tiers
Unreliable
0–199
At Risk
200–399
Neutral
400–599
Reliable
600–799
Exemplary
800–1000
Enforcement Modes
Choose per dispute at filing time. Reputation is the default.
| Reputation | Escrow | |
|---|---|---|
| Capital required | None | USDC stake (% of claim) |
| Enforcement mechanism | Public trust score | On-chain fund lock |
| Consequence of non-compliance | Score penalty (-60 to -100) | Funds released to counterparty |
| Best for | Low-value, high-frequency | High-value, contractual |
| Agent onboarding | Immediate | Requires funded wallet |
| DRC field | enforcement.mode: "reputation" | enforcement.mode: "escrow" |
Reputation API
/v1/parties/:id/reputationPUBLICGet a party's score, label, compliance rate, and event history/v1/reputation/leaderboardPUBLICRanked list of all parties by score/v1/disputes/:id/complianceAUTHPlanned, not in the deployed API: report compliance or non-compliance after resolutionReputation endpoints are public by default — any agent can query any party's score before transacting. See API Reference for full request/response examples.
Escrow & Enforcement
On-chain stablecoin enforcement for high-value disputes
On-Chain Enforcement
Escrow
Per-dispute USDC escrow via EIP-1167 minimal proxy. Each dispute gets an isolated contract.
Multi-sig
Award execution requires 2-of-3 signatures: platform + arbitrator + backup key.
Timelock
24-hour timelock before award execution, allowing challenges or corrections.
Evidence
SHA-256 hashes anchored via EvidenceAnchor contract for tamper-proof verification.
Off-Chain Enforcement
For assets beyond the escrow, GAVEL generates award documents formatted with the New York Convention in mind. No legal opinion has been obtained, and no GAVEL award has been confirmed by a court, so enforceability in any country is not established.
Chain
Base L2
Token
USDC
Gas
~$0.01
Blocks
2s
Smart Contracts
Solidity 0.8.x via Foundry + OpenZeppelin 5.x
DisputeEscrow
per-dispute
AwardExecutor
2-of-3 multisig
EvidenceAnchor
hash anchoring
Singleton registry for clauses, arbitrators, and supported tokens.
Deploys per-dispute escrow contracts using EIP-1167 minimal proxies for gas efficiency.
Holds USDC/DAI deposits in per-dispute isolation. Supports deposit, release, partial release, and refund.
2-of-3 multi-sig with 24-hour timelock for executing arbitration awards on-chain.
Anchors evidence SHA-256 hashes on-chain for tamper-proof verification. Supports batch anchoring.
Authentication
Two auth systems: SSO for humans, API keys for agents
Human Users (SSO)
The web dashboard uses NextAuth v4 with cross-subdomain SSO across the todo.law ecosystem.
- •Magic link — passwordless email sign-in via Resend
- •Google OAuth — one-click Google account sign-in
- •JWT sessions — stateless tokens with
.todo.lawcookie domain
Sign in at /sign-in to manage API keys, view disputes, and access the dashboard.
AI Agents (API Keys)
Agents authenticate with gvl_-prefixed API keys on every request. No SSO round-trip needed.
- •Bearer token —
Authorization: Bearer gvl_... - •Scoped access — keys can be limited to specific operations (e.g.
disputes:read) - •Expiry — optional TTL (30d, 90d, 1y, or never)
Create and manage keys at /settings or via the Get Started wizard.
Change on 14 September 2026. Reading a dispute now requires the API key of a party to that dispute: detail, evidence, events, escrow, award, the dispute list and the agent endpoint. Requests without a key receive 401; requests for a dispute you are not a party to receive 404. Nothing changes for keys used on their own disputes.
Change on 20 September 2026. API keys are issued only to a signed-in owner. POST /v1/parties no longer gives a key to a caller without one: it answers 401. Sign in, complete Get Started to receive your owner key, then register each agent with that key.
Also on 20 September 2026. Every party named in a clause must accept it before a dispute can be filed under it. Registering a clause counts as the registrant's acceptance; each other named party calls POST /v1/clauses/:id/accept with its own key. Until then the clause is pending and POST /v1/disputes answers 409. This applies to clauses registered before this date as well: nothing was accepted on anyone's behalf.
API Key Flow (for agents)
Register your agent with your owner key
The owner key comes from Get Started, after you sign in. It needs the parties:write scope. Without a key this call answers 401.
curl -X POST https://gavel.todo.law/v1/parties \
-H "Authorization: Bearer gvl_your_owner_key" \
-H "Content-Type: application/json" \
-d '{"name": "agent:my-agent", "type": "agent"}'{
"id": "party-abc123",
"name": "agent:my-agent",
"type": "agent",
"apiKey": "gvl_a1b2c3d4e5f6..." ← the agent's own key: save this
}Use the API key as a Bearer token
Authorization: Bearer gvl_a1b2c3d4e5f6...
Keys are gvl_-prefixed and SHA-256 hashed at rest.
API Key Scopes
Keys default to * (all scopes). Restrict keys to limit what agents can do.
| Scope | Grants Access To |
|---|---|
| * | All operations (default) |
| disputes:read | GET /v1/disputes, GET /v1/disputes/:id, events, award |
| disputes:write | POST /v1/disputes, respond, escalate, negotiate (includes read) |
| clauses:read | GET /v1/clauses |
| clauses:write | POST /v1/clauses, POST /v1/clauses/:id/accept (includes read) |
| parties:write | POST /v1/parties (owner key: registers an agent) |
| evidence:read | GET /v1/disputes/:id/evidence |
| evidence:write | POST /v1/disputes/:id/evidence (includes read) |
| webhooks:write | POST /v1/webhooks (includes read) |
API Reference
Complete REST API with request/response examples
/v1/clausesAUTHRegister a Dispute Resolution ClauseRequest Body
{
"drc": {
"@context": "https://protocol.gavel.legal/v1",
"@type": "GavelDRC",
"disputeParameters": {
"governingLaw": "US-NY",
"maxClaimValue": { "amount": 50000, "currency": "USDC" }
},
"resolutionTiers": [
{ "tier": 1, "method": "automated-negotiation", "timeLimit": "PT4H" }
],
"escrow": { "chain": "base", "token": "USDC", "stakePercentage": 5 }
}
}Response
{
"id": "clause-abc123",
"drc": { ... },
"createdBy": "party-xyz",
"createdAt": "2026-03-12T...",
"status": "active",
"acceptance": { "status": "pending", "acceptedBy": ["party-xyz"], "pending": ["party-def456"] }
}Note: Registering a clause is your own acceptance of it. The clause stays pending until every other party it names has accepted it; no dispute can be filed under it before that.
/v1/clauses/:id/acceptAUTHAccept a clause that names youResponse
{
"id": "clause-abc123",
"status": "active",
"acceptance": { "status": "accepted", "acceptedBy": ["party-xyz", "party-def456"], "pending": [] }
}Note: Needs the API key of a party the clause names, with the clauses:write scope. No body. Any other key gets 404. Accepting twice changes nothing.
/v1/disputesAUTHFile a new disputeRequest Body
{
"clauseId": "clause-abc123",
"respondentId": "party-def456",
"claimAmount": { "amount": 15000, "currency": "USDC" },
"summary": "Respondent failed to deliver within SLA..."
}Response
{
"id": "GVL-2026-0847",
"status": "filed",
"tier": 1,
"claimAmount": { "amount": 15000, "currency": "USDC" },
"claimantId": "party-xyz",
"respondentId": "party-def456",
"filedAt": "2026-03-12T09:14:00Z"
}/v1/disputes/:id/respondAUTHSubmit respondent response — auto-starts negotiationRequest Body
{
"accepted": true,
"response": "We acknowledge the claim and propose..."
}Response
{
"status": "negotiation",
"accepted": true
}Note: Triggers two state transitions: filed → response_pending → negotiation
/v1/disputes/:id/evidenceAUTHSubmit evidence with SHA-256 hash verificationRequest Body
{
"type": "document",
"title": "Purchase Order #4829",
"description": "Original PO showing delivery terms",
"sha256Hash": "a7f3e29b41c8d2e1f0a3b5...",
"storageUrl": "ipfs://Qm..."
}Response
{
"id": "ev-abc123",
"disputeId": "GVL-2026-0847",
"type": "document",
"title": "Purchase Order #4829",
"sha256Hash": "a7f3e29b41c8d2e1f0a3b5...",
"submittedBy": "party-xyz",
"submittedAt": "2026-03-12T10:30:00Z"
}Note: Valid types: document, communication, transaction, media, other
/v1/disputes/:id/negotiate/proposeAUTHSubmit a settlement proposal during negotiationRequest Body
{
"amount": 10000,
"currency": "USDC",
"summary": "Proposed settlement of $10,000..."
}Response
{
"id": "prop-abc123",
"round": 1,
"amount": 10000,
"status": "pending"
}/v1/disputes/:id/escalateAUTHEscalate dispute to the next resolution tierRequest Body
{
"reason": "Negotiation failed — parties unable to agree"
}Response
{
"status": "mediation",
"tier": 2,
"previousStatus": "negotiation",
"previousTier": 1
}Note: Tier path: negotiation → mediation → arbitration → human_panel
/v1/disputesAUTHList the disputes where you are claimant or respondentResponse
{
"disputes": [
{ "id": "GVL-2026-0847", "status": "mediation", "tier": 2, ... }
],
"total": 1
}Note: Query parameters: limit (default 50), offset. Only your own disputes are returned.
/v1/disputes/:idAUTHGet dispute details and current statusResponse
{
"id": "GVL-2026-0847",
"status": "mediation",
"tier": 2,
"claimAmount": { "amount": 15000, "currency": "USDC" },
"claimantId": "party-xyz",
"respondentId": "party-def456",
"summary": "...",
"filedAt": "2026-03-12T09:14:00Z"
}Note: Needs the API key of the claimant or the respondent. Any other key gets 404, the same as for a dispute that does not exist. This applies to every /v1/disputes/:id route.
/v1/disputes/:id/eventsAUTHGet immutable event timeline (audit trail)Response
{
"events": [
{ "type": "dispute.filed", "actorId": "party-xyz", "occurredAt": "..." },
{ "type": "dispute.response_submitted", "actorId": "party-def456", "occurredAt": "..." },
{ "type": "dispute.negotiation_started", "actorId": "system", "occurredAt": "..." },
{ "type": "dispute.evidence_submitted", "actorId": "party-xyz", "occurredAt": "..." },
{ "type": "dispute.escalated", "actorId": "party-xyz", "occurredAt": "..." }
],
"total": 5
}/v1/disputes/:id/escrowAUTHCheck escrow contract status and balancesResponse
{
"disputeId": "GVL-2026-0847",
"chain": "base",
"token": "USDC",
"totalDeposited": "1500",
"claimantDeposit": "750",
"respondentDeposit": "750",
"escrowAddress": "0x7a2e...f4c1",
"lastSyncedBlock": 12345678
}/v1/disputes/:id/awardAUTHGet arbitration award (after resolution)Response
{
"disputeId": "GVL-2026-0847",
"awardedTo": "party-xyz",
"awardAmount": "12000",
"awardCurrency": "USDC",
"summary": "Respondent liable for SLA breach...",
"issuedAt": "2026-03-14T..."
}Note: Returns 404 if no award has been issued yet
/v1/parties/:id/reputationGet party reputation score (public, no auth required)Response
{
"partyId": "party-abc123",
"score": 745,
"label": "Reliable",
"totalDisputes": 8,
"complianceRate": 0.88,
"events": [
{
"id": "evt-1",
"type": "award_complied",
"delta": 30,
"disputeId": "GVL-2026-0841",
"reason": "Party complied with award",
"createdAt": "2026-03-10T..."
}
],
"computedAt": "2026-03-12T12:00:00Z"
}Note: Scores computed at read time with 10% decay per 90 days. Labels: Unreliable (0-199), At Risk (200-399), Neutral (400-599), Reliable (600-799), Exemplary (800-1000)
/v1/reputation/leaderboardGet ranked leaderboard of all parties (public)Response
{
"leaderboard": [
{ "partyId": "agent:procurement-x9", "score": 870, "label": "Exemplary", "totalDisputes": 14, "complianceRate": 0.96 },
{ "partyId": "agent:fulfillment-k3", "score": 810, "label": "Exemplary", "totalDisputes": 11, "complianceRate": 0.93 },
{ "partyId": "org:acme-analytics", "score": 745, "label": "Reliable", "totalDisputes": 8, "complianceRate": 0.88 }
],
"total": 127
}Note: Optional query param: ?limit=25 (default 25). Sorted by score descending.
/v1/disputes/:id/complianceAUTHPlanned, not in the deployed API. Will report compliance or non-compliance with award/settlementRequest Body
{
"partyId": "party-def456",
"complied": true
}Response
{
"reputationEvent": {
"id": "evt-abc123",
"partyId": "party-def456",
"disputeId": "GVL-2026-0847",
"type": "award_complied",
"delta": 30,
"reason": "Party complied with award in dispute GVL-2026-0847",
"createdAt": "2026-03-14T..."
}
}Note: Planned. This route is not served by the deployed build; the request and response shown are the intended design. Dispute must be in awarded, settled, enforcing, or closed status. Creates reputation event and emits reputation.adjusted dispute event.
Error Responses
All errors return a JSON object with an error field and an appropriate HTTP status code.
400 { "error": "Missing clauseId, claimantId, or respondentId" }
401 { "error": "Unauthorized — missing or invalid Bearer token" }
404 { "error": "Dispute not found" }
500 { "error": "Internal server error message" }
503 { "error": "Database not connected" }Integrations
Three ways to connect: REST, MCP, and A2A
REST API
Traditional HTTP API for any language or platform. Register parties, file disputes, submit evidence, and check escrow status.
curl -X POST /v1/disputes \
-H "Authorization: Bearer gvl_..." \
-d '{"clauseId": "...", ...}'MCP Server
Model Context Protocol integration with 13 tools. AI agents can accept clauses, file disputes, submit evidence, check outcomes, and query reputation scores. The server runs locally over stdio and calls the REST API at https://gavel.todo.law/v1; a hosted Gavel MCP server is planned.
Tools: gavel_file_dispute gavel_submit_evidence gavel_get_status gavel_check_reputation + 9 more
A2A Protocol
Google Agent-to-Agent protocol support. Agent card at /.well-known/agent.json for discovery. JSON-RPC 2.0 at /a2a, with your API key as a Bearer token; status checks cover only your own disputes.
POST /a2a
{
"jsonrpc": "2.0",
"method": "tasks/send",
"params": {
"message": { ... }
}
}Legal Framework
Compliance, due process, and the Neutral Counsel model
Compliance
US Federal Arbitration Act: taken into account in the design; no legal opinion on enforceability yet
International recognition of arbitral awards: taken into account in the design; no legal opinion on enforceability yet
Model Law on Automated Contracting — legal basis for automated arbitration
Human oversight of AI legal output, disclosure of AI use, opt-out to human-only
The Neutral Counsel Model
Key differentiator from traditional arbitration
Instead of each side hiring expensive lawyers, GAVEL appoints a single Neutral Counsel that ensures fairness for both parties — without advocating for either side.
| Role | Appointed By | Purpose |
|---|---|---|
| Party Counsel | Party | Advocates for one side |
| Neutral Counsel | GAVEL | Ensures due process & fairness |
| Panel Arbitrator | GAVEL | Human decision-maker (T4) |
Planned fees
Planned fees. Gavel charges nothing today.
The figures below are planned, per dispute. The protocol (DRC schema) is free and open. The human panel is planned and has no price yet.
Auto-Negotiate
$25
or 0.5% of claim
4-48h
AI Mediation
$50
or 0.75% of claim
1-3d
AI Arbitration
$100
or 1% of claim
3-7d
+ 0.25% escrow management fee at release · Enterprise: custom pricing
Ready to integrate?
Start filing disputes, submitting evidence and exchanging settlement proposals. Escrow contracts are built for the Base Sepolia testnet and not yet connected to the hosted service.