Trace LLC ownership
Follow the holding company chain to find who's actually in control.
2 API calls · $0.01How can I find out who actually owns a Florida LLC? You're researching a property, a business partner, or a counterparty — and the public records only show an LLC name. The real decision-makers are hidden behind layers of holding companies. One detail call reveals the full officer list, including which officers are themselves corporations — giving you the next layer to trace.
In this example, we're looking up "Example Palm Holdings LLC."
The lookup
L00000000003What you learn
The type field on each officer tells you what to do next:
type: "P"(person) — you've found a real human. End of chain.type: "C"(corporation) — another LLC. Search its name and repeat.
Most chains are 2-3 layers deep. Each hop costs one request ($0.005). A full trace typically costs $0.01 – $0.02.
How it's built
Search by name to get the document number, then pull detail to see the officer list. When an officer is a corporation, repeat the process on that entity.
# Step 1: Search by name
# Replace "EXAMPLE+PALM+HOLDINGS" with the actual LLC name
$ curl -s -H "x-api-key: $API_KEY" \
"https://api.sunbizdata.com/api/v1/corporations/search/name?name=EXAMPLE+PALM+HOLDINGS"
< 200 OK (36ms)
{ "results": [{
"documentNumber": "L00000000003",
"corporationName": "EXAMPLE PALM HOLDINGS LLC",
"status": "Active"
}], "total": 1 }
# Step 2: Get full detail — check officer types
# Replace "L00000000003" with the documentNumber from step 1
$ curl -s -H "x-api-key: $API_KEY" \
"https://api.sunbizdata.com/api/v1/corporations/detail?documentNumber=L00000000003"
< 200 OK (44ms)
{
"corporationName": "EXAMPLE PALM HOLDINGS LLC",
"officers": [
{ "title": "MGR", "type": "C", "name": "EXAMPLE PARTNERS LLC" },
{ "title": "MGR", "type": "C", "name": "EXAMPLE INVESTORS GROUP LLC" }
]
}
# type "C" = corporation — search that name to go deeper
# type "P" = person — you've found the end of the chain// Recursively trace an LLC ownership chain
async function traceOwnership(name, depth = 0, maxDepth = 5) {
const headers = { "x-api-key": process.env.SUNBIZDATA_KEY };
if (depth >= maxDepth) return [{ name, note: "max depth reached" }];
const search = await fetch(
`https://api.sunbizdata.com/api/v1/corporations/search/name?name=${name}`,
{ headers }
).then(r => r.json());
if (!search.results.length) return [{ name, note: "not found" }];
const detail = await fetch(
`https://api.sunbizdata.com/api/v1/corporations/detail?documentNumber=${search.results[0].documentNumber}`,
{ headers }
).then(r => r.json());
const chain = [{ name: detail.corporationName, officers: detail.officers }];
for (const officer of detail.officers.filter(o => o.type === "C")) {
const deeper = await traceOwnership(officer.name, depth + 1, maxDepth);
chain.push(...deeper);
}
return chain;
}Start with $5, get 1,000 requests
Pay per request. No subscription. Requests never expire.
Get started