> ## Documentation Index
> Fetch the complete documentation index at: https://docs.peec.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Create Actions

> Record work the customer decided to do themselves as actions, in the same shape as the ones Peec generates, so they sort, filter and move through the same statuses. The kind picked decides an action's type and group. The linked topic and prompts are resolved against the project, and an item naming one it does not hold lands in `rejected` on its own — the batch never fails as a whole.



## OpenAPI

````yaml https://api.peec.ai/customer/v1/openapi/json post /actions/create
openapi: 3.0.3
info:
  title: Peec AI Customer API
  description: Development documentation
  version: 1.0.0
  contact:
    name: Peec AI Team
    email: support@peec.ai
servers:
  - url: https://api.peec.ai/customer/v1
security: []
paths:
  /actions/create:
    post:
      tags:
        - Actions
      summary: Create Actions
      description: >-
        Record work the customer decided to do themselves as actions, in the
        same shape as the ones Peec generates, so they sort, filter and move
        through the same statuses. The kind picked decides an action's type and
        group. The linked topic and prompts are resolved against the project,
        and an item naming one it does not hold lands in `rejected` on its own —
        the batch never fails as a whole.
      operationId: postActionsCreate
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                project_id:
                  description: Required if using a company api key
                  example: or_f45b94ba-5e35-4982-93ed-285e72ee14eb
                  type: string
                actions:
                  minItems: 1
                  maxItems: 50
                  type: array
                  items:
                    type: object
                    properties:
                      description:
                        description: >-
                          What the action is for. `html` is the formatting the
                          app's editor renders; `text` is what everything else
                          reads.
                        type: object
                        properties:
                          text:
                            type: string
                            maxLength: 10000
                          html:
                            type: string
                            maxLength: 10000
                        required:
                          - text
                      notes:
                        description: >-
                          Working notes kept beside the action. Null clears
                          them.
                        nullable: true
                        type: object
                        properties:
                          text:
                            type: string
                            maxLength: 10000
                          html:
                            type: string
                            maxLength: 10000
                        required:
                          - text
                      topic_id:
                        description: >-
                          Topic the action is scoped to, from the topics
                          endpoint. Null clears it.
                        example: to_a1b2c3
                        nullable: true
                        type: string
                        minLength: 1
                      prompt_ids:
                        description: >-
                          Prompts this action is meant to move, from the prompts
                          endpoint. Replaces the whole list.
                        example:
                          - pr_a1b2c3
                        maxItems: 100
                        type: array
                        items:
                          type: string
                      steps:
                        description: The work to do, replacing the whole step list.
                        maxItems: 100
                        type: array
                        items:
                          type: object
                          properties:
                            title:
                              type: string
                              minLength: 1
                              maxLength: 10000
                              description: What to do, as one line.
                              example: Add a pricing comparison table
                            description:
                              description: Detail below the step's own line.
                              type: string
                              maxLength: 10000
                            completed:
                              type: boolean
                            section:
                              description: >-
                                Heading this step sits under. Steps naming the
                                same one are grouped together, in the order they
                                first appear; steps naming none sit in the
                                default list above every group.
                              example: Before publishing
                              type: string
                              minLength: 1
                              maxLength: 80
                          required:
                            - title
                      priority:
                        description: >-
                          How much the action matters. It fills the same impact
                          bars a generated action fills from its predicted lift,
                          which is what lets the two sort together.
                        type: string
                        enum:
                          - none
                          - low
                          - medium
                          - high
                      country_codes:
                        description: >-
                          ISO 3166-1 alpha-2 markets the action is scoped to.
                          Null means every market the project tracks.
                        nullable: true
                        maxItems: 100
                        type: array
                        items:
                          type: string
                      language_codes:
                        nullable: true
                        maxItems: 100
                        type: array
                        items:
                          type: string
                      tag_ids:
                        maxItems: 100
                        type: array
                        items:
                          type: string
                      category:
                        nullable: true
                        type: string
                      assignee_user_id:
                        description: >-
                          The project member who owns the work. Null unassigns
                          it.
                        nullable: true
                        type: string
                      due_on:
                        description: >-
                          Calendar day in the project's timezone. Null clears
                          it.
                        example: '2026-10-31'
                        nullable: true
                        type: string
                        format: date
                        pattern: >-
                          ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))$
                      repeat:
                        description: >-
                          How often the work comes round again. Null makes it
                          one-off.
                        nullable: true
                        type: object
                        properties:
                          every:
                            type: integer
                            minimum: 1
                            maximum: 12
                          unit:
                            type: string
                            enum:
                              - day
                              - week
                              - month
                              - year
                        required:
                          - every
                          - unit
                      time_range:
                        nullable: true
                        description: >-
                          The window the action's own measurements are read
                          over.
                        type: string
                        enum:
                          - 7d
                          - 28d
                          - 90d
                          - all
                      title:
                        type: string
                        minLength: 1
                        maxLength: 250
                        example: Add a pricing comparison table
                      kind:
                        type: string
                        enum:
                          - CONTENT_OPTIMIZATION
                          - CONTENT_CREATION
                          - MENTION
                          - TECHNICAL
                          - PRODUCT_PAGE
                          - OTHER
                        description: >-
                          What the work is, which decides the action's type and
                          group so it files beside the generated ones:
                          `CONTENT_OPTIMIZATION` (Content optimization),
                          `CONTENT_CREATION` (Create content), `MENTION`
                          (Improve a mention), `TECHNICAL` (Fix a technical
                          issue), `PRODUCT_PAGE` (Improve a product page),
                          `OTHER` (Something else).
                      status:
                        default: PENDING
                        description: >-
                          Where the action starts. `PENDING` is undecided,
                          `ACCEPTED` is in progress, `COMPLETED` is done,
                          `REJECTED` was declined.
                        type: string
                        enum:
                          - PENDING
                          - ACCEPTED
                          - REJECTED
                          - COMPLETED
                      page_url:
                        default: ''
                        description: >-
                          The page the action lands on. Empty means it names no
                          page. On an owned-page kind this is also the page the
                          action is measured against.
                        example: https://example.com/pricing
                        type: string
                        maxLength: 2048
                    required:
                      - title
                      - kind
                  description: Up to 50 actions to write.
              required:
                - actions
          application/x-www-form-urlencoded:
            schema:
              type: object
              properties:
                project_id:
                  description: Required if using a company api key
                  example: or_f45b94ba-5e35-4982-93ed-285e72ee14eb
                  type: string
                actions:
                  minItems: 1
                  maxItems: 50
                  type: array
                  items:
                    type: object
                    properties:
                      description:
                        description: >-
                          What the action is for. `html` is the formatting the
                          app's editor renders; `text` is what everything else
                          reads.
                        type: object
                        properties:
                          text:
                            type: string
                            maxLength: 10000
                          html:
                            type: string
                            maxLength: 10000
                        required:
                          - text
                      notes:
                        description: >-
                          Working notes kept beside the action. Null clears
                          them.
                        nullable: true
                        type: object
                        properties:
                          text:
                            type: string
                            maxLength: 10000
                          html:
                            type: string
                            maxLength: 10000
                        required:
                          - text
                      topic_id:
                        description: >-
                          Topic the action is scoped to, from the topics
                          endpoint. Null clears it.
                        example: to_a1b2c3
                        nullable: true
                        type: string
                        minLength: 1
                      prompt_ids:
                        description: >-
                          Prompts this action is meant to move, from the prompts
                          endpoint. Replaces the whole list.
                        example:
                          - pr_a1b2c3
                        maxItems: 100
                        type: array
                        items:
                          type: string
                      steps:
                        description: The work to do, replacing the whole step list.
                        maxItems: 100
                        type: array
                        items:
                          type: object
                          properties:
                            title:
                              type: string
                              minLength: 1
                              maxLength: 10000
                              description: What to do, as one line.
                              example: Add a pricing comparison table
                            description:
                              description: Detail below the step's own line.
                              type: string
                              maxLength: 10000
                            completed:
                              type: boolean
                            section:
                              description: >-
                                Heading this step sits under. Steps naming the
                                same one are grouped together, in the order they
                                first appear; steps naming none sit in the
                                default list above every group.
                              example: Before publishing
                              type: string
                              minLength: 1
                              maxLength: 80
                          required:
                            - title
                      priority:
                        description: >-
                          How much the action matters. It fills the same impact
                          bars a generated action fills from its predicted lift,
                          which is what lets the two sort together.
                        type: string
                        enum:
                          - none
                          - low
                          - medium
                          - high
                      country_codes:
                        description: >-
                          ISO 3166-1 alpha-2 markets the action is scoped to.
                          Null means every market the project tracks.
                        nullable: true
                        maxItems: 100
                        type: array
                        items:
                          type: string
                      language_codes:
                        nullable: true
                        maxItems: 100
                        type: array
                        items:
                          type: string
                      tag_ids:
                        maxItems: 100
                        type: array
                        items:
                          type: string
                      category:
                        nullable: true
                        type: string
                      assignee_user_id:
                        description: >-
                          The project member who owns the work. Null unassigns
                          it.
                        nullable: true
                        type: string
                      due_on:
                        description: >-
                          Calendar day in the project's timezone. Null clears
                          it.
                        example: '2026-10-31'
                        nullable: true
                        type: string
                        format: date
                        pattern: >-
                          ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))$
                      repeat:
                        description: >-
                          How often the work comes round again. Null makes it
                          one-off.
                        nullable: true
                        type: object
                        properties:
                          every:
                            type: integer
                            minimum: 1
                            maximum: 12
                          unit:
                            type: string
                            enum:
                              - day
                              - week
                              - month
                              - year
                        required:
                          - every
                          - unit
                      time_range:
                        nullable: true
                        description: >-
                          The window the action's own measurements are read
                          over.
                        type: string
                        enum:
                          - 7d
                          - 28d
                          - 90d
                          - all
                      title:
                        type: string
                        minLength: 1
                        maxLength: 250
                        example: Add a pricing comparison table
                      kind:
                        type: string
                        enum:
                          - CONTENT_OPTIMIZATION
                          - CONTENT_CREATION
                          - MENTION
                          - TECHNICAL
                          - PRODUCT_PAGE
                          - OTHER
                        description: >-
                          What the work is, which decides the action's type and
                          group so it files beside the generated ones:
                          `CONTENT_OPTIMIZATION` (Content optimization),
                          `CONTENT_CREATION` (Create content), `MENTION`
                          (Improve a mention), `TECHNICAL` (Fix a technical
                          issue), `PRODUCT_PAGE` (Improve a product page),
                          `OTHER` (Something else).
                      status:
                        default: PENDING
                        description: >-
                          Where the action starts. `PENDING` is undecided,
                          `ACCEPTED` is in progress, `COMPLETED` is done,
                          `REJECTED` was declined.
                        type: string
                        enum:
                          - PENDING
                          - ACCEPTED
                          - REJECTED
                          - COMPLETED
                      page_url:
                        default: ''
                        description: >-
                          The page the action lands on. Empty means it names no
                          page. On an owned-page kind this is also the page the
                          action is measured against.
                        example: https://example.com/pricing
                        type: string
                        maxLength: 2048
                    required:
                      - title
                      - kind
                  description: Up to 50 actions to write.
              required:
                - actions
          multipart/form-data:
            schema:
              type: object
              properties:
                project_id:
                  description: Required if using a company api key
                  example: or_f45b94ba-5e35-4982-93ed-285e72ee14eb
                  type: string
                actions:
                  minItems: 1
                  maxItems: 50
                  type: array
                  items:
                    type: object
                    properties:
                      description:
                        description: >-
                          What the action is for. `html` is the formatting the
                          app's editor renders; `text` is what everything else
                          reads.
                        type: object
                        properties:
                          text:
                            type: string
                            maxLength: 10000
                          html:
                            type: string
                            maxLength: 10000
                        required:
                          - text
                      notes:
                        description: >-
                          Working notes kept beside the action. Null clears
                          them.
                        nullable: true
                        type: object
                        properties:
                          text:
                            type: string
                            maxLength: 10000
                          html:
                            type: string
                            maxLength: 10000
                        required:
                          - text
                      topic_id:
                        description: >-
                          Topic the action is scoped to, from the topics
                          endpoint. Null clears it.
                        example: to_a1b2c3
                        nullable: true
                        type: string
                        minLength: 1
                      prompt_ids:
                        description: >-
                          Prompts this action is meant to move, from the prompts
                          endpoint. Replaces the whole list.
                        example:
                          - pr_a1b2c3
                        maxItems: 100
                        type: array
                        items:
                          type: string
                      steps:
                        description: The work to do, replacing the whole step list.
                        maxItems: 100
                        type: array
                        items:
                          type: object
                          properties:
                            title:
                              type: string
                              minLength: 1
                              maxLength: 10000
                              description: What to do, as one line.
                              example: Add a pricing comparison table
                            description:
                              description: Detail below the step's own line.
                              type: string
                              maxLength: 10000
                            completed:
                              type: boolean
                            section:
                              description: >-
                                Heading this step sits under. Steps naming the
                                same one are grouped together, in the order they
                                first appear; steps naming none sit in the
                                default list above every group.
                              example: Before publishing
                              type: string
                              minLength: 1
                              maxLength: 80
                          required:
                            - title
                      priority:
                        description: >-
                          How much the action matters. It fills the same impact
                          bars a generated action fills from its predicted lift,
                          which is what lets the two sort together.
                        type: string
                        enum:
                          - none
                          - low
                          - medium
                          - high
                      country_codes:
                        description: >-
                          ISO 3166-1 alpha-2 markets the action is scoped to.
                          Null means every market the project tracks.
                        nullable: true
                        maxItems: 100
                        type: array
                        items:
                          type: string
                      language_codes:
                        nullable: true
                        maxItems: 100
                        type: array
                        items:
                          type: string
                      tag_ids:
                        maxItems: 100
                        type: array
                        items:
                          type: string
                      category:
                        nullable: true
                        type: string
                      assignee_user_id:
                        description: >-
                          The project member who owns the work. Null unassigns
                          it.
                        nullable: true
                        type: string
                      due_on:
                        description: >-
                          Calendar day in the project's timezone. Null clears
                          it.
                        example: '2026-10-31'
                        nullable: true
                        type: string
                        format: date
                        pattern: >-
                          ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))$
                      repeat:
                        description: >-
                          How often the work comes round again. Null makes it
                          one-off.
                        nullable: true
                        type: object
                        properties:
                          every:
                            type: integer
                            minimum: 1
                            maximum: 12
                          unit:
                            type: string
                            enum:
                              - day
                              - week
                              - month
                              - year
                        required:
                          - every
                          - unit
                      time_range:
                        nullable: true
                        description: >-
                          The window the action's own measurements are read
                          over.
                        type: string
                        enum:
                          - 7d
                          - 28d
                          - 90d
                          - all
                      title:
                        type: string
                        minLength: 1
                        maxLength: 250
                        example: Add a pricing comparison table
                      kind:
                        type: string
                        enum:
                          - CONTENT_OPTIMIZATION
                          - CONTENT_CREATION
                          - MENTION
                          - TECHNICAL
                          - PRODUCT_PAGE
                          - OTHER
                        description: >-
                          What the work is, which decides the action's type and
                          group so it files beside the generated ones:
                          `CONTENT_OPTIMIZATION` (Content optimization),
                          `CONTENT_CREATION` (Create content), `MENTION`
                          (Improve a mention), `TECHNICAL` (Fix a technical
                          issue), `PRODUCT_PAGE` (Improve a product page),
                          `OTHER` (Something else).
                      status:
                        default: PENDING
                        description: >-
                          Where the action starts. `PENDING` is undecided,
                          `ACCEPTED` is in progress, `COMPLETED` is done,
                          `REJECTED` was declined.
                        type: string
                        enum:
                          - PENDING
                          - ACCEPTED
                          - REJECTED
                          - COMPLETED
                      page_url:
                        default: ''
                        description: >-
                          The page the action lands on. Empty means it names no
                          page. On an owned-page kind this is also the page the
                          action is measured against.
                        example: https://example.com/pricing
                        type: string
                        maxLength: 2048
                    required:
                      - title
                      - kind
                  description: Up to 50 actions to write.
              required:
                - actions
      responses:
        '200':
          description: Per-item results, `index` naming the position in the request.
          content:
            application/json:
              schema:
                type: object
                properties:
                  created:
                    type: array
                    items:
                      type: object
                      properties:
                        index:
                          type: number
                        action_id:
                          type: string
                        title:
                          type: string
                      required:
                        - index
                        - action_id
                        - title
                  rejected:
                    type: array
                    items:
                      type: object
                      properties:
                        index:
                          type: number
                        reason:
                          type: string
                          enum:
                            - invalid
                        message:
                          type: string
                      required:
                        - index
                        - reason
                        - message
                required:
                  - created
                  - rejected
                description: Per-item results, `index` naming the position in the request.
      security:
        - APIKeyHeader: []
        - APIKeyQuery: []
        - BearerAuth: []
components:
  securitySchemes:
    APIKeyHeader:
      type: apiKey
      in: header
      name: X-API-Key
    APIKeyQuery:
      type: apiKey
      in: query
      name: api_key
    BearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT

````