DFX Intelligence · developer docs
API examples: curl, Python, TypeScript
Requests and the answers production returned: one-call research, paging, lender groups, change feeds and the JSON API.
Short answer
The shape of every call
POST JSON-RPC 2.0 to https://exchange-production-9123.up.railway.app/mcp/core?c=docs with Content-Type: application/json and Accept: application/json, text/event-stream. A tool call is {"method":"tools/call","params":{"name":<tool>,"arguments":{...}}}. The answer arrives twice in result: parsed in structuredContent (every core tool declares an outputSchema) and as a JSON string in content[0].text, for clients that read only text.
curl: one question, compact answer
detail: "compact" returns the resolved subject, the answer, the claims it rests on and counts, in under 2 KB. Leave it out for the full page.
research, compact
curl -s "https://exchange-production-9123.up.railway.app/mcp/core?c=docs" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"research",
"arguments":{"question":"Which BDCs lend to Auctane, and which of them are current lenders?",
"detail":"compact"}}}'What production returned at . result.structuredContent in full, re-indented. The same JSON also arrives as text in result.content[0].text.
{
"dfx": {
"capability": "research",
"layer": "dfx_intelligence",
"version": "1.0.0",
"answered_at": "2026-10-11T20:21:43.373145+00:00"
},
"ok": true,
"state": "OK",
"schema": "dfx.research/2",
"generated_at": "2026-10-11T20:21:43.373145+00:00",
"answer_state": "OK",
"detail": "compact",
"identities": {
"state": "RESOLVED",
"subject": {
"dfx_id": "dfx:pc:d071f992-5b4e-dffb-9f2c-22cb2204622b",
"name": "Auctane Inc",
"type": "borrower"
}
},
"answer": {
"text": "At 2026-06-30, 29 BDCs held positions in Auctane Inc on their own schedules of investments; the largest: Blackstone Private Credit Fund ($889.4M of debt at fair value over 2 tranches; principal $902.9M), Blackstone Secured Lending Fund ($277.3M of debt at fair value; principal $281.6M), ARES CAPITAL CORP ($241.6M of debt at fair value; principal $245.3M), Goldman Sachs Private Credit Corp. ($217.7M of debt at fair value; principal $221.0M), and 1 more on the next page (continue with page.continuation); 24 further BDC lenders are withheld for this access tier. Its debt on the tape matures from…",
"basis": [
"r1",
"r2",
"r3",
"r4",
"e1",
"r6"
]
},
"claims": [
{
"claim_id": "clm_b09515e7250a04a0f9093e3b",
"row": "r1",
"predicate": "LENDER_TO",
"claim_type": "VERIFIED_FACT"
},
{
"claim_id": "clm_b124865cf2a38a3bd5a0d414",
"row": "r1",
"predicate": "LENDER_TO_AMOUNT_USD",
"claim_type": "VERIFIED_FACT"
},
{
"claim_id": "clm_87bbceed44972806f2371aad",
"row": "r2",
"predicate": "LENDER_TO",
"claim_type": "VERIFIED_FACT"
}
],
"counts": {
"facts": 1,
"relationships": 5,
"events": 0,
"claims_total": 19,
"rows_total": 14,
"uncertainty": 0,
"coverage_limits": 1
},
"withheld": {
"access": "anonymous",
"withheld_in_this_answer": {
"rows": 24,
"why": "rows whose names the access gate withheld are left out of this answer rather than shown masked"
}
},
"more": "detail=research returns the facts, relationships, claims and limits in full"
}Python: the full answer, then the next page
Standard library only. The full answer pages whole claims at a time; pass page.continuation back as continue to get the next page. A continuation returns the next page of the same plan; it does not re-run the question.
research and continue
# Python 3.8+, standard library only. One research call, then its next page.
import json
import urllib.request
MCP = "https://exchange-production-9123.up.railway.app/mcp/core?c=docs"
def call(tool, arguments, rpc_id=1):
body = json.dumps({
"jsonrpc": "2.0", "id": rpc_id, "method": "tools/call",
"params": {"name": tool, "arguments": arguments},
}).encode()
req = urllib.request.Request(MCP, data=body, headers={
"Content-Type": "application/json",
"Accept": "application/json, text/event-stream",
"User-Agent": "my-research-agent/1.0",
})
with urllib.request.urlopen(req, timeout=60) as resp:
result = json.load(resp)["result"]
return result["structuredContent"]
page1 = call("research", {
"question": "Which BDCs lend to Auctane, and which of them are current lenders?",
})
print(page1["answer_state"], "|", page1["answer"]["text"][:160])
for row in page1["relationships"]:
print(" ", row["type"], "|", row["subject"]["name"], "| current:", row.get("current"), "|", row["claim_type"], "|", row["cite"]["url"])
print("page", page1["page"]["index"], "of", page1["page"]["pages"])
if page1["page"].get("continuation"):
page2 = call("research", {"continue": page1["page"]["continuation"]}, rpc_id=2)
for row in page2["relationships"]:
print(" ", row["type"], "|", row["subject"]["name"], "| current:", row.get("current"), "|", row["claim_type"], "|", row["cite"]["url"])
print("page", page2["page"]["index"], "of", page2["page"]["pages"])What production returned at . Standard output in full.
OK | At 2026-06-30, 29 BDCs held positions in Auctane Inc on their own schedules of investments; the largest: Blackstone Private Credit Fund ($889.4M of debt at fair BDC_SCHEDULE_HOLDING | Blackstone Private Credit Fund | current: True | VERIFIED_FACT | https://www.sec.gov/Archives/edgar/data/1803498/000180349826000048/bcred-20260630.htm BDC_SCHEDULE_HOLDING | Blackstone Secured Lending Fund | current: True | VERIFIED_FACT | https://www.sec.gov/Archives/edgar/data/1736035/000173603526000016/bxsl-20260630.htm BDC_SCHEDULE_HOLDING | ARES CAPITAL CORP | current: True | VERIFIED_FACT | https://www.sec.gov/Archives/edgar/data/1287750/000162828026050307/arcc-20260630.htm BDC_SCHEDULE_HOLDING | Goldman Sachs Private Credit Corp. | current: True | VERIFIED_FACT | https://www.sec.gov/Archives/edgar/data/1920145/000119312526340582/ck0001920145-20260630.htm page 1 of 3 BDC_SCHEDULE_HOLDING | ARES STRATEGIC INCOME FUND | current: True | VERIFIED_FACT | https://www.sec.gov/Archives/edgar/data/1918712/000162828026054923/asif-20260630.htm SPONSOR_OF_BORROWER | Thoma Bravo | current: True | REPORTED | https://www.thomabravo.com/press-releases/wwex-group-and-auctane-complete-merger-creating-leading-logistics-provider-shipstation-global page 2 of 3
TypeScript: from a name to a lender group
Two reads an agent can compose itself: resolve_name turns a name into a DFX id, and get_borrower_facilities with group_by: "lender" returns one row per BDC lender, each summed from that lender's own filing.
resolve_name, then get_borrower_facilities
// Node 18+ (built-in fetch). Save as lenders.mts and run: npx tsx lenders.mts
const MCP = "https://exchange-production-9123.up.railway.app/mcp/core?c=docs";
async function call(name: string, args: Record<string, unknown>, id = 1) {
const res = await fetch(MCP, {
method: "POST",
headers: {
"Content-Type": "application/json",
Accept: "application/json, text/event-stream",
"User-Agent": "my-research-agent/1.0",
},
body: JSON.stringify({ jsonrpc: "2.0", id, method: "tools/call", params: { name, arguments: args } }),
});
const { result } = await res.json();
return result.structuredContent;
}
// 1. a name to a DFX id
const found = await call("resolve_name", { name: "Auctane" });
const borrower = found.results.find((r: any) => r.domain === "private_credit");
console.log(borrower.name, borrower.dfx_id);
// 2. one row per BDC lender, from each lender's own filing
const group = await call("get_borrower_facilities", { dfx_id: borrower.dfx_id, group_by: "lender", limit: 5 }, 2);
console.log(group.state, "| lenders:", group.total);
for (const r of group.results) {
console.log(" ", r.lender.name, "|", r.as_of, "|", r.fair_value_usd, "|", r.claim_type, "|", r.cite_url);
}What production returned at . Standard output in full.
Auctane Inc dfx:pc:d071f992-5b4e-dffb-9f2c-22cb2204622b OK | lenders: 29 Blackstone Private Credit Fund | 2026-06-30 | 889367000 | VERIFIED_FACT | https://www.sec.gov/Archives/edgar/data/1803498/000180349826000048/bcred-20260630.htm Blackstone Secured Lending Fund | 2026-06-30 | 277347000 | VERIFIED_FACT | https://www.sec.gov/Archives/edgar/data/1736035/000173603526000016/bxsl-20260630.htm ARES CAPITAL CORP | 2026-06-30 | 241600000 | VERIFIED_FACT | https://www.sec.gov/Archives/edgar/data/1287750/000162828026050307/arcc-20260630.htm Goldman Sachs Private Credit Corp. | 2026-06-30 | 217685000 | VERIFIED_FACT | https://www.sec.gov/Archives/edgar/data/1920145/000119312526340582/ck0001920145-20260630.htm ARES STRATEGIC INCOME FUND | 2026-06-30 | 117539100 | VERIFIED_FACT | https://www.sec.gov/Archives/edgar/data/1918712/000162828026054923/asif-20260630.htm
curl: what changed since a date
changes_since with a domain, an optional dfx_id and an ISO since returns dated events. Each carries occurred_at (when it happened, and on what basis) and first_seen_at (when DFX first read it), and the answer counts them by novelty so a newly read old quarter is never presented as news. Pass cursor_hint.next_since as the next since to poll.
changes_since
curl -s "https://exchange-production-9123.up.railway.app/mcp/core?c=docs" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":4,"method":"tools/call","params":{"name":"changes_since",
"arguments":{"domain":"private_credit","dfx_id":"dfx:pc:d071f992-5b4e-dffb-9f2c-22cb2204622b",
"since":"2026-04-01"}}}'What production returned at . Fields excerpted from the answer; every value shown is verbatim.
{
"state": "OK",
"count": 1,
"novelty_filter": {
"returned_by_novelty": {
"NEW_EVENT": 1
}
},
"results": [
{
"cite_url": "https://www.sec.gov/Archives/edgar/data/1959604/000119312526345216/ck0001959604-20260630.htm",
"cite_granularity": "document",
"claim_type": "VERIFIED_FACT",
"event_type": "NEW_LENDER",
"subject": {
"dfx_id": "dfx:pc:9ba07849-6ea0-3d70-60a3-ce0d407d8bab",
"name": "Jefferies Credit Partners BDC Inc.",
"entity_type": "bdc"
},
"related": {
"dfx_id": "dfx:pc:d071f992-5b4e-dffb-9f2c-22cb2204622b",
"name": "Auctane Inc",
"entity_type": "borrower"
},
"headline": "Jefferies Credit Partners BDC Inc. joins Auctane Inc term loan (first lien) held by 24 other BDCs",
"occurred_at": "2026-06-30",
"occurred_basis": "filing",
"first_seen_at": "2026-09-21T17:16:09.14437+00:00",
"materiality": "market",
"magnitude": 5913000,
"magnitude_unit": "usd",
"confidence": 0.9
}
],
"cursor_hint": {
"next_since": "2026-10-11T20:24:09.781060+00:00",
"note": "pass next_since as `since` on the next call to see only what DFX saw after this answer"
}
}The JSON API, without MCP
For pipelines that call plain HTTP. https://dfxintel.com/api/data-factory/v1 lists every route. /search and /explore answer without a key; /forward, /changes and /universes need a signed-in session or a key.
GET /v1/search
curl -s "https://dfxintel.com/api/data-factory/v1/search?q=auctane&limit=3"
What production returned at . The first of 3 hits; the records array that follows is left out.
{
"version": "v1",
"q": "auctane",
"hits": [
{
"graph": "pc",
"entityType": "borrower",
"id": "d071f992-5b4e-dffb-9f2c-22cb2204622b",
"name": "Auctane Inc",
"matched": null,
"matchKind": "name",
"subclass": "Air Freight & Logistics",
"classState": "PERFORMING",
"city": null,
"state": null,
"context": "Thoma Bravo",
"score": 1.37964,
"href": "/private-credit/borrowers/d071f992-5b4e-dffb-9f2c-22cb2204622b",
"tier": "observed",
"also": [],
"see": null,
"capital": {
"status": "CONFIRMED",
"confidence": 0.95,
"evidenceCount": 31,
"lastRaise": "2026-06-30",
"equitySold": null,
"identity": "name_only"
}
}
]
}Checked against production on . The same page as Markdown, for agents: /api/data-factory/v1/docs/examples.