API v1 · Stable

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

  1. Create an account and subscribe to a plan. API access is included on every paid tier; the free tier is UI-only.
  2. Generate a key from /app/api-keys. Keys look like ri_live_…. You see the token exactly once — store it in a password manager.
  3. Send it as a bearer token on every request:
    curl https://re-invest.ai/api/v1/markets \
      -H "Authorization: Bearer ri_live_..."
  4. Responses are { data, meta }. On error, the shape is { error, message? } with a 4xx or 5xx status code.

Authentication & rate limits

Auth

Bearer token in the Authorization header. Session cookies work for same-origin browser requests, but API keys are the supported path for programmatic access.

Rate limits

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

TierIncludesPrice
Analyst/markets, /forecasts, /series, /health$49/mo
ProfessionalEverything in Analyst + /observations + /signals$199/mo
EnterpriseEverything + higher rate limit + SLA + team keysContact

Exceeding your tier returns 403 tier_required with the required tier in the body. See pricing.

Endpoints

GET/api/v1/health
analyst+

Ping the API and the database. Unauthenticated.

Response
{
  "data": { "status": "ok", "db": "ok" },
  "meta": { "apiVersion": "v1", "timestamp": "..." }
}
GET/api/v1/markets
analyst+

List all 410 MSAs with the latest signal, YoY price, and 12-month forecast.

Query parameters
signalFilter by signalexpand | hold | contract
stateFilter by 2-letter state codeCA
limitMax rows (1-1000)100
Response
{
  "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 } }
}
GET/api/v1/forecasts
analyst+

12-month forecast point estimates with 80% prediction intervals.

Query parameters
minMinimum forecast (pp, −100 to 100)0
maxMaximum forecast (pp, −100 to 100)10
Response
{
  "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": "..." }
}
GET/api/v1/observations
professional+

Historical FHFA HPI_AT series for a single metro (quarterly).

Query parameters
cbsa5-digit CBSA code (required)35620
Response
{
  "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" }
}
GET/api/v1/signals
professional+

Latest market-signal rollup (signal class, risk grade, YoY, 12-month forecast).

Query parameters
signalFilter by signalexpand
Response
{
  "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 }
}
GET/api/v1/series
analyst+

Catalog of upstream data series the platform ingests (BLS, FRED, Census, FHFA, HUD, Zillow, Redfin).

Response
{
  "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.

Get an API key →