Skip to Content
Docs are evolving — expect frequent updates.
CompanyChange Status & Phase

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

HeaderRequiredDescription
AuthorizationYesYour API key (format: YOUR_API_KEY)
Content-TypeYesapplication/json

Request Body

FieldTypeRequiredDescription
projectIdstring (UUID)YesThe company to update
projectstatusIdstring (UUID)YesTarget status id — from Config
projectphaseIdstring (UUID)YesTarget phase id — from Config
projectstageIdstring (UUID)NoAlso move the company to this stage — from Pipeline Stages
reasonTakenArrayarrayNoReasons for the change (see below)
commentstringNoFree-text note stored with the change

reasonTakenArray

Each entry records one reason. Reason ids come from your workspace configuration in Config.

CODE
[
  { "projectstatusreasonId": "8b1c...", "isActive": true },
  { "id": "existing-reason-taken-id", "projectstatusreasonId": "9c2d...", "isActive": false }
]
  • Pass projectstatusreasonId + isActive: true to attach a reason.
  • Pass an existing id with isActive: false to 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 projectstageId when one is supplied

Quick Start

CODE
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

CODE
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

CODE
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)

CODE
{
  "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

SituationResponse
Missing or malformed field400 with the offending field named
Invalid API key401 Unauthorized
Company not in your workspace, or unknown status/phase id200 with an error envelope (metadata.code1000)

Finding the IDs

IDWhere to get it
projectIdRetrieve Companies or Search Companies
projectstatusId, projectphaseId, projectstatusreasonIdConfig — reference data for your workspace
projectstageIdPipeline Stages
  • 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