---
title: "Approve, publish, revert, or dismiss a content draft"
method: POST
path: "/api/v2/content-drafts/{id}"
tags: ["Own-site execution"]
---

# Approve, publish, revert, or dismiss a content draft

`POST /api/v2/content-drafts/{id}`

## Request

- Base URL: `https://www.hireeli.io`
- URL: `https://www.hireeli.io/api/v2/content-drafts/{id}`
- Auth: one of:
  - HTTP bearer
  - HTTP bearer

Publication uses the connected CMS and its verified target. Revert moves only an exact Eli-created native WordPress post to trash, verifies that state, preserves the historical publication receipt and returns an immutable reversal receipt.

## Path parameters

- `id` string, uuid, required

## Headers

- `x-eli-tenant` string, uuid

## Request body

- ContentDecisionRequest: approve_publish and revert require write:drafts and write:own-site for an API key. dismiss requires write:drafts. Revert is limited to exact Eli-created native WordPress posts and remains available after downgrade.
  - `action` 'approve_publish' | 'revert' | 'dismiss', required
  - `confirm` true: Must be the JSON boolean true. Strings, numbers and free-text phrases are rejected.
  - `confirmed_preview_hash` string: SHA-256 confirmation binding for the exact tool, workspace, resource and preview returned by the immediately preceding preview response.
  - `provider` 'wordpress' | 'webflow' | 'shopify' | 'contentful' | 'sanity' | 'strapi' | 'generic_api' | 'manual_url': Optional connected CMS choice. Use manual_url only with publication_url after the page is publicly live.
  - `publication_url` string, uri: Exact public URL used only with provider manual_url so Eli can verify a human publication handoff.

## Response `200`

The decision completed. The response is a machine-readable receipt.

- ProtocolReceipt
  - `decision` string, required: The exact accepted operation.
  - `resourceId` string, required: The decided resource ID.
  - `status` string, required: The state Eli verified after the decision.
  - `url` string, uri, nullable, required
  - `revertible` boolean, required: Whether Eli exposes a guarded machine revert for this completed action.
  - `revert_hint` string, nullable, required: The exact safe next step for a revert or immutable follow-up.
  - `caps` object, nullable, required: Durable protocol write counter returned by the shared execution core.
    - `used` integer, required
    - `limit` integer, required
    - `window` 'day', required
  - `audit_id` string, uuid, nullable, required: Durable protocol-decision audit row for this machine write.
  - `change_id` string, uuid, nullable: Exact owned-site change reconciled by a content rollback, when applicable.
  - `publication_receipt_id` string, uuid, nullable: Immutable publication receipt preserved across rollback.
  - `reversal_receipt_id` string, uuid, nullable: Immutable verified rollback receipt, when rollback completed.

## Other responses

- `400`: Invalid JSON body, action, resource ID or publication target. No write occurred.
- `401`: Credential missing, invalid, expired or revoked.
- `403`: Workspace, role, scope, plan or feature does not permit this operation.
- `404`: The resource is not visible in this workspace.
- `409`: Literal confirmation or the exact current preview hash is missing/stale, or the resource lifecycle conflicts with the decision. No unverified write should be assumed.
- `422`: Stored content failed the mandatory safety or evidence gate. Nothing was published.
- `429`: Request or durable protocol cap reached.
- `503`: A required security, billing, cap, audit, evidence or storage check is unavailable. Writes fail closed.

---

[API](https://skmtc.dev/hireeli/apis/eli-api.md) · [All operations](https://skmtc.dev/hireeli/apis/eli-api/llms.txt) · [OpenAPI document](https://skmtc.dev/hireeli/apis/eli-api/revisions/3272729fecd2?raw)
