The day they finally pay you.
A free, worldwide consumer-compensation engine with exact figures,
pinpoint citations and letters you send yourself. You keep 100%.
Claims agencies take a cut of money that was already yours. AirHelp charges 35%, rising to 50% if a case reaches court. FairShake takes 20% of arbitration wins. Ownwell takes 25% of property-tax savings. DoNotPay charged a subscription, earned a D- BBB rating, and was ordered by the FTC in January 2025 to pay $193,000 over its "robot lawyer" marketing.
They are all charging for the same thing: the gap between what a statute already says you are owed and how hard it is to find out.
The free alternatives are narrow. Resolver handles UK complaints. MissingMoney searches unclaimed property but writes no letters. Delay Repay apps do one railway. Nobody had built one free, self-serve, multi-category engine that spans the world.
Give it the facts of a dispute. It runs them against every legal regime that could apply — not just the obvious one — and tells you:
- What each regime says you are owed, to the cent, in the currency the statute names.
- Why, as a step-by-step reasoning trace with the pinpoint citation behind each step. No competitor shows their working.
- Which deadlines are running, which ones kill the claim if missed, and how long is left.
- What the other side will say, and what to say back, with authority.
- Where to escalate — the actual named regulator, ombudsman or court, what it costs, and whether its decision binds them.
- A finished letter you send yourself, in your own name, in your language or theirs.
Every result can be added to a private claim ledger. It tracks the amount at stake, stage history, correspondence, recoveries and fatal or procedural deadlines. It is local-first and there is nothing else: the file lives in your browser, and a JSON export is how it moves to another device.
When several regimes cover the same facts it reconciles them rather than adding them up. A Paris–New York delay is covered by both EU261 and the Montreal Convention, but Article 12(1) lets the fixed award be set off against further damages — so "€600 + $2,100" would be a lie, and "€600" would leave money on the table. The engine models the interaction and reports what is realistically recoverable alongside the theoretical maximum.
It is not a law firm and gives no legal advice. It is a document-assembly and information tool. You send everything yourself, in your own name; it never acts as your agent and never contacts anyone for you. It promises no outcome.
That posture is the architecture, not timidity. Taking a contingency fee would make it a regulated claims-management company. Acting as agent walks toward the unauthorised practice of law. Promising recovery is the exact conduct the FTC penalised DoNotPay for. Staying free, self-serve and honest keeps all three problems away — and the conformance suite enforces it in code: a rule module whose prose promises an outcome fails the build.
654 regimes across 223 jurisdictions in 131 countries. Run
npm run validate:rules for the live figure — it is counted from the registry,
never written down.
| Category | Regimes | Examples of what is modelled |
|---|---|---|
| Rental deposits | 170 | All 50 US states + DC with their real multipliers, plus 80 countries — South Africa's interest-bearing duty under RHA s.5, Turkey's three-month cap under TBK 342, Argentina's return-at-current-value rule, Colombia's outright prohibition |
| Flight disruption | 86 | EU261/UK261 with the CJEU case law, US DOT, Canada APPR, Brazil ANAC 400, Nigeria Part 19, Indonesia PM 89/2015, Korea's KFTC standards, Russia's Air Code art. 120 |
| Unclaimed property | 80 | Every US state portal, 10 federal programmes and 30 countries — including which regimes forfeit (France, Switzerland, Spain) and which are perpetual |
| Data rights | 66 | GDPR, UK GDPR, 30+ US state laws, PIPL, APPI, PIPA, POPIA, LGPD, DPDP and the Gulf regimes |
| Medical billing | 39 | No Surprises Act, Good Faith Estimates, 501(r) charity care, the Medicare limiting charge, QMB, and 16 countries |
| Card and bank billing | 38 | FCBA, Reg E, UK s.75, PSD2, plus scheme chargeback rules as a separate non-statutory route |
| Rail delay | 35 | GB Delay Repay, EU 2021/782 and 23 national schemes |
| Parcel delay | 35 | UPU, the CMR Convention's 8.33 SDR/kg, Montreal cargo, Hague-Visby, and 22 postal operators |
| Subscriptions | 34 | ROSCA, US state auto-renewal laws, EU CRD, UK DMCCA, Chile's botón de arrepentimiento |
| Hidden fees | 28 | FTC 16 CFR 464, California SB 478, EU 1008/2008 art. 23, UK DMCCA |
| Class actions | 23 | Rule 23, mass arbitration, EU Directive 2020/1828, the UK CAT regime |
| Unwanted calls | 16 | TCPA and its state analogues, PECR, CASL |
| Baggage | 4 | Montreal (1,519 SDR since Dec 2024), Warsaw, EU 2027/97, 14 CFR 254 |
Every entry carries a confidence rating. high means the figure reads off
primary legislation. medium means an official regulator page. low means we
could not verify it from a primary source — and a low entry states no figure
at all. It names the regulator and the route and says so plainly. A regime we
cannot verify ships as an honest gap rather than a confident guess. Today that is
94 high, 272 medium and 288 low, and the low count is a feature.
Claim evaluation runs in your browser. Your booking reference, address and card details never reach a server at all. The API stores nothing: a request is evaluated and discarded.
There are no accounts. Nothing here asks who you are — not the catalogue, not the letters, not the API, and not the claim flow, which is the part that would ordinarily sit behind a signup and is exactly the part that most needs to stay on your machine. Claims are written to this browser's local storage as one versioned document; that document is also the export format, so moving to another device means downloading a file and importing it there.
The consequence runs both ways and is worth stating plainly: clearing the browser's site data deletes your claims, and nobody — including us — can restore them.
The Content-Security-Policy is what makes the promise auditable rather than merely stated. With no auth stack it names no external host at all, and the end-to-end suite asserts that list is empty rather than allow-listing anyone.
npm install
npm run dev # http://localhost:3000
npm run check # typecheck + lint + validate rules + validate data + test
npm run e2e # end-to-end, against a production buildNo credentials are required, in development or in production. There is no database to provision, no auth provider to configure and no secret without which the app degrades: it has no accounts and no server-side storage, so a fresh clone is a complete deployment.
The only optional configuration is a flight-lookup provider key, which
pre-fills an itinerary from a flight number. The claim flow works without it and
the UI degrades cleanly when it is absent. See .env.example.
Everything you do lives in the workspace under /dashboard behind one
sidebar. The public pages are the landing page, the API reference and the four
explanatory pages. Nothing is gated — there is no account — so this is layout
rather than permission, and a workspace URL is as shareable and as crawlable as
any other.
Free, unauthenticated, rate-limited per IP. Full reference at /api, machine
spec at /api/v1/openapi.json.
curl -X POST https://duesday.sohamaggarwal.com/api/v1/evaluate \
-H 'Content-Type: application/json' \
-d '{
"claim": {
"category": "flight-disruption",
"legs": [{
"carrier": "LH", "flightNumber": "400",
"origin": "FRA", "destination": "JFK",
"scheduledDeparture": "2026-06-01T10:00:00Z",
"scheduledArrival": "2026-06-01T18:00:00Z"
}],
"disruption": "delayed",
"arrivalDelayMinutes": 270,
"cause": "technical-fault",
"passengerCount": 2,
"incidentDate": "2026-06-01"
}
}'Or with the typed client:
import { createClient } from '@claimback/sdk';
const duesday = createClient();
const result = await duesday.evaluate(claim);
console.log(result.bestTotal); // what is realistically recoverable
console.log(result.evaluations[0].trace); // why, step by stepThere is also a lookup layer, so a passenger types BA117 and a date instead of
hand-entering the carrier, both airports, four timestamps and the delay. It runs
server-side behind our own origin — the browser never talks to a provider, the
CSP forbids it — and only ever sends a flight number and a date. See the flight
section of .env.example for exactly what leaves the server, and what happens
when no provider is configured.
packages/core Rules-engine kernel: domain types, evaluation, money, geo,
dates. Pure, isomorphic, dependency-light — runs identically
in a Node route, a Worker, and the browser.
packages/rules Every jurisdiction, as a pure (input, context) -> Evaluation
function plus citations. Adding a country is data, not code.
packages/data Airports, airlines, carrier claim channels, 352 regulators
and ADR bodies, 91 unclaimed-property portals, 333
jurisdictions, public-holiday calendars.
packages/letters Multi-language document assembly to text, markdown and
print-ready HTML.
packages/sdk Zero-dependency typed API client.
apps/web Next.js app and the public REST API.
The interface is documented in docs/DESIGN.md, and it is a
contract rather than a mood board: the Tailwind palette is replaced rather than
extended, so a colour nobody chose is a build error. The product uses one blue
action accent, semantic colours only for money and deadlines, restrained motion,
and a shared ledger grammar from the landing page through the dashboard and API
reference.
docs/REFERENCE-STUDY.md records the measured
teardown of 21 reference sites that informed it.
Read docs/RULE-AUTHORING.md. The short version: a rule
module is a pure function with citations, it records why it decided what it
decided, it cites primary law rather than a blog, and it would rather say "we do
not know" than state a number nobody checked.
npm run validate:rules is the gate. It will fail you for a missing citation, a
duplicate id, a letter template that does not exist, or prose that promises an
outcome.
The product name lives in exactly one place:
packages/core/src/brand.ts. Nothing else may
hardcode it — not UI copy, not a letter, not an error type URI, not an API base
URL — and npx tsx scripts/rename.ts --check fails if anything does. Renaming is
npx tsx scripts/rename.ts "NewName" --domain newname.example.
AGPL-3.0-or-later. If you run a modified version as a service, your users get the source. A tool built to stop people being charged a percentage of their own money should not be quietly closed up and resold.




