The goal
Replace profile tab hopping with one evidence packet
A company profile is useful for exploration. An investment discussion needs a stable packet that a colleague can read, save, and challenge. This cookbook turns one Dealroom company UUID into Markdown or structured JSON.
The output separates reported facts from estimates and unavailable fields. It does not manufacture a narrative where source coverage is thin.
A brief, not a verdict
The script assembles evidence for review. It does not score an investment, infer ownership, or replace commercial, legal, technical, and reference diligence.
Evidence plan
Give each question one source
The entity detail record carries the company identity and headline metrics. Typed company subresources supply the relationships and time series.
| Question | Endpoint |
|---|---|
| What is the company? | GET /data/entities/{id} |
| How has it been financed? | GET /data/companies/{id}/funding-rounds |
| What valuations are recorded? | GET /data/companies/{id}/valuations |
| Who invested? | GET /data/companies/{id}/investors |
| Who is on the current team? | GET /data/companies/{id}/team |
| What financial history is available? | GET /data/companies/{id}/financials |
| Is web attention changing? | GET /data/companies/{id}/web-traffic |
| Where and how is headcount distributed? | GET /data/companies/{id}/headcount-breakdown |
Request monetary fields in one currency before comparing them. This example uses USD throughout.
Data retrieval
Use the company UUID as the join key
Names change and can be ambiguous. A Dealroom UUID is stable and routes directly to every typed company resource.
root = f"/data/companies/{company_id}"
company = client.get(
f"/data/entities/{company_id}",
{"currency": "USD"},
)["data"]
funding = rows(client.get(f"{root}/funding-rounds", {"limit": 100}))
valuations = rows(client.get(f"{root}/valuations", {"limit": 100}))
investors = rows(client.get(f"{root}/investors", {"limit": 100}))
financials = rows(client.get(f"{root}/financials", {"currency": "USD"}))
traffic = rows(client.get(f"{root}/web-traffic"))
headcount = rows(client.get(f"{root}/headcount-breakdown"))
team = rows(client.get(f"{root}/team", {"is_past": "false"}))
The downloadable client refreshes its OAuth2 token after a 401 and retries rate limits and temporary server errors with bounded backoff.
Normalization
Keep unknown different from zero
Private-company records are naturally uneven. An undisclosed round is not a zero-dollar round. Missing R&D is not zero R&D. Preserve nulls until the final presentation layer.
def money(value):
if value is None:
return "not disclosed"
if abs(value) >= 1_000_000:
return f"${value / 1_000_000:.1f}M"
return f"${value:,.0f}"
For time series, sort by year and month before selecting the latest row. For headcount, select every item from the latest available month, then rank by percentage.
Brief assembly
Lead with facts, then expose the caveats
The default command prints Markdown for a memo, Notion page, or model context. The JSON option retains the full source records for your own renderer.
DEALROOM_CLIENT_ID=your_client_id
DEALROOM_CLIENT_SECRET=your_client_secret
DEALROOM_USER_AGENT=your-company-brief/1.0
pip install authlib requests python-dotenv
python company_360_brief.py
python company_360_brief.py --company YOUR_COMPANY_UUID
python company_360_brief.py --company YOUR_COMPANY_UUID --json
Use the Markdown output for human review. Use JSON when a downstream application needs to render its own memo, store source evidence, or run additional checks.
Real output
Inspect the generated Cerrion brief
Built from the same eight endpoints used in the downloadable example.
Loading the Company 360 snapshot...
Snapshot generated from the Dealroom API. Re-run the script for current data before making a decision.
Diligence discipline
State what the data cannot prove
A defensible brief includes its blind spots. Keep these constraints attached to the output:
- Profit and R&D depend on available company filings and are often null.
- Web traffic is an external estimate, not company-reported product usage.
- Recorded valuations may be estimates. Preserve the estimate flag.
- Shareholder names, ownership percentages, and cap-table data are not exposed.
- Funding records and current team relationships can change as coverage improves.
Complete example
Download the brief generator
The file includes OAuth2 authentication, retry behavior, eight API calls, normalization, Markdown rendering, and structured JSON output.