> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.partnerpage.io/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.partnerpage.io/_mcp/server.

# Update a contact request's project status

PATCH https://v1.api.partnerpage.io/api/directory/private/v1alpha/contact-requests/{contactId}/
Content-Type: application/json

Moves a contact request in your directory to a new project status. `projectStatus` is required: `new`, `contacted`, `engaged`, `on_hold`, `secured`, `launched_deployed` or `lost`. Setting `lost` also requires `lostReason`; send `lostReasonDetail` (up to 500 characters) only when the reason is `other`. A closed request's status can't change. Each change sends a `contact_request_updated` webhook event.

Reference: https://docs.partnerpage.io/api-reference/contact-request/update-a-contact-requests-project-status

## Authentication

- `Authorization` header (required) (prefixed with ` Token   `) — Your API key, sent as `Authorization: Token <your API key>`

## Request

### Path parameters

- `contactId` (string, required) — ID of the contact request to update

### Body (application/json)

This endpoint expects a PatchedExternalPartnerContactRequestDetailWriterRequest.

- `projectStatus` (enum, optional) — * `new` - New * `contacted` - Contacted * `engaged` - Engaged * `on_hold` - On hold * `secured` - Secured * `launched_deployed` - Launched / Deployed * `lost` - Lost
  - Allowed values: `new`, `contacted`, `engaged`, `on_hold`, `secured`, `launched_deployed`, `lost`
- `lostReason` (enum, optional, nullable) — * `customer_went_unresponsive` - Customer went unresponsive * `lost_to_another_provider` - Lost to another provider * `budget_or_timing` - Budget or timing * `not_a_fit_after_discovery` - Not a fit after discovery * `customer_handled_in_house` - Customer handled in house * `other` - Other
  - Allowed values: `customer_went_unresponsive`, `lost_to_another_provider`, `budget_or_timing`, `not_a_fit_after_discovery`, `customer_handled_in_house`, `other`
- `lostReasonDetail` (string, optional, nullable)

## Response

### 200

Updated contact request

- `firstName` (string, required)
- `lastName` (string, required)
- `email` (string, required)
- `companyName` (string, required)
- `href` (string, required)
- `id` (string, required)
- `created` (string, required)
- `state` (string, required)
- `projectStatus` (enum, required, nullable) — * `new` - New * `contacted` - Contacted * `engaged` - Engaged * `on_hold` - On hold * `secured` - Secured * `launched_deployed` - Launched / Deployed * `lost` - Lost
  - Allowed values: `new`, `contacted`, `engaged`, `on_hold`, `secured`, `launched_deployed`, `lost`
- `entry` (map from string to any, required)
- `directory` (map from string to any, required)
- `source` (enum, required) — * `matchmaking` - Matchmaking * `contact_request` - Contact Request
  - Allowed values: `matchmaking`, `contact_request`
- `matchOrigin` (string, required, nullable)
- `customForm` (string, required)
- `events` (list of ContactRequestTimelineEvent, required)
- `firstViewedAt` (datetime, required, nullable)
- `phone` (string, optional, nullable)
- `companyWebsite` (string, optional, nullable)
- `comments` (string, optional, nullable)
- `utmQueryParams` (any, optional)
- `customFormResponseId` (string, optional)
- `declineReason` (string, optional, nullable)
- `declineReasonDetail` (string, optional, nullable)
- `closeReason` (string, optional, nullable)
- `closeReasonDetail` (string, optional, nullable)
- `routingSource` (string, optional, nullable)
- `isStale` (boolean, optional)
- `daysWaiting` (integer, optional)
- `reminderCount` (integer, optional)
- `holdReason` (enum, optional, nullable) — * `same_message` - Same message already sent to 2 partners today * `same_phone` - Same phone number already sent to 2 partners today * `same_company` - Same company already sent to 2 partners today
  - Allowed values: `same_message`, `same_phone`, `same_company`
- `reminder` (PartnerContactRequestReminderStatus, optional)
- `senderBlocked` (boolean, optional)
- `closeNotificationRecipients` (list of string, optional)
- `delivery` (RequestDelivery, optional)

## Errors

### 400 Bad Request Error

Invalid project status or Lost reason

- `any`

### 403 Forbidden Error

Forbidden

- `any`

### 404 Not Found Error

Contact request not found

- `any`

### 429 Too Many Requests Error

Rate limit exceeded

- `any`

## Types

### ContactRequestTimelineEvent

- `type` (enum, required) — * `note` - note * `state_changed` - state_changed * `project_status_changed` - project_status_changed * `email_sent` - email_sent * `reminder_sent` - reminder_sent * `viewed` - viewed * `request_linked` - request_linked
  - Allowed values: `note`, `state_changed`, `project_status_changed`, `email_sent`, `reminder_sent`, `viewed`, `request_linked`
- `timestamp` (datetime, required)
- `data` (map from string to any, required)

### PartnerContactRequestReminderStatus

- `availableType` (enum, required, nullable) — * `reminder` - Reminder * `update_request` - Update request
  - Allowed values: `reminder`, `update_request`
- `lastSent` (PartnerContactRequestReminderRead, required, nullable)
- `partnerHasRecipients` (boolean, required)

### RequestDelivery

- `delivered` (boolean, required) — True unless the request was held and never released. Does not confirm receipt by an external integration.
- `heldAt` (datetime, required, nullable)
- `releasedAt` (datetime, required, nullable)
- `publicFormSubmittedAt` (datetime, required, nullable)
- `modified` (datetime, required)

### PartnerContactRequestReminderRead

- `id` (string, required)
- `type` (enum, required) — * `reminder` - Reminder * `update_request` - Update request
  - Allowed values: `reminder`, `update_request`
- `message` (string, required)
- `created` (datetime, required)
- `sender` (PartnerContactRequestNoteAuthor, required, nullable)

### PartnerContactRequestNoteAuthor

- `id` (string, required)
- `fullName` (string, required)
- `email` (string, required)
- `role` (enum, required) — * `directory_owner` - directory_owner * `entry_owner` - entry_owner
  - Allowed values: `directory_owner`, `entry_owner`

## Examples

**Request**

```json
{}
```

**Response**

```json
{
  "firstName": "string",
  "lastName": "string",
  "email": "string",
  "companyName": "string",
  "href": "string",
  "id": "string",
  "created": "string",
  "state": "string",
  "projectStatus": "new",
  "entry": {},
  "directory": {},
  "source": "matchmaking",
  "matchOrigin": "string",
  "customForm": "string",
  "events": [
    {
      "type": "note",
      "timestamp": "2024-01-15T09:30:00Z",
      "data": {}
    }
  ],
  "firstViewedAt": "2024-01-15T09:30:00Z",
  "phone": "string",
  "companyWebsite": "string",
  "comments": "string",
  "customFormResponseId": "string",
  "declineReason": "string",
  "declineReasonDetail": "string",
  "closeReason": "string",
  "closeReasonDetail": "string",
  "routingSource": "string",
  "isStale": true,
  "daysWaiting": 1,
  "reminderCount": 1,
  "holdReason": "same_message",
  "reminder": {
    "availableType": "reminder",
    "lastSent": {
      "id": "string",
      "type": "reminder",
      "message": "string",
      "created": "2024-01-15T09:30:00Z",
      "sender": {
        "id": "string",
        "fullName": "string",
        "email": "string",
        "role": "directory_owner"
      }
    },
    "partnerHasRecipients": true
  },
  "senderBlocked": true,
  "closeNotificationRecipients": [
    "string"
  ],
  "delivery": {
    "delivered": true,
    "heldAt": "2024-01-15T09:30:00Z",
    "releasedAt": "2024-01-15T09:30:00Z",
    "publicFormSubmittedAt": "2024-01-15T09:30:00Z",
    "modified": "2024-01-15T09:30:00Z"
  }
}
```

**SDK Code**

```python
import requests

url = "https://v1.api.partnerpage.io/api/directory/private/v1alpha/contact-requests/contactId/"

payload = {}
headers = {
    "Authorization": "Token  <apiKey>",
    "Content-Type": "application/json"
}

response = requests.patch(url, json=payload, headers=headers)

print(response.json())
```

```javascript
const url = 'https://v1.api.partnerpage.io/api/directory/private/v1alpha/contact-requests/contactId/';
const options = {
  method: 'PATCH',
  headers: {Authorization: 'Token  <apiKey>', 'Content-Type': 'application/json'},
  body: '{}'
};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```