---
title: "Revisar antes de publicar"
description: "Muestra qué compilación se publicaría, qué lo impide y a qué generación se publicaría."
canonical: "https://atelier201.com/docs/es/api/publishing/review"
updated: "2026-11-06"
---

# Revisar antes de publicar

Requiere `sites:read`. No modifica nada.

Llama a este endpoint antes de cada publicación y muestra a la persona el resultado. Envía `expected_generation` a [Publicar una compilación](/docs/api/publishing/publish) para que solo se publique el estado revisado.

No se puede publicar una compilación mientras `blockers` no esté vacío. Cada elemento de bloqueo tiene un `code` y un `message`: `guest_site`, `site_unavailable`, `plan_required` (el sitio es un borrador: para publicar se necesita el plan Site), `no_build`, `build_not_ready`, `origin_changed`, `manual_check` (esta versión está pendiente de una comprobación rápida por nuestra parte; no hay nada que corregir) o `older_than_draft`. Consulta [Cómo se publica un sitio](/docs/platform/drafts-builds-and-publishing).

Las `warnings` nunca bloquean la publicación. Léelas antes de publicar: `sample_text` indica, con el archivo y la línea, si queda algún texto de muestra, como Lorem ipsum.

```http
GET https://api.atelier201.com/v1/sites/{site_id}/publish/review
```

## Authorizations

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

## Path parameters

- `site_id` (`string`, required): El ID del sitio o su slug (la dirección antes de .atelier201.page).

## Query parameters

- `build_id` (`string<uuid>`, pattern: `^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$`)
- `allow_older_build` (`boolean`): Revisar una compilación anterior al borrador para publicarla (en ese caso, older_than_draft es una advertencia, no un impedimento).

## Response

**200**: Revisar antes de publicar

- `data` (`object`, required)
- `data.site_id` (`string`, required)
- `data.url` (`string`, required)
- `data.platform_address` (`object`, required): La dirección incluida con el sitio, que se cambia con set_site_address. is_main: los visitantes acceden a ella si ningún dominio personalizado la ha sustituido.
- `data.platform_address.slug` (`string`, required)
- `data.platform_address.domain` (`string`, required)
- `data.platform_address.is_main` (`boolean`, required)
- `data.build` (`object | null`, required)
- `data.build.id` (`string`, required)
- `data.build.site_id` (`string`, required)
- `data.build.revision` (`string`, required, length: `40–40 chars`): Un ID de commit de Git (40 caracteres hexadecimales) del repositorio del sitio.
- `data.build.state` (`enum<string>`, required, one of: `queued, building, collecting, ready, failed, cancelled`)
- `data.build.target_origin` (`string`, required)
- `data.build.profile` (`enum<string>`, required, one of: `standard, guest-demo`)
- `data.build.file_count` (`integer | null`, required)
- `data.build.total_bytes` (`integer | null`, required)
- `data.build.duration_ms` (`integer | null`, required)
- `data.build.error` (`object | null`, required)
- `data.build.error.code` (`string`, required)
- `data.build.error.message` (`string,null`, required)
- `data.build.warnings` (`string[]`, required)
- `data.build.created_at` (`string`, required): ISO 8601, UTC.
- `data.build.started_at` (`string | null`, required)
- `data.build.finished_at` (`string | null`, required)
- `data.revision` (`string | null`, required)
- `data.draft_revision` (`string | null`, required)
- `data.is_latest_draft` (`boolean`, required)
- `data.live_build_id` (`string,null`, required)
- `data.expected_generation` (`integer`, required, range: `-9007199254740991–9007199254740991`)
- `data.can_publish` (`boolean`, required)
- `data.blockers` (`object[]`, required)
- `data.blockers.code` (`string`, required)
- `data.blockers.message` (`string`, required)
- `data.warnings` (`object[]`, required): Permitido, pero conviene decidirlo. Aquí, older_than_draft significa que la compilación revisada es anterior al borrador y se ha permitido (allow_older_build), o que no se ha indicado ningún build_id.
- `data.warnings.code` (`string`, required)
- `data.warnings.message` (`string`, required)
- `request_id` (`string`, required)

```json
{
  "data": {
    "site_id": "<string>",
    "url": "<string>",
    "platform_address": {
      "slug": "<string>",
      "domain": "<string>",
      "is_main": true
    },
    "build": {
      "id": "<string>",
      "site_id": "<string>",
      "revision": "<string>",
      "state": "queued",
      "target_origin": "<string>",
      "profile": "standard",
      "file_count": 123,
      "total_bytes": 123,
      "duration_ms": 123,
      "error": {
        "code": "<string>",
        "message": null
      },
      "warnings": [
        "<string>"
      ],
      "created_at": "<string>",
      "started_at": "<string>",
      "finished_at": "<string>"
    },
    "revision": "<string>",
    "draft_revision": "<string>",
    "is_latest_draft": true,
    "live_build_id": null,
    "expected_generation": 123,
    "can_publish": true,
    "blockers": [
      {
        "code": "<string>",
        "message": "<string>"
      }
    ],
    "warnings": [
      {
        "code": "<string>",
        "message": "<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 GET \
  --url 'https://api.atelier201.com/v1/sites/<site_id>/publish/review' \
  --header 'Authorization: <api-key>'
```
