Change Status & Phase
Change a company’s status (active, rejected, on hold, …) and phase (screening, due diligence, portfolio, …) in one call. Optionally set the pipeline stage at the same time, record why the change happened, and attach a comment.
This is the endpoint to use when a company is passed on, put on hold, or promoted into the portfolio. To move a company between stages within its current phase, use Change Stage instead.
Endpoint
POST https://api.kruncher.ai/api/integration/project/status
Headers
| Header | Required | Description |
|---|---|---|
Authorization | Yes | Your API key (format: YOUR_API_KEY) |
Content-Type | Yes | application/json |
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
projectId | string (UUID) | Yes | The company to update |
projectstatusId | string (UUID) | Yes | Target status id — from Config |
projectphaseId | string (UUID) | Yes | Target phase id — from Config |
projectstageId | string (UUID) | No | Also move the company to this stage — from Pipeline Stages |
reasonTakenArray | array | No | Reasons for the change (see below) |
comment | string | No | Free-text note stored with the change |
reasonTakenArray
Each entry records one reason. Reason ids come from your workspace configuration in Config.
[
{ "projectstatusreasonId": "8b1c...", "isActive": true },
{ "id": "existing-reason-taken-id", "projectstatusreasonId": "9c2d...", "isActive": false }
]- Pass
projectstatusreasonId+isActive: trueto attach a reason. - Pass an existing
idwithisActive: falseto remove a reason that was attached earlier.
Side Effects
Changing status or phase runs the same logic as the web app:
- Writes an entry to the company’s activity log
- Notifies watchers of the company (in-app and, if enabled, email/Slack/WhatsApp/Telegram)
- Triggers any stage automations attached to
projectstageIdwhen one is supplied
Quick Start
curl -X POST "https://api.kruncher.ai/api/integration/project/status" \
-H "Authorization: YOUR_API_KEY_HERE" \
-H "Content-Type: application/json" \
-d '{
"projectId": "521a93a6-091d-4943-ba13-7c1a654a14ae",
"projectstatusId": "0f1e8f7a-1c2b-4d3e-9f80-a1b2c3d4e5f6",
"projectphaseId": "6b7c8d9e-0f10-4a2b-8c3d-4e5f60718293",
"reasonTakenArray": [
{ "projectstatusreasonId": "c1d2e3f4-5061-4728-9a3b-4c5d6e7f8091", "isActive": true }
],
"comment": "Passing for now — round already closed."
}'Code Examples
JavaScript/TypeScript
Basic
const API_KEY = "YOUR_API_KEY_HERE";
const BASE_URL = "https://api.kruncher.ai/api";
async function changeStatus(projectId, projectstatusId, projectphaseId, options = {}) {
const response = await fetch(`${BASE_URL}/integration/project/status`, {
method: "POST",
headers: {
"Authorization": `${API_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
projectId,
projectstatusId,
projectphaseId,
projectstageId: options.projectstageId,
reasonTakenArray: options.reasons,
comment: options.comment
})
});
if (!response.ok) {
throw new Error(`Failed to change status: ${response.statusText}`);
}
return await response.json();
}
// Usage — reject a company with a reason
const result = await changeStatus(
"521a93a6-091d-4943-ba13-7c1a654a14ae",
REJECTED_STATUS_ID,
SCREENING_PHASE_ID,
{
reasons: [{ projectstatusreasonId: TOO_EARLY_REASON_ID, isActive: true }],
comment: "Pre-revenue, revisit after Series A."
}
);
console.log("Status changed:", result.data);Python
import requests
API_KEY = "YOUR_API_KEY_HERE"
BASE_URL = "https://api.kruncher.ai/api"
def change_status(
project_id: str,
projectstatus_id: str,
projectphase_id: str,
projectstage_id: str = None,
reasons: list = None,
comment: str = None,
) -> dict:
"""Change a company's status and phase."""
payload = {
"projectId": project_id,
"projectstatusId": projectstatus_id,
"projectphaseId": projectphase_id,
}
if projectstage_id:
payload["projectstageId"] = projectstage_id
if reasons:
payload["reasonTakenArray"] = reasons
if comment:
payload["comment"] = comment
response = requests.post(
f"{BASE_URL}/integration/project/status",
json=payload,
headers={
"Authorization": f"{API_KEY}",
"Content-Type": "application/json",
},
)
response.raise_for_status()
body = response.json()
if body["metadata"]["code"] != "1000":
raise RuntimeError(body["metadata"]["description"])
return body["data"]
# Usage — put a company on hold
project = change_status(
"521a93a6-091d-4943-ba13-7c1a654a14ae",
ON_HOLD_STATUS_ID,
SCREENING_PHASE_ID,
comment="Waiting on updated financials.",
)Response
Success Response (200 OK)
{
"metadata": {
"code": "1000",
"title": "Successful",
"description": ""
},
"data": {
"id": "521a93a6-091d-4943-ba13-7c1a654a14ae",
"companyName": "Acme Corporation",
"projectstatusId": "0f1e8f7a-1c2b-4d3e-9f80-a1b2c3d4e5f6",
"projectphaseId": "6b7c8d9e-0f10-4a2b-8c3d-4e5f60718293",
"...": "updated project object"
}
}Errors
| Situation | Response |
|---|---|
| Missing or malformed field | 400 with the offending field named |
| Invalid API key | 401 Unauthorized |
| Company not in your workspace, or unknown status/phase id | 200 with an error envelope (metadata.code ≠ 1000) |
Finding the IDs
| ID | Where to get it |
|---|---|
projectId | Retrieve Companies or Search Companies |
projectstatusId, projectphaseId, projectstatusreasonId | Config — reference data for your workspace |
projectstageId | Pipeline Stages |
Related Endpoints
- Change Stage — move within the pipeline without changing status
- Add Comment — log a note without changing status
- Change Criteria — override an investment-criteria outcome
- Config — status, phase, and reason reference data
Last updated on