API Reference
RESTful JSON API for CRE private credit intelligence. Programmatic access to loan coverage, entity resolution, capital graph traversal, and decision-ready signals across $1.4T+ in tracked debt.
Authentication
All requests require a valid API key passed via the request header. Keys are issued per license tier and scoped to your permitted endpoints. Separate keys are provided for production and sandbox environments.
Do not expose API keys in client-side code, public repositories, or browser requests. Keys that appear in public sources will be revoked automatically.
curl -s "https://api.{your-domain}/v1/loans?state=TX&limit=5" \
-H "Authorization: Bearer your-api-key"Endpoints
Six endpoints across four data surfaces: loans, entities, capital graph, and signals. All responses return JSON with consistent envelope structure.
Query the normalized loan coverage layer. Filter by geography, insurer, balance range, maturity window, distress tier, and more. Returns paginated loan-level records with debt sizing, collateral, lender, and confidence context.
| Parameter | Type | Required | Description |
|---|---|---|---|
| state | string | No | Two-letter US state code (e.g. TX, FL, CA) |
| insurer | string | No | Insurer name or normalized key (e.g. northbridge, summit) |
| min_balance | integer | No | Minimum book value in dollars (e.g. 10000000) |
| max_balance | integer | No | Maximum book value in dollars |
| maturity_before | date | No | ISO 8601 date. Return loans maturing before this date |
| maturity_after | date | No | ISO 8601 date. Return loans maturing after this date |
| rate_pressure | string | No | Rate pressure classification: critical, elevated, moderate, low |
| limit | integer | No | Results per page (default 25, max 100) |
| cursor | string | No | Pagination cursor from previous response |
curl -s "https://api.{your-domain}/v1/loans?state=TX&insurer=northbridge&min_balance=10000000&limit=25" \
-H "Authorization: Bearer your-api-key"{
"object": "list",
"count": 47,
"has_more": true,
"next_cursor": "eyJpZCI6MTg0Mn0",
"items": [
{
"id": "ln_01J8XKFV2N",
"loan_number": "loan_demo_01842",
"book_value": 18400000,
"interest_rate": 3.85,
"property_type": "industrial",
"property_city": "Metro A",
"property_state": "TX",
"insurer_normalized": "Northbridge Life",
"maturity_date": "2027-03-15",
"rate_pressure": "elevated",
"confidence_tier": "confirmed",
},
{
"id": "ln_01J8XKFV3P",
"loan_number": "loan_demo_02917",
"book_value": 32100000,
"interest_rate": 4.12,
"property_type": "office",
"property_city": "Metro B",
"property_state": "TX",
"insurer_normalized": "Northbridge Life",
"maturity_date": "2026-11-01",
"rate_pressure": "critical",
"confidence_tier": "confirmed",
}
]
}Retrieve a single loan record by its internal identifier. Returns the full record including extended fields not present in list responses.
| Parameter | Type | Required | Description |
|---|---|---|---|
| id | string | Yes | Loan identifier (e.g. ln_01J8XKFV2N) |
curl -s "https://api.{your-domain}/v1/loans/ln_01J8XKFV2N" \
-H "Authorization: Bearer your-api-key"{
"object": "loan",
"id": "ln_01J8XKFV2N",
"loan_number": "loan_demo_01842",
"book_value": 18400000,
"interest_rate": 3.85,
"property_type": "industrial",
"property_city": "Metro A",
"property_state": "TX",
"insurer_normalized": "Northbridge Life",
"origination_date": "2019-03-15",
"maturity_date": "2027-03-15",
"rate_pressure": "elevated",
"rate_pressure_score": 72.4,
"confidence_tier": "confirmed",
"created_at": "2024-09-12T14:22:00Z",
"updated_at": "2026-03-28T08:15:00Z"
}Query the resolved entity layer. Search by name, type, or minimum confidence threshold. Returns entities with resolution metadata and relationship counts.
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | string | No | Fuzzy name search across entity names |
| type | string | No | Entity type: borrower, owner, sponsor, ubo, servicer |
| confidence_min | number | No | Minimum confidence score (0.0 to 1.0) |
| limit | integer | No | Results per page (default 25, max 100) |
| cursor | string | No | Pagination cursor from previous response |
curl -s "https://api.{your-domain}/v1/entities?name=redacted+holdings&type=sponsor&limit=10" \
-H "Authorization: Bearer your-api-key"{
"object": "list",
"count": 3,
"has_more": false,
"next_cursor": null,
"items": [
{
"id": "ent_01K2MNP8V4",
"name": "Redacted Holdings LLC",
"type": "sponsor",
"confidence": 0.94,
"confidence_tier": "high",
"related_loan_count": 12,
"related_entity_count": 7,
},
{
"id": "ent_01K2MNP9X6",
"name": "Redacted Holdings Partners LP",
"type": "sponsor",
"confidence": 0.87,
"confidence_tier": "high",
"related_loan_count": 5,
"related_entity_count": 3,
}
]
}Retrieve the resolved ownership chain for an entity. Returns the hierarchical path from borrower through operating entities to ultimate beneficial owner, with confidence at each level.
| Parameter | Type | Required | Description |
|---|---|---|---|
| id | string | Yes | Entity identifier (e.g. ent_01K2MNP8V4) |
curl -s "https://api.{your-domain}/v1/entities/ent_01K2MNP8V4/ownership" \
-H "Authorization: Bearer your-api-key"{
"object": "ownership_chain",
"entity_id": "ent_01K2MNP8V4",
"chain": [
{
"level": 0,
"entity_name": "Redacted Borrower SPE LLC",
"role": "borrower",
"confidence": 0.98
},
{
"level": 1,
"entity_name": "Redacted Holdings LLC",
"role": "sponsor",
"confidence": 0.94
},
{
"level": 2,
"entity_name": "Redacted Capital Partners",
"role": "owner",
"confidence": 0.88
},
{
"level": 3,
"entity_name": "J. Redacted",
"role": "ubo",
"confidence": 0.79
}
],
"resolution_method": "multi_stage",
}Traverse the capital relationship graph. Returns connected paths between loans, entities, capital sources, and related exposure. Use this to map concentration risk and relationship networks.
| Parameter | Type | Required | Description |
|---|---|---|---|
| loan_number | string | No | Loan number to start traversal (e.g. loan_demo_01842) |
| entity_id | string | No | Entity ID to start traversal (e.g. ent_01K2MNP8V4) |
| depth | integer | No | Max traversal depth (default 3, max 6) |
| limit | integer | No | Max paths returned (default 25, max 100) |
curl -s "https://api.{your-domain}/v1/graph/paths?loan_number=loan_demo_01842&depth=3&limit=25" \
-H "Authorization: Bearer your-api-key"{
"object": "graph_result",
"root": "loan_demo_01842",
"root_type": "loan",
"path_count": 4,
"depth_reached": 3,
"paths": [
{
"path_id": "gp_01",
"edges": [
{ "from": "loan_demo_01842", "to": "Redacted Borrower SPE LLC", "relation": "borrower", "confidence": 0.98 },
{ "from": "Redacted Borrower SPE LLC", "to": "Redacted Holdings LLC", "relation": "owned_by", "confidence": 0.94 },
{ "from": "Redacted Holdings LLC", "to": "Northbridge Life General Account", "relation": "capital_source", "confidence": 0.91 }
]
},
{
"path_id": "gp_02",
"edges": [
{ "from": "loan_demo_01842", "to": "Redacted Borrower SPE LLC", "relation": "borrower", "confidence": 0.98 },
{ "from": "Redacted Borrower SPE LLC", "to": "loan_demo_03291", "relation": "common_borrower", "confidence": 0.86 }
]
}
],
"connected_entity_count": 8,
"connected_loan_count": 3,
}Retrieve scored signals across the coverage layer. Signals include rate pressure, maturity timing, concentration risk, stress indicators, and other mandate-level flags.
| Parameter | Type | Required | Description |
|---|---|---|---|
| state | string | No | Two-letter US state code |
| signal_type | string | No | Type: rate_pressure, maturity_timing, concentration_risk, stress_indicator, distress |
| severity | string | No | Severity level: critical, elevated, moderate, low |
| limit | integer | No | Results per page (default 25, max 100) |
| cursor | string | No | Pagination cursor from previous response |
curl -s "https://api.{your-domain}/v1/signals?state=FL&signal_type=rate_pressure&severity=critical&limit=10" \
-H "Authorization: Bearer your-api-key"{
"object": "list",
"count": 18,
"has_more": true,
"next_cursor": "eyJpZCI6ODkxN30",
"items": [
{
"id": "sig_01L4QRS7V2",
"signal_type": "rate_pressure",
"severity": "critical",
"loan_number": "loan_demo_08917",
"loan_id": "ln_01J7WKDV1M",
"property_state": "FL",
"property_city": "Metro C",
"property_type": "office",
"book_value": 44200000,
"interest_rate": 3.25,
"current_market_rate": 6.80,
"rate_gap_bps": 355,
"rate_pressure_score": 91.2,
"maturity_date": "2026-09-01",
"insurer_normalized": "Summit Capital Insurance",
"description": "Fixed coupon 355bps below current market. Maturity inside 6 months. Refinance wall exposure.",
},
{
"id": "sig_01L4QRS8X4",
"signal_type": "rate_pressure",
"severity": "critical",
"loan_number": "loan_demo_11204",
"loan_id": "ln_01J7WKDV3P",
"property_state": "FL",
"property_city": "Metro D",
"property_type": "multifamily",
"book_value": 27800000,
"interest_rate": 3.60,
"current_market_rate": 6.80,
"rate_gap_bps": 320,
"rate_pressure_score": 86.7,
"maturity_date": "2026-12-15",
"insurer_normalized": "Ridgeline Mutual",
"description": "Fixed coupon 320bps below market. Maturity inside 9 months. Elevated refinance pressure.",
}
]
}Pagination
All list endpoints use cursor-based pagination. This provides stable results even when the underlying data is updated between requests. Each response includes has_more and next_cursor fields.
limit (default 25, max 100).has_more field in the response. If true, more results exist.next_cursor value as the cursor query parameter in your next request.has_more is false or next_cursor is null.# First page
curl -s "https://api.{your-domain}/v1/loans?state=TX&limit=25" \
-H "Authorization: Bearer your-api-key"
# Next page (using cursor from previous response)
curl -s "https://api.{your-domain}/v1/loans?state=TX&limit=25&cursor=eyJpZCI6MTg0Mn0" \
-H "Authorization: Bearer your-api-key"Rate Limits
Rate limits are enforced per API key and vary by endpoint group and license tier. Exceeding limits returns HTTP 429 with a Retry-After header indicating seconds until the next available window.
| Tier | Endpoints | Requests / Min | Daily Quota |
|---|---|---|---|
| Base | /v1/loans, /v1/signals | Tiered by subscription level | Tiered by subscription level |
| Resolution | /v1/entities, /v1/entities/*/ownership | Tiered by subscription level | Tiered by subscription level |
| Capital Graph | /v1/graph/paths | Tiered by subscription level | Tiered by subscription level |
| Complete | All endpoints (bundled license) | Tiered by subscription level | Tiered by subscription level |
Errors
The API uses standard HTTP status codes. Error responses include a JSON body with error, message, and status fields.
| Status | Title | Description |
|---|---|---|
| 400 | Bad Request | The request was malformed or contains invalid parameters. Check query parameter types and values. |
| 401 | Unauthorized | No API key provided or the key is invalid. Include a valid API key header with your request. |
| 403 | Forbidden | The API key does not have permission for this endpoint or resource. Check your license tier. |
| 404 | Not Found | The requested resource does not exist. Verify the ID or loan number. |
| 429 | Rate Limited | Request rate or daily quota exceeded. Back off and retry after the window indicated in Retry-After header. |
| 500 | Internal Error | An unexpected server error occurred. Retry with exponential backoff. Contact support if persistent. |
{
"error": "rate_limited",
"message": "Daily quota exceeded for /v1/loans. Resets at 00:00 UTC.",
"status": 429,
"retry_after": 3420
}Get Started
API keys are issued as part of the annual license. Submit your use case and team details to begin the access process.
Request Access