Introduction
Connect an agent or an app to BDC Schedules of Investments: the fund tape, the credit, and every holder mark that was filed.
Data is taken from SEC 10-Q and 10-K filings, plus opt-in N-CSR / N-CSRS interval funds. Each line traces to the filing it came from. Trial, Tape, and Matched start themselves. You do not wait for us.
What you can access
Your key only opens the surfaces on your plan. A Tape key cannot open issuer cards. A Trial key cannot open the SOI tape. Those calls return HTTP 402 with an upgrade line. See plans.
- Trial - issuer cards (one credit, holder marks, history since 2020). 100 request units. No SOI tape, no coverage, no fund cards.
- Tape - coverage, fund cards, SOI positions. Last four quarters. No issuer cards, no sector, no non-accrual.
- Matched - Tape plus issuer cards, sector, non-accrual, history since 2020.
- Terminal - all of that, plus disagreement, interval, CLO, loan CEF, and the /app screen. By invitation.
- Find a credit - search a borrower the way you do in the terminal. Trial and Matched.
- Holder marks - every fund that printed that name, and the mark they filed. Trial and Matched.
- Fund profile - Ares, Blackstone, Blue Owl, and the rest, by CIK or ticker. Tape and up.
- SOI tape - the fund's Schedule of Investments, line by line (company, investment, cost, fair value, mark). Tape and up.
- Non-accrual - lines the fund footnoted as non-accrual. Matched and up.
- Coverage - snapshot size for this compile (funds and credits in the tip). Not seating-complete or accuracy-complete. Cite
meta.compile_id. Tape and up.
Coverage
Live counts (Tape and up): GET /v1/coverage. BDCs file 10-Q / 10-K. Interval funds on the roster file N-CSR / N-CSRS. Trial cannot open coverage. That call returns HTTP 402.
Data notes
- Structured JSON - the same field names on every endpoint.
- As-reported names -
company_rawandinvestment_raware the cells as printed on the SOI. - Marks - fair value / cost from the filed schedule.
1.00is par. - Money - $ millions.
- Funds - identified by CIK. Ticker is extra when the fund is listed.
Built for
- Credit agents and LLM pipelines
- Private-credit research
- Portfolio and risk systems
- Internal data layers
Start with the Quick start.
Quick start
Authenticate and make your first request.
1. Get an API key
Get a key at API plans. Trial on a work email, or subscribe to Tape or Matched. You see the secret once. Copy it. No one has to approve those plans. Terminal seats are by invitation. Sign in at /login to mint more keys and watch usage.
2. Make your first request
Interactive hosts (Claude, Cursor, ChatGPT, Grok, Claude Code): OAuth via https://dirigon.com/connect. Do not paste a key into chat or mcp.json.
Scripts / curl / workers: header X-API-KEY from an env var. Use the call that matches the plan you just bought. The other one returns HTTP 402. The meter is request units: most calls are 1, a credit card with history is 5, an SOI tape is 10. MCP uses the same units.
Scripts / curl — Trial (issuer card):
curl "https://dirigon.com/v1/issuers?q=Coupa" \ -H "X-API-KEY: YOUR_KEY"
import requests
headers = {"X-API-KEY": "YOUR_KEY"}
r = requests.get("https://dirigon.com/v1/issuers?q=Coupa", headers=headers)
print(r.json())
Scripts / curl — Tape (fund card):
curl "https://dirigon.com/v1/filers?q=ARCC" \ -H "X-API-KEY: YOUR_KEY"
import requests
headers = {"X-API-KEY": "YOUR_KEY"}
body = requests.get("https://dirigon.com/v1/filers?q=ARCC", headers=headers).json()
fil = body.get("filer") or (body.get("filers") or [{}])[0]
print(fil.get("name"), fil.get("cik"), (body.get("book") or {}).get("fv_m") or fil.get("total_fv_m"))
3. Open a tape, or find a credit
curl "https://dirigon.com/v1/filers/1287750/positions?limit=5" \ -H "X-API-KEY: YOUR_KEY" curl "https://dirigon.com/v1/issuers?q=Coupa" \ -H "X-API-KEY: YOUR_KEY"
import requests
headers = {"X-API-KEY": "YOUR_KEY"}
tape = requests.get(
"https://dirigon.com/v1/filers/1287750/positions?limit=5",
headers=headers,
).json()
body = requests.get(
"https://dirigon.com/v1/issuers?q=Coupa",
headers=headers,
).json()
iss = body.get("issuer") or (body.get("issuers") or [{}])[0]
print(iss.get("issuer_id"), iss.get("display_name"))
What's next
Find a credit
Search a borrower. Same idea as Find credit in the terminal.
q= an exact name, or one hit, returns the credit card: issuer plus marks. Many hits return issuers[]. A miss may still sit unmatched on a fund tape.
GET/v1/issuers?q=Coupa
Query
| Param | Where | Meaning |
|---|---|---|
| q | query | Name search. Exact or one hit opens the card. |
| issuer_id | path | Credit id (ISS-######). |
| limit | query | How many rows to return. Default 100, max 500. |
| cursor | query | From next_page_url. |
Example
curl "https://dirigon.com/v1/issuers?q=Coupa" \ -H "X-API-KEY: YOUR_KEY"
import requests
headers = {"X-API-KEY": "YOUR_KEY"}
body = requests.get("https://dirigon.com/v1/issuers?q=Coupa", headers=headers).json()
iss = body.get("issuer") or (body.get("issuers") or [{}])[0]
print(iss.get("issuer_id"), iss.get("display_name"), iss.get("n_holders"))
print("marks", len(body.get("marks") or []))
Response (card)
{
"issuer": {
"issuer_id": "ISS-015563",
"display_name": "Coupa"
},
"marks": []
}
Fields
| Field | Meaning |
|---|---|
| issuer_id | Credit id. Use this in later calls. |
| display_name | Credit name. |
| n_holders | How many funds print it. |
| total_fv_m | Fair value across those holders, $ millions. |
| blocked | True if the name is disputed. Skip it for comparisons. |
Holder marks
Every fund that printed the credit, and the mark they filed.
This is the disagreement view. One row per holder. Mark is fair value / cost.
GET/v1/issuers/ISS-002537/marks
If blocked is true on the credit, this endpoint returns 404. Skip disputed names for comparisons.
Example
curl "https://dirigon.com/v1/issuers/ISS-002537/marks" \ -H "X-API-KEY: YOUR_KEY"
import requests
headers = {"X-API-KEY": "YOUR_KEY"}
r = requests.get("https://dirigon.com/v1/issuers/ISS-002537/marks", headers=headers)
for row in r.json()["marks"]:
print(row["filer"], row["mark"], row["fv_m"])
Response
{
"marks": [
{
"issuer_id": "ISS-002537",
"cik": 1287750,
"filer": "ARES CAPITAL CORP",
"mark": 0.9524,
"fv_m": 365.8,
"cost_m": 384.1,
"period_end": "2026-06-30"
}
]
}
Fields
| Field | Meaning |
|---|---|
| filer | Fund name. |
| cik | Fund CIK. |
| mark | Fair value / cost (1.00 = par). |
| fv_m | Fair value, $ millions. |
| cost_m | Amortized cost, $ millions. |
| period_end | SOI period. |
Fund profile
Same idea as Fund profile in the terminal. Exact ticker or CIK opens the fund card. Quote book.fv_m.
GET/v1/filers?q=ARCC
GET/v1/filers/1287750
Query
| Param | Where | Meaning |
|---|---|---|
| q | query | Name, ticker, or CIK. |
| cik | path | SEC CIK of the fund. |
| limit | query | How many rows to return. Default 100, max 500. |
Example
curl "https://dirigon.com/v1/filers?q=ARCC" \ -H "X-API-KEY: YOUR_KEY"
import requests
headers = {"X-API-KEY": "YOUR_KEY"}
body = requests.get("https://dirigon.com/v1/filers?q=ARCC", headers=headers).json()
fil = body.get("filer") or (body.get("filers") or [{}])[0]
print(fil.get("name"), fil.get("cik"), (body.get("book") or {}).get("fv_m") or fil.get("total_fv_m"))
Response
{
"filer": {
"cik": 1287750,
"name": "ARES CAPITAL CORP",
"ticker": "ARCC"
}
}
Fields
| Field | Meaning |
|---|---|
| cik | SEC id for the fund. |
| name | Fund name. |
| ticker | Listed ticker when there is one. |
| manager | Adviser. |
| period_end | Latest SOI period. |
| n_positions | Lines on the tape. |
| total_fv_m | Fair value of that tape, $ millions. |
| filing_url | Link to the SEC filing. |
SOI tape
The Schedule of Investments for one fund, line by line: company, investment, cost, fair value, mark.
GET/v1/filers/1287750/positions?limit=25
limit is how many rows you want in total. Follow next_page_url when it is present.
Query
| Param | Where | Meaning |
|---|---|---|
| cik | path | Fund CIK (required). |
| limit | query | Total rows to return. Default 100, max 500. |
| cursor | query | From next_page_url. |
Example
curl "https://dirigon.com/v1/filers/1287750/positions?limit=5" \ -H "X-API-KEY: YOUR_KEY"
import requests
headers = {"X-API-KEY": "YOUR_KEY"}
url = "https://dirigon.com/v1/filers/1287750/positions?limit=25"
r = requests.get(url, headers=headers)
for row in r.json()["positions"]:
print(row["company_raw"], row["lien"], row["mark"], row["fv_m"])
Response
{
"positions": [
{
"company_raw": "ACP Avenu Midco LLC",
"investment_raw": "First lien senior secured revolving loan",
"lien": "first_lien",
"mark": 1.0,
"fv_m": 0.9,
"cost_m": 0.9,
"non_accrual": false,
"filing_url": "https://www.sec.gov/Archives/edgar/data/1287750/000162828026050307/arcc-20260630.htm"
}
]
}
Fields
| Field | Meaning |
|---|---|
| company_raw | Company as printed on the SOI. |
| investment_raw | Investment line as printed. |
| lien | first_lien, second_lien, and so on. |
| cost_m | Amortized cost, $ millions. |
| fv_m | Fair value, $ millions. |
| mark | Fair value / cost. |
| non_accrual | True if the fund footnoted it as non-accrual. |
| filing_url | The filing this line came from. |
Non-accrual
What the fund footnoted. Not inferred from a low mark.
GET/v1/non-accrual
Example
curl "https://dirigon.com/v1/non-accrual?limit=10" \ -H "X-API-KEY: YOUR_KEY"
import requests
headers = {"X-API-KEY": "YOUR_KEY"}
r = requests.get("https://dirigon.com/v1/non-accrual?limit=10", headers=headers)
for row in r.json()["non_accrual"]:
print(row["filer"], row["company"], row["mark"])
Response
{
"non_accrual": [
{
"filer": "Blackstone Private Credit Fund",
"company": "Medallia, Inc.",
"cost_m": 1084.03,
"fv_m": 553.6,
"mark": 0.5107,
"period": "2026-06-30"
}
]
}
Coverage
Snapshot size for this compile (funds and credits in the tip). Not seating-complete or accuracy-complete. Cite meta.compile_id.
GET/v1/coverage
No query parameters. Call this when you want snapshot size for this compile. Not seating-complete or accuracy-complete. Cite meta.compile_id.
curl "https://dirigon.com/v1/coverage" \ -H "X-API-KEY: YOUR_KEY"
import requests
headers = {"X-API-KEY": "YOUR_KEY"}
print(requests.get("https://dirigon.com/v1/coverage", headers=headers).json())
MCP
Same data, for agents. Do not paste an API key into a chat.
Do not piece this together. Open Connect. Claude is one button. ChatGPT is copy the URL into Plugins. Sign in with the mailbox on the API plan. An invite terminal seat cannot Allow.
Add to Claude (opens Claude with Dirigon already filled in).
Do not paste an API key into that dialog or into a chat. Claude, ChatGPT, and Cursor use OAuth. Curl uses header X-API-KEY from an env var.
Claude Code
claude mcp add --transport http dirigon https://dirigon.com/v1/mcp
Codex
codex mcp add dirigon --url https://dirigon.com/v1/mcp
ChatGPT
Copy https://dirigon.com/v1/mcp. Settings → Developer mode → Plugins → +. Name Dirigon. Paste the URL. Authentication OAuth. Sign in. Allow. New chat, add Dirigon from the app picker.
Cursor
{
"mcpServers": {
"dirigon": {
"url": "https://dirigon.com/v1/mcp"
}
}
}
Tools
tools/list returns only the tools on your plan. Start with lookup. Tape does not see get_issuer. Trial does not see get_filer or get_positions.
lookup- First tool. q= a borrower or ticker. One short card.full=trueis the deep card. Trial+.get_issuer- Peeled credit. One hit or exact name opens the card. q= is a whole token. Trial and Matched.get_facility- One paper (instrument x maturity): holders, marks, as-of, liens. Not the issuer blend. Trial and Matched.get_disagreement- Widest same-loan screen. Pass issuer_id to get_issuer for the card. Terminal.get_filer- Fund card: book, top credits, software membership vs printed mix. Tape+.get_positions- Line lookup (cik required; q= a borrower; no q is a 15-line sample). Tape+.get_non_accrual- Non-accrual lines (optional cik or q). Matched+.get_coverage- Snapshot size +meta.compile_id+start_here. Not accuracy-complete; not a seating audit. Tape+.get_sector- Sectors page (software, healthcare, industrials). Matched+.get_software- Same as get_sector for software. Matched+.get_clo_tranche- CLO note holders across CEFs, BDCs, and interval funds. Terminal.
Example
curl https://dirigon.com/v1/mcp \
-H "X-API-KEY: YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
Example prompts
Match the mailbox plan. Off-plan tools return HTTP 402. Read legal_alternative and retry.
- Trial lookup q=Coupa. Who holds it, and how do they mark the same loan? Then get_facility on the matched paper.
- Tape Open ARCC. What is book vs as-filed? Then five SOI lines.
- Tape Open BCRED. What is the book mark vs as-filed?
- Tape Show Ares Capital's Kellermeyer line.
- Matched lookup q=Coupa. Open get_issuer for every holder and the mark they filed. Open get_facility on default_facility.
- Matched Which fund has the most software?
- Matched Which funds flagged Medallia as non-accrual?
- Matched Four largest funds, equal-weight: book mark, PIK, non-accrual.
- Terminal Show the widest same-loan disagreements this quarter, on fair value versus principal.
- Terminal Show the widest holder-mark disagreements in software.
OpenAPI
Generate a client, import into Postman, or let an agent discover the endpoints.
https://dirigon.com/v1/openapi.yaml
Full field list: /v1/fields.json. Agent index: /llms.txt. Markdown pages: /docs/introduction.md.