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

# Update a content brief

> Edits the brief's outline and planning fields. Omitted fields keep their current value; list fields replace the whole list. Only briefs in `draft` or `failed` can be edited, and the draft post's plan is updated with them. Anything else returns 409. Editing drops research notes such as the baseline and recommended angle, as the dashboard editor does.



## OpenAPI

````yaml https://api.usenotra.com/openapi.json patch /v1/projects/{projectId}/geo/briefs/{briefId}
openapi: 3.1.1
info:
  title: Notra API
  version: 1.0.0
  description: >-
    OpenAPI schema for Notra content endpoints. Use GET /v1/status for public
    reachability. Error responses include recovery guidance. Breaking changes
    ship under a new major path; deprecated operations send Deprecation and
    Sunset headers at least 90 days before removal.
servers:
  - url: https://api.usenotra.com
    description: Production
  - url: https://demo-api.usenotra.com
    description: >-
      Sandbox with sample data. Get a free sandbox key at demo.usenotra.com, no
      signup needed
security:
  - BearerAuth: []
tags:
  - name: Webhooks
    description: Manage outbound webhook subscriptions and delivery history.
  - name: Discovery
    description: Public API status and authenticated workspace discovery.
  - name: Content
    description: >-
      Manage posts, brand identities, and GitHub or Linear integrations, and
      queue content generation. Organization is inferred from the API key
      (identity.externalId).
  - name: Schedules
    description: >-
      Manage scheduled content generation. Organization is inferred from the API
      key (identity.externalId).
  - name: Event Triggers
    description: >-
      Manage event-based content generation triggered by GitHub webhooks.
      Organization is inferred from the API key (identity.externalId).
  - name: Chats
    description: >-
      Manage chat sessions. Organization is inferred from the API key
      (identity.externalId).
  - name: Skills
    description: >-
      Manage reusable writing skills. Organization is inferred from the API key
      (identity.externalId).
  - name: Feedback
    description: >-
      Collect and triage feedback submitted by AI agents. Agents post to the
      organization's feedback URL without credentials; reading and triage
      require an API key with feedback.read or feedback.write.
  - name: GEO
    description: >-
      Manage generative engine optimization: projects, tracking settings,
      prompts, prompt sequences, competitors, scans, visibility reads, content
      gaps and briefs, agent readiness and AI traffic. Project-scoped endpoints
      require the GEO plan entitlement in addition to their scope;
      organization-level ingest endpoints require only the traffic scope.
  - name: Sites
    description: >-
      Notra Sites are hosted blogs and changelogs built from a GitHub
      repository. Read Sites and their deployments, start builds, preview posts
      on a Site, open pull requests that publish posts to it, and manage
      blog.json authors and the author page through staged Design changes.
      Domains, settings, rollbacks and deletion stay in the dashboard.
externalDocs:
  description: Notra API versioning and deprecation policy
  url: https://www.usenotra.com/docs/api/versioning
paths:
  /v1/projects/{projectId}/geo/briefs/{briefId}:
    patch:
      tags:
        - GEO
      summary: Update a content brief
      description: >-
        Edits the brief's outline and planning fields. Omitted fields keep their
        current value; list fields replace the whole list. Only briefs in
        `draft` or `failed` can be edited, and the draft post's plan is updated
        with them. Anything else returns 409. Editing drops research notes such
        as the baseline and recommended angle, as the dashboard editor does.
      operationId: updateGeoContentBrief
      parameters:
        - schema:
            type: string
            minLength: 1
            pattern: ^[A-Za-z0-9_-]{1,100}$
            example: b1f2c3d4-0000-4000-8000-000000000000
          required: true
          name: projectId
          in: path
        - schema:
            type: string
            minLength: 1
            pattern: ^[A-Za-z0-9_-]{1,100}$
          required: true
          name: briefId
          in: path
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UpdateGeoContentBriefRequest'
      responses:
        '200':
          description: Brief updated successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GeoContentBriefResponse'
        '400':
          description: Invalid request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '401':
          description: Missing or invalid API key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '402':
          description: GEO plan or available AI credits required
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: Organization, project or resource not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '409':
          description: Conflict
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '503':
          description: Authentication or billing service unavailable
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
components:
  schemas:
    UpdateGeoContentBriefRequest:
      type: object
      properties:
        expectedUpdatedAt:
          type: string
          format: date-time
          description: >-
            The brief's updatedAt from your last read. When set, the update
            fails with 409 if the brief changed since. Omit to overwrite the
            latest version.
        workingTitle:
          type: string
          minLength: 1
          maxLength: 120
          pattern: ^[^\r\n]*$
        targetPrompt:
          type: string
          minLength: 1
          pattern: ^[^\r\n]*$
        intent:
          type: string
          minLength: 1
          pattern: ^[^\r\n]*$
        audience:
          type: string
          minLength: 1
          pattern: ^[^\r\n]*$
        jobToBeDone:
          type: string
          minLength: 1
          pattern: ^[^\r\n]*$
        sections:
          type: array
          items:
            type: object
            properties:
              heading:
                type: string
                minLength: 1
                pattern: ^[^\r\n]*$
              goal:
                type: string
                minLength: 1
                pattern: ^[^\r\n]*$
              claims:
                type: array
                items:
                  type: string
                  minLength: 1
                  pattern: ^[^\r\n]*$
                maxItems: 5
            required:
              - heading
              - goal
              - claims
          minItems: 3
          maxItems: 8
          description: The outline. Replaces every section; send the full list in order.
        questionsToAnswer:
          type: array
          items:
            type: string
            minLength: 1
            pattern: ^[^\r\n]*$
          maxItems: 8
          description: FAQ questions. Replaces the whole list.
        internalLinks:
          type: array
          items:
            type: object
            properties:
              url:
                type: string
                minLength: 1
                pattern: ^[^\r\n]*$
              anchor:
                type: string
                minLength: 1
                pattern: ^[^\r\n]*$
              why:
                type: string
                minLength: 1
                pattern: ^[^\r\n]*$
            required:
              - url
              - anchor
              - why
          maxItems: 6
          description: Replaces the whole list.
        acceptanceChecklist:
          type: array
          items:
            type: string
            minLength: 1
            pattern: ^[^\r\n]*$
          maxItems: 8
          description: Replaces the whole list.
    GeoContentBriefResponse:
      type: object
      properties:
        brief:
          $ref: '#/components/schemas/GeoContentBriefDetail'
        organization:
          type: object
          properties:
            id:
              type: string
            slug:
              type: string
            name:
              type: string
            logo:
              type:
                - string
                - 'null'
          required:
            - id
            - slug
            - name
            - logo
      required:
        - brief
        - organization
    ErrorResponse:
      type: object
      properties:
        error:
          type: string
        code:
          type: string
        recovery:
          type: string
      required:
        - error
    GeoContentBriefDetail:
      type: object
      properties:
        id:
          type: string
        topic:
          type: string
        brief:
          $ref: '#/components/schemas/GeoContentBriefDocument'
        status:
          type: string
          enum:
            - draft
            - approved
            - writing
            - completed
            - failed
        autoApproved:
          type: boolean
        runId:
          type:
            - string
            - 'null'
        postId:
          type:
            - string
            - 'null'
        humanized:
          type: boolean
        error:
          type:
            - string
            - 'null'
        createdAt:
          type: string
        updatedAt:
          type: string
        completedAt:
          type:
            - string
            - 'null'
      required:
        - id
        - topic
        - brief
        - status
        - autoApproved
        - runId
        - postId
        - humanized
        - error
        - createdAt
        - updatedAt
        - completedAt
    GeoContentBriefDocument:
      type: object
      properties:
        targetPrompt:
          type: string
        intent:
          type: string
        contentSubtype:
          type: string
          enum:
            - guide
            - comparison
            - listicle
            - how-to
            - faq
            - alternatives
        workingTitle:
          type: string
        audience:
          type: string
        jobToBeDone:
          type: string
        sections:
          type: array
          items:
            type: object
            properties:
              heading:
                type: string
              goal:
                type: string
              claims:
                type: array
                items:
                  type: string
            required:
              - heading
              - goal
              - claims
        questionsToAnswer:
          type: array
          items:
            type: string
        internalLinks:
          type: array
          items:
            type: object
            properties:
              url:
                type: string
              anchor:
                type: string
              why:
                type: string
            required:
              - url
              - anchor
              - why
        acceptanceChecklist:
          type: array
          items:
            type: string
        recommendedAngle:
          type: string
        competitorsToCounter:
          type: array
          items:
            type: string
        sourcesToReference:
          type: array
          items:
            type: string
        missingCoverage:
          type: array
          items:
            type: string
        baseline:
          type:
            - object
            - 'null'
          properties:
            sourcePromptId:
              type: string
            mentionedEngines:
              type: number
            totalEngines:
              type: number
            engines:
              type: array
              items:
                type: object
                properties:
                  engine:
                    type: string
                  mentioned:
                    type: boolean
                  position:
                    type:
                      - number
                      - 'null'
                required:
                  - engine
                  - mentioned
                  - position
            competitorMentions:
              type: array
              items:
                type: object
                properties:
                  name:
                    type: string
                  engines:
                    type: number
                required:
                  - name
                  - engines
            citedDomains:
              type: array
              items:
                type: object
                properties:
                  domain:
                    type: string
                  engines:
                    type: number
                required:
                  - domain
                  - engines
            capturedAt:
              type:
                - string
                - 'null'
          required:
            - sourcePromptId
            - mentionedEngines
            - totalEngines
            - engines
            - competitorMentions
            - citedDomains
            - capturedAt
      required:
        - targetPrompt
        - intent
        - contentSubtype
        - workingTitle
        - audience
        - jobToBeDone
        - sections
        - questionsToAnswer
        - internalLinks
        - acceptanceChecklist
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
      bearerFormat: API Key
      description: >-
        Send your API key in the Authorization header as Bearer API_KEY. Account
        API keys work in every workspace you belong to: send
        X-Notra-Organization-Id with the workspace id or slug to choose one.
        Workspace endpoints require it when you belong to more than one
        workspace; GET /v1/me/workspaces works without it. Organization keys
        only accept their own workspace there.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.