API Reference
RESTful JSON API for CRE private credit intelligence. Programmatic access to loan coverage, entity resolution, capital-stack triangulation, capital graph traversal, and decision-ready signals across $2T+ in tracked debt spanning private and public layers.
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
Representative endpoints across the four primary data surfaces: loans, entities, capital graph, and signals. The full endpoint reference and OpenAPI 3.1 specification are provided on license activation. All responses return JSON with a consistent envelope.
Query the normalized loan coverage layer. Filter by geography, lender, 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) |
| lender | string | No | Lender name or normalized key across any debt layer (insurance, bank, private credit, CMBS servicer) |
| 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 (tier names provided with license) |
| page | integer | No | Page number (default 1) |
| per_page | integer | No | Results per page (default 25, max 100) |
curl -s "https://api.{your-domain}/v1/loans?state=TX&lender=northbridge&min_balance=10000000&per_page=25" \
-H "Authorization: Bearer your-api-key"{
"data": [
{
"loan_number": "loan_demo_01842",
"book_value": 18400000,
"interest_rate": 3.85,
"property_type": "industrial",
"property_city": "Metro A",
"property_state": "TX",
"lender_normalized": "Northbridge Life",
"maturity_date": "2027-03-15",
"rate_pressure": "elevated",
"confidence_tier": "confirmed"
},
{
"loan_number": "loan_demo_02917",
"book_value": 32100000,
"interest_rate": 4.12,
"property_type": "office",
"property_city": "Metro B",
"property_state": "TX",
"lender_normalized": "Northbridge Life",
"maturity_date": "2026-11-01",
"rate_pressure": "critical",
"confidence_tier": "confirmed"
}
],
"pagination": {
"page": 1,
"per_page": 25,
"total": 47
},
"meta": {
"request_id": "req_01J8XKFV2N"
}
}Retrieve a single loan record by loan number. Returns the full record including extended fields not present in list responses.
| Parameter | Type | Required | Description |
|---|---|---|---|
| loan_number | string | Yes | Loan number (e.g. loan_demo_01842) |
curl -s "https://api.{your-domain}/v1/loans/loan_demo_01842" \
-H "Authorization: Bearer your-api-key"{
"data": {
"loan_number": "loan_demo_01842",
"book_value": 18400000,
"interest_rate": 3.85,
"property_type": "industrial",
"property_city": "Metro A",
"property_state": "TX",
"lender_normalized": "Northbridge Life",
"origination_date": "2019-03-15",
"maturity_date": "2027-03-15",
"rate_pressure": "elevated",
"confidence_tier": "confirmed"
},
"meta": {
"request_id": "req_01J8XKFV3Q"
}
}Query the resolved entity layer. Search by name 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 |
| confidence_min | number | No | Minimum confidence score (0.0 to 1.0) |
| page | integer | No | Page number (default 1) |
| per_page | integer | No | Results per page (default 25, max 100) |
curl -s "https://api.{your-domain}/v1/entities?name=redacted+holdings&per_page=10" \
-H "Authorization: Bearer your-api-key"{
"data": [
{
"entity_name": "Redacted Holdings LLC",
"confidence": 0.94,
"confidence_tier": "confirmed",
"related_loan_count": 12
},
{
"entity_name": "Redacted Holdings Partners LP",
"confidence": 0.87,
"confidence_tier": "confirmed",
"related_loan_count": 5
}
],
"pagination": {
"page": 1,
"per_page": 10,
"total": 3
},
"meta": {
"request_id": "req_01K2MNP8V4"
}
}Retrieve the resolved ownership chain for a loan. Returns the hierarchical path from borrower through operating entities to ultimate beneficial owner, with confidence at each level.
| Parameter | Type | Required | Description |
|---|---|---|---|
| loan_number | string | Yes | Loan number (e.g. loan_demo_01842) |
curl -s "https://api.{your-domain}/v1/entities/loan_demo_01842/ownership" \
-H "Authorization: Bearer your-api-key"{
"data": {
"loan_number": "loan_demo_01842",
"chain": [
{
"entity_name": "Redacted Borrower SPE LLC",
"role": "borrower",
"confidence": 0.98
},
{
"entity_name": "Redacted Holdings LLC",
"role": "sponsor",
"confidence": 0.94
},
{
"entity_name": "Redacted Capital Partners",
"role": "owner",
"confidence": 0.88
}
],
"confidence_tier": "confirmed"
},
"meta": {
"request_id": "req_01K2MNPAW6"
}
}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_name | string | No | Entity name to start traversal |
| depth | integer | No | Max traversal depth (default 3, max 6) |
| page | integer | No | Page number (default 1) |
| per_page | integer | No | Max paths per page (default 25, max 25) |
curl -s "https://api.{your-domain}/v1/graph/paths?loan_number=loan_demo_01842&depth=3" \
-H "Authorization: Bearer your-api-key"{
"data": {
"root": "loan_demo_01842",
"depth_reached": 3,
"paths": [
{
"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 }
]
}
]
},
"pagination": {
"page": 1,
"per_page": 25,
"total": 4
},
"meta": {
"request_id": "req_01L4QRS7V2"
}
}Retrieve scored signals across the coverage layer. Signals include rate pressure, maturity timing, concentration risk, and stress indicators.
| Parameter | Type | Required | Description |
|---|---|---|---|
| state | string | No | Two-letter US state code |
| signal_type | string | No | Signal category (types available on license) |
| severity | string | No | Severity level (tier values provided with license) |
| page | integer | No | Page number (default 1) |
| per_page | integer | No | Results per page (default 25, max 100) |
curl -s "https://api.{your-domain}/v1/signals?state=FL&severity=critical&per_page=10" \
-H "Authorization: Bearer your-api-key"{
"data": [
{
"signal_type": "rate_pressure",
"severity": "critical",
"loan_number": "loan_demo_08917",
"property_state": "FL",
"property_city": "Metro C",
"property_type": "office",
"book_value": 44200000,
"maturity_date": "2026-09-01",
"lender_normalized": "Summit Capital Insurance",
"description": "Fixed coupon below current market. Maturity inside 6 months. Refinance wall exposure."
}
],
"pagination": {
"page": 1,
"per_page": 10,
"total": 18
},
"meta": {
"request_id": "req_01L4QRS8X4"
}
}Pagination
List endpoints return a pagination object with page, per_page, and total. Request subsequent pages by incrementing the page query parameter. Per-endpoint caps apply; defaults are noted in each endpoint’s parameter table.
per_page (default 25).pagination.total value in the response to determine how many pages exist.page query parameter to request the next page.page × per_page ≥ total.# First page
curl -s "https://api.{your-domain}/v1/loans?state=TX&per_page=25" \
-H "Authorization: Bearer your-api-key"
# Second page
curl -s "https://api.{your-domain}/v1/loans?state=TX&per_page=25&page=2" \
-H "Authorization: Bearer your-api-key"Rate Limits
Rate limits are enforced per API key and scale by license tier. Every response includes X-RateLimit-Remaining, X-RateLimit-Reset, and X-RateLimit-Daily-Remaining headers. Exceeding a limit returns HTTP 429 with a Retry-After header indicating seconds until the next available window. Specific per-tier limits are provided on license activation.
| Tier | Endpoints | Requests / Min | Daily Quota |
|---|---|---|---|
| Base | /v1/loans, /v1/signals | By integration mandate | By integration mandate |
| Resolution | /v1/entities, /v1/entities/*/ownership | By integration mandate | By integration mandate |
| Capital Graph | /v1/graph/paths | By integration mandate | By integration mandate |
| Complete | All endpoints (bundled engagement) | By integration mandate | By integration mandate |
Errors
The API uses standard HTTP status codes. Error responses return a JSON body with an error object containing code, message, and request_id for support correlation.
| 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": {
"code": "rate_limited",
"message": "Daily quota exceeded. Retry after the window indicated in Retry-After.",
"request_id": "req_01L4QRS9Z7"
}
}Get Started
API keys are issued on engagement activation. Submit your use case and team details to begin the access process.
Request Access