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

PATCH https://v1.api.partnerpage.io/api/directory/private/v1alpha/reviews/directory/{directoryId}/{reviewId}/
Content-Type: application/json

Partially update a review belonging to this directory. Accepts any subset of `title`, `company`, `summary`, `first_name`, `last_name`, `email`, `rating`, and `status` — at least one field must be provided. `entry_id` is immutable: a review cannot be reassigned to a different partner entry. When `status` is included and differs from the current status, approver bookkeeping is updated automatically: transitioning to `A` (approved) sets `approvedBy` to the caller and clears `declinedBy`; transitioning to `D` (declined) does the inverse. Status values other than `A`/`D` leave both fields untouched. Requires the `generic_directory:update_reviews` permission.

Reference: https://docs.partnerpage.io/api-reference/review/update-a-review

## Authentication

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

## Request

### Path parameters

- `directoryId` (string, required) — UUID of the generic directory that owns the review.
- `reviewId` (string, required) — UUID of the review to update.

### Body (application/json)

This endpoint expects a PatchedReviewDashboardUpdateRequest.

- `title` (string, optional)
- `company` (string, optional)
- `summary` (string, optional)
- `firstName` (string, optional)
- `lastName` (string, optional)
- `email` (string, optional)
- `rating` (integer, optional)
- `status` (enum, optional) — * `A` - approved * `D` - declined * `P` - pending * `R` - replied
  - Allowed values: `A`, `D`, `P`, `R`

## Response

### 200

Updated review.

- `id` (string, required)
- `entry` (GenericDirectoryEntry, required)
- `entryType` (string, required)
- `title` (string, required)
- `company` (string, required, nullable)
- `summary` (string, required)
- `shortSummary` (string, required)
- `firstName` (string, required)
- `lastName` (string, required)
- `email` (string, required, nullable)
- `rating` (integer, required)
- `created` (datetime, required)
- `status` (string, required)
- `statusDisplay` (string, required)
- `approvedBy` (GenericDirectoryApprover, required, nullable)
- `declinedBy` (GenericDirectoryApprover, required, nullable)
- `partnerReply` (GenericDirectoryEntryReviewReply, required, nullable)

## Errors

### 400 Bad Request Error

Invalid payload — empty body or a field fails validation.

- `any`

### 401 Unauthorized Error

Authentication credentials were not provided or are invalid.

- `any`

### 403 Forbidden Error

Caller is not the owner of this directory, or lacks `generic_directory:update_reviews`.

- `any`

### 404 Not Found Error

No review matches `review_id` in this directory.

- `any`

## Types

### GenericDirectoryEntry

- `id` (string, required)
- `owner` (string, required)
- `title` (string, required)

### GenericDirectoryApprover

- `id` (string, required)
- `firstName` (string, required)
- `lastName` (string, required)
- `email` (string, required)

### GenericDirectoryEntryReviewReply

- `id` (string, required)
- `contents` (string, required)
- `created` (datetime, required)
- `modified` (datetime, required)

## Examples

### Status-only change (dashboard accept/decline flow) (application/json)

**Request**

```json
{
  "status": "A"
}
```

**Response**

```json
{
  "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "entry": {
    "id": "a0b1c2d3-0000-0000-0000-000000000001",
    "owner": "org-owner-id",
    "title": "Acme Partner"
  },
  "entryType": "partner",
  "title": "Great partner to work with",
  "company": "Acme Inc.",
  "summary": "Delivered on time and within budget.",
  "shortSummary": "Delivered on time and within budget.",
  "firstName": "Jane",
  "lastName": "Doe",
  "email": "jane.doe@example.com",
  "rating": 5,
  "created": "2026-04-21T10:15:30Z",
  "status": "A",
  "statusDisplay": "approved",
  "approvedBy": {
    "id": "b1c2d3e4-0000-0000-0000-000000000002",
    "firstName": "Owner",
    "lastName": "User",
    "email": "owner@example.com"
  },
  "declinedBy": null
}
```

**SDK Code**

```python Status-only change (dashboard accept/decline flow) (application/json)
import requests

url = "https://v1.api.partnerpage.io/api/directory/private/v1alpha/reviews/directory/:directoryId/:reviewId/"

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

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

print(response.json())
```

```javascript Status-only change (dashboard accept/decline flow) (application/json)
const url = 'https://v1.api.partnerpage.io/api/directory/private/v1alpha/reviews/directory/:directoryId/:reviewId/';
const options = {
  method: 'PATCH',
  headers: {Authorization: 'Token  <apiKey>', 'Content-Type': 'application/json'},
  body: '{"status":"A"}'
};

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

### Correct reviewer-submitted content without changing status (application/json)

**Request**

```json
{
  "title": "Great partner to work with",
  "summary": "Delivered on time and within budget.",
  "rating": 5
}
```

**Response**

```json
{
  "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "entry": {
    "id": "a0b1c2d3-0000-0000-0000-000000000001",
    "owner": "org-owner-id",
    "title": "Acme Partner"
  },
  "entryType": "partner",
  "title": "Great partner to work with",
  "company": "Acme Inc.",
  "summary": "Delivered on time and within budget.",
  "shortSummary": "Delivered on time and within budget.",
  "firstName": "Jane",
  "lastName": "Doe",
  "email": "jane.doe@example.com",
  "rating": 5,
  "created": "2026-04-21T10:15:30Z",
  "status": "A",
  "statusDisplay": "approved",
  "approvedBy": {
    "id": "b1c2d3e4-0000-0000-0000-000000000002",
    "firstName": "Owner",
    "lastName": "User",
    "email": "owner@example.com"
  },
  "declinedBy": null
}
```

**SDK Code**

```python Correct reviewer-submitted content without changing status (application/json)
import requests

url = "https://v1.api.partnerpage.io/api/directory/private/v1alpha/reviews/directory/:directoryId/:reviewId/"

payload = {
    "title": "Great partner to work with",
    "summary": "Delivered on time and within budget.",
    "rating": 5
}
headers = {
    "Authorization": "Token  <apiKey>",
    "Content-Type": "application/json"
}

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

print(response.json())
```

```javascript Correct reviewer-submitted content without changing status (application/json)
const url = 'https://v1.api.partnerpage.io/api/directory/private/v1alpha/reviews/directory/:directoryId/:reviewId/';
const options = {
  method: 'PATCH',
  headers: {Authorization: 'Token  <apiKey>', 'Content-Type': 'application/json'},
  body: '{"title":"Great partner to work with","summary":"Delivered on time and within budget.","rating":5}'
};

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

### Edit fields and approve in a single call (application/json)

**Request**

```json
{
  "title": "Great partner to work with",
  "rating": 5,
  "status": "A"
}
```

**Response**

```json
{
  "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "entry": {
    "id": "a0b1c2d3-0000-0000-0000-000000000001",
    "owner": "org-owner-id",
    "title": "Acme Partner"
  },
  "entryType": "partner",
  "title": "Great partner to work with",
  "company": "Acme Inc.",
  "summary": "Delivered on time and within budget.",
  "shortSummary": "Delivered on time and within budget.",
  "firstName": "Jane",
  "lastName": "Doe",
  "email": "jane.doe@example.com",
  "rating": 5,
  "created": "2026-04-21T10:15:30Z",
  "status": "A",
  "statusDisplay": "approved",
  "approvedBy": {
    "id": "b1c2d3e4-0000-0000-0000-000000000002",
    "firstName": "Owner",
    "lastName": "User",
    "email": "owner@example.com"
  },
  "declinedBy": null
}
```

**SDK Code**

```python Edit fields and approve in a single call (application/json)
import requests

url = "https://v1.api.partnerpage.io/api/directory/private/v1alpha/reviews/directory/:directoryId/:reviewId/"

payload = {
    "title": "Great partner to work with",
    "rating": 5,
    "status": "A"
}
headers = {
    "Authorization": "Token  <apiKey>",
    "Content-Type": "application/json"
}

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

print(response.json())
```

```javascript Edit fields and approve in a single call (application/json)
const url = 'https://v1.api.partnerpage.io/api/directory/private/v1alpha/reviews/directory/:directoryId/:reviewId/';
const options = {
  method: 'PATCH',
  headers: {Authorization: 'Token  <apiKey>', 'Content-Type': 'application/json'},
  body: '{"title":"Great partner to work with","rating":5,"status":"A"}'
};

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