Money2046 Agent API — Score Contract

Canonical reference for agents and LLMs consuming Money2046. Short version: public/agents.md. Feeds: /data/v1/*.json (build-time generated, versioned, static). Scoring: pure functions in src/lib/calc.js + src/lib/dispositions.js. Primary object: advertised vs settled for machine payments. Card spend and MYR corridors are secondary. CHAIN flow is gated by docs/chain-addendum.md — no aggregate payment count in these feeds.


1. Dispositions

Enum Meaning
SCHEMA_ONLY Schema/estimate values only, zero verified evidence. NOT fact.
VERIFIED_FRESH Verified (certified-adapter payload or human review) within 30 days. Fact.
STALE_REVERIFY Was verified, older than 30 days. Re-verify before reliance.
UNAVAILABLE Not available/eligible in the stated jurisdiction (cards: myGate = unlikely → MY).
INSUFFICIENT_EVIDENCE Cannot score — required fields or evidence missing.

Freshness window: 30 days (FRESH_DAYS in src/lib/dispositions.js, isFresh(record, 30) in src/lib/calc.js). Missing date ⇒ not fresh (fail closed).


2. Feeds

All feeds share: schema (versioned id), asOf (ISO build time), rule (human-readable fail-closed rule), plus their payload. Pending evidence appears only as a count in meta.

catalog.json (money2046.catalog.v1)

quotes.json (money2046.quotes.v1)

card-evidence.json (money2046.card-evidence.v1)

observations.json (money2046.observations.v1)

wallets.json (money2046.wallets.v1)

agent-index.json (money2046.agent-index.v1)

registry-epochs.json (money2046.registry-epochs.v1)

chain-flow.json (money2046.chain-flow.v1)

onchain (money2046.onchain.v1, index money2046.onchain-index.v1)

Conditions an agent needs before it moves money or takes a position. Human hub: /onchain/. Contract anchor: /onchain/#contract. Design: docs/onchain.md. This is not the CHAIN payment-count surface and it does not satisfy docs/chain-addendum.md.

card-index.json (money2046.card-index.v1)

index.json (money2046.index.v1)

watch.json (money2046.watch.v1)

score-examples.json (money2046.score-examples.v1)

openapi.json

OpenAPI 3.1: resources + Disposition enum + ScoreCardRequest/ScoreResponse schemas. Live scoring endpoints are not deployed; the schemas describe the contract the examples already implement.


3. score_card

Request shape (as mirrored by agents until a live endpoint exists):

{
  "cardId": "cryptocom-indigo",
  "monthly": 3000,
  "crossPct": 0.5,
  "opts": { "alreadyHoldStake": false }
}

Response shape:

{
  "disposition": "SCHEMA_ONLY",
  "score": {
    "annual": 36000,
    "grossCashback": 540,
    "netCashback": 459,
    "rewardHaircut": 81,
    "fxCost": 144,
    "fundingCost": 288,
    "fees": 0,
    "stakingCost": 0,
    "net": 27,
    "netLow": 24.84,
    "netHigh": 29.16,
    "costPerRm100": 99.93,
    "band": 0.08,
    "stages": { "funding": 288, "conversion": 144, "fees": 0, "rewards": 459, "staking": 0 }
  },
  "assumptions": ["..."],
  "asOf": "2026-08-11T00:00:00.000Z",
  "evidenceIds": []
}

Model (must match cardReviewModel):

Agent rules:


4. score_route

{
  "request": { "corridor": "USD-MYR", "provider": "Wise", "amount": 1000, "currency": "USD" },
  "response": {
    "disposition": "INSUFFICIENT_EVIDENCE",
    "score": null,
    "reason": "No verified quote for this corridor yet. Schema-only rates must not be used.",
    "assumptions": [],
    "asOf": "...",
    "evidenceIds": []
  }
}

When verified quotes exist: score = { recipient, rate, feePct } via estimateRecipient — recipient_gets is NET; rate × amount; never deduct the fee again (a known historical bug class in this codebase — do not reintroduce).


5. Ingest (propose evidence)

Agents cannot self-approve. Pipeline:

Card spend (observations ledger):

  1. CSV per docs/card-capture-protocol.md (template: docs/card-capture-template.csv).
  2. node scripts/card_spend_import.mjs --file <csv> → pending SETTLEMENT rows with vault hash.
  3. Human gate: node scripts/card_spend_import.mjs --verify <id>. consent=false is REFUSED.
  4. Verified rows flow into observations.json and card-index.json on next build.

Routes / legacy card evidence:

  1. python3 scripts/quotes_import.py --file <csv> or scripts/card_evidence_import.py.
  2. Human --verify <id>. Next build publishes to feeds.

x402 discovery (automated): npm run observe:x402 via certified QUOTE adapter; QUOTE rows include replay + discovery. Settlement: SETTLEMENT capability + docs/x402-probe.md. CHAIN collector is local-only (scripts/census/x402_flow.py) until docs/chain-addendum.md gates pass.

Wise quotes (automated): npm run observe:wise via certified adapter; QUOTE rows include replay.

Env MONEY2046_DATA_DIR isolates any test/agent run from real data.


6. Error / refusal semantics

Disclosure: Money2046 publishes receipts for agent payments: fee, time, fail, facilitator, chain — or INSUFFICIENT_EVIDENCE. Not financial advice. Evidence can be insufficient. We charge you in USD. Payment processing by Airwallex. Money2046 does not move customer funds and is not a wallet, an exchange, or a payment processor.