Exit Waterfall Workshop, October 15 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 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.

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 result is returned under data.result.

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