---
title: "Multi-quarter cross-BDC mark history for one borrower"
method: GET
path: "/api/bdc/borrower-mark-history"
tags: ["Private Credit"]
---

# Multi-quarter cross-BDC mark history for one borrower

`GET /api/bdc/borrower-mark-history`

## 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-mark-history`
- Auth: none declared

Per-quarter fair-value mark band for one borrower across every BDC
that holds its debt (2026-09-05 external field-test F4: the borrower
panel's priceHistory was 8 tranches of ONE quarter; the multi-quarter
rows existed but nothing read them per-borrower).

`q` is a borrower_norm key or a borrower NAME (2026-10-13, live MCP QA
P2): the shared ladder in data/borrower_key_resolution.py tries the
casefolded key, the borrower normaliser, then the search_bdc_borrower
name ladder, and `matchType` / `resolvedFrom` / `candidates` say what
happened (an ambiguous name picks nothing). An unknown key is an
honest-empty 200, never a 404: absence of priced history is an answer,
not an error.

## Query parameters

- `q` string
- `quarters` integer

## Response `200`

Successful Response

- BDCBorrowerMarkHistoryResponse: `GET /api/bdc/borrower-mark-history` — per-quarter cross-BDC mark history for one borrower (2026-09-05 field-test F4: priceHistory was 8 tranches of ONE quarter). `borrowerNorm` + `quarters` REQUIRED on every branch (honest-empty quarters=[] + note; the 500 fallback) — the consumer iterates `data.quarters`. Entry: quarterKey, minMark, maxMark, parWeightedMark, rowCount, aboveParRowCount, holderCount, bdcs, periodEnd; marks are percent of par (`units`). `markBasis` is the above-par basis sentence when a quarter has an above-par row (f3-bdc-core-7), else null.
  - `borrowerNorm` string, required
  - `quarters` object[], required
  - `count` integer, nullable
  - `units` object, nullable
  - `note` string, nullable
  - `markBasis` string, nullable
  - `matchType` string, nullable
  - `resolvedFrom` object, nullable
  - `candidates` object[], nullable

## Other responses

- `400`: Bad Request
- `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)
