# Review methods: publish, remove, withhold

URL: /code/sdk/review/verbs · Id: `page:code/sdk/review/verbs`

> The Review Verbs publish, remove, withhold as typed SDK methods, with inputs, result, refusals and an example.

Reference for [Review](/business/nouns/review), one group of [Review methods](/code/sdk/review).

### Review.publish
Publish shows a Review on the Startup’s Pages with its rating counted, whatever the rating. [Verb page](/business/nouns/review/publish?interface=sdk).

```ts
interface ReviewVerbs {
  publish(input: ReviewPublishInput, options?: SB.CallOptions): SB.Call<Review>
}
```

Emits [`Review.published`](/business/events/Review.published).

**Inputs**

| Input | Type | Required | Description |
| --- | --- | --- | --- |
| `review` | [Review](/business/nouns/review) | Yes | The Review to show. |

**Returns**

| Output | Type | Required | Description |
| --- | --- | --- | --- |
| `review` | [Review](/business/nouns/review) | Yes | The Review, now `published`. |

**Refuses when**

| Check | Error | Fix | Then call |
| --- | --- | --- | --- |
| The key is valid, but its scopes do not allow this operation. | [`forbidden`](/code/api/errors/forbidden) | Use a key whose scopes cover the operation, or ask an owner of the namespace to grant them. | None. |

**Example**

```ts
import { $ } from 'startup-builder'

const review = await $.Review.publish({ review: 'review_1XPL2xTlfx' })
```

### Review.remove
Remove takes a Review down for good when its author or its venue asks; the record is kept. [Verb page](/business/nouns/review/remove?interface=sdk).

```ts
interface ReviewVerbs {
  remove(input: ReviewRemoveInput, options?: SB.CallOptions): SB.Call<Review>
}
```

Emits [`Review.removed`](/business/events/Review.removed).

**Inputs**

| Input | Type | Required | Description |
| --- | --- | --- | --- |
| `review` | [Review](/business/nouns/review) | Yes | The Review to take down. |
| `reason` | `string` | Yes | Who asked. |

**Returns**

| Output | Type | Required | Description |
| --- | --- | --- | --- |
| `review` | [Review](/business/nouns/review) | Yes | The Review, now `removed`. |

**Refuses when**

| Check | Error | Fix | Then call |
| --- | --- | --- | --- |
| The key is valid, but its scopes do not allow this operation. | [`forbidden`](/code/api/errors/forbidden) | Use a key whose scopes cover the operation, or ask an owner of the namespace to grant them. | None. |

**Example**

```ts
import { $ } from 'startup-builder'

const review = await $.Review.remove({ review: 'review_1XPL2xTlfx', reason: 'authorRequest' })
```

### Review.withhold
Withhold keeps a Review off display for one of five reasons, none of them its rating or its tone. [Verb page](/business/nouns/review/withhold?interface=sdk).

```ts
interface ReviewVerbs {
  withhold(input: ReviewWithholdInput, options?: SB.CallOptions): SB.Call<Review>
}
```

Emits [`Review.withheld`](/business/events/Review.withheld).

**Inputs**

| Input | Type | Required | Description |
| --- | --- | --- | --- |
| `review` | [Review](/business/nouns/review) | Yes | The Review to withhold. |
| `reason` | `string` | Yes | Why it is not shown. |

**Returns**

| Output | Type | Required | Description |
| --- | --- | --- | --- |
| `review` | [Review](/business/nouns/review) | Yes | The Review, now `withheld`. |

**Refuses when**

| Check | Error | Fix | Then call |
| --- | --- | --- | --- |
| The key is valid, but its scopes do not allow this operation. | [`forbidden`](/code/api/errors/forbidden) | Use a key whose scopes cover the operation, or ask an owner of the namespace to grant them. | None. |

**Example**

```ts
import { $ } from 'startup-builder'

const review = await $.Review.withhold({ review: 'review_1XPL2xTlfx', reason: 'fake' })
```