Mission Control
Read your organization's board, what needs a person now, and give an item to one of your agents.
TL;DRAI summary
Mission Control lets you see and manage all outstanding tasks from every part of your Cypress platform in one place. You can use it in the app or via the API to track urgent actions like offers and closings, and even delegate tasks to your agents.
Mission Control is the board in the app that gathers everything waiting on someone, from every system that owns some of it: offers to decide, closings past their deadline, onboarding steps, valuations, billing, campaigns and the CRM's follow-ups. The API reads the same board, in the same triage order, so a system or an agent of your organization sees what the people see, and can take work off the board. Since 1.5.0.
| Scope | Grants |
|---|---|
mission-control:read | GET /api/v1/mission-control |
mission-control:read and tasks:write | POST /api/v1/mission-control/items/{itemId}/delegate |
Both an API key and a Connect Cypress token are accepted. The board is your organization's own: never another organization's work, and never what Cypress keeps for itself.
A first-party app acting for Cypress staff for one organization (Grove for a Cypress Manager) reads the board a Cypress Manager acting for that organization reads in the app: its work plus the staff items, still that one organization's. Since 1.9.0.
| Kind | What waits on Cypress |
|---|---|
closing-reopen-suggested | A Deal Setup change altered what paper on a completed step printed: reopen that step or leave it as issued |
bank-transfer-unapplied | Money the organization sent by bank transfer that is not applied to an invoice (short, over, or nothing open); GET /api/v1/billing/bank-transfers lists it |
archive-request-review | The organization's archive requests waiting for Cypress's decision |
The board
GET /api/v1/mission-control answers the items, most urgent first, with a
summary counted over them and the sources that failed to load this time (a
board missing a source looks the same as one with nothing to show).
{
"items": [
{
"id": "offer-clx…",
"source": "offers",
"kind": "offer-decision",
"phase": "sale",
"urgency": "decision",
"badge": null,
"title": "$20,000 offered on 2021 Honda Civic",
"entity": {
"type": "offer", "id": "clx…", "label": "2021 Honda Civic",
"links": { "app": "https://app.getcypress.ai/go/offer/clx…" }
},
"aggregate": null,
"valueKind": "blocked",
"responsible": { "kind": "role", "id": null, "label": "Fleet manager" },
"dueAt": null,
"enteredAt": "2026-10-15T14:00:00.000Z",
"automation": { "actor": "human", "did": null, "can": "Cedar can score this offer against the floor and market", "at": null },
"delegable": true,
"links": { "app": "https://app.getcypress.ai/go/item/offer-clx…" }
}
],
"summary": { "total": 1, "byPhase": { "sale": 1, … }, "byUrgency": { "decision": 1, … }, "automated": 0, "blockedValue": 0, "opportunityValue": 0 },
"unavailable": []
}An item's id is stable while the work is open (offer-<id>,
closing-<id>, crm-task-<taskId>). entity is the one record it is about,
with the link that opens it in the app; an aggregate is many records under
one decision ("4 deals gone quiet"). The board's free text is left out on
purpose, because it can name a counterparty, and so are the app's buttons and
photos: follow entity.links.app, or read the record through its own API.
The item's own links.app opens what it is about too, or the board for a
summary.
| Filter | Values |
|---|---|
source | Comma list of offers, listings, onboarding, valuations, closings, billing, campaigns, crm, platform |
urgency | Comma list of decision, overdue, due-soon, attention, fyi |
owner | me (the person or agent the token acts as; an API key is nobody, so 422) or unassigned |
automated | false leaves out the receipts of what automations already did |
The board is not paged: each source shows its most urgent few and one line for the rest, as the app does.
Since 1.9.0 two items say more about pricing. missing-floor-price (the
cars waiting on a floor) counts drafts with no floor too, not only approved
cars; planning stock stays out. pricing-rule-listed is a receipt (fyi,
an aggregate of the cars, worth what they list at): one per pricing rule
that approved and listed cars in the last day, whether its own sweep did it
or a person applied it.
Since 1.10.0 stuck-draft (attention) gathers the drafts that have a
floor but were not sent to review in 7 days, counted from when they last
became a draft, or from when they were added: one item, the cars in
aggregate.entityIds, the oldest named in detail. Drafts with no floor are
missing-floor-price's, so no car is in both.
Delegating an item to an agent
POST /api/v1/mission-control/items/{itemId}/delegate gives an item to one of
your organization's agents. It is what Delegate to an agent does on the
board in the app, by the same rule:
- An item that is a task (
crm-task-<id>) is handed to the agent. - An item about one record (a vehicle, an offer, a closing, a contact, a company or a deal) becomes a task on that record, titled as the item, due when it is due, and given to the agent. An offer's or a closing's task is on its vehicle.
- Anything else is refused (
422 INVALID): an aggregate, an item about your organization, or a receipt of what an automation did. Open it and give its parts to the agent one by one.
{ "agentUserId": "clx…", "note": "Check the floor before you answer" }Both fields are optional. Without agentUserId the item goes to your
organization's only agent; with none connected, or more than one and none
named, it is refused and says which. GET /api/v1/members lists your agents
(kind: AGENT). The note is kept as the task's notes.
{
"task": { "id": "clx…", "title": "$20,000 offered on 2021 Honda Civic", "source": "AUTOMATION", "playKey": "mission-control:offer-clx…", "assignee": { "id": "clx…", "name": "Scout", "kind": "AGENT" }, … },
"created": true,
"how": "made",
"agent": { "id": "clx…", "name": "Scout" },
"item": { "id": "offer-clx…", "title": "$20,000 offered on 2021 Honda Civic" }
}how is made (201), handed-over for a task item, or already when the
item was delegated before and its task is still open: asking twice never makes
two tasks. The task is an ordinary task, with the
same TASK.CREATED and TASK.ASSIGNED webhooks, and its playKey
(mission-control:<itemId>) says where it came from. Like every write, it takes
?dryRun=true and an Idempotency-Key.