Funds
The Fund Integration API exposes the fund analyses your team runs in Kruncher: a data room (quarterly reports, capital account statements, LPAs, schedules of investments) is uploaded, Kruncher extracts and reconciles the figures, and the result is a fund run you can read back as a workbook, a dashboard, a list of underlying assets, a legal structure and the raw extracted rows. You can also push a new data room and be told when the analysis is done.
Base URL and authentication
All fund endpoints live under:
https://api.kruncher.ai/api/integrationfund/Authenticate with the same API key you use for the rest of the Integration API
(Settings → API Integration in the Kruncher app). Send it raw in the Authorization
header — no Bearer prefix:
Authorization: YOUR_API_KEYEvery response uses the standard envelope:
{
"metadata": { "code": "1000", "title": "Successful", "description": "" },
"data": { }
}Concepts
Fund runs and ids
Each analysis of a data room is a fund run, identified by fundExtractionId. A run
belongs to a fund (fundId), and re-analysing the same fund with a later quarter’s
documents creates a new run on the same fund (an incremental run, which carries
baseFundExtractionId). Every read endpoint takes fundExtractionId; List Funds
returns one entry per fund with its latest run, and Fund Detail lists all
of a fund’s runs under fundRuns.
| Id | What it identifies |
|---|---|
fundExtractionId | One analysis run of a data room. The id every read endpoint takes. |
fundId | The fund the run belongs to. Shared across a fund’s versions. |
baseFundExtractionId | For an incremental run, the run it extends. null for the first run. |
refDate | The reporting date the documents describe (YYYY-MM-DD). |
Membership
Access follows the fund’s members, exactly as in the app. The API key belongs to a user; the
endpoints return only the funds that user has a role on (owner, contributor or reader,
reported as myRole). A fund the user has no role on answers Error212 (HTTP 403). An
unknown id answers Error100 (HTTP 404).
Status
A run moves through pending → running → completed, or ends in error (with
errorMessage). Only a completed run has a workbook, an overview, assets and data.
Endpoints
Read
| Endpoint | Description |
|---|---|
| List Funds | Every fund you can open, with headline figures and portfolio size |
| Fund Detail | Run summary: status, stage, companies, versions and which views are available |
| Fund Workbook | The reviewed workbook: fund sheet, schedule of investments, one sheet per company |
| Fund Overview | The dashboard: performance, portfolio totals, NAV estimator, portfolio stats |
| Fund Assets | The underlying assets with cost, NAV, distributions, multiples and Kruncher signals |
| Fund Structure | The legal structure as a Mermaid flowchart plus the extracted entities |
| Fund Data | Raw extracted and reconciled rows, by section |
Push
| Endpoint | Description |
|---|---|
| Upload & Run | Upload a data room and start a fund analysis (10 credits) |
Webhook
| Event | Description |
|---|---|
fundAnalysisCompleted | Fires when a fund analysis finishes processing |
Walkthrough: read → push → webhook
1. See which funds you already have.
curl -s "https://api.kruncher.ai/api/integrationfund/funds" \
-H "Authorization: YOUR_API_KEY" | jq '.data.funds[] | {name, fundExtractionId, status, refDate}'2. Read one run. Start with the detail to see what is available, then pull the view you need.
FUND_RUN="3f1c9a2e-7b4d-4e1a-9c2f-5d6e7f8a9b0c"
curl -s "https://api.kruncher.ai/api/integrationfund/fund?fundExtractionId=$FUND_RUN" \
-H "Authorization: YOUR_API_KEY" | jq '.data.available'
curl -s "https://api.kruncher.ai/api/integrationfund/fund/overview?fundExtractionId=$FUND_RUN" \
-H "Authorization: YOUR_API_KEY" | jq '.data.portfolio'3. Push a new data room. Upload the files, then start the run with the returned folderPath.
UPLOAD=$(curl -s -X POST "https://api.kruncher.ai/api/integrationfund/fund/upload" \
-H "Authorization: YOUR_API_KEY" \
-F "files=@Q2-2026-quarterly-report.pdf" \
-F "files=@Q2-2026-capital-account.pdf" \
-F "files=@schedule-of-investments.xlsx")
FOLDER=$(echo "$UPLOAD" | jq -r '.data.folderPath')
curl -s -X POST "https://api.kruncher.ai/api/integrationfund/fund/run" \
-H "Authorization: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d "{\"name\": \"Northwind Growth Fund II\", \"folderPath\": \"$FOLDER\", \"refDate\": \"2026-06-30\"}"4. Wait for completion. Either poll Fund Detail until status is
completed, or subscribe to the fundAnalysisCompleted event in
Settings → API Integration → Webhook and fetch the detail when it arrives:
{
"event": "fundAnalysisCompleted",
"data": {
"fundExtractionId": "3f1c9a2e-7b4d-4e1a-9c2f-5d6e7f8a9b0c",
"fundId": "9e8d7c6b-5a4f-4e3d-2c1b-0a9f8e7d6c5b",
"fundName": "Northwind Growth Fund II",
"status": "completed",
"refDate": "2026-06-30",
"fundstage": { "id": "1a2b3c4d-0000-4000-8000-000000000001", "name": "Screening", "type": "screening" },
"companiesCount": 14
}
}Errors
| Code | HTTP | Meaning |
|---|---|---|
Error100 | 404 | No run with that fundExtractionId in your workspace |
Error212 | 403 | The fund exists but your user has no role on it |
Error131 | 402 | Your plan has no credits left to start a run |
Error209 | 400 | The data room has more than 50 files |
Error0 | 500 | Kruncher cannot reach its analysis engine; retry later |
Errors come back in the same envelope, with the code, title and description in metadata
and data: null.
Related
- Webhooks — the
fundAnalysisCompletedevent - Company Report — portfolio companies that were analysed (
projectMode: analyze) have full company reports