Developer docs

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

Every example below ran against production on the date shown, and the output under it is what came back.

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.