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 aggregate Fund Economics engine over the life of a fund. It does not open or recalculate the quarterly 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 result is returned under data.result.
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. 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.