# unpublish_site

Source: https://modulify.ai/docs/api/publishing/unpublish-site

Takes a published site off its public address, so visitors can no longer reach it.

- Title: Take a site offline
- Scope: `publish:write`
- Access: Destructive
- Endpoint: `POST /v1/unpublish_site`

It permanently destroys the machines serving the live site and clears its publish date, so there is nothing to switch back on. Publishing again builds and deploys the site afresh. The site, its code and its content are all kept.

It is refused while a publish is running, with `A publish is running, so the site cannot be taken offline until it finishes or is stopped!`, so stop that one first with `stop_publish`. It is also refused when the site is not published at all. This interrupts a live site, so the tool tells the client to always confirm with you first. See [Unpublish project](https://modulify.ai/docs/editor/settings#unpublish-project).

## Request

Call it with a `POST` to `https://api.modulify.ai/v1/unpublish_site`, sending the inputs below as a JSON object. The token needs the `publish:write` scope.

> **Warning**
>
> This method is marked destructive: it deletes or overwrites data. Check the inputs before you call it, and send an [Idempotency-Key](https://modulify.ai/docs/api/idempotency) header whenever you might retry it.

```bash
curl -X POST https://api.modulify.ai/v1/unpublish_site \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"projectId":"PROJECT_ID"}'
```

Over MCP, the same method is the [unpublish_site tool](https://modulify.ai/docs/mcp/publishing/unpublish-site).

## Inputs

| Input | Type | Required | Description |
| --- | --- | --- | --- |
| `projectId` | string | Yes | The site to take offline. |

## Response

Every call answers with the [JSON envelope](https://modulify.ai/docs/api/requests-and-responses#the-response) of `success`, `message`, `data`, `code` and `version`. `data` holds the result described above, and on a method that returns a total, `count` carries it. The [response headers](https://modulify.ai/docs/api/requests-and-responses#headers-on-every-method-call) carry the call's `X-Request-Id` and what is left of your per-minute budget in `X-RateLimit-Limit`, `X-RateLimit-Remaining` and `X-RateLimit-Reset`. [Errors](https://modulify.ai/docs/api/errors) explains every status code a call can answer with.