Give us a consumer. We tell you what they can actually get.

RateAPI’s eligibility API accepts consumer attributes — where they live, who they work for, where they studied, what they belong to — and returns the financial institutions that consumer appears eligible to join, what it would take to join the ones they cannot yet, and the live rates on the products those institutions offer. POST /v1/eligibility/search is the entry point.

Read the API docs →
Live endpoint, not a waitlistFree tier: 20 requests/monthEvidence on every verdictNo credit check, no PII required

The problem this solves

A rate is only useful to a consumer who can actually get it. Most rate data answers “what does this product cost?” and leaves the harder question — “can this particular person even open it?” — to you. For US credit unions that question is genuinely hard: eligibility is governed by each institution’s field of membership, published as prose across thousands of separate websites and charter documents.

  1. Consumer facts in

    Send whatever you know. Every field is optional; the endpoint needs at least one discriminating fact and gets sharper as you send more. No SSN, no date of birth, no credit pull.

  2. Institution eligibility out

    Candidates are narrowed with indexed lookups, then each is evaluated against its whole rule set — never on the strength of the one condition that surfaced it — and bucketed by verdict with its evidence.

  3. Products and rates

    Take the institutions from step 2 into POST /v1/rates or POST /v1/decisions to get the products they offer and what those products cost today.

Eligibility to join is not credit approval. This endpoint answers whether a person can become a member of an institution. Whether that institution will then approve them for a specific loan is a separate decision that belongs to the lender. Presenting an eligibility verdict to an end user as an approval would be wrong, and the API’s inline disclosure says so on every response.

The endpoints

POST/v1/eligibility/search

Person-based discovery. “Which institutions can THIS person join?” Returns four buckets with evidence. This is the endpoint most integrations start with.

GET/v1/eligibility/search

The inverse lookup. “Which institutions’ published membership area reaches this county?” Same path, different question — useful for coverage maps and geo-first product surfaces.

POST/v1/eligibility/check

Batch verdicts against a known set of institutions, for when you already have a shortlist and need it evaluated rather than discovered.

GET/v1/credit-unions/:id/eligibility

The full membership-eligibility record for one institution — every published rule, with its source and evidence quote.

Request

Every field is optional. Send what you have.

$POST /v1/eligibility/search
curl -X POST "https://api.rateapi.dev/v1/eligibility/search" \
-H "Authorization: Bearer $RATEAPI_KEY" \
-H "Content-Type: application/json" \
-d '{
"home_state": "NC",
"home_county": "Mecklenburg",
"employer": "Atrium Health",
"military_status": "veteran",
"associations": ["American Consumer Council"],
"willing_to_join_association": true,
"limit": 25
}'
home_zip
ZIP code. Resolved server-side to county and state, so this one field usually does the most work.
home_state
Two-letter state code.
home_county
County name. "Mecklenburg" and "Mecklenburg County" both resolve.
employer
Employer name, resolved against an organisation alias index — you do not need to send a canonical id.
school
School name, with school_relationship as student, alumni, or employee.
associations
Up to 20 association or membership-group names.
military_status
active_duty, veteran, reservist, dod_civilian, or military_family.
worship
Place of worship, for institutions chartered around a congregation.
willing_to_join_association
When true, institutions reachable by joining an affiliated association are surfaced as conditionally eligible rather than dropped. This one boolean typically moves the most institutions.
limit
Entries returned per bucket. Default 50, maximum 200.

Response

Four buckets, each sorted by confidence, each item carrying the evidence for its verdict.

{}200 OK
{
"counts": {
"eligible": 13,
"conditionally_eligible": 2,
"possibly_eligible": 0,
"unknown": 20
},
"candidates_evaluated": 35,
"eligible": [
{
"credit_union_id": "charlotte metro|charlotte|NC",
"name": "Charlotte Metro Credit Union",
"state": "NC",
"status": "eligible",
"confidence": 1,
"reasons": [
"You appear to be eligible to join. Qualifies: Live or work in Mecklenburg County"
],
"paths": [
{
"rule_id": 4848,
"kind": "geography",
"reason": "Qualifies: Live or work in Mecklenburg County",
"conditions_matched": ["geo_residence"],
"status": "eligible"
}
],
"engine": "graph"
}
],
"conditionally_eligible": [
{
"credit_union_id": "american 1|jackson|MI",
"name": "American 1 Credit Union",
"state": "MI",
"status": "conditionally_eligible",
"confidence": 1,
"reasons": [
"You can join by completing one additional step. Qualifies after one step: Open to anyone and Qualifying payment of $3 — requires a qualifying deposit or donation of $3."
],
"join_cost_usd": 3,
"engine": "graph"
}
],
"resolved": { "orgs": [], "geo_keys": ["state:NC", "county:NC:mecklenburg"] },
"limit": 25,
"engine": "graph+legacy_fallback",
"disclosure": "Membership eligibility is guidance based on public charter data and institution websites; final determination is made by the institution."
}
eligible
A published rule matches the facts you sent.
conditionally_eligible
One additional step qualifies them. The reason names the step, and join_cost_usd carries its cost when the rule states one.
possibly_eligible
A rule plausibly applies, but the facts you sent do not confirm it. Usually resolved by asking the user one more question.
unknown
We hold the institution but not enough rule data to judge. Unknown is NEVER treated as ineligible.
confidence
0–1. Reflects the quality of the underlying rule evidence, not the strength of the match.
paths
The structured rules that matched — rule_id, kind, and the conditions satisfied. Log these for audit; render reasons for humans.
engine
graph when the verdict came from published rules, legacy for the annotation fallback on institutions the rule graph has not reached yet.
candidates_evaluated
How many institutions were actually assessed to produce this answer.
There is no ineligible bucket, deliberately. An institution that fails every path is absent from the response rather than listed as a rejection. A false “ineligible” costs a consumer an institution they could have joined, which is a worse error than an honest “unknown” — so the API refuses to make it.

Consumer → institution → product → rate

Eligibility on its own is half an answer. The other half is what the eligible institutions actually sell, and for how much.

$Pricing the eligible set
# 2. Now price the products those institutions actually offer.
curl -X POST "https://api.rateapi.dev/v1/rates" \
-H "Authorization: Bearer $RATEAPI_KEY" \
-H "Content-Type: application/json" \
-d '{ "product_type": "auto_loan", "state": "NC", "sort": "apr_asc", "limit": 25 }'
For a ranked answer rather than raw rows, POST /v1/decisions takes the same consumer context and returns ordered offers with the reasoning attached — see the recommendation API.

Coverage and freshness

Institutions
Thousands of US credit unions, with membership rules sourced from public charter data and institution websites.
Rule provenance
Every rule carries its source and an evidence quote. You can always see why a verdict was reached.
Rate freshness
Rate rows carry an as_of timestamp and are filtered for freshness before they are served. See /data-coverage for the current windows.
Rule coverage
Not every institution has machine-readable rules yet. Those land in unknown rather than being guessed at — coverage gaps shrink the answer’s confidence, never its recall.

Frequently asked