Cap Table Workshop, October 28 Save a seat

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.

ModelEndpointAccess
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/v1

The 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.

bash
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

post/cap-table/to-waterfall

Map a retained cap-table result with explicit economic terms; zero calculations.

StatusMeaning
200Waterfall model and explicit assumptions
400Unavailable result or unsupported terms
401Authentication required
post/compute/batch

Quote or execute up to five scenarios for one product. Execution requires Idempotency-Key.

StatusMeaning
200Quote or per-case outcomes
402No free access
403Paid quota exhausted
409Idempotency conflict or pending
get/results/{id}

View or export an owned result retained for 24 hours; zero calculations.

StatusMeaning
200Persisted result with CSV calculated values, or downloadable CSV
400Result unavailable for this account
401Authentication required
post/cap-table/compute

Compute 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.

Example request body
json
{
  "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"
        }
      ]
    }
  ]
}
StatusMeaning
200Computed cap table
400Validation failed (bad JSON or missing events array)
401Missing or invalid API key
402Cap Table entitlement required
409Idempotency key was already used with a different payload
422Engine error (well-formed but invalid input)
429Rate limit exceeded (paid quota exhaustion uses 403)
503Compute service temporarily unavailable
post/exit-waterfall/compute

Compute 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).

Example request body
json
{
  "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
}
StatusMeaning
200Computed waterfall
400Validation failed (bad JSON or missing model / exitValuation)
401Missing or invalid API key
402Cap Table & Exit Waterfall entitlement required
409Idempotency key was already used with a different payload
422Engine error (well-formed but invalid input)
429Rate limit exceeded (paid quota exhaustion uses 403)
503Compute service temporarily unavailable
post/fund-economics/compute

Compute 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.

Example request body
json
{
  "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
      }
    ]
  }
}
StatusMeaning
200Computed fund economics
400Validation failed (bad JSON or invalid inputs)
401Missing or invalid API key
402Fund Economics annual compute access required
409Idempotency key was already used with a different payload
422Engine error (well-formed but invalid input)
429Rate limit exceeded (paid quota exhaustion uses 403)
503Compute service temporarily unavailable
get/access

Get compute access and recent usage

Return the calling account’s independent product access, remaining annual allowances, and recent daily usage.

StatusMeaning
200Product access and daily usage
401Missing or invalid API key
get/usage

Get compute usage

Return access and UTC daily usage for an inclusive date range of at most 366 days.

StatusMeaning
200Product access and daily usage
400Invalid YYYY-MM-DD range or range exceeds 366 days
401Missing or invalid API key

Errors

Every failure is the same shape, with a stable code:

json
{
  "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/account

The 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.