Pipeline API
Retrieve the full pipeline board grouped by stage and move deals between stages — api.misar.io/reach/api/pipeline.
The pipeline represents your deals organized into a Kanban board. Each deal occupies exactly one stage at a time. The seven stages form a standard sales funnel from initial contact through close or loss.
Pipeline stages (in order):
| Stage | Description |
|---|---|
new | Lead identified, not yet contacted |
contacted | Outreach sent |
interested | Lead engaged positively |
meeting | Demo or call scheduled |
proposal | Proposal or quote submitted |
closed | Deal won |
lost | Deal lost — excluded from pipeline revenue |
Base URL: https://api.misar.io/reach
Get pipeline board
/api/pipelineReturns the full pipeline board — all deals grouped by stage — plus revenue totals. Optionally filtered by workspace. Required scope: deals:read.
Query parameters
workspaceIdstringqueryFilter the board to a specific workspace UUID.
Response fields
boardobjectObject with one key per stage (new through lost). Each value is an array of PipelineDeal objects ordered by created_at descending.
revenue.pipelinenumberSum of value for all deals not in closed or lost stages.
revenue.closednumberSum of value for deals in the closed stage.
stagesstring[]Ordered list of all stage identifiers.
curl "https://api.misar.io/reach/api/pipeline" \
-H "Authorization: Bearer msr_your_key_here"{
"board": {
"new": [{ "id": "uuid", "lead_name": "Priya Sharma", "lead_email": "[email protected]", "value": 5000, "currency": "USD", "stage": "new", "status": "new", "conversation_id": null, "campaign_id": null, "workspace_id": null, "created_at": "2026-05-21T10:00:00Z", "closed_at": null, "notes": null }],
"contacted": [],
"interested": [],
"meeting": [],
"proposal": [],
"closed": [],
"lost": []
},
"revenue": {
"pipeline": 135000,
"closed": 45000
},
"stages": ["new", "contacted", "interested", "meeting", "proposal", "closed", "lost"]
}lost deals are excluded from both revenue.pipeline and revenue.closed. They appear in the board.lost array for reference but do not affect revenue totals.
Move a deal
/api/pipelineMoves a deal to a new stage. This is the canonical "drag-and-drop" action for the Kanban UI. When the target stage is "closed", closed_at is automatically set. Required scope: deals:write.
Request body
dealIdstringbodyrequiredUUID of the deal to move.
newStagestringbodyrequiredTarget stage. Must be one of: "new" | "contacted" | "interested" | "meeting" | "proposal" | "closed" | "lost".
curl -X POST https://api.misar.io/reach/api/pipeline \
-H "Authorization: Bearer msr_your_key_here" \
-H "Content-Type: application/json" \
-d '{"dealId": "550e8400-e29b-41d4-a716-446655440000", "newStage": "meeting"}'{
"ok": true,
"deal": {
"id": "uuid",
"stage": "proposal",
"lead_email": "[email protected]"
}
}Status codes
| Code | Meaning |
|---|---|
200 | Deal moved to new stage |
400 | Invalid JSON |
404 | Deal not found or does not belong to authenticated user |
422 | Validation error (invalid dealId or unknown newStage) |
Pipeline deal object
Each deal in the board has the following shape:
idstringUUID of the deal.
lead_namestring | nullLead display name.
lead_emailstringLead email address.
valuenumberDeal value (integer, in the deal's currency).
currencystringISO 4217 3-letter currency code.
stagestringCurrent pipeline stage.
statusstringDeal status (mirrors stage for most deals).
conversation_idstring | nullLinked conversation UUID, if any.
campaign_idstring | nullLinked campaign UUID, if any.
workspace_idstring | nullWorkspace UUID, if assigned.
created_atstringISO 8601 timestamp when the deal was created.
closed_atstring | nullISO 8601 timestamp when stage was set to "closed". null otherwise.
notesstring | nullFree-text deal notes.