Skip to main content

Due diligence API for counterparty research

If you're underwriting a partnership, evaluating an acquisition target, or running counterparty risk for a fund, you need a 360-degree view of a public company that goes beyond its quote and fundamentals. Who owns it. Who's selling it. Is it being sued. Who buys from it. Are insiders dumping. Is short interest spiking.

That information lives in five or six different public datasets — SEC EDGAR (13F, Form 4, 10-K, Schedule 13D/G), FINRA short interest reports, USASpending.gov, federal court dockets via CourtListener / RECAP, and Exhibit 21 subsidiary lists embedded in annual reports. Stitching those together is a week of plumbing on the typical vendor stack.

Jintel returns all of it for one ticker — or for a list of tickers — in a single GraphQL request, normalized into a typed schema.

What due diligence covers

A standard counterparty file has roughly these sections:

SectionSchema fieldSource
Smart-money exposureEntity.topHoldersSEC 13F
Insider activityEntity.insiderTradesSEC Form 4
Short-seller signalEntity.ownership (shortPercentOfFloat, daysToCover) and MarketData.shortInterestFINRA
Recent 10-K / 10-QEntity.periodicFilings (Risk Factors, MD&A, Quant & Qual Risk sections)SEC EDGAR
Federal litigationEntity.litigationCourtListener / RECAP
Government revenueEntity.governmentContractsUSASpending.gov
SubsidiariesEntity.subsidiariesSEC 10-K / 20-F Exhibit 21
Customer concentrationEntity.concentrationSEC XBRL segments
Sanctions screentop-level sanctionsScreenOFAC SDN

Most of these surface as nested sub-graphs on Entity. They lazy-resolve only what you select — so you can ship a wide query and pay only for the fields you actually need.

A counterparty due-diligence request

query DueDiligence($ticker: String!, $name: String!) {
entityByTicker(ticker: $ticker) {
name tickers
market {
quote { price marketCap }
fundamentals { sector industry employees website }
}
ownership {
institutionOwnership institutionsCount
shortPercentOfFloat daysToCover shortInterestDate
}
topHolders(filter: { limit: 10 }) {
filerName cik value shares reportDate
}
insiderTrades(filter: {
limit: 20,
acquiredDisposed: DISPOSED,
since: "2024-01-01T00:00:00Z"
}) {
reporterName officerTitle isOfficer
transactionDate shares pricePerShare transactionValue
}
periodicFilings(filter: { limit: 2 }) {
form filingDate reportDate filingUrl
sections { item title excerpt bodyLength }
}
litigation(filter: { onlyActive: true, limit: 10 }) {
caseName court dateFiled docketNumber natureOfSuit absoluteUrl
}
governmentContracts(filter: { limit: 10, minAmount: 1000000 }) {
agency awardId actionDate amount awardType description
}
subsidiaries {
form filingDate
subsidiaries { name jurisdiction }
}
concentration {
form filingDate periodEnd
product { hhi count components { label share value } }
customer { hhi count components { label share value } }
geography { hhi count components { label share value } }
}
}

sanctionsScreen(name: $name, filter: { minScore: 70, limit: 5 }) {
listName matchedName score programs
}
}

This is one round trip. Mercurius loaders batch the upstream calls, so even though it spans five different connectors (Yahoo Finance, SEC EDGAR, FINRA, CourtListener, USASpending, OFAC), the response comes back together.

A note on sanctions: see the sanctions screening use case — Jintel's sanctionsScreen is a convenience-grade pre-filter, not a substitute for a compliance-grade vendor. Use it as a triage signal, not as the basis for a regulated decision.

Reading the signals

The agent or analyst consuming this response should look for:

  • Insider selling concentration: large transactionValue from isOfficer: true reporters, especially CEO/CFO, especially when not flagged isUnder10b5One: true.
  • Short interest rising: shortPercentOfFloat north of ~10% with daysToCover > 5 is a crowded short. Cross-reference against MarketData.shortInterest for the trend.
  • Active litigation: litigation(onlyActive: true) with natureOfSuit containing securities fraud, antitrust, or RICO is a different signal than slip-and-fall lawsuits.
  • Customer concentration risk: the top entry in concentration.customer.components (sorted by share descending) above 0.20 means a single customer is more than 20% of revenue — a structural risk worth flagging.
  • Government revenue exposure: large governmentContracts.amount totals concentrated in a single agency mean budget cycles and procurement rules are macro factors for the company.

Code

import { JintelClient } from "@yojinhq/jintel-client";

const jintel = new JintelClient({ apiKey: process.env.JINTEL_API_KEY });

const DUE_DILIGENCE = `
query($ticker: String!, $name: String!) {
entityByTicker(ticker: $ticker) {
name
ownership { shortPercentOfFloat daysToCover institutionOwnership }
topHolders(filter: { limit: 10 }) { filerName value shares }
insiderTrades(filter: { limit: 10, acquiredDisposed: DISPOSED }) {
reporterName officerTitle transactionDate transactionValue
}
litigation(filter: { onlyActive: true, limit: 5 }) {
caseName court dateFiled natureOfSuit
}
governmentContracts(filter: { limit: 5, minAmount: 1000000 }) {
agency actionDate amount description
}
concentration {
customer { components { label share } }
}
}
sanctionsScreen(name: $name, filter: { minScore: 70, limit: 5 }) {
listName matchedName score
}
}
`;

const { data } = await jintel.request(DUE_DILIGENCE, {
ticker: "PLTR",
name: "Palantir Technologies Inc",
});

Where to go next