---
title: "Crear un sitio"
description: "Crea un sitio a partir del starter de Atelier201 en <slug>.atelier201.page e inicia su primera compilación."
canonical: "https://atelier201.com/docs/es/api/sites/create"
updated: "2026-11-06"
---

# Crear un sitio

Requiere `sites:write`. No consume créditos. No se publica nada.

El sitio parte del starter: un proyecto de Astro para pequeñas empresas, con servicios, un blog cuyas entradas indican a qué servicios se refieren y los datos de la empresa. Es una estructura básica que hay que adaptar: cada sitio elimina lo que su empresa no necesita y añade lo que sí necesita. `description` y `locale` se incorporan a los datos de la empresa.

La primera compilación se inicia automáticamente. Cuando esté `ready`, consulta el [modelo de contenido](/docs/api/content/model) y completa el contenido.

Un sitio nuevo es un borrador: puedes editarlo gratis y compartirlo mediante enlaces de vista previa; para publicarlo, hace falta el plan Site. Un espacio de trabajo puede tener hasta 10 borradores (25 si ya ha pagado un plan Site o créditos); los sitios no cuentan para el límite. Si se supera, se rechaza la creación con un `409 conflict` que indica el límite.

```http
POST https://api.atelier201.com/v1/sites
```

## Authorizations

- `Authorization` (bearer, in header, required)

## Body

`application/json`, required

- `name` (`string`, required, length: `1–80 chars`)
- `slug` (`string`, length: `3–40 chars`): La dirección: <slug>.atelier201.page. Se genera a partir del nombre si no se especifica.
- `description` (`string`, length: `≤ 400 chars`): Una o dos frases sobre el negocio, que se incluirán en los datos del negocio del starter.
- `locale` (`enum<string>`, one of: `en, fr, de, es, it, pt`)

## Response

**201**: Crear un sitio

- `data` (`object`, required)
- `data.id` (`string`, required)
- `data.name` (`string`, required)
- `data.slug` (`string`, required)
- `data.status` (`enum<string>`, required, one of: `creating, ready, suspended, deleting`)
- `data.plan` (`enum<string>`, required, one of: `free, site`)
- `data.url` (`string`, required): Dónde encuentran los visitantes el sitio: su dominio personalizado principal o su dirección atelier201.page.
- `data.platform_url` (`string`, required)
- `data.guest` (`boolean`, required): Preparado por un agente antes de iniciar sesión y aún sin reclamar: se puede previsualizar, pero no publicar.
- `data.draft` (`object`, required)
- `data.draft.revision` (`string | null`, required)
- `data.draft.updated_at` (`string | null`, required)
- `data.published` (`object | null`, required)
- `data.published.build_id` (`string`, required)
- `data.published.generation` (`integer`, required, range: `-9007199254740991–9007199254740991`)
- `data.published.published_at` (`string | null`, required)
- `data.generation` (`integer`, required, range: `-9007199254740991–9007199254740991`): Aumenta con cada publicación, reversión o retirada de la publicación. Envíalo de vuelta como expected_generation.
- `data.cover_at` (`string | null`, required): Cuándo se tomó por última vez la imagen de la página de inicio que la aplicación muestra en la tarjeta del sitio, después de compilarlo. Es Null antes de la primera compilación.
- `data.created_at` (`string`, required): ISO 8601, UTC.
- `data.updated_at` (`string`, required): ISO 8601, UTC.
- `request_id` (`string`, required)

```json
{
  "data": {
    "id": "<string>",
    "name": "<string>",
    "slug": "<string>",
    "status": "creating",
    "plan": "free",
    "url": "<string>",
    "platform_url": "<string>",
    "guest": true,
    "draft": {
      "revision": "<string>",
      "updated_at": "<string>"
    },
    "published": {
      "build_id": "<string>",
      "generation": 123,
      "published_at": "<string>"
    },
    "generation": 123,
    "cover_at": "<string>",
    "created_at": "<string>",
    "updated_at": "<string>"
  },
  "request_id": "<string>"
}
```

**400**: Códigos posibles: invalid_request, unknown_field, invalid_parameter, invalid_cursor

- `error` (`object`, required)
- `error.type` (`string`, required)
- `error.code` (`string`, required)
- `error.message` (`string`, required)
- `error.param` (`string`)
- `error.docs_url` (`string`, required)
- `error.action_url` (`string<uri>`)
- `error.details` (`Record<string, object>`)
- `request_id` (`string`, required)

```json
{
  "error": {
    "type": "<string>",
    "code": "<string>",
    "message": "<string>",
    "param": "<string>",
    "docs_url": "<string>",
    "action_url": "<string>",
    "details": {}
  },
  "request_id": "<string>"
}
```

**401**: Códigos posibles: authentication_required, invalid_api_key, api_key_expired, api_key_revoked

- `error` (`object`, required)
- `error.type` (`string`, required)
- `error.code` (`string`, required)
- `error.message` (`string`, required)
- `error.param` (`string`)
- `error.docs_url` (`string`, required)
- `error.action_url` (`string<uri>`)
- `error.details` (`Record<string, object>`)
- `request_id` (`string`, required)

```json
{
  "error": {
    "type": "<string>",
    "code": "<string>",
    "message": "<string>",
    "param": "<string>",
    "docs_url": "<string>",
    "action_url": "<string>",
    "details": {}
  },
  "request_id": "<string>"
}
```

**402**: Códigos posibles: insufficient_credits

- `error` (`object`, required)
- `error.type` (`string`, required)
- `error.code` (`string`, required)
- `error.message` (`string`, required)
- `error.param` (`string`)
- `error.docs_url` (`string`, required)
- `error.action_url` (`string<uri>`)
- `error.details` (`Record<string, object>`)
- `request_id` (`string`, required)

```json
{
  "error": {
    "type": "<string>",
    "code": "<string>",
    "message": "<string>",
    "param": "<string>",
    "docs_url": "<string>",
    "action_url": "<string>",
    "details": {}
  },
  "request_id": "<string>"
}
```

**403**: Códigos posibles: insufficient_scope, feature_not_available, admin_required

- `error` (`object`, required)
- `error.type` (`string`, required)
- `error.code` (`string`, required)
- `error.message` (`string`, required)
- `error.param` (`string`)
- `error.docs_url` (`string`, required)
- `error.action_url` (`string<uri>`)
- `error.details` (`Record<string, object>`)
- `request_id` (`string`, required)

```json
{
  "error": {
    "type": "<string>",
    "code": "<string>",
    "message": "<string>",
    "param": "<string>",
    "docs_url": "<string>",
    "action_url": "<string>",
    "details": {}
  },
  "request_id": "<string>"
}
```

**404**: Códigos posibles: resource_not_found

- `error` (`object`, required)
- `error.type` (`string`, required)
- `error.code` (`string`, required)
- `error.message` (`string`, required)
- `error.param` (`string`)
- `error.docs_url` (`string`, required)
- `error.action_url` (`string<uri>`)
- `error.details` (`Record<string, object>`)
- `request_id` (`string`, required)

```json
{
  "error": {
    "type": "<string>",
    "code": "<string>",
    "message": "<string>",
    "param": "<string>",
    "docs_url": "<string>",
    "action_url": "<string>",
    "details": {}
  },
  "request_id": "<string>"
}
```

**409**: Códigos posibles: conflict, result_not_ready, idempotency_key_reused

- `error` (`object`, required)
- `error.type` (`string`, required)
- `error.code` (`string`, required)
- `error.message` (`string`, required)
- `error.param` (`string`)
- `error.docs_url` (`string`, required)
- `error.action_url` (`string<uri>`)
- `error.details` (`Record<string, object>`)
- `request_id` (`string`, required)

```json
{
  "error": {
    "type": "<string>",
    "code": "<string>",
    "message": "<string>",
    "param": "<string>",
    "docs_url": "<string>",
    "action_url": "<string>",
    "details": {}
  },
  "request_id": "<string>"
}
```

**410**: Códigos posibles: result_expired

- `error` (`object`, required)
- `error.type` (`string`, required)
- `error.code` (`string`, required)
- `error.message` (`string`, required)
- `error.param` (`string`)
- `error.docs_url` (`string`, required)
- `error.action_url` (`string<uri>`)
- `error.details` (`Record<string, object>`)
- `request_id` (`string`, required)

```json
{
  "error": {
    "type": "<string>",
    "code": "<string>",
    "message": "<string>",
    "param": "<string>",
    "docs_url": "<string>",
    "action_url": "<string>",
    "details": {}
  },
  "request_id": "<string>"
}
```

**413**: Códigos posibles: request_too_large

- `error` (`object`, required)
- `error.type` (`string`, required)
- `error.code` (`string`, required)
- `error.message` (`string`, required)
- `error.param` (`string`)
- `error.docs_url` (`string`, required)
- `error.action_url` (`string<uri>`)
- `error.details` (`Record<string, object>`)
- `request_id` (`string`, required)

```json
{
  "error": {
    "type": "<string>",
    "code": "<string>",
    "message": "<string>",
    "param": "<string>",
    "docs_url": "<string>",
    "action_url": "<string>",
    "details": {}
  },
  "request_id": "<string>"
}
```

**422**: Códigos posibles: request_too_large_for_plan

- `error` (`object`, required)
- `error.type` (`string`, required)
- `error.code` (`string`, required)
- `error.message` (`string`, required)
- `error.param` (`string`)
- `error.docs_url` (`string`, required)
- `error.action_url` (`string<uri>`)
- `error.details` (`Record<string, object>`)
- `request_id` (`string`, required)

```json
{
  "error": {
    "type": "<string>",
    "code": "<string>",
    "message": "<string>",
    "param": "<string>",
    "docs_url": "<string>",
    "action_url": "<string>",
    "details": {}
  },
  "request_id": "<string>"
}
```

**429**: Códigos posibles: rate_limited

- `error` (`object`, required)
- `error.type` (`string`, required)
- `error.code` (`string`, required)
- `error.message` (`string`, required)
- `error.param` (`string`)
- `error.docs_url` (`string`, required)
- `error.action_url` (`string<uri>`)
- `error.details` (`Record<string, object>`)
- `request_id` (`string`, required)

```json
{
  "error": {
    "type": "<string>",
    "code": "<string>",
    "message": "<string>",
    "param": "<string>",
    "docs_url": "<string>",
    "action_url": "<string>",
    "details": {}
  },
  "request_id": "<string>"
}
```

**500**: Códigos posibles: internal_error

- `error` (`object`, required)
- `error.type` (`string`, required)
- `error.code` (`string`, required)
- `error.message` (`string`, required)
- `error.param` (`string`)
- `error.docs_url` (`string`, required)
- `error.action_url` (`string<uri>`)
- `error.details` (`Record<string, object>`)
- `request_id` (`string`, required)

```json
{
  "error": {
    "type": "<string>",
    "code": "<string>",
    "message": "<string>",
    "param": "<string>",
    "docs_url": "<string>",
    "action_url": "<string>",
    "details": {}
  },
  "request_id": "<string>"
}
```

**503**: Códigos posibles: service_unavailable

- `error` (`object`, required)
- `error.type` (`string`, required)
- `error.code` (`string`, required)
- `error.message` (`string`, required)
- `error.param` (`string`)
- `error.docs_url` (`string`, required)
- `error.action_url` (`string<uri>`)
- `error.details` (`Record<string, object>`)
- `request_id` (`string`, required)

```json
{
  "error": {
    "type": "<string>",
    "code": "<string>",
    "message": "<string>",
    "param": "<string>",
    "docs_url": "<string>",
    "action_url": "<string>",
    "details": {}
  },
  "request_id": "<string>"
}
```

**Example request**

```bash
curl --request POST \
  --url 'https://api.atelier201.com/v1/sites' \
  --header 'Authorization: <api-key>' \
  --header 'Content-Type: application/json' \
  --data '{
  "name": "<string>"
}'
```
