---
title: "Start a draft site without an account"
method: POST
path: "/api/v1/anon/sites"
tags: ["Guest"]
---

# Start a draft site without an account

`POST /api/v1/anon/sites`

## Request

- Base URL: `https://api.dotsy.ai`
- URL: `https://api.dotsy.ai/api/v1/anon/sites`
- Auth: none required

Creates a draft-only site and a guest token, with no sign-in and no API key. This is the one call that needs no credentials.

The response carries a **guest token** (`pgg_…`). Send it as `Authorization: Bearer <guestToken>` and it authenticates as `GuestBearerAuth` for that one site: you can read and edit its content, routes and brief, but only the operations that list `GuestBearerAuth` in their security accept it. Publishing, renaming, deleting, custom domains, imports, asset writes, creating other sites and managing API keys answer `403` `guest_requires_account`, and any other site answers `403` `forbidden_site_scope`.

The site is deleted 72 hours after creation (`expiresAt`) unless you claim it with `POST /api/v1/anon/claim` from a signed-in account.

Guest creation is rate limited across the whole platform. Over the limit you get `429` `rate_limited` with a `Retry-After` header.

## Request body

- StartGuestSiteRequest: Both fields are optional. An empty body (or `{}`) is fine.
  - `title` string: Site title, up to 200 characters.
  - `purpose` string: What the site is for, up to 2,000 characters. It seeds the site brief. When you leave it out, Dotsy infers a placeholder from the title.

## Response `201`

The guest site exists. Keep `guestToken`: it is not shown again.

- StartGuestSiteResponse
  - `slug` string, required: The new site's slug: `anon` followed by ten letters and digits.
  - `guestToken` string, required: The guest token (`pgg_…`). It is returned only here, so store it. Send it as `Authorization: Bearer <guestToken>`; it authenticates as `GuestBearerAuth` on this one site.
  - `expiresAt` number, required: When the guest site is deleted if nobody claims it, Unix ms. 72 hours after creation.
  - `draftOnly` true, required: Always true: a guest site can be edited as a draft but cannot be published until it is claimed.
  - `guidance` GuidanceHint: Which rules & guidelines sections are still empty and the MCP skill to fill them (`get_skill('guidance')`).
    - `missing` string[], required
    - `next` 'Before your first change: load get_skill('guidance') and write the missing sections.', required

## Other responses

- `400`: The body is not valid (`invalid_body`): `title` or `purpose` is too long or not a string.
- `429`: Too many guest sites were created in the last hour (`rate_limited`). Retry after the delay in `Retry-After`.

---

[API](https://skmtc.dev/dotsy/apis/dotsy-api.md) · [All operations](https://skmtc.dev/dotsy/apis/dotsy-api/llms.txt) · [OpenAPI document](https://skmtc.dev/dotsy/apis/dotsy-api/revisions/4272ed3b85d7?raw)
