---
name: rateapi
description: Evidence-backed US credit union product matching, rates, and membership eligibility. Use when the user asks which published lending or deposit products match confirmed membership facts, which credit unions they may be able to join, whether a quote is competitive, or when a published rate moves. Membership and product evidence stay attached to every promoted match; published pricing is not approval or guaranteed availability.
homepage: https://rateapi.dev/agents/openclaw
metadata:
  {
    "openclaw":
      {
        "requires": { "bins": ["rateapi"] },
        "emoji": "🏦",
      },
  }
---

# RateAPI — match customers to credit union products, with proof

Use the globally installed RateAPI CLI for every operation when OpenClaw can run
a shell. Start with `rateapi agent --json`, verify the public contract with
`rateapi demo`, then inspect `rateapi capabilities`. Run the narrowest capability
as `rateapi run <capability-id> --input @- --confirm-request --idempotency-key <uuid> --json`,
passing JSON on stdin.

Before live data, ask permission to run `rateapi login`. It reuses an existing
credential and creates a key only when one is absent, then stores it in the OS
credential store where supported. Get explicit approval before a metered call,
skill installation, alert, or any other state-changing action. Never pass
sensitive values as shell arguments.

Coverage: ~2,950 US credit unions with fresh loan and deposit rates, re-observed daily on
weekdays, plus published membership rules for 2,800+ of them (2,836 as of 2026-08-22; the live
count is at Enterprise Routes `GET /v1/eligibility/coverage`). **Credit unions only** — not
banks, not benchmark indices, not non-US lenders. Say so instead of guessing.

## The loop (do these in order)

0. **The user gave you prose, not fields?** Run `eligibility-fact-extraction`
   with `{"text": "..."}`
   turns their own words into the fields step 1 accepts, each with the exact words it was read
   from and a `needs_confirmation` flag. It is an extractor, never a decider: the response
   carries no status, bucket or institution. Show the person `facts[]`, then send
   `person_search_body` to step 1.
1. **Who can the user join?** Run `eligibility-discovery` with any facts you have
   (`home_zip` is enough to start; `employer`, `school`+`school_relationship`, `associations`,
   `military_status`+`military_service_state`, `worship`, `occupation`, `property_*` (where they
   own property), `facility_*` (where their business has a location), `applicant_kind` (person,
   trust, organization, partnership, corporation) and `asserted_org_qualifiers` sharpen it).
   Four buckets come back: `eligible`, `conditionally_eligible` (one step, with `join_cost_usd`
   and `join_url`), `possibly_eligible`, `unknown`. **`unknown` never means no.** Every returned
   `possibly_eligible` and `unknown` item carries `missing_facts[]` when a question would help —
   the exact question to ask, the `fact_field` an answer fills, and the institution's verbatim
   `evidence_quote`. (`conditionally_eligible` needs none: the priced step already is the
   instruction.) The response also carries `next_questions[]`
   (the same questions rolled up across institutions, sorted by `unlocks_cu_count`: ask the top
   one first) and `unanswerable[]` (what we deliberately will not ask about, and why — `no_rules`,
   an unresolved organization, or a boundary such as a census tract or school district we can
   state but cannot decide). Ask a `next_questions` question, then call again. Never render a
   bare yes/no.
2. **Price only what they may reach.** Run `reachable-offers` with `person`, `product`,
   and the same confirmed eligibility facts. RateAPI evaluates the complete
   active CU fleet before intersecting graph-positive institutions with fresh, evidenced rates.
   Read `reachable_now`, `reachable_after_action`, `unresolved`, and `no_published_offer`
   separately. Lead only with the first two; incomplete proof or a missing published offer is
   unknown, not unavailable.
   Use `rate-shopping` only when the user needs underwriting-oriented financing analysis
   beyond membership routing. Published pricing is not approval or guaranteed final availability.
3. **Check a quote they already have.** Choose the quote-check capability returned by
   `rateapi capabilities` and supply the quoted APR and
   product — returns good / fair / beatable against live offers, not a remembered average.
4. **Watch instead of poll.** Use `rate-alerts` to subscribe the user to email alerts for a
   product, state and threshold. Alerts follow scrape cadence; do not promise real time.

The CLI capability catalog maps every flow to its backing REST route and MCP tool.

## Rules

- Quote every rate as **"X% APR at <institution>, observed <as_of>, per its published page"**.
  Never a bare number.
- Membership is required first; published pricing is not an offer, a pre-approval or a
  commitment to lend. Final terms come from the institution after underwriting.
- Benchmarks (`GET /v1/benchmarks`) are **credit union medians**. Never say "national average".
- An empty result means "nothing fresh enough", not "no such product". Rates outside the
  freshness window are suppressed on purpose.
- No credit score, income or debt is needed for eligibility; do not ask for them to decide who
  the user can join.

## Optional direct MCP connection

Use this only for a hosted/no-shell agent or when the user explicitly requests a
persistent native tool connection. The same tools are served at
`https://mcp.rateapi.dev/mcp?profile=personal` (streamable HTTP,
header `x-api-key`; the `profile=personal` suffix narrows the 89-tool registry to the consumer
surface, in loop order). For OpenClaw builds that spawn stdio MCP servers, bridge it in `~/.openclaw/openclaw.json`:

```json
{
  "mcpServers": {
    "rateapi": {
      "command": "npx",
      "args": ["-y", "mcp-remote", "https://mcp.rateapi.dev/mcp?profile=personal", "--header", "x-api-key:${RATEAPI_API_KEY}"],
      "env": { "RATEAPI_API_KEY": "${RATEAPI_API_KEY}" }
    }
  }
}
```

Full agent contract: https://rateapi.dev/.well-known/agent-instructions.md
