Program against the same data the dashboard runs on.
Six endpoints, REST over HTTPS, JSON responses. Every call is tier-gated and rate-limited per-key. Paid tiers start at the Analyst level.
Getting started
- Create an account and subscribe to a plan. API access is included on every paid tier; the free tier is UI-only.
- Generate a key from /app/api-keys. Keys look like
ri_live_…. You see the token exactly once — store it in a password manager. - Send it as a bearer token on every request:
curl https://re-invest.ai/api/v1/markets \ -H "Authorization: Bearer ri_live_..."
- Responses are
{ data, meta }. On error, the shape is{ error, message? }with a 4xx or 5xx status code.
Authentication & rate limits
Bearer token in the Authorization header. Session cookies work for same-origin browser requests, but API keys are the supported path for programmatic access.
Signin / signup / waitlist are capped at 5 requests/minute per IP. API key creation is 10/hour/user. Upstream v1 endpoints inherit the per-key tier's quota (not yet enforced per-call; subject to change with 30 days' notice).
Tiers
| Tier | Includes | Price |
|---|---|---|
| Analyst | /markets, /forecasts, /series, /health | $49/mo |
| Professional | Everything in Analyst + /observations + /signals | $199/mo |
| Enterprise | Everything + higher rate limit + SLA + team keys | Contact |
Exceeding your tier returns 403 tier_required with the required tier in the body. See pricing.
Endpoints
/api/v1/healthPing the API and the database. Unauthenticated.
{
"data": { "status": "ok", "db": "ok" },
"meta": { "apiVersion": "v1", "timestamp": "..." }
}/api/v1/marketsList all 410 MSAs with the latest signal, YoY price, and 12-month forecast.
| signal | Filter by signal | expand | hold | contract |
| state | Filter by 2-letter state code | CA |
| limit | Max rows (1-1000) | 100 |
{
"data": [
{
"cbsa": "35620",
"name": "New York-Newark-Jersey City, NY-NJ-PA",
"signal": "hold",
"risk_score": "B",
"yoy_price": 2.4,
"forecast_12m": 1.9
}
],
"meta": { "count": 410, "filters": { "signal": null, "state": null, "limit": 500 } }
}/api/v1/forecasts12-month forecast point estimates with 80% prediction intervals.
| min | Minimum forecast (pp, −100 to 100) | 0 |
| max | Maximum forecast (pp, −100 to 100) | 10 |
{
"data": [
{
"cbsa": "35620",
"name": "New York-Newark-Jersey City, NY-NJ-PA",
"point": 1.9,
"horizonMonths": 12,
"yoyRealized": 2.4,
"signal": "hold",
"riskScore": "B"
}
],
"meta": { "count": 410, "modelVersion": "v0.2", "lastRefresh": "..." }
}/api/v1/observationsHistorical FHFA HPI_AT series for a single metro (quarterly).
| cbsa | 5-digit CBSA code (required) | 35620 |
{
"data": [
{ "cbsa": "35620", "series": "fhfa.HPI_AT", "periodStart": "1995-01-01", "value": 100.0 },
{ "cbsa": "35620", "series": "fhfa.HPI_AT", "periodStart": "1995-04-01", "value": 100.6 }
],
"meta": { "count": 120, "cbsa": "35620", "series": "fhfa.HPI_AT" }
}/api/v1/signalsLatest market-signal rollup (signal class, risk grade, YoY, 12-month forecast).
| signal | Filter by signal | expand |
{
"data": [
{
"cbsa": "35620",
"name": "New York-Newark-Jersey City, NY-NJ-PA",
"signal": "hold",
"riskScore": "B",
"yoyPrice": 2.4,
"forecast12m": 1.9,
"asOf": "..."
}
],
"meta": { "count": 410 }
}/api/v1/seriesCatalog of upstream data series the platform ingests (BLS, FRED, Census, FHFA, HUD, Zillow, Redfin).
{
"data": [
{ "source": "fhfa", "name": "FHFA House Price Index",
"series": "HPI_AT", "frequency": "quarterly", "coverage": "National, State, MSA" }
],
"meta": { "count": 24 }
}Versioning + deprecation
The /api/v1 prefix is stable. Breaking changes ship under /api/v2; /v1 gets a 12-month deprecation notice via email and via the Deprecation response header before removal. Additive changes (new fields) happen in /v1without notice — clients should ignore unknown fields.