Skip to content

API · 1.0.0

The whole engine, over HTTP.

Everything this site does, it does through this API. There is no key, no account and no quota to buy — just a per-IP limit so one caller cannot take it down for everyone else.
Base URL
https://duesday.sohamaggarwal.com/api/v1
Authentication
None
Licence
AGPL-3.0-or-later
Machine-readable
openapi.json

01/Scope

What this is for.

The catalogue is AGPL-3.0. The API is how you use it without running it.

The reason a claims agency can take a third of your money is that the law is public and unreadable. Closing that gap is worth doing once, properly, and then giving away — so the rules engine, the citations, the letter templates and this API are all under the AGPL and all of it is on GitHub.

The API is not a lead funnel. It has no tracking, it sets no cookie, it returns no referral link and it does not want your users’ email addresses. If you are a consumer group, a union, a tenants’ association, a travel app or a student building something for a coursework deadline, take it and use it.

Two things must survive the integration, and they are the two things that keep this lawful rather than merely free: the output is information about the law, not legal advice, and a rendered document is one the user sends themselves, in their own name. Every letter carries the disclaimer, there is no flag to suppress it, and there is deliberately no endpoint that sends anything on anybody’s behalf.

02/Index

14 endpoints.

Generated from the OpenAPI document, so this list cannot fall behind the API it describes.
Evaluate a claim against every applicable jurisdiction
Every document the product can assemble
Assemble a demand letter
Liveness and coverage fingerprint
List every regime the engine knows about
One regime, with its explainer and full sourcing
Coverage map across every category
Airport lookup by IATA code
Great-circle distance between two airports
Ranked airport search
Ranked carrier search
Great-circle distance, with both endpoints resolved
Whether flight lookup is configured in this deployment
Flight status by flight number and date

03/Endpoints

Evaluation

Work out what is owed.
POST

/evaluate

Evaluate a claim against every applicable jurisdiction

Runs every rule module registered for the claim category and returns each verdict, ranked, with the reasoning trace intact.

More than one regime frequently applies to the same facts — a Paris-to-New-York delay is covered by both EU261 and the Montreal Convention. The response reconciles them in groups rather than naively summing: bestTotal is what is realistically recoverable, and theoreticalMax is the arithmetic sum, shown only as an upper bound.

Request body

application/json

Responses

Evaluation complete
application/json·EvaluateResponse
200
The request did not match the expected shape
application/problem+json·Problem
422
Too many requests
application/problem+json·ProblemRetry-After — Seconds to wait
429
curl
curl -sS '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": "2025-06-14T13:20:00Z",
          "scheduledArrival": "2025-06-14T16:05:00Z",
          "actualArrival": "2025-06-14T20:17:00Z"
        }
      ],
      "disruption": "delayed",
      "arrivalDelayMinutes": 252,
      "cause": "technical-fault",
      "passengerCount": 1,
      "incidentDate": "2025-06-14"
    },
    "asOf": "2025-06-20"
  }'
@claimback/sdk
const result = await client.evaluate(
{
  "category": "flight-disruption",
  "legs": [
    {
      "carrier": "LH",
      "flightNumber": "400",
      "origin": "FRA",
      "destination": "JFK",
      "scheduledDeparture": "2025-06-14T13:20:00Z",
      "scheduledArrival": "2025-06-14T16:05:00Z",
      "actualArrival": "2025-06-14T20:17:00Z"
    }
  ],
  "disruption": "delayed",
  "arrivalDelayMinutes": 252,
  "cause": "technical-fault",
  "passengerCount": 1,
  "incidentDate": "2025-06-14"
} as ClaimInput,
  { asOf: '2025-06-20' },
);

for (const evaluation of result.actionable) {
  console.log(evaluation.ruleId, evaluation.verdict, evaluation.award);
}

04/Endpoints

Letters

Assemble a document the claimant sends themselves.
GET

/dashboard/library/templates

Every document the product can assemble

Parameters

ruleIdin query
string

Responses

Template catalogue
application/json
200
curl
curl -sS 'https://duesday.sohamaggarwal.com/api/v1/dashboard/library/templates'
fetch
const response = await fetch(`${BASE}/dashboard/library/templates`);
const data = await response.json();

The SDK has no dedicated method for this endpoint yet.

POST

/dashboard/library/render

Assemble a demand letter

The evaluation is recomputed server-side from the claim facts; a client-supplied Evaluation is not accepted. This guarantees the figure in the letter is one the engine stands behind, rather than an arbitrary number wearing our citations.

Every rendered document carries the not-legal-advice disclaimer. There is no option to suppress it, and integrations must not strip it.

Request body

application/json

Responses

Rendered document in the requested formats
application/json
200
No such resource
application/problem+json·Problem
404
The request did not match the expected shape
application/problem+json·Problem
422
curl
curl -sS 'https://duesday.sohamaggarwal.com/api/v1/dashboard/library/render' \
  -H 'Content-Type: application/json' \
  -d '{
    "claim": {},
    "templateId": "flight.initial-demand",
    "ruleId": "air.eu261",
    "claimant": {},
    "recipient": {}
  }'
fetch
const response = await fetch(`${BASE}/dashboard/library/render`, {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({
  "claim": {},
  "templateId": "flight.initial-demand",
  "ruleId": "air.eu261",
  "claimant": {},
  "recipient": {}
}),
});
const data = await response.json();

The SDK has no dedicated method for this endpoint yet.

05/Endpoints

Catalogue

What regimes and jurisdictions are covered.
GET

/health

Liveness and coverage fingerprint

Includes rule and template counts so a deploy that silently drops a jurisdiction is detectable.

Responses

Service is up
application/json·Health
200
curl
curl -sS 'https://duesday.sohamaggarwal.com/api/v1/health'
@claimback/sdk
const health = await client.health();
console.log(health.coverage);
GET

/rules

List every regime the engine knows about

Parameters

categoryin query
flight-disruption · baggage · rental-deposit · unclaimed-property · card-billing · subscription · unwanted-calls · rail-delay · parcel-delay · medical-billing · data-rights · class-action · hidden-fees
ClaimCategory
jurisdictionin query
string
confidencein query
Minimum confidence to include.high · medium · low
string

Responses

Rule catalogue
application/json
200
curl
curl -sS 'https://duesday.sohamaggarwal.com/api/v1/rules'
@claimback/sdk
const { total, rules } = await client.listRules({ category: 'flight-disruption' });
GET

/rules/{id}

One regime, with its explainer and full sourcing

Parameters

idin pathrequired
string

Responses

Rule metadata
application/json
200
No such resource
application/problem+json·Problem
404
curl
curl -sS 'https://duesday.sohamaggarwal.com/api/v1/rules/air.eu261'
@claimback/sdk
const rule = await client.getRule('air.eu261');
GET

/jurisdictions

Coverage map across every category

Responses

Coverage
application/json
200
curl
curl -sS 'https://duesday.sohamaggarwal.com/api/v1/jurisdictions'
@claimback/sdk
const coverage = await client.jurisdictions();

06/Endpoints

Reference

Airports, distances and lookup data.
GET

/airports/{iata}

Airport lookup by IATA code

Parameters

iatain pathrequired
string

Responses

Airport
application/json
200
No such resource
application/problem+json·Problem
404
curl
curl -sS 'https://duesday.sohamaggarwal.com/api/v1/airports/<iata>'

Values in <angle brackets> are placeholders: the OpenAPI document carries no example for that parameter. Substitute a real one before running it.

fetch
const response = await fetch(`${BASE}/airports/<iata>`);
const data = await response.json();

The SDK has no dedicated method for this endpoint yet.

GET

/distance

Great-circle distance between two airports

The figure the compensation bands are calculated from — first departure to final destination, per CJEU C-559/16 (Bossen).

Parameters

fromin queryrequired
string
toin queryrequired
string

Responses

Distance
application/json
200
No such resource
application/problem+json·Problem
404
curl
curl -sS 'https://duesday.sohamaggarwal.com/api/v1/distance?from=LHR&to=JFK'
@claimback/sdk
const { distanceKm, band } = await client.distance('LHR', 'JFK');

07/Endpoints

Lookup

Reference search over the local dataset, and optional flight-status lookup. Every field these fill is a suggestion the user may overwrite.
GET

/lookup/airports

Ranked airport search

Fuzzy search over IATA code, ICAO code, city, airport name and IATA metropolitan codes — LON returns the six London fields in order, NYC the three New York ones.

Answered entirely from the local dataset. No outbound request is made, so a passenger typing their route into a picker discloses it to nobody, and the endpoint is safe to call on every keystroke.

Ranking: exact IATA, then exact ICAO, then metropolitan code, then exact city, then prefix matches, then substring matches. Ties break on a coarse prominence tier, so Paris lists Charles de Gaulle above Beauvais.

Parameters

qin queryrequired
string
limitin query
integer

Responses

Ranked matches
application/json·AirportSearchResponse
200
The request did not match the expected shape
application/problem+json·Problem
400
Too many requests
application/problem+json·ProblemRetry-After — Seconds to wait
429
curl
curl -sS 'https://duesday.sohamaggarwal.com/api/v1/lookup/airports?q=heathrow'
fetch
const response = await fetch(`${BASE}/lookup/airports?q=heathrow`);
const data = await response.json();

The SDK has no dedicated method for this endpoint yet.

GET

/lookup/airlines

Ranked carrier search

Search over IATA designator, ICAO designator and carrier name. Local dataset only.

euCarrier and ukCarrier are derived from the state that granted the operating licence, not from the brand or the fleet registration — that is the test in Art. 3(1)(b) of Regulation 261/2004, and it decides whether a third-country departure into the EU is in scope at all.

Parameters

qin queryrequired
string
limitin query
integer

Responses

Ranked matches
application/json·AirlineSearchResponse
200
The request did not match the expected shape
application/problem+json·Problem
400
Too many requests
application/problem+json·ProblemRetry-After — Seconds to wait
429
curl
curl -sS 'https://duesday.sohamaggarwal.com/api/v1/lookup/airlines?q=ryanair'
fetch
const response = await fetch(`${BASE}/lookup/airlines?q=ryanair`);
const data = await response.json();

The SDK has no dedicated method for this endpoint yet.

GET

/lookup/distance

Great-circle distance, with both endpoints resolved

The wizard-facing superset of /distance, which remains the canonical endpoint. Both compute the figure through the same function, so they cannot disagree.

This one additionally accepts ICAO codes and IATA metropolitan codes, and returns each end's timezone and EU261/UK261 territorial scope — which a claim form needs anyway and would otherwise cost two further round trips.

Parameters

fromin queryrequired
string
toin queryrequired
string

Responses

Distance and both endpoints
application/json
200
The request did not match the expected shape
application/problem+json·Problem
400
No such resource
application/problem+json·Problem
404
curl
curl -sS 'https://duesday.sohamaggarwal.com/api/v1/lookup/distance?from=LON&to=JFK'
fetch
const response = await fetch(`${BASE}/lookup/distance?from=LON&to=JFK`);
const data = await response.json();

The SDK has no dedicated method for this endpoint yet.

GET

/flights

Whether flight lookup is configured in this deployment

Returns configured: false with a 200, not an error — a deployment with no flight-data provider is a supported state and the default for a fresh clone. Call this before offering a "look it up" button, rather than offering one that always fails.

Responses

Capability report
application/json
200
curl
curl -sS 'https://duesday.sohamaggarwal.com/api/v1/flights'
fetch
const response = await fetch(`${BASE}/flights`);
const data = await response.json();

The SDK has no dedicated method for this endpoint yet.

GET

/flights/{flight}

Flight status by flight number and date

Resolves a flight to its scheduled and actual times in UTC, its airports, its aircraft, its operating carrier and a computed arrival delay.

What is sent upstream. The flight number, the date, and — only for providers that cannot search any other way — the airport codes. Nothing identifying the claimant is in scope in the handler, let alone forwarded: a provider's only argument is a type with three fields, none of which can hold a name, an address or a booking reference. Nothing is persisted; the cache is in-memory, keyed by the flight and the date, and never by the caller.

Operating versus marketing carrier. Modelled separately and deliberately. EU261 Art. 2(b) puts every obligation on the *operating* air carrier, and a demand sent to the airline whose code is on the ticket is routinely refused on that ground alone. Where a provider does not name the operator directly, it may be derived from the ATC callsign — and where it is, limitations says so.

Honesty requirements on any consumer of this response. Every value here is a suggestion. It must be labelled as looked up, attributed to source, and left editable. Never substitute a provider's delay figure for the user's own: where they disagree, show both. A claim is the claimant's statement of fact and they were on the aeroplane.

503 is a normal answer. With no provider configured — the default for a fresh clone — this returns a 503 problem detail saying so and pointing at manual entry. The whole claim flow works with this endpoint switched off.

Parameters

flightin pathrequired
Carrier designator and number, IATA or ICAO, e.g. BA117 or BAW117.
string
datein queryrequired
Local calendar date of scheduled departure at the origin — the date on the boarding pass.
string · date
fromin query
Origin airport, if already known. A hint: providers that search by flight number ignore it, and ADS-B providers cannot answer without it.
string
toin query
Destination airport, same role as from.
string

Responses

Flight resolved
application/json·FlightStatusResponse
200
The request did not match the expected shape
application/problem+json·Problem
400
No configured source had this flight. Not evidence the flight did not run.
application/problem+json·Problem
404
Too many requests
application/problem+json·ProblemRetry-After — Seconds to wait
429
No provider is configured, or none covers that date. Enter the details by hand.
application/problem+json·Problem
503
curl
curl -sS 'https://duesday.sohamaggarwal.com/api/v1/flights/BA117?date=2026-07-14'
fetch
const response = await fetch(`${BASE}/flights/BA117?date=2026-07-14`);
const data = await response.json();

The SDK has no dedicated method for this endpoint yet.

08/Limits

What stops you, and when.

Read from the token buckets and the body cap the handlers actually enforce.

Limiting is a per-IP token bucket: a burst up to the capacity, then a steady refill. Nothing is billed and nothing is throttled by account, because there are no accounts. The evaluation endpoints run every registered jurisdiction against your facts, so they are CPU-bound and get the tighter bucket.

Compute endpoints
Burst of 30, refilling at 0.5/second — about 30 a minute sustained. Once empty, one request frees up every 2s.POST /evaluate · POST /dashboard/library/render
30/burst
Read endpoints
Burst of 120, refilling at 4/second — about 240 a minute sustained. Once empty, one request frees up every 1s.GET /dashboard/library/templates · GET /health · GET /rules · GET /rules/{id} · GET /jurisdictions · GET /airports/{iata} · GET /distance · GET /lookup/airports · GET /lookup/airlines · GET /lookup/distance · GET /flights · GET /flights/{flight}
120/burst
Request body
Checked against Content-Length first, then counted while reading — a chunked request can omit the header entirely. Over the cap returns 413 before anything is parsed.
256KiB
Content type
POST bodies must declare application/json. Anything else is refused with 415 rather than guessed at.
application/json

Every successful response carries

RateLimit-Limit
30
RateLimit-Remaining
29
RateLimit-Reset
1787884373

A 429 additionally carries Retry-After in seconds. Honour it — the bucket is per IP, and retrying immediately only takes the slot from whatever else is behind the same address.

09/Errors

RFC 9457, all the way down.

Rendered by calling the same functions that build the responses in production.

Every failure is an application/problem+json document with a stable type URI you can switch on, rather than an ad-hoc { "error": "bad request" }. Validation failures carry a per-field errors array, so a client can point a user at the field they got wrong instead of re-rendering the whole form.

Internal errors return a short correlation reference and never an exception message. A rules-engine throw can contain a claimant’s booking reference or home address, and that must not come back over the wire even to the caller who sent it.

Stable type URIs

validation
https://duesday.sohamaggarwal.com/problems/validation-failed
notFound
https://duesday.sohamaggarwal.com/problems/not-found
methodNotAllowed
https://duesday.sohamaggarwal.com/problems/method-not-allowed
rateLimited
https://duesday.sohamaggarwal.com/problems/rate-limited
payloadTooLarge
https://duesday.sohamaggarwal.com/problems/payload-too-large
unsupportedMediaType
https://duesday.sohamaggarwal.com/problems/unsupported-media-type
internal
https://duesday.sohamaggarwal.com/problems/internal-error
422 — The request body did not match the expected shape
{
  "type": "https://duesday.sohamaggarwal.com/problems/validation-failed",
  "title": "The request body did not match the expected shape",
  "status": 422,
  "detail": "One or more fields are missing or malformed. See `errors` for the specific problems.",
  "instance": "/api/v1/evaluate",
  "errors": [
    {
      "field": "arrivalDelayMinutes",
      "message": "Required",
      "code": "invalid_type"
    },
    {
      "field": "incidentDate",
      "message": "Expected string, received number",
      "code": "invalid_type"
    }
  ]
}

The body parsed but did not match the schema.

404 — Not found
{
  "type": "https://duesday.sohamaggarwal.com/problems/not-found",
  "title": "Not found",
  "status": 404,
  "detail": "No rule module with id \"air.nonexistent\".",
  "instance": "/api/v1/rules/air.nonexistent"
}

No rule, template, airport or route with that identifier.

429 — Too many requests
{
  "type": "https://duesday.sohamaggarwal.com/problems/rate-limited",
  "title": "Too many requests",
  "status": 429,
  "detail": "Slow down and retry in 2 seconds."
}

The per-IP bucket is empty. `Retry-After` is sent as a header too.

413 — Request body too large
{
  "type": "https://duesday.sohamaggarwal.com/problems/payload-too-large",
  "title": "Request body too large",
  "status": 413,
  "detail": "The body must be at most 262144 bytes."
}

The request body exceeded 262,144 bytes.

415 — Unsupported media type
{
  "type": "https://duesday.sohamaggarwal.com/problems/unsupported-media-type",
  "title": "Unsupported media type",
  "status": 415,
  "detail": "Send `Content-Type: application/json`."
}

The request did not declare `Content-Type: application/json`.

500 — Something went wrong on our side
{
  "type": "https://duesday.sohamaggarwal.com/problems/internal-error",
  "title": "Something went wrong on our side",
  "status": 500,
  "detail": "This has been logged. Quote the reference below if you report it.",
  "reference": "k7m2q4xr"
}

A rule module threw. The message is never echoed — it can contain a claimant’s booking reference.

10/Cross-origin

Callable from a browser.

Read from next.config.ts, which is the file that sets these headers.

The API is open to any origin. There is nothing to protect with a same-origin rule: no cookie is read, no session is consulted, and no request is authenticated, so an allow-list would cost integrators something and buy nobody anything. Every route also answers OPTIONS with a 204 for preflight.

Access-Control-Allow-Origin
*
Access-Control-Allow-Methods
GET, POST, OPTIONS
Access-Control-Allow-Headers
Content-Type, Accept-Language
Access-Control-Max-Age
86400

Note the absence of Access-Control-Allow-Credentials: there are no credentials to send.

11/Schemas

21 shapes.

Money is always an integer count of minor units. Nothing in this API is a float.

AirlineMatch

object
iatarequired
string
icaorequired
string
namerequired
The licensed legal entity, which is who a letter is addressed to — not the trading brand.
string
countryrequired
State that granted the operating licence, not the headquarters.
string
euCarrierrequired
A "Community carrier" under Art. 2(c) of Regulation 261/2004.
boolean
ukCarrierrequired
boolean
hasClaimChannel
We carry a complaint address or form for this carrier.
boolean
note
string
score
number
matchedOn
iata · icao · name · city · alias
string

AirlineSearchResponse

object
query
string
count
integer
source
local
string
note
string

AirportMatch

object
iatarequired
string
icaorequired
string
namerequired
string
cityrequired
string
countryrequired
ISO 3166-1 alpha-2. EU outermost regions carry their own code — Réunion is RE, not FR — so a naive country === "FR" test drops them from EU261 scope.
string
latrequired
number
lonrequired
number
timeZonerequired
IANA identifier, for rendering local time. Never used for arithmetic.
string
eu261required
Inside Regulation (EC) 261/2004 territorial scope.
boolean
uk261required
boolean
score
Relevance. Exposed so a caller can see why an order came out as it did.
number
matchedOn
iata · icao · name · city · alias
string

AirportSearchResponse

object
query
string
count
integer
source
local
string
note
string

Citation

object
labelrequired
string
instrumentrequired
string
pinpoint
string
url
string · uri
verifiedOn
string · date

ClaimCategory

string
  • flight-disruption
  • baggage
  • rental-deposit
  • unclaimed-property
  • card-billing
  • subscription
  • unwanted-calls
  • rail-delay
  • parcel-delay
  • medical-billing
  • data-rights
  • class-action
  • hidden-fees

EvaluateRequest

object
claimrequired
A discriminated union keyed on category. See /rules for what each category supports.
object
asOf
Evaluation date. Every deadline is computed from this, so passing it explicitly makes results reproducible.
string · date
language
string
displayCurrency
pattern ^[A-Z]{3}$
string
includeLowConfidence
Include regimes we could not verify from primary sources. Off by default; these always carry a warning.
boolean
includeOutOfScope
boolean

EvaluateResponse

object
asOf
string · date
evaluations
Evaluation[]
actionable
Evaluation[]
bestTotal
MoneyRange
theoreticalMax
MoneyRange
groups
object[]
missing
object[]
urgentDeadline
object
warnings
string[]
stats
object
disclaimer
string

Evaluation

object
ruleIdrequired
string
ruleNamerequired
string
categoryrequired
ClaimCategory
verdictrequired
Verdict
confidencerequired
high · medium · low
string
components
object[]
remedies
object[]
deadlines
object[]
escalation
object[]
citations
Citation[]
missing
object[]
letterTemplates
string[]
anticipatedDefences
object[]
warnings
string[]

FlightCarrier

object
iata
string
icao
string
name
string

FlightEndpoint

object
iata
string
icao
string
name
string
terminal
string
scheduledUtc
UTC, ISO 8601, always ending in Z. Absent for ADS-B sources, which observe but do not plan.
string · date-time
actualUtc
string · date-time
actualIsEstimate
True when actualUtc is a projection rather than an observation. A claim resting on an estimate is one an airline can rebut with its own record.
boolean
timeZone
string

FlightStatus

object
flightNumberrequired
string
daterequired
string · date
departurerequired
FlightEndpoint
arrivalrequired
FlightEndpoint
marketingCarrier
Whose code is on the ticket.
FlightCarrier
operatingCarrier
Who actually flew it. Under EU261 Art. 2(b) this is the carrier a claim must be addressed to.
FlightCarrier
codesharerequired
false from a provider that models no codeshare data means "not known to be", not "is not" — check limitations.
boolean
aircraftType
string
registration
string
statusrequired
scheduled · active · landed · cancelled · diverted · unknown
string
arrivalDelayMinutes
Difference of two UTC instants, positive for late, truncated toward zero so a near-threshold delay is never overstated. Absent when either end is unknown.
integer
departureDelayMinutes
integer
sourcerequired
LookupSource
limitationsrequired
What this particular answer cannot tell you. Render verbatim; an empty array is not a claim of certainty.
string[]

FlightStatusResponse

object
prefill
The same facts shaped for a claim form. provenance maps each filled field to the source that supplied it; rendering the values without it misrepresents a data feed as the claimant's own testimony. stillNeeded lists what no feed can answer.
object
attribution
string
providers
Every provider consulted, skipped or failed, with the reason. The reasons are the useful part.
object[]
editable
boolean
note
string

Health

object
status
string
service
string
apiVersion
string
coverage
object

LookupSource

object

Where a looked-up value came from. Must be rendered alongside the value it explains.

providerrequired
string
providerNamerequired
string
attributionrequired
Display this next to the data. Several providers require it.
string
providerUrlrequired
string · uri
retrievedAtrequired
string · date-time
cachedrequired
Served from an in-memory TTL cache keyed by the flight, never by the caller.
boolean

Money

object

An integer count of minor units plus an ISO 4217 code. { "amount": 60000, "currency": "EUR" } is EUR 600.00. Never a float — rounding a statutory award through IEEE-754 misstates it.

amountrequired
integer
currencyrequired
pattern ^[A-Z]{3}$
string

MoneyRange

object
minrequired
Money
maxrequired
Money
exact
Present when the rule yields a single deterministic figure.
Money

Problem

object

RFC 9457 problem detail.

typerequired
string · uri
titlerequired
string
statusrequired
integer
detail
string
instance
string
errors
object[]

RenderLetterRequest

object
claimrequired
object
templateIdrequired
string
ruleIdrequired
string
claimantrequired
object
recipientrequired
object
language
string
asOf
string · date
responseDays
integer
additionalFacts
string
rejectionText
What the counterparty said when they refused, for rebuttal templates.
string
formats
text · markdown · html · blocks
string[]

TraceStep

object

One recorded decision step. The trace is why a figure can be walked back to the check that produced it.

coderequired
string
labelrequired
string
outcomerequired
pass · fail · inconclusive · info
string
detailrequired
string
observed
object
citation
Citation

Verdict

string
  • eligible
  • ineligible
  • out-of-scope
  • needs-more-info
  • time-barred

Take it. It is meant to be taken.

The engine, the catalogue, the letters and this documentation are AGPL-3.0-or-later. Run your own copy, fork the rules for a jurisdiction we have missed, or send the correction back.