API
The full contract is an OpenAPI 3.1 document. Reads need no key.
Look up
curl -s https://txfacts.hulvik.se/v1/lookup \
-H 'content-type: application/json' \
-d '{"items":[{"key":"klarna*ikea.se","format":"amex"}]}'
Send keys scrubbed with @txfacts/normalize, never raw statement text; the server refuses
anything its own scrubber would change. For a stronger guarantee, use GET /v1/range/<first 5 hex of
the key hash> and match locally: the server never learns which text you asked about.
Contribute
GET /v1/keys/challenge, then find asolutionsuch thatsha256(challenge + ":" + solution)starts withdifficultyzero bits.POST /v1/keyswith both. The key is shown once and is not linked to you.POST /v1/contributionsorPOST /v1/voteswithAuthorization: Bearer <key>.
Contribute facts about merchants, never preferences: if a supermarket purchase was a gift in your own budget, that stays in your app.