← REACHABLE Developer API About
For developers, state agencies, and integrators

ABLE data, as an API.

Read-only JSON endpoints for ABLE eligibility rules, state plan fees, QDE tags, and interaction rules with public benefits. Free to use with attribution. Rate limited to 1,000 requests per hour per IP.

Base URL: https://api.riseilab.org/able/v1

What you can build

Endpoints
GET/eligibility

Check ABLE eligibility

Returns eligibility outcome and annual contribution capacity given age, disability onset, employment, and state.

Query params:
  onset_age    integer  Age at disability onset. Required.
  age          integer  Current age. Required.
  working      boolean  Working with earned income. Default false.
  state        string   Two-letter state code. Default "US".

Example: GET /eligibility?onset_age=32&age=40&working=true&state=IL

Response:
{
  "eligible": true,
  "annual_cap": 20000,
  "working_earner_bonus": 15650,
  "total_cap": 35650,
  "reason": "Onset before age 46",
  "ssi_shield_ceiling": 100000,
  "medicaid_cap": 596925,
  "state": "IL",
  "state_plan": "Illinois ABLE"
}
GET/plans

List state ABLE plans

Returns all 51 state ABLE plans with fees, features, and residency rules. Cached daily.

Query params (optional):
  state        string   Filter by state code
  sort         string   "fee" | "cap" | "name"

Example: GET /plans?sort=fee

Response:
[
  {
    "state": "CA",
    "plan_name": "CalABLE",
    "annual_fee_pct": 0.35,
    "medicaid_cap": 596925,
    "tax_deduction": false,
    "residency_required": false,
    "url": "https://www.calable.ca.gov/",
    "investment_options": ["Cash", "Conservative", "Moderate", "Aggressive"]
  },
  // ...50 more
]
GET/qde/{expense}

Check Qualified Disability Expense

Returns whether a plain-text expense is a QDE. Uses semantic search over 100+ tagged expense examples.

Path params:
  expense      string   Free-text expense description

Example: GET /qde/gym%20membership

Response:
{
  "query": "gym membership",
  "tag": "gray",
  "category": "Health",
  "guidance": "Gray area. Ask plan admin. Keep receipt showing therapeutic benefit.",
  "similar_examples": ["physical therapy", "personal trainer"]
}
GET/benefits/interaction

ABLE-benefits interaction rules

Returns how ABLE interacts with each public benefits program.

Query params (optional):
  program      string   Filter by program code (SSI, SSDI, Medicaid, ...)

Example: GET /benefits/interaction?program=SSI

Response:
{
  "program": "SSI",
  "excluded_amount": 100000,
  "treatment": "Balances up to $100k excluded from asset test. Above $100k, SSI suspended (not lost).",
  "citation": "POMS SI 01130.740",
  "source_url": "https://secure.ssa.gov/apps10/poms.nsf/lnx/0501130740",
  "last_updated": "2025-10-01"
}
GET/simulate/growth

Simulate ABLE balance growth

Returns 25-year balance projection given inputs. Same model as ABLE Simulator.

Query params:
  monthly              number   Monthly contribution
  employer_match       number   Employer match monthly
  working_bonus        number   Annual working-earner bonus
  starting_balance     number   Current balance
  allocation           string   cash | conservative | moderate | aggressive
  fee_pct              number   Annual plan fee
  inflation            number   Real-return adjustment

Example: GET /simulate/growth?monthly=200&employer_match=50&allocation=moderate

Response:
{
  "projection": [
    { "year": 1, "balance": 3210, "deposits": 3000, "growth": 210 },
    { "year": 5, "balance": 17842, "deposits": 15000, "growth": 2842 },
    // through year 25
  ]
}
GET/data/state-year

State-year adoption panel

Returns state-year ABLE adoption metrics from 2016 to present. Data source: State ABLE program reports, aggregated by RISEI Lab.

Response format: CSV or JSON via Accept header.

Fields:
  state       string
  year        integer
  accounts    integer   Total open accounts end of year
  contribs    number    Total contributions ($M)
  avg_balance number    Average balance

Example: GET /data/state-year?state=IL&format=json

[
  { "state": "IL", "year": 2018, "accounts": 2100, "contribs": 6.2, "avg_balance": 3450 },
  // ...
]
Authentication & rate limits

The API is currently open (no authentication required). Rate limit: 1,000 requests per hour per IP. For higher volume, contact us at api@riseilab.org for a key. Please cite RISEI Lab in derivative products. All data is refreshed daily from authoritative federal and state sources.

Related tools
REACHABLE is built by the RISEI Lab at Northwestern University with support from the U.S. Department of Health and Human Services