Updates a prospect: interest, stage, owner, room-access expiry, external references, project tags, or the legacy classification. Every deterministic validation of the body runs before the first write, so a malformed request changes nothing; the writes themselves are applied one field at a time and are not transactional — a concurrent change of the project's team or room state between them can leave earlier fields applied when a later one is refused.
Path Parameters
- Type: stringproject
Id requiredProject ID
- Type: stringidrequired
Prospect ID
Headers
- Type: stringIf
- Match ETag value for optimistic concurrency control
Body·
Fields to update
Request model for updating a prospect.
- Type: null | stringaccess
Expiry Schedule when the prospect's room access expires. Accepts a relative ("7d", "1w"), named ("tomorrow", "next_week"), or ISO date/datetime value — must be in the future. An expiry is a deadline, so a date without a time is the START of that day, UTC. Only valid on a prospect connected to a room. Send null to clear a scheduled expiry. Omit to leave unchanged.
- Type: null | stringclassification
Single-value pipeline vocabulary kept for existing integrations: not_contacted, contacted, interested, not_interested, bidder. Prefer interest and stage. When sent together with them, interest and stage win.
- Type:external
Refs Properties: 2External references for CRM integration. Replaces all existing external refs. Set to empty array to remove all external refs.
- Type: enumnullableinterest
Your judgement of the prospect's appetite: interested, maybe, not_interested. Send null to clear it. Omit to leave unchanged.
valuesinterestedmaybenot_interested - Type: null | stringowner
Assign a team member as the prospect's owner. Send the member's user id, or "me" for the caller. Send null to unassign. Omit to leave unchanged.
- Type: null | array of stringproject
Tags Your labels on this prospect within this project. Replaces the whole list; send an empty array (or null) to clear it. Values are trimmed and de-duplicated (case-sensitive) and a multi-word value stays one label. Leaves
tags— the contact's or company's network-wide tags — untouched. Omit to leave unchanged. - Type: enumstage
Correct the prospect's process stage: not_contacted, teaser, im, data_room, bid. The stage is normally derived from what has happened; setting it records a manual override (returned as stageOverride) that later events can still raise. Omit to leave unchanged; there is no null here — correct an override by sending another stage, or withdraw it with DELETE .../prospects/{id}/stage-override.
valuesnot_contactedteaserimdata_roombid - Type: null | stringstage
Reason Why the stage was corrected. Only valid together with stage; kept with the override.
Responses
- application/json
- application/problem+json
- application/problem+json
- application/problem+json
- application/problem+json
- application/problem+json
- application/problem+json
curl 'https://app.propstreet.com/api/v1/projects/{projectId}/prospects/{id}' \
--request PATCH \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
--data '{
"interest": "interested",
"stage": "not_contacted",
"stageReason": null,
"classification": null,
"owner": null,
"accessExpiry": null,
"externalRefs": [
{
"namespace": "",
"id": ""
}
],
"projectTags": [
""
]
}'
{
"id": "string",
"uri": null,
"externalRefs": [
{
"namespace": "string",
"id": "string"
}
],
"projectId": "string",
"contactId": null,
"companyId": null,
"displayName": null,
"organizationName": null,
"status": "active",
"interest": "interested",
"stage": "not_contacted",
"stageOverride": {
"stage": "not_contacted",
"setBy": {
"id": "string",
"name": "string"
},
"setAtUtc": "2026-10-16T16:23:10.054Z",
"reason": null
},
"nextTask": {
"id": "string",
"type": "call",
"dueDateUtc": "2026-10-16T16:23:10.054Z",
"assignee": {
"id": "string",
"name": "string"
},
"overdue": true
},
"openTaskCount": 1,
"owner": {
"id": "string",
"name": "string"
},
"capabilities": [
"string"
],
"tags": [
"string"
],
"projectTags": [
"string"
],
"teaser": {
"acceptedUtc": null,
"deadlineUtc": null
},
"createdUtc": "2026-10-16T16:23:10.054Z",
"updatedUtc": "2026-10-16T16:23:10.054Z",
"deletedUtc": null,
"etag": "string",
"changeType": null,
"changeOrigin": null
}