Hemrock API
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.
Authentication
Create a key under Settings → API keys. 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/v1Until the api.hemrock.com alias is live, the same routes are reachable on the main domain at https://www.hemrock.com/v1.
Models & pricing
| Model | Endpoint | Access |
|---|---|---|
| Cap Table | /v1/cap-table/compute | From $20 · Buy access |
| Exit Waterfall | /v1/exit-waterfall/compute | From $20 · Buy access |
| Fund Economics | /v1/fund-economics/compute | Free |
Machine-readable at /api/v1/catalog. A gated call without access returns 402 with a checkoutUrl in the error details, so an agent can resolve the block and retry.
Quickstart
curl -X POST https://api.hemrock.com/v1/cap-table/compute \
-H "Authorization: Bearer hk_live_..." \
-H "Content-Type: application/json" \
-d '{
"events": [
{ "type": "common_issuance", "label": "Founders",
"grants": [{ "id": "f", "name": "Founder", "shares": 8000000, "kind": "founder" }] }
]
}'Endpoints
/cap-table/computeCompute a cap table
Fold a list of cap-table events into a sequence of snapshots and the final state. Stateless. Requires the Cap Table & Exit Waterfall entitlement on the calling account (free with the product); a valid key without it 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 |
| 422 | Engine error (well-formed but invalid input) |
/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 |
| 422 | Engine error (well-formed but invalid input) |
/fund-economics/computeCompute fund economics
Forecast a venture fund: capital calls, fees, deployment, NAV, and gross/net returns. The Fund Economics Tool is free, so any valid key works, no entitlement.
{
"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 |
| 422 | Engine error (well-formed but invalid input) |
/keysList your API keys
List the calling account's keys (prefixes only, raw tokens are never returned).
| Status | Meaning |
|---|---|
| 200 | Your keys |
| 401 | Missing or invalid API key |
/keysCreate an API key
Mint a new key for the calling account. The raw token is returned once in data.key.token. This is the programmatic alternative to Settings → API keys.
{
"name": "agent-key"
}| Status | Meaning |
|---|---|
| 200 | Created key (includes the raw token, once) |
| 401 | Missing or invalid API key |
/keys/{id}Revoke an API key
Revoke one of the calling account's keys. Scoped to the owner; a no-op if already revoked.
| Status | Meaning |
|---|---|
| 200 | Revoked |
| 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 connector:
https://mcp.hemrock.com/mcpThe discovery tools (list_models, get_access) are open. The compute tools (cap_table_compute, exit_waterfall_compute, fund_economics_compute) use your API key: add your hk_live_… key to the connector and it is forwarded as the bearer token. Full 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.