> ## 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.

# Schedule a post for publishing

> Publishes the post automatically at scheduledAt: it is marked as published in Notra and, optionally, opened and merged as a GitHub pull request or posted to a connected X or LinkedIn account. Replaces any schedule that has not started. The post is published as saved at that time, so later edits are included. Publishing runs within about a minute of scheduledAt; transient errors are retried automatically.



## OpenAPI

````yaml https://api.usenotra.com/openapi.json post /v1/posts/{postId}/schedule
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.
servers:
  - url: https://api.usenotra.com
    description: Production
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.
paths:
  /v1/posts/{postId}/schedule:
    post:
      tags:
        - Content
      summary: Schedule a post for publishing
      description: >-
        Publishes the post automatically at scheduledAt: it is marked as
        published in Notra and, optionally, opened and merged as a GitHub pull
        request or posted to a connected X or LinkedIn account. Replaces any
        schedule that has not started. The post is published as saved at that
        time, so later edits are included. Publishing runs within about a minute
        of scheduledAt; transient errors are retried automatically.
      operationId: schedulePost
      parameters:
        - schema:
            type: string
            minLength: 1
            pattern: ^[A-Za-z0-9_-]{1,100}$
            example: post_123
          required: true
          in: path
          name: postId
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SchedulePostRequest'
      responses:
        '200':
          description: Post scheduled successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PostScheduleResponse'
        '400':
          description: Invalid request body or destination
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '401':
          description: Missing or invalid API key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: Post not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '409':
          description: Post is publishing or the schedule changed
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '429':
          description: >-
            Rate limit exceeded. This endpoint allows 60 requests per 1 minute
            per API key.
          headers:
            RateLimit-Limit:
              description: Maximum requests allowed in the current window.
              schema:
                type: integer
            RateLimit-Remaining:
              description: Requests remaining in the current window.
              schema:
                type: integer
            RateLimit-Reset:
              description: Seconds until the current window resets.
              schema:
                type: integer
            Retry-After:
              description: Seconds the client should wait before retrying.
              schema:
                type: integer
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RateLimitErrorResponse'
        '503':
          description: Authentication service unavailable
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
components:
  schemas:
    SchedulePostRequest:
      type: object
      properties:
        scheduledAt:
          type: string
          format: date-time
          description: >-
            When to publish, as an ISO 8601 timestamp. At most one year ahead; a
            time up to five minutes in the past publishes right away.
          example: '2026-10-06T08:00:00Z'
        timeZone:
          type: string
          minLength: 1
          maxLength: 100
          default: UTC
          description: >-
            IANA time zone the schedule was picked in. Used for display and
            emails only.
          example: Europe/Berlin
        destinations:
          type: array
          items:
            $ref: '#/components/schemas/ScheduleDestination'
          maxItems: 2
          default: []
          description: >-
            Where the post goes out besides Notra. The post is always marked as
            published in Notra at the scheduled time.
      required:
        - scheduledAt
    PostScheduleResponse:
      type: object
      properties:
        organization:
          type: object
          properties:
            id:
              type: string
            slug:
              type: string
            name:
              type: string
            logo:
              type:
                - string
                - 'null'
          required:
            - id
            - slug
            - name
            - logo
        schedule:
          $ref: '#/components/schemas/PostSchedule'
      required:
        - organization
        - schedule
    ErrorResponse:
      type: object
      properties:
        error:
          type: string
        code:
          type: string
        recovery:
          type: string
      required:
        - error
    RateLimitErrorResponse:
      type: object
      properties:
        error:
          type: string
        limit:
          type: integer
          minimum: 1
        remaining:
          type: integer
          minimum: 0
        reset:
          type: integer
      required:
        - error
        - limit
        - remaining
        - reset
    ScheduleDestination:
      oneOf:
        - type: object
          properties:
            destination:
              type: string
              enum:
                - github
            repositoryId:
              type: string
              minLength: 1
              pattern: ^[A-Za-z0-9_-]{1,100}$
              description: >-
                GitHub integration ID from GET /v1/integrations. Only for blog
                posts and changelogs.
              example: int_123
            merge:
              type: boolean
              default: true
              description: >-
                Merge the pull request at the scheduled time. When false, the
                pull request is only opened or updated.
          required:
            - destination
            - repositoryId
        - type: object
          properties:
            destination:
              type: string
              enum:
                - social
            accountId:
              type: string
              minLength: 1
              pattern: ^[A-Za-z0-9_-]{1,100}$
              description: >-
                Connected X or LinkedIn account ID. Only for tweets and LinkedIn
                posts, on an account of the matching platform.
              example: acc_123
          required:
            - destination
            - accountId
    PostSchedule:
      type:
        - object
        - 'null'
      properties:
        postId:
          type: string
        scheduledAt:
          type: string
          format: date-time
        timeZone:
          type: string
        publications:
          type: array
          items:
            $ref: '#/components/schemas/ScheduledPublication'
      required:
        - postId
        - scheduledAt
        - timeZone
        - publications
    ScheduledPublication:
      type: object
      properties:
        id:
          type: string
        destination:
          type: string
          enum:
            - notra
            - github
            - social
        config:
          oneOf:
            - type: object
              properties:
                destination:
                  type: string
                  enum:
                    - notra
              required:
                - destination
            - type: object
              properties:
                destination:
                  type: string
                  enum:
                    - github
                repositoryId:
                  type: string
                merge:
                  type: boolean
              required:
                - destination
                - repositoryId
                - merge
            - type: object
              properties:
                destination:
                  type: string
                  enum:
                    - social
                accountId:
                  type: string
              required:
                - destination
                - accountId
        status:
          type: string
          enum:
            - scheduled
            - publishing
            - published
            - failed
            - canceled
          description: >-
            scheduled → publishing → published or failed. Failed destinations
            are retried automatically for transient errors before they end up
            failed.
        scheduledAt:
          type: string
          format: date-time
        timeZone:
          type: string
        attempts:
          type: integer
        errorCode:
          type:
            - string
            - 'null'
        lastError:
          type:
            - string
            - 'null'
        resultUrl:
          type:
            - string
            - 'null'
          description: Pull request or social post URL once published.
        publishedAt:
          type:
            - string
            - 'null'
          format: date-time
      required:
        - id
        - destination
        - config
        - status
        - scheduledAt
        - timeZone
        - attempts
        - errorCode
        - lastError
        - resultUrl
        - publishedAt
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
      bearerFormat: API Key
      description: Send your API key in the Authorization header as Bearer API_KEY.

````

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