> 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.

# Close a contact request

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

Closes a pending, accepted or held contact request in your directory, at any project status. Declined or already closed requests can't be closed, and a closed request can't be accepted, declined, reopened or have its project status changed. `closeReason` is required: `wrong_partner`, `handled_by_us`, `partner_unresponsive`, `spam`, `duplicate`, `customer_withdrew` or `other`. Send `closeReasonDetail` (up to 500 characters) only with `other`, where it is required. Set `notifyPartner` to `true` to email the partner when closing a pending or accepted request; it defaults to `false`, and the customer who sent the request is never emailed. Set `blockSender` to `true`, only with `spam`, to also block the sender's email address in this directory. Closing a pending or accepted request sends a `contact_request_updated` webhook event. Closing a held request, which was never delivered, sends no webhook and no partner email, even with `notifyPartner: true`.

Reference: https://docs.partnerpage.io/api-reference/contact-request/close-a-contact-request

## 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 close

### Body (application/json)

This endpoint expects a PartnerContactRequestCloseRequest.

- `closeReason` (enum, required) — * `wrong_partner` - Wrong partner * `handled_by_us` - Handled by us * `partner_unresponsive` - Partner unresponsive * `spam` - Spam * `duplicate` - Duplicate * `customer_withdrew` - Customer withdrew * `other` - Other
  - Allowed values: `wrong_partner`, `handled_by_us`, `partner_unresponsive`, `spam`, `duplicate`, `customer_withdrew`, `other`
- `notifyPartner` (boolean, optional, default: false)
- `closeReasonDetail` (string, optional, nullable)
- `blockSender` (boolean, optional, default: false)

## Response

### 200

- `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

Bad Request

- `any`

### 403 Forbidden Error

Forbidden

- `any`

### 404 Not Found Error

Contact request not found

- `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
{
  "closeReason": "wrong_partner"
}
```

**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/close/"

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

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

print(response.json())
```

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

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