---
title: "Plan creative directions"
method: POST
path: "/publication-builds/angles"
tags: ["Publication Builds"]
---

# Plan creative directions

`POST /publication-builds/angles`

## Request

- Base URL: `https://app.openpo.st/api/v1`
- URL: `https://app.openpo.st/api/v1/publication-builds/angles`
- Auth: one of:
  - HTTP bearer
  - API key in cookie `openpost_session`

## Request body

- CreatePublicationBuildBody
  - `$schema` string, uri: A URL to the JSON Schema for this object.
  - `account_ids` string[], nullable: Candidate connected account IDs
  - `assets` BuildAsset[], nullable: Stored Workspace media used as source evidence
    - `may_publish` boolean, required
    - `media_id` string, required
    - `role` string, required
  - `context_may_publish` boolean: Allow text from context notes to appear in generated drafts
  - `context_notes` string: Private planning notes supplied as untrusted source material
  - `context_urls` string[], nullable: Public HTTP or HTTPS sources loaded by the guarded background worker
  - `destination_policy` 'recommend' | 'require_all': Allow the director to skip weak destinations or require every candidate
  - `direction` DirectionInput
    - `angle` string
    - `audience` string
    - `media_preference` string
    - `outcome` string
    - `tone_adjustment` string
  - `idea` string: Idea, note, update, or Markdown source text
  - `option_count` 0 | 4: Four complete creative alternatives, or the existing single package
  - `series_count` integer: Plan up to three complementary posts before generating selected drafts
  - `social_set_id` string: Optional Social Set candidate snapshot
  - `voice_profile_id` string: Optional build-level Voice Profile override
  - `workspace_id` string, required: Workspace that owns the source material and destinations

## Response `200`

OK

- PlanPublicationAnglesOutputBody
  - `$schema` string, uri: A URL to the JSON Schema for this object.
  - `angles` AngleOption[], nullable, required
    - `approach` string, required
    - `build_direction` DirectionInput, required
      - `angle` string
      - `audience` string
      - `media_preference` string
      - `outcome` string
      - `tone_adjustment` string
    - `desired_reaction` string, required
    - `evidence` string, required
    - `hook` string, required
    - `id` string, required
    - `label` string, required
    - `media` MediaPlan, required
      - `alt_text` string
      - `brief` string, required
      - `document` ScreenshotTemplateDocument
        - `appearance` 'light' | 'dark', required
        - `conversation` ScreenshotTemplateConversation
          - `messages` ScreenshotTemplateMessage[], required
            - `id` string, required
            - `image_media_id` string
            - `sender_id` string, required
            - `text` string, required
          - `name` string, required
          - `people` ScreenshotTemplatePerson[], required
            - `avatar_media_id` string
            - `id` string, required
            - `name` string, required
          - `read_receipt` string, required
          - `self_id` string, required
          - `show_header` boolean, required
          - `timestamp` string, required
        - `frame` 'natural' | 'square' | 'portrait', required
        - `meme` ScreenshotTemplateMeme
          - `alt_text` string
          - `captions` string[], required
          - `format` 'png' | 'webp' | 'gif', required
          - `name` string, required
          - `overlay_media_ids` string[], required
          - `overlay_slots` integer, required
          - `parent_media_id` string
          - `template_id` string, required
        - `receipt` ScreenshotTemplateReceipt
          - `address` string, required
          - `business` string, required
          - `currency` 'USD' | 'EUR' | 'GBP' | 'BRL' | 'JPY', required
          - `custom_total` string, required
          - `footer` string, required
          - `items` ScreenshotTemplateReceiptItem[], required
            - `amount_cents` integer, required
            - `id` string, required
            - `name` string, required
            - `quantity` integer, required
          - `order` string, required
          - `tax_percent` number, double, required
          - `timestamp` string, required
        - `schema_version` 1, required
        - `status_page` ScreenshotTemplateStatus
          - `headline` string, required
          - `name` string, required
          - `severity` 'operational' | 'degraded' | 'outage', required
          - `updates` ScreenshotTemplateStatusUpdate[], required
            - `id` string, required
            - `stage` string, required
            - `text` string, required
            - `timestamp` string, required
        - `template_id` 'messages' | 'group-chat' | 'receipt' | 'status-page' | 'meme', required
        - `text_size` 'small' | 'normal' | 'large', required
        - `title` string, required
      - `role` string, required
      - `source_ref` string: Exact source ID for source-bound media treatments
      - `template_id` string
      - `treatment` string, required
    - `objective` string, required
    - `thesis` string, required

## Other responses

- `400`: Bad Request
- `403`: Forbidden
- `422`: Unprocessable Entity
- `429`: Too Many Requests
- `500`: Internal Server Error
- `503`: Service Unavailable

---

[API](https://skmtc.dev/openpo/apis/openpost-api.md) · [All operations](https://skmtc.dev/openpo/apis/openpost-api/llms.txt) · [OpenAPI document](https://skmtc.dev/openpo/apis/openpost-api/revisions/67d3964458a7?raw)
