Upload & Run
Starting a fund analysis takes two calls:
- Upload the data room with
POST /fund/upload. Files are stored in a folder and you get back itsfolderPath. - Run the analysis with
POST /fund/run, passing thatfolderPathand a name.
Processing takes minutes. Poll Fund Detail for status, or subscribe to the
fundAnalysisCompleted webhook.
Headers
| Header | Required | Description |
|---|---|---|
Authorization | Yes | Your API key (format: YOUR_API_KEY) |
Content-Type | Yes | multipart/form-data for upload (set by your HTTP client); application/json for run |
1. Upload the data room
POST https://api.kruncher.ai/api/integrationfund/fund/upload
Send the documents as multipart/form-data, repeating the files field once per file.
Form fields
| Field | Type | Required | Description |
|---|---|---|---|
files | file (repeatable) | Yes | PDF, XLSX or XLS. Max 100 MB per file per request |
folderPath | string | No | A folderPath returned by an earlier upload. Files are added to that folder instead of a new one |
A data room bigger than one request fits comfortably: upload the first batch, then call again
with folderPath set to the value you got back. Each call adds to the same folder. The run
itself accepts up to 50 files in total.
Request
cURL
# First batch — creates the folder
curl -X POST "https://api.kruncher.ai/api/integrationfund/fund/upload" \
-H "Authorization: YOUR_API_KEY_HERE" \
-F "files=@Q2-2026-quarterly-report.pdf" \
-F "files=@Q2-2026-capital-account.pdf" \
-F "files=@schedule-of-investments.xlsx"
# Second batch — adds to the same folder
curl -X POST "https://api.kruncher.ai/api/integrationfund/fund/upload" \
-H "Authorization: YOUR_API_KEY_HERE" \
-F "folderPath=fund-uploads/6d5c4b3a-2f1e-4d0c-9b8a-7f6e5d4c3b2a" \
-F "files=@LPA.pdf" \
-F "files=@structure-chart.pdf"Response
{
"metadata": { "code": "1000", "title": "Successful", "description": "" },
"data": {
"folderPath": "fund-uploads/6d5c4b3a-2f1e-4d0c-9b8a-7f6e5d4c3b2a",
"fileNames": [
"Q2-2026-quarterly-report.pdf",
"Q2-2026-capital-account.pdf",
"schedule-of-investments.xlsx"
]
}
}| Field | Type | Description |
|---|---|---|
folderPath | string | Pass to /fund/run, or to another upload to add files |
fileNames | string[] | The files stored by this call |
2. Start the run
POST https://api.kruncher.ai/api/integrationfund/fund/run
Body
| Field | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Fund name shown in Kruncher |
folderPath | string | Yes | From the upload response |
refDate | string | No | Reporting date of the documents (YYYY-MM-DD) |
projectMode | string | No | none, bookmark or analyze: whether the portfolio companies become Kruncher companies, and whether they are analysed. Default bookmark |
fundstageId | string (uuid) | No | Fund stage to place the fund in |
projectstageId | string (uuid) | No | Pipeline stage for the portfolio companies created by bookmark / analyze |
projectlistId | string (uuid) | No | List to add those companies to |
customerIsInvestor | boolean | No | Your firm is an LP in this fund |
projectMode:
| Value | Effect |
|---|---|
none | Portfolio companies stay as names in the fund run |
bookmark | Each portfolio company is created as a Kruncher company (no company analysis, no extra credits) |
analyze | Each portfolio company is created and a company analysis is started for it, at the usual per-company cost |
Request
cURL
curl -X POST "https://api.kruncher.ai/api/integrationfund/fund/run" \
-H "Authorization: YOUR_API_KEY_HERE" \
-H "Content-Type: application/json" \
-d '{
"name": "Northwind Growth Fund II",
"folderPath": "fund-uploads/6d5c4b3a-2f1e-4d0c-9b8a-7f6e5d4c3b2a",
"refDate": "2026-06-30",
"projectMode": "bookmark",
"customerIsInvestor": true
}'Response
{
"metadata": { "code": "1000", "title": "Successful", "description": "" },
"data": {
"fundExtractionId": "3f1c9a2e-7b4d-4e1a-9c2f-5d6e7f8a9b0c",
"name": "Northwind Growth Fund II",
"status": "pending",
"refDate": "2026-06-30",
"createdAt": "2026-09-21T08:02:10.000Z"
}
}| Field | Type | Description |
|---|---|---|
fundExtractionId | string | The new run. Use it with every read endpoint |
name | string | Fund name |
status | string | Always pending on creation |
refDate | string/null | The reporting date you passed |
createdAt | string | ISO 8601 timestamp |
Credits and limits
- A run costs 10 credits, charged when the run is accepted. With no credits left the call
answers
Error131and nothing is charged. - A data room of more than 50 files is refused with
Error209before charging. Remove documents that do not carry fund data, or split the room. - Each file may be at most 100 MB; allowed types are PDF, XLSX and XLS.
projectMode: analyzeadditionally charges the usual company-analysis credits per portfolio company.
Errors
| Code | HTTP | Endpoint | Meaning |
|---|---|---|---|
Error131 | 402 | run | Your plan has no credits left |
Error209 | 400 | run | The folder holds more than 50 files |
Error100 | 404 | upload | folderPath does not name a folder you uploaded |
Error0 | 500 | both | Kruncher cannot reach its analysis engine; retry later |
A run that fails during processing is not an HTTP error: its status becomes error and
errorMessage on Fund Detail explains why. The fundAnalysisCompleted
webhook is not sent for failed runs.
Related Endpoints
- Fund Detail — poll for
status - Webhooks — be told when the run completes
- List Funds — the new fund appears here once created