---
title: "Full field-of-membership record for one credit union"
method: GET
path: "/v1/credit-unions/{id}/eligibility"
tags: ["Reference Data"]
---

# Full field-of-membership record for one credit union

`GET /v1/credit-unions/{id}/eligibility`

## Request

- Base URL: `https://api.rateapi.dev`
- URL: `https://api.rateapi.dev/v1/credit-unions/{id}/eligibility`
- Auth: API key in header `X-API-Key`

Returns the complete published membership-eligibility record ("who can join") for one credit union: charter shape, geography arrays, employer groups, associations, occupations, military/school/place-of-worship affinities, the cost to join, and provenance (`source`, `confidence`, `evidence_url`, `extracted_at`). Long employer lists live here rather than inlined on ranked offers.

The `id` is the composite credit-union id (`name|city|STATE`) returned by the rate and decision surfaces — URL-encode it. Any `/v1/rates` row's `eligibility.details` field already contains a ready-made path to this endpoint.

This endpoint reports published criteria; it never asserts that an individual is ineligible. Day-cacheable at the edge.

**Authentication required**: Pass your API key in the `X-API-Key` header.

## Path parameters

- `id` string, required

## Response `200`

The credit union's full membership-eligibility record.

- CreditUnionEligibilityRecord: Published membership criteria and provenance for one credit union. This is guidance only; the institution makes the final membership determination.
  - `credit_union_id` string, required: Canonical identifier of the credit union.
  - `eligibility_type` string, required: How membership is defined for this credit union — for example community, employer, association, or military.
  - `open_to_anyone` boolean, required: True when anyone can join, typically via an association or donation path.
  - `join_path` string, nullable: How a non-qualifying borrower can still become eligible, or null when no such path is documented.
  - `geo_states` string[], required: US state codes whose residents qualify on geography alone.
  - `geo_counties` string[], required: Counties whose residents qualify on geography alone.
  - `geo_cities` string[], required: Cities whose residents qualify on geography alone.
  - `employers` string[], required: Employers whose staff qualify for membership.
  - `associations` string[], required: Associations whose members qualify, including any that can be joined to gain eligibility.
  - `occupations` string[], required: Occupations that qualify for membership.
  - `military` object: Military-service eligibility, and the evidence it was read from.
    - `eligible` boolean: True when military service is a documented path to membership.
    - `affiliations` string[]: The specific branches, bases, or service statuses that qualify.
    - `evidence` string: The extracted text supporting the military eligibility rule.
  - `worship_orgs` string[]: Congregations or religious organizations whose members qualify.
  - `schools` string[]: Schools or districts whose students, staff, or alumni qualify.
  - `family_membership` boolean, nullable: True when a family member of an existing member qualifies, or null when unknown.
  - `membership_fee_usd` number, nullable: One-time membership fee in US dollars, or null when unknown.
  - `min_deposit_usd` number, nullable: Minimum opening share deposit in US dollars, or null when unknown.
  - `requirements_summary` string, nullable: Plain-language summary of what membership requires, or null when none was extracted.
  - `source` string, nullable: Where the eligibility rules were read from, or null when unattributed.
  - `confidence` number, nullable: Confidence in the extracted rules, 0–1, or null when not scored.
  - `evidence_url` string, uri, nullable: Page the eligibility rules were extracted from, or null when unattributed.
  - `extracted_at` string, date-time, nullable: When the eligibility rules were last extracted, or null when unknown.
  - `updated_at` string, date-time, nullable: When this eligibility record was last written, or null when unknown.
  - `rules` object[]: The returned rules we hold. When `publication` is present, these are exactly the active publication's rules; otherwise they are the compatibility/current held set. Bundle integrity does not attest that every possible field-of-membership path is known.
    - `rule_id` integer, required: Stable identifier of this published rule.
    - `kind` string, required: Membership-path category represented by this rule.
    - `description` string, nullable: Deterministic human-readable rule description, or null.
    - `conditions` object[], required: Conditions that must all hold for this membership path.
      - `kind` string, required: Machine-readable condition kind.
      - `text` string, required: Deterministic rendering of this condition.
      - `negated` boolean: True when this condition is an exclusion.
      - `geo_level` string: Geographic level such as state, county, city, or ZIP.
      - `geo_value` string: Canonical geographic key used by the evaluator.
      - `org_name` string: Canonical organization name, or the raw name when unresolved.
      - `org_unresolved` boolean: True when org_name is evidence text rather than a resolved entity.
      - `family_relations` string[]: Family relationships accepted by this condition.
    - `evidence_quote` string: Verbatim source excerpt supporting this rule.
    - `evidence_same_as_rule_id` integer: Rule carrying the shared quote when duplicate evidence was compacted.
    - `source_url` string, uri: Source URL from which the supporting evidence was captured.
    - `source_type` string: Acquisition/source role of the supporting artifact.
    - `verification_status` string, required: How far evidence and semantic verification progressed.
    - `confidence` number, required: Confidence in this verified rule, from 0 to 1.
    - `observed_at` string, date-time: When the source evidence was observed.
    - `last_confirmed_at` string, date-time: Most recent live acquisition that confirmed this rule.
  - `rules_summary` object: Deterministic summary of the returned held rules. When `publication` is present, it summarizes that exact active publication; otherwise it summarizes the compatibility/current held set. It is not a closed-world completeness attestation.
    - `total` integer, required: Number of rules in the returned held set.
    - `by_kind` object, required: Rule counts grouped by membership-path kind.
    - `counties_served` integer, required: Distinct county conditions represented by the rule set.
    - `last_verified` string, date-time, nullable, required: Freshest source confirmation across the rule set, or null.
    - `compacted` boolean: True when duplicate evidence quotes were compacted by reference.
  - `publication` EligibilityPublicationRef: Exact immutable active eligibility generation evaluated for this response.
    - `publication_id` integer, required: Database identifier of the active publication.
    - `ruleset_sha256` string, required: SHA-256 digest of the complete ordered rule set.
    - `activated_at` string, date-time, required: When this generation became serving authority.
    - `proposal_coverage` EligibilityProposalCoverage: How many model-proposed claims from the source page survived evidence verification. This is not an attestation that every real-world field-of-membership path is known.
      - `scope` 'source_page_model_proposals', required: Metric scope, explicitly limited to model proposals extracted from reviewed source pages.
      - `proposed_claims` integer, required: Claims proposed by extraction from the reviewed source pages.
      - `verified_claims` integer, required: Proposed claims that passed evidence verification.
      - `published_rules` integer, required: Verified graph rules published from the candidate.
      - `withheld_claims` integer, required: Proposed claims withheld because verification did not pass.
      - `proposal_survival` number, nullable, required: Verified claims divided by proposed claims, or null when no claims were proposed.
      - `withheld_reasons` object, required: Withheld claim counts grouped by machine-readable verification reason.
  - `authority` object: Present with an active publication. It identifies `rules` as the authoritative immutable generation and marks the older flat record fields as a compatibility projection, not decision proof.
    - `rules` 'active_publication', required: Authority used for the returned rules array.
    - `flat_fields` 'legacy_projection_non_authoritative', required: Authority classification of the compatibility flat fields.
    - `publication_id` integer, required: Exact active publication that supplied the rules.
    - `ruleset_sha256` string, required: Immutable identity hash of that publication's ruleset.
  - `disclosure` string, required: Disclosure text that must be shown with these rules: they are extracted from published sources and the credit union decides eligibility, not this API.

## Other responses

- `400`: The request was malformed — a missing required field, an unparseable body, or a parameter outside its allowed range. The `error` field names what was wrong; retrying the identical request will fail identically.
- `401`: No API key, or a key that is unknown or disabled. Send it in the `X-API-Key` header. Free keys are issued instantly by POST /keys with an email address. The response carries `WWW-Authenticate` pointing at this host's protected-resource metadata, and the `RateLimit-*` headers describing the Free-tier budget a key issued now would carry (scope `anonymous`) — a rejected request spends none of it, so `Remaining` equals `Limit`.
- `402`: The key is valid, but RateAPI Routes is available only on Enterprise. The response includes `required_plan`, `upgrade_url`, and a `Link` header with `rel="upgrade"`; the rejected request does not consume quota.
- `404`: No resource matches the identifier supplied. For rate queries an empty result set is a 200 with an empty array, so a 404 here means the resource itself does not exist.
- `429`: Quota exhausted for the current window. `Retry-After` gives the seconds to wait; `upgradeInfo` explains how to lift the cap. Retrying before the reset will fail again and still counts as a request.

---

[API](https://skmtc.dev/rateapi/apis/rate-api.md) · [All operations](https://skmtc.dev/rateapi/apis/rate-api/llms.txt) · [OpenAPI document](https://skmtc.dev/rateapi/apis/rate-api/revisions/06a6db76995f?raw)
