API reference
The same engines that power the tools on hemrock.com, callable from your code, scripts, or agents via API and MCP.
Version 0.1.0 (v0.x). The wire format may change while the contract settles.
Access
API access is included for users who have paid at least the minimum price for the related web tool. Each purchase includes the annual calculation allowance shown below.
| Model | Endpoint | Access |
|---|---|---|
| Cap Table | /v1/cap-table/compute | $20/year · 6,000 calculations |
| Exit Waterfall | /v1/exit-waterfall/compute | $20/year · 6,000 calculations |
| Fund Economics | /v1/fund-economics/compute | $20/year · 6,000 calculations |
The catalog is also available in machine-readable form at /api/v1/catalog. A gated call without access returns 402 with a checkoutUrl, so an agent can resolve the block and retry.
Need a larger allowance or support for a team? Enterprise pricing is available. Contact Taylor to discuss your API usage.
Authentication
Create a key under developer dashboard. You see the raw token (hk_live_…) once. Send it on every request:
Authorization: Bearer hk_live_...Each call runs against your account’s product entitlements. A valid key without the required product gets a 402. Treat a key like a password; revoke it from the same page if it leaks.
Base URL
https://api.hemrock.com/v1The same routes are also reachable on the main domain at https://www.hemrock.com/v1.
Run the fund model
This runs the Fund Economics engine, the same one the browser tool uses. It answers with lifetime totals and with the fund by year: cash flows, NAV, the J-curve, an IRR solved from those flows, and statements. It does not open or recalculate the Venture Capital Model workbook; that spreadsheet does not have an API. Any valid Hemrock API key can run this endpoint using its independent annual allowance.
curl -X POST https://api.hemrock.com/v1/fund-economics/compute \
-H "Authorization: Bearer hk_live_..." \
-H "Content-Type: application/json" \
-d '{
"inputs": {
"committedCapital": 25000000,
"gpCommitPct": 0.02,
"gpCommitCountedTowardInvested": true,
"organizationalExpenses": 150000,
"operationalExpensesAnnual": 100000,
"partnershipExpensesAnnual": 0,
"mgmtFeePct": 0.02,
"recycledCapitalPct": 0.1,
"carryPct": 0.2,
"newInvestmentPeriodYears": 4,
"mgmtFeesPeriodYears": 10,
"fundOperationsYears": 10,
"portfolio": {
"newPct": 1,
"followPct": 0,
"avgCheckSizeNew": 750000,
"avgCheckSizeFollow": 0,
"entryStages": [
{
"name": "Average Investment",
"numInvestments": 0,
"avgCheckSize": 750000,
"pctAllocation": 1,
"reserveRatio": 0
}
]
},
"returnTiers": [
{
"name": "writeoff",
"pctOfCapital": 0.6,
"multiple": 0,
"holdingPeriodYears": 2
},
{
"name": "small",
"pctOfCapital": 0.2,
"multiple": 1.5,
"holdingPeriodYears": 3
},
{
"name": "medium",
"pctOfCapital": 0.1,
"multiple": 5,
"holdingPeriodYears": 4
},
{
"name": "large",
"pctOfCapital": 0.1,
"multiple": 32,
"holdingPeriodYears": 6
}
]
}
}'Start with this complete input object and change the assumptions you need. Percentages are decimals: 0.20 means 20%. portfolio.newPct plus portfolio.followPct must equal 1, and the return-tier pctOfCapital values must also total 1. The totals come back under data.result and the fund by year under data.detail. Send "granularity": "quarter" for quarters or "granularity": "none" for the totals alone, and add a features block for a preferred return and catch-up, fee bases, LP classes, a cap-table portfolio or a management company budget.
Endpoints
/cap-table/to-waterfallMap a retained cap-table result with explicit economic terms; zero calculations.
| Status | Meaning |
|---|---|
| 200 | Waterfall model and explicit assumptions |
| 400 | Unavailable result or unsupported terms |
| 401 | Authentication required |
/compute/batchQuote or execute up to five scenarios for one product. Execution requires Idempotency-Key.
| Status | Meaning |
|---|---|
| 200 | Quote or per-case outcomes |
| 402 | No free access |
| 403 | Paid quota exhausted |
| 409 | Idempotency conflict or pending |
/results/{id}View or export an owned result retained for 24 hours; zero calculations.
| Status | Meaning |
|---|---|
| 200 | Persisted result with CSV calculated values, or downloadable CSV |
| 400 | Result unavailable for this account |
| 401 | Authentication required |
/cap-table/computeCompute a cap table
Fold a list of cap-table events into a sequence of snapshots and the final state. Stateless. Requires an active Cap Table & Exit Waterfall free allowance or paid compute period; exhausted free access returns 402.
{
"events": [
{
"type": "common_issuance",
"label": "Founders",
"grants": [
{
"id": "founder",
"name": "Founder",
"shares": 8000000,
"kind": "founder"
}
]
},
{
"type": "priced_round",
"label": "Seed",
"preMoneyValuation": 6000000,
"investments": [
{
"id": "seed",
"name": "Seed Fund",
"amount": 2000000
}
],
"pools": [
{
"pct": 0.1,
"mode": "pre"
}
]
}
]
}| Status | Meaning |
|---|---|
| 200 | Computed cap table |
| 400 | Validation failed (bad JSON or missing events array) |
| 401 | Missing or invalid API key |
| 402 | Cap Table entitlement required |
| 409 | Idempotency key was already used with a different payload |
| 422 | Engine error (well-formed but invalid input) |
| 429 | Rate limit exceeded (paid quota exhaustion uses 403) |
| 503 | Compute service temporarily unavailable |
/exit-waterfall/computeCompute an exit waterfall
Distribute exit proceeds across the cap stack: preferences, participation, conversions, and in-the-money options/warrants. Requires the Cap Table & Exit Waterfall entitlement (a valid key without it returns 402).
{
"model": {
"common": [
{
"id": "founder",
"name": "Founder",
"shares": 8000000
}
],
"preferred": [
{
"id": "seed",
"name": "Seed",
"seniority": 1,
"holders": [
{
"id": "seed-fund",
"name": "Seed Fund",
"shares": 2500000,
"invested": 2000000
}
]
}
]
},
"exitValuation": 50000000
}| Status | Meaning |
|---|---|
| 200 | Computed waterfall |
| 400 | Validation failed (bad JSON or missing model / exitValuation) |
| 401 | Missing or invalid API key |
| 402 | Cap Table & Exit Waterfall entitlement required |
| 409 | Idempotency key was already used with a different payload |
| 422 | Engine error (well-formed but invalid input) |
| 429 | Rate limit exceeded (paid quota exhaustion uses 403) |
| 503 | Compute service temporarily unavailable |
/fund-economics/computeCompute fund economics
Forecast a venture fund: capital calls, fees, deployment, NAV, and gross/net returns, as lifetime totals (result) and over time (detail): cash flows by year or quarter, the J-curve, IRRs from dated cash flows, and financial statements. Optional features (cap-table construction, fee bases, preferred return and catch-up, LP classes, a management company budget) apply when their block is sent. Set granularity to "none" for totals only. Set format to "xlsx" to also get the live Excel workbook as base64, or "xlsx_url" for a download link that lasts 24 hours. Requires remaining free Fund Economics credits or an active paid compute period.
{
"inputs": {
"committedCapital": 25000000,
"gpCommitPct": 0.02,
"gpCommitCountedTowardInvested": true,
"organizationalExpenses": 150000,
"operationalExpensesAnnual": 100000,
"partnershipExpensesAnnual": 0,
"mgmtFeePct": 0.02,
"recycledCapitalPct": 0.1,
"carryPct": 0.2,
"newInvestmentPeriodYears": 4,
"mgmtFeesPeriodYears": 10,
"fundOperationsYears": 10,
"portfolio": {
"newPct": 1,
"followPct": 0,
"avgCheckSizeNew": 750000,
"avgCheckSizeFollow": 0,
"entryStages": [
{
"name": "Average Investment",
"numInvestments": 0,
"avgCheckSize": 750000,
"pctAllocation": 1,
"reserveRatio": 0
}
]
},
"returnTiers": [
{
"name": "writeoff",
"pctOfCapital": 0.6,
"multiple": 0,
"holdingPeriodYears": 2
},
{
"name": "small",
"pctOfCapital": 0.2,
"multiple": 1.5,
"holdingPeriodYears": 3
},
{
"name": "medium",
"pctOfCapital": 0.1,
"multiple": 5,
"holdingPeriodYears": 4
},
{
"name": "large",
"pctOfCapital": 0.1,
"multiple": 32,
"holdingPeriodYears": 6
}
]
}
}| Status | Meaning |
|---|---|
| 200 | Computed fund economics |
| 400 | Validation failed (bad JSON or invalid inputs) |
| 401 | Missing or invalid API key |
| 402 | Fund Economics annual compute access required |
| 409 | Idempotency key was already used with a different payload |
| 422 | Engine error (well-formed but invalid input) |
| 429 | Rate limit exceeded (paid quota exhaustion uses 403) |
| 503 | Compute service temporarily unavailable |
/accessGet compute access and recent usage
Return the calling account’s independent product access, remaining annual allowances, and recent daily usage.
| Status | Meaning |
|---|---|
| 200 | Product access and daily usage |
| 401 | Missing or invalid API key |
/usageGet compute usage
Return access and UTC daily usage for an inclusive date range of at most 366 days.
| Status | Meaning |
|---|---|
| 200 | Product access and daily usage |
| 400 | Invalid YYYY-MM-DD range or range exceeds 366 days |
| 401 | Missing or invalid API key |
Errors
Every failure is the same shape, with a stable code:
{
"error": {
"code": "payment_required",
"message": "This API needs the Cap Table & Exit Waterfall product.",
"retryable": false
}
}From an agent (MCP)
The same engines are available as MCP tools, so an agent calls them as native tools instead of writing HTTP. Add the signed-in connector, and your client asks you to sign in to Hemrock:
https://mcp.hemrock.com/mcp/accountThe discovery tools (list_models, get_access) are open. The compute tools (cap_table_compute, exit_waterfall_compute, fund_economics_compute) run on that sign-in. The public https://mcp.hemrock.com/mcp URL carries the reference and discovery tools only, unless the connector sends Authorization: Bearer hk_live_…. A compute call without access answers with the sign-in or purchase link it needs. Full setup guide at hemrock.com/mcp.
Spec and what's next
The machine-readable OpenAPI spec is at /api/v1/openapi.json.
The MCP server is live (see above). A CLI that wraps these same routes is next.