REST API v1.
Read-only access to Maturr's CRE loan-level data. Five endpoints, JSON in, JSON out. Authenticated with a Bearer API key. Included on Advanced and Enterprise plans.
Machine-readable OpenAPI 3.1 spec: /api/v1/openapi.json
Quick start
- Be on the Advanced or Enterprise plan. Upgrade at Settings → Billing.
- Create a key at Settings → API keys. The full token is displayed once — copy it immediately.
- Send it as a Bearer header on every request:
curl 'https://www.maturr.io/api/v1/properties?msa_id=33100&limit=5' \ -H 'Authorization: Bearer YOUR_API_KEY'
Authentication
Every request must include an Authorization: Bearer <token> header. Tokens are opaque 32-byte hex strings. We never store the raw token — only its SHA-256 hash — so once the dashboard closes the create dialog, neither you nor Maturr support can recover it; create a new key instead.
Keys are scoped to a single user account. The owner's plan determines the rate limit (see below). Keys can be revoked from the dashboard immediately. Pro-plan keys created before 2026-05-28 are revoked automatically.
Endpoints
/api/v1/propertiesSearch properties
Filter and paginate the property index. Mirrors every filter on the in-app /search page. Returns up to 5,000 rows per page. Pass format=geojson for a FeatureCollection suitable for map rendering.
Parameters
- msa_id
- 5-digit CBSA code.
- state_code
- 2-letter US state.
- bbox
- `south,west,north,east`.
- property_types
- Comma-separated. multifamily, office, retail, …
- distress
- Comma-separated. AND-combined.
- maturity_window
- 3m / 6m / 12m / 24m / 36m.
- dscr_min / dscr_max / occupancy_min / occupancy_max / ltv_min / ltv_max
- Numeric ranges.
- balance_min / balance_max
- Loan balance USD.
- sort
- balance_desc (default), balance_asc, maturity_asc, maturity_desc, name_asc.
- limit / offset
- Default limit 1000, max 5000.
- format
- json (default) or geojson.
Example
curl 'https://www.maturr.io/api/v1/properties?msa_id=33100&property_types=multifamily&limit=10' \
-H 'Authorization: Bearer YOUR_API_KEY'const res = await fetch(
'https://www.maturr.io/api/v1/properties?msa_id=33100&property_types=multifamily&limit=10',
{ headers: { Authorization: `Bearer ${process.env.MATURR_API_KEY}` } },
);
const { data, pagination } = await res.json();import os, requests
res = requests.get(
"https://www.maturr.io/api/v1/properties",
params={"msa_id": "33100", "property_types": "multifamily", "limit": 10},
headers={"Authorization": f"Bearer {os.environ['MATURR_API_KEY']}"},
)
res.raise_for_status()
payload = res.json()Response (200)
{
"data": [
{
"property_uid": "maturr:prop:8da29e2a60ef7457",
"property_name": "Vista Commons",
"city": "Tampa",
"state_code": "FL",
"property_type": "multifamily",
"current_balance": 9000000,
"dscr": 1.42,
"occupancy_pct": 96.5,
"ltv": 68.2,
"severity": "current"
}
],
"pagination": { "limit": 10, "offset": 0, "count": 4567 }
}/api/v1/properties/{uid}Single property detail
Returns the property row plus the latest 8 financial statements and every loan linked to the property. UIDs are stable — they don't change as new disclosures arrive.
Parameters
- uid*
- Maturr UID, form `maturr:prop:<hex>`.
Example
curl 'https://www.maturr.io/api/v1/properties/maturr:prop:8da29e2a60ef7457' \
-H 'Authorization: Bearer YOUR_API_KEY'Response (200)
{
"property": { "property_uid": "…", "property_name": "Vista Commons", … },
"financials": [ { "statement_period_end": "2025-12-31", "noi": 612000, … }, … ],
"loans": [ { "loan_id": "…", "current_balance": 9000000, "rate_pct": 3.635, … } ]
}/api/v1/geo-searchTypeahead lookup
Trigram-backed grouped typeahead across MSAs, counties, states, cities, ZIPs, property names, and addresses. Returns grouped results so the client can render them as section headings.
Parameters
- q*
- Search prefix. ≥2 chars or returns empty.
- limit
- Max 25, default 8.
Example
curl 'https://www.maturr.io/api/v1/geo-search?q=tampa&limit=8' \
-H 'Authorization: Bearer YOUR_API_KEY'Response (200)
{ "data": [ { "group": "msa", "id": "45300", "label": "Tampa-St. Petersburg-Clearwater, FL", … }, … ] }/api/v1/loansLoan list with maturity filter
Returns loan-level rows, optionally restricted to loans maturing within N months from today. Useful for maturity-wall workflows that need loan-level granularity.
Parameters
- maturity_within_months
- Integer 1-60.
- limit
- Max 200, default 50.
Example
curl 'https://www.maturr.io/api/v1/loans?maturity_within_months=12&limit=100' \
-H 'Authorization: Bearer YOUR_API_KEY'Response (200)
{ "data": [ { "loan_id": "…", "current_balance": 9000000, "maturity_date": "2026-12-01", … }, … ] }/api/v1/markets/{msa_id}/statsAggregate stats for one MSA
Property/loan counts, total UPB, distress mix, weighted DSCR and occupancy for a single MSA. Mirrors the `public_market_stats_by_msa` view used by the marketing hero.
Parameters
- msa_id*
- CBSA code.
Example
curl 'https://www.maturr.io/api/v1/markets/45300/stats' \
-H 'Authorization: Bearer YOUR_API_KEY'Response (200)
{ "msa_id": "45300", "property_count": 583, "total_upb": 12340000000, … }Rate limits
Limits are per API key, sliding 60-second window. Every successful response carries:
X-RateLimit-Limit— your ceilingX-RateLimit-Remaining— requests left in this windowX-RateLimit-Reset— seconds until the window resets
When you exceed the limit you'll get a 429 with the same headers plus Retry-After and a JSON body of the form { error: "rate_limited", retry_after: 12 }. Treat 429 as a backoff signal, not an error.
| Plan | Limit |
|---|---|
| Pro | API access not included |
| Advanced | 500 requests/min per key |
| Enterprise | 1,000 requests/min per key (higher on request) |
Errors
Errors return a JSON body of the form { error, message }. error is a stable machine-readable code; message is for logs.
| Status | Code | Meaning |
|---|---|---|
| 401 | unauthorized | Missing/invalid key, or owner is not on Advanced+. |
| 404 | not_found | Resource by the given identifier does not exist. |
| 429 | rate_limited | Per-key rate limit exceeded. See `Retry-After`. |
| 500 | db_error | Database error. Safe to retry with backoff. |
Versioning
The current version is v1. v1 is stable — additive schema changes (new fields, new endpoints) won't bump the version. Breaking changes — renamed fields, removed endpoints, changed param semantics — will ship as /api/v2/alongside v1, with a deprecation window.
Changelog
- 2026-05-28 — v1 launch
- Five read endpoints. Bearer auth. Per-plan rate limits. OpenAPI 3.1 spec published at /api/v1/openapi.json.