---
title: "Cross-BDC borrower exposure detail"
method: GET
path: "/api/bdc/borrower"
tags: ["Private Credit"]
---

# Cross-BDC borrower exposure detail

`GET /api/bdc/borrower`

## Request

- Base URL: `https://www.oxfordledge.com` (the document declares no server; this is the origin it was published from)
- URL: `https://www.oxfordledge.com/api/bdc/borrower`
- Auth: none declared

Borrower lookup.

The company description (COUNSEL 2026-09-27 licensing cycle D4,
OWNER-approved "label everywhere + strip on anonymous JSON"). This route
has no tier gate and the SPA does not render its `description`
(static/js/bdc-view.ts), so its audience is machine callers -- the
re-presenters the MCP channel's R-DESC-PULL strip exists for. A
description that is not first-party (research-written, `wellknown`,
`manual`, absent tag, or `csv`: data/borrower_description_policy.
is_research_written) is served ONLY to a signed-in first-party browser
session (`_is_first_party_browser_session`); every other caller gets
`description: null` + `descriptionWithheld`. Whatever description remains
carries `descriptionLabel`, the caption the SSR borrower page prints.

## Query parameters

- `q` string

## Response `200`

Successful Response

- BorrowerDetailResponse: `GET /api/bdc/borrower` response. F4 schema-tightening + correction (2026-04-30): `borrowerName` + `holders` REQUIRED on every 200 shape (empty-query {borrowerName, holders=[], error}; disambiguation {ambiguous, matches, holders=[]}; success with borrowerNorm/totals); 400/404/500 are ErrorResponse. Frontend `borrower-view.js` reads `data.borrowerName` and iterates `data.holders`. COUNSEL 2026-09-27 D4: a not-first-party `description` is null for anonymous / API-key / OAuth callers with the reason in `descriptionWithheld`; a served one carries `descriptionLabel` (who wrote it), the SSR borrower page's caption.
  - `borrowerName` string, required
  - `holders` object[], required
  - `borrowerNorm` string, nullable
  - `description` string, nullable
  - `descriptionSource` string, nullable
  - `descriptionSources` string[], nullable
  - `descriptionLabel` string, nullable
  - `descriptionWithheld` string, nullable
  - `industry` string, nullable
  - `totalHolders` integer, nullable
  - `totalParAmount` number, nullable
  - `totalFairValue` number, nullable
  - `ambiguous` boolean, nullable
  - `matches` object[], nullable
  - `match_type` string, nullable
  - `message` string, nullable
  - `error` string, nullable

## Other responses

- `400`: Bad Request
- `404`: Not Found
- `422`: Validation Error
- `500`: Internal Server Error

---

[API](https://skmtc.dev/oxfordledge/apis/oxford-ledge-api.md) · [All operations](https://skmtc.dev/oxfordledge/apis/oxford-ledge-api/llms.txt) · [OpenAPI document](https://skmtc.dev/oxfordledge/apis/oxford-ledge-api/revisions/e832a1260f0b?raw)
