---
title: "Get Action"
method: POST
path: "/actions/detail"
tags: ["Actions"]
---

# Get Action

`POST /actions/detail`

## Request

- Base URL: `https://api.peec.ai/customer/v1`
- URL: `https://api.peec.ai/customer/v1/actions/detail`
- Auth: one of:
  - API key in header `X-API-Key`
  - API key in query parameter `api_key`
  - HTTP bearer

One action in full: what to do, the fields the customer owns on it — notes, priority, assignee, due date, tags and repeat — the steps to work through, the content brief when there is one with its sections, the competitor demand behind it, the prompts it affects and the terms competitors use on the topic. A site audit action carries no brief and no opportunity, and its description and steps are the whole fix. An id this project has no published action for is a 404, whether it belongs to another project, to an action type this API does not publish for the project, or to nothing at all. A content optimisation carries its article, suggestions and score on the optimize content endpoint instead.

## Request body

- object
  - `project_id` string: Required if using a company api key
  - `action_id` string, uuid, required

## Response `200`

Success

- object: Success
  - `data` object, required
    - `id` string, uuid, required
    - `type` 'TEMPLATE_ACTION' | 'CONTENT_BRIEF' | 'CATEGORY_SITUATION_BRIEF' | 'CONTRADICTIONS_EXTERNAL_SOURCES' | 'CONTRADICTIONS_OWNED_SOURCES' | 'SEO_ISSUE' | 'ROBOTS_TXT' | 'PDP_OPTIMISATION' | 'MANUAL_ACTION' | 'CONTENT_OPTIMISATION', required
    - `status` 'PENDING' | 'PLANNED' | 'ACCEPTED' | 'REJECTED' | 'COMPLETED' | 'EXPIRED', required
    - `title` string, required
    - `group` 'OWNED' | 'EDITORIAL' | 'REFERENCE' | 'UGC' | 'OTHER', required
    - `category` string, nullable, required: The off-site playbook a template action follows, or the audit check an `SEO_ISSUE` came from — normally one of the values the `categories` filter accepts. Null on content briefs and `ROBOTS_TXT` actions.
    - `target` 'owned' | 'earned', required
    - `archetype` 'HOMEPAGE' | 'CATEGORY_PAGE' | 'PRODUCT_PAGE' | 'LISTICLE' | 'COMPARISON' | 'PROFILE' | 'ALTERNATIVE' | 'DISCUSSION' | 'HOW_TO_GUIDE' | 'ARTICLE' | 'REVIEW' | 'OTHER', nullable, required: The kind of page a content brief says to create. Null on template actions, and on content briefs generated before Peec recorded it.
    - `platform` string, nullable, required: Registrable domain of the third-party site. Null on own-site actions.
    - `topic_id` string, nullable, required
    - `source` string, required: The page the action targets. Not always a url: a content brief describes a page that does not exist yet and carries the sentinel `content-brief` (`situation-brief` on a `CATEGORY_SITUATION_BRIEF`), an `SEO_ISSUE` names the audit that raised it and puts its target in `domain`, and a `ROBOTS_TXT` action carries a bare hostname.
    - `domain` string, nullable, required: The site an `SEO_ISSUE` was raised against, which is what it applies to rather than a single page. Null on every other type.
    - `country_codes` string[], required: Markets the action is scoped to. Empty when it applies to every market the project tracks.
    - `model_channel_ids` string[], required
    - `impact` 'VERY_LOW' | 'LOW' | 'MEDIUM' | 'HIGH' | 'VERY_HIGH', required: How much the action is expected to gain if it is completed, banded against every action in the project, so it reads the same whatever the filters are. On an `SEO_ISSUE` the band comes from the issue's severity instead. This is the impact the app shows, and the only measure of expected gain the API publishes.
    - `step_count` number, required: How many steps the action has.
    - `completed_step_count` number, required
    - `created_at` string, required
    - `status_updated_at` string, nullable, required: When the status last changed. Null while still `PENDING`. On a `COMPLETED` action this is when the work was done, which the customer can backdate with `completed_at`.
    - `created_by` 'peec' | 'customer', required: Who wrote the action. Only a `customer` one can be deleted or have its `kind` changed; a `peec` one is declined through the status endpoint instead.
    - `priority` 'none' | 'low' | 'medium' | 'high', nullable, required: How much the customer says the action matters. It fills the same bars `impact` fills on a generated action, and is null on one nobody has set.
    - `assignee_user_id` string, nullable, required: The project member the work is on. Null when unassigned.
    - `due_on` string, nullable, required: Calendar day in the project's timezone.
    - `tag_ids` string[], required: Tags the customer filed the action under.
    - `description` object, required
      - `text` string, required
      - `sources` string[], required
    - `kind` 'CONTENT_OPTIMIZATION' | 'CONTENT_CREATION' | 'MENTION' | 'TECHNICAL' | 'PRODUCT_PAGE' | 'OTHER', nullable, required: What the customer wrote the action as, which is what decided its type and group. Null on an action Peec generated, whose shape came from what it found rather than from a choice.
    - `notes` string, nullable, required: Working notes the customer keeps beside the action.
    - `page_url` string, nullable, required: The page the action lands on, where `source` can instead carry a sentinel or a hostname. Null when the action names no page.
    - `language_codes` string[], nullable, required: Null when the action is not scoped to a language.
    - `repeat` object, nullable, required: How often the work comes round again.
      - `every` number, required
      - `unit` 'day' | 'week' | 'month' | 'year', required
    - `time_range` '7d' | '28d' | '90d' | 'all', nullable, required: The window the action's own measurements are read over.
    - `steps` object[]: The work to do on a template action, and on a content brief the material it was written from. This endpoint always returns it; the MCP tool omits it unless asked.
      - `id` string, required
      - `status` 'PENDING' | 'PLANNED' | 'ACCEPTED' | 'REJECTED' | 'COMPLETED' | 'EXPIRED', required
      - `group_title` string, nullable, required: Heading for a multi-option step. Null on a single-option step, which stands alone.
      - `gap_type` string, nullable, required: What a content brief's step holds — the fan-out prompts, the community phrases, themes or discussions, the winning sources, the brand context, or the brief's own points. A brief's steps are the material it was written from rather than work to do, and this is the only thing that says which is which. Null on a template action, whose steps are the work itself.
      - `options` object[], required
        - `id` string, required
        - `label` string, required
        - `text` string, required
        - `score` number, required
        - `completed` boolean, required
    - `content_brief_outline` object, nullable, required: Content briefs only, and null on a brief written before Peec recorded an outline. Everything past `points` arrived together and is null or empty on an outline written before that.
      - `title` string, required
      - `points` string[], required: The points to cover as plain headings, parallel to `outline_points` and in the same order.
      - `brief` string, nullable, required: The whole brief as one markdown document.
      - `summary` string, nullable, required: One line on what the page is for.
      - `overview` string, nullable, required
      - `h1_options` string[], required: Headlines to choose between.
      - `meta_title` string, nullable, required
      - `meta_description` string, nullable, required
      - `usp` object, nullable, required: How the brand should sound: the argument to hold to, the proof to cite, and the terms to avoid.
        - `spine` string, required
        - `proof_points` string[], required
        - `never_write_terms` string[], required
        - `register_lines` string[], required
      - `brand_context` object[], required: First-party facts the writer may draw on. Competitors are deliberately absent.
        - `label` string, required
        - `value` string, required
      - `language` object, nullable, required
        - `code` string, required: ISO 639-1.
        - `name` string, required
      - `outline_points` object[]: The brief section by section: what each one argues, the questions it answers and the evidence behind it. This endpoint always returns it; the MCP tool omits it unless asked.
        - `plan_index` number, required: 1-based position of the plan point this was written from.
        - `label` string, required
        - `direction` string, required
        - `angle` string, required
        - `questions` string[], required
        - `bullets` string[], required
        - `brand_grounding` string, required: The only first-party brand claim this point may make.
        - `evidence` object[], required
          - `kind` string, required
          - `source` string, nullable, required: Null for the evidence kinds carrying no attribution.
          - `text` string, required
    - `opportunity` object, nullable, required: The competitor demand behind a content brief. Null on other types.
      - `target_citation_count` number, required
      - `page_type` 'HOMEPAGE' | 'CATEGORY_PAGE' | 'PRODUCT_PAGE' | 'LISTICLE' | 'COMPARISON' | 'PROFILE' | 'ALTERNATIVE' | 'DISCUSSION' | 'HOW_TO_GUIDE' | 'ARTICLE' | 'REVIEW' | 'OTHER', required
      - `page_type_label` string, required
      - `topic_name` string, required
    - `impacted_prompts` object[]: The prompts this action affects. For source-correction actions, own_coverage_score is the owned domains' share of all citations for that prompt in the action's analysis window. Other types use their documented page-coverage score. This endpoint always returns the field; the MCP tool omits it unless asked.
      - `prompt_id` string, required
      - `prompt_text` string, required
      - `own_coverage_score` number, required
      - `source_coverage_score` number, nullable, required
    - `ngrams` object[]: Terms competitors use on this topic that the brand's own pages do not. This endpoint always returns it; the MCP tool omits it unless asked.
      - `gram` string, required
      - `count` number, required

## Other responses

- `404`: Response for status 404

## Changes

- **2026-11-03** `9d774600c8eb`: 1 warning
  - added the new `exa-0` enum value to the `data/model_channel_ids/items/` response property for the response status `200`
- **2026-11-03** `9fdffdff48a5`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/peec/apis/peec-ai-customer-api/changes/actions/detail/post.md)

---

[API](https://skmtc.dev/peec/apis/peec-ai-customer-api.md) - [All operations](https://skmtc.dev/peec/apis/peec-ai-customer-api/llms.txt) - [OpenAPI document](https://skmtc.dev/peec/apis/peec-ai-customer-api/revisions/9d774600c8eb?raw)
