---
title: "Submit or replace the brief on a paid order"
method: PUT
path: "/api/agent/v1/orders/{id}/brief"
---

# Submit or replace the brief on a paid order

`PUT /api/agent/v1/orders/{id}/brief`

## Request

- Base URL: `https://essentras.com`
- URL: `https://essentras.com/api/agent/v1/orders/{id}/brief`
- Auth: HTTP bearer

Requires orders:write. POST is accepted as an alias. The body is the brief itself, or wrapped as { "brief": { ... } }. Same quality gate as the website brief form. Locked once a draft is out for approval or a placement is live (409 brief_locked).

## Path parameters

- `id` string, required

## Request body

- Brief
  - `subject_name` string, required: Who or what the article is about.
  - `subject_title` string
  - `links` string, required: Must contain at least one real link.
  - `goal` string, required: The business and what the coverage should achieve.
  - `avoid` string
  - `title_ideas` string
  - `notes` string
  - `placement_notes` object[]: Optional per-outlet angle. Each id must be an outlet on the order.
    - `id` string, required
    - `note` string, required

## Response `200`

The updated order

- Order
  - `object` 'order'
  - `id` string: Order id for the API (the public id).
  - `number` integer, nullable
  - `status` string
  - `payment_status` string
  - `fulfillment` 'awaiting_payment' | 'awaiting_brief' | 'in_progress' | 'partially_published' | 'published' | 'cancelled' | 'refunded'
  - `channel` 'api' | 'reseller_portal' | 'website'
  - `created_at` string, date-time
  - `paid_at` string, date-time, nullable
  - `currency` 'USD'
  - `pricing_basis` 'list' | 'reseller'
  - `subtotal` number
  - `discount` number
  - `discount_reason` string, nullable
  - `total` number
  - `paid_from_wallet` number
  - `client_reference` string, nullable
  - `line_items` object[]
    - `id` string: Outlet id.
    - `name` string
    - `type` string
    - `quantity` integer
    - `unit_price` number
    - `list_price` number
    - `amount` number
    - `placement_note` string, nullable
    - `status` 'in_progress' | 'published'
    - `live_url` string, uri, nullable
    - `published_at` string, date-time, nullable
  - `brief` object, nullable
    - `status` string
    - `submitted_at` string, date-time, nullable
    - `article_status` string
  - `dashboard_url` string, uri

## Other responses

- `400`: invalid_json or invalid_brief (with field)
- `401`: authentication_required, invalid_api_key, api_key_revoked or api_key_expired
- `403`: insufficient_scope (with required_scope) or ip_not_allowed
- `404`: order_not_found
- `409`: order_not_paid or brief_locked
- `429`: rate_limited

---

[API](https://skmtc.dev/essentras/apis/essentras-agent-api.md) · [All operations](https://skmtc.dev/essentras/apis/essentras-agent-api/llms.txt) · [OpenAPI document](https://skmtc.dev/essentras/apis/essentras-agent-api/revisions/17a4d739e1b1?raw)
