Planable Posts API

The Posts API from Planable — 8 operation(s) for posts.

OpenAPI Specification

planable-posts-api-openapi.yml Raw ↑
openapi: 3.1.0
info:
  title: Planable Public Campaigns Posts API
  version: 1.0.0
  description: REST API for managing Planable companies, workspaces, pages, posts and more.
servers:
- url: https://api.planable.io/api/v1
security:
- bearerAuth: []
tags:
- name: Posts
paths:
  /posts:
    get:
      tags:
      - Posts
      summary: List posts
      description: Returns posts for a workspace with pagination. Each item includes the same post detail fields as GET /posts/{id}.
      parameters:
      - name: workspaceId
        in: query
        required: true
        schema:
          type: string
      - name: pageId
        in: query
        required: false
        schema:
          type: string
      - name: campaignId
        in: query
        required: false
        schema:
          type: string
        description: Filter by campaign ID, or `no-campaign` for posts not assigned to any campaign
      - name: offset
        in: query
        required: false
        schema:
          type: integer
          default: 0
      - name: limit
        in: query
        required: false
        schema:
          type: integer
          default: 20
      security:
      - bearerAuth: []
      responses:
        '200':
          description: List of post details with pagination
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      type: object
                      properties:
                        id:
                          type: string
                        workspaceId:
                          type: string
                        pageId:
                          type: string
                        type:
                          type: string
                        classification:
                          type: string
                        plainText:
                          type: string
                        createdAt:
                          type: string
                          format: date-time
                        gridPosition:
                          type: number
                        campaignId:
                          type:
                          - string
                          - 'null'
                        media:
                          type: array
                          items:
                            type: string
                            format: uri
                          maxItems: 20
                          description: Up to 20 public image or video URLs, each max 100MB. Files are downloaded server-side from the provided URLs.
                        scheduledAt:
                          type:
                          - string
                          - 'null'
                          format: date-time
                        status:
                          type: string
                        approved:
                          type: boolean
                        approvedBy:
                          type: array
                          items:
                            type: object
                            properties:
                              userId:
                                type: string
                              approvedAt:
                                type: string
                                format: date-time
                              levelId:
                                type: string
                            required:
                            - userId
                            - approvedAt
                        approval:
                          type: object
                          properties:
                            status:
                              type: string
                              enum:
                              - NOT_APPLICABLE
                              - NEVER_SENT
                              - PENDING
                              - PARTIALLY_APPROVED
                              - FULLY_APPROVED
                            approved:
                              type: boolean
                            type:
                              type: string
                              enum:
                              - NONE
                              - OPTIONAL
                              - REQUIRED
                              - MULTIPLE
                            completedLevels:
                              type: integer
                              minimum: 0
                            totalLevels:
                              type: integer
                              minimum: 0
                            currentLevelId:
                              type: string
                            levels:
                              type: array
                              items:
                                type: object
                                properties:
                                  id:
                                    type: string
                                  label:
                                    type: string
                                  approved:
                                    type: boolean
                                  approvedBy:
                                    type: array
                                    items:
                                      type: object
                                      properties:
                                        userId:
                                          type: string
                                        approvedAt:
                                          type: string
                                          format: date-time
                                        levelId:
                                          type: string
                                      required:
                                      - userId
                                      - approvedAt
                                required:
                                - id
                                - label
                                - approved
                                - approvedBy
                          required:
                          - status
                          - approved
                          - type
                          - completedLevels
                          - totalLevels
                          - levels
                        published:
                          type: boolean
                        scheduledSet:
                          type: boolean
                        teamOnly:
                          type: boolean
                        archived:
                          type: boolean
                        modifiedAt:
                          type: string
                          format: date-time
                        mediaType:
                          type: string
                        labels:
                          type: array
                          items:
                            type: object
                            properties:
                              uuid:
                                type: string
                              text:
                                type: string
                              color:
                                type: string
                            required:
                            - uuid
                            - text
                            - color
                        commentsCounter:
                          type: number
                        notesCounter:
                          type: number
                        publicShareLink:
                          type: string
                          format: uri
                        publishedPostLink:
                          type: string
                          format: uri
                        groupId:
                          type: string
                        groupPageIds:
                          type: array
                          items:
                            type: string
                        groupSync:
                          type: boolean
                        pinterest:
                          type: object
                          properties:
                            boardId:
                              type: string
                            boardName:
                              type: string
                            title:
                              type:
                              - string
                              - 'null'
                            link:
                              type:
                              - string
                              - 'null'
                            description:
                              type:
                              - string
                              - 'null'
                          required:
                          - boardId
                          - boardName
                          - title
                          - link
                          - description
                      required:
                      - id
                      - workspaceId
                      - pageId
                      - type
                      - classification
                      - plainText
                      - createdAt
                      - campaignId
                      - media
                      - scheduledAt
                      - status
                      - approved
                      - approval
                      - published
                      - scheduledSet
                      - teamOnly
                      - archived
                      - commentsCounter
                      - notesCounter
                  pagination:
                    type: object
                    properties:
                      offset:
                        type: number
                      limit:
                        type: number
                      hasMore:
                        type: boolean
                    required:
                    - offset
                    - limit
                    - hasMore
                required:
                - data
                - pagination
        '400':
          description: Validation error
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '429':
          description: Rate limit exceeded
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
    post:
      tags:
      - Posts
      summary: Create a new post
      description: 'Creates a post in the specified workspace and page. Use `pageId` for a single post or `pageIds` to create grouped cross-page posts. Set `notify` to `false` to suppress external notifications (email, in-app push) for this post creation; internal activity feed entries are always recorded. The `media` field: Up to 20 public image or video URLs, each max 100MB. Files are downloaded server-side from the provided URLs.'
      security:
      - bearerAuth: []
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                workspaceId:
                  type: string
                  minLength: 1
                pageId:
                  type: string
                  minLength: 1
                pageIds:
                  type: array
                  items:
                    type: string
                    minLength: 1
                  minItems: 1
                  maxItems: 20
                text:
                  type: string
                  maxLength: 25000
                  default: ''
                gridPosition:
                  type: integer
                  minimum: 0
                scheduledAt:
                  type: string
                  format: date-time
                labels:
                  type: array
                  items:
                    type: string
                  default: []
                media:
                  type: array
                  items:
                    type: string
                    format: uri
                  maxItems: 20
                  default: []
                  description: Up to 20 public image or video URLs, each max 100MB. Files are downloaded server-side from the provided URLs.
                teamOnly:
                  type: boolean
                approved:
                  type: boolean
                approvedBy:
                  type: string
                  minLength: 1
                publishAtScheduledDate:
                  type: boolean
                  default: false
                firstComment:
                  type: string
                  maxLength: 8000
                internalNote:
                  type: string
                  maxLength: 8000
                youtubeTitle:
                  type: string
                  maxLength: 100
                linkedinPdfTitle:
                  type: string
                  maxLength: 150
                linkedinVideoTitle:
                  type: string
                  maxLength: 150
                notify:
                  type: boolean
                  default: true
                pinterest:
                  type: object
                  properties:
                    boardId:
                      type: string
                      minLength: 1
                    title:
                      type: string
                      maxLength: 100
                    link:
                      type: string
                      format: uri
                    description:
                      type: string
                      maxLength: 500
                  required:
                  - boardId
                campaignId:
                  anyOf:
                  - type: string
                    minLength: 1
                  - type: 'null'
                  - type: 'null'
              required:
              - workspaceId
      responses:
        '201':
          description: Post created
          content:
            application/json:
              schema:
                type: object
                properties:
                  posts:
                    type: array
                    items:
                      type: object
                      properties:
                        id:
                          type: string
                        workspaceId:
                          type: string
                        pageId:
                          type: string
                        type:
                          type: string
                        classification:
                          type: string
                        plainText:
                          type: string
                        createdAt:
                          type: string
                          format: date-time
                        gridPosition:
                          type: number
                        campaignId:
                          type:
                          - string
                          - 'null'
                        media:
                          type: array
                          items:
                            type: string
                            format: uri
                          maxItems: 20
                          description: Up to 20 public image or video URLs, each max 100MB. Files are downloaded server-side from the provided URLs.
                        scheduledAt:
                          type:
                          - string
                          - 'null'
                          format: date-time
                        status:
                          type: string
                        approved:
                          type: boolean
                        approvedBy:
                          type: array
                          items:
                            type: object
                            properties:
                              userId:
                                type: string
                              approvedAt:
                                type: string
                                format: date-time
                              levelId:
                                type: string
                            required:
                            - userId
                            - approvedAt
                        approval:
                          type: object
                          properties:
                            status:
                              type: string
                              enum:
                              - NOT_APPLICABLE
                              - NEVER_SENT
                              - PENDING
                              - PARTIALLY_APPROVED
                              - FULLY_APPROVED
                            approved:
                              type: boolean
                            type:
                              type: string
                              enum:
                              - NONE
                              - OPTIONAL
                              - REQUIRED
                              - MULTIPLE
                            completedLevels:
                              type: integer
                              minimum: 0
                            totalLevels:
                              type: integer
                              minimum: 0
                            currentLevelId:
                              type: string
                            levels:
                              type: array
                              items:
                                type: object
                                properties:
                                  id:
                                    type: string
                                  label:
                                    type: string
                                  approved:
                                    type: boolean
                                  approvedBy:
                                    type: array
                                    items:
                                      type: object
                                      properties:
                                        userId:
                                          type: string
                                        approvedAt:
                                          type: string
                                          format: date-time
                                        levelId:
                                          type: string
                                      required:
                                      - userId
                                      - approvedAt
                                required:
                                - id
                                - label
                                - approved
                                - approvedBy
                          required:
                          - status
                          - approved
                          - type
                          - completedLevels
                          - totalLevels
                          - levels
                        published:
                          type: boolean
                        scheduledSet:
                          type: boolean
                        teamOnly:
                          type: boolean
                        archived:
                          type: boolean
                        modifiedAt:
                          type: string
                          format: date-time
                        mediaType:
                          type: string
                        labels:
                          type: array
                          items:
                            type: object
                            properties:
                              uuid:
                                type: string
                              text:
                                type: string
                              color:
                                type: string
                            required:
                            - uuid
                            - text
                            - color
                        commentsCounter:
                          type: number
                        notesCounter:
                          type: number
                        publicShareLink:
                          type: string
                          format: uri
                        publishedPostLink:
                          type: string
                          format: uri
                        groupId:
                          type: string
                        groupPageIds:
                          type: array
                          items:
                            type: string
                        groupSync:
                          type: boolean
                        pinterest:
                          type: object
                          properties:
                            boardId:
                              type: string
                            boardName:
                              type: string
                            title:
                              type:
                              - string
                              - 'null'
                            link:
                              type:
                              - string
                              - 'null'
                            description:
                              type:
                              - string
                              - 'null'
                          required:
                          - boardId
                          - boardName
                          - title
                          - link
                          - description
                      required:
                      - id
                      - workspaceId
                      - pageId
                      - type
                      - classification
                      - plainText
                      - createdAt
                      - campaignId
                      - media
                      - scheduledAt
                      - status
                      - approved
                      - approval
                      - published
                      - scheduledSet
                      - teamOnly
                      - archived
                      - commentsCounter
                      - notesCounter
                required:
                - posts
        '400':
          description: Validation error
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: Workspace or page not found
        '429':
          description: Rate limit exceeded
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
  /posts/{id}:
    get:
      tags:
      - Posts
      summary: Get post detail
      description: Returns a single post by ID including media URLs.
      parameters:
      - name: id
        in: path
        required: true
        schema:
          type: string
      security:
      - bearerAuth: []
      responses:
        '200':
          description: Post detail with media
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: object
                    properties:
                      id:
                        type: string
                      workspaceId:
                        type: string
                      pageId:
                        type: string
                      type:
                        type: string
                      classification:
                        type: string
                      plainText:
                        type: string
                      createdAt:
                        type: string
                        format: date-time
                      gridPosition:
                        type: number
                      campaignId:
                        type:
                        - string
                        - 'null'
                      media:
                        type: array
                        items:
                          type: string
                          format: uri
                        maxItems: 20
                        description: Up to 20 public image or video URLs, each max 100MB. Files are downloaded server-side from the provided URLs.
                      scheduledAt:
                        type:
                        - string
                        - 'null'
                        format: date-time
                      status:
                        type: string
                      approved:
                        type: boolean
                      approvedBy:
                        type: array
                        items:
                          type: object
                          properties:
                            userId:
                              type: string
                            approvedAt:
                              type: string
                              format: date-time
                            levelId:
                              type: string
                          required:
                          - userId
                          - approvedAt
                      approval:
                        type: object
                        properties:
                          status:
                            type: string
                            enum:
                            - NOT_APPLICABLE
                            - NEVER_SENT
                            - PENDING
                            - PARTIALLY_APPROVED
                            - FULLY_APPROVED
                          approved:
                            type: boolean
                          type:
                            type: string
                            enum:
                            - NONE
                            - OPTIONAL
                            - REQUIRED
                            - MULTIPLE
                          completedLevels:
                            type: integer
                            minimum: 0
                          totalLevels:
                            type: integer
                            minimum: 0
                          currentLevelId:
                            type: string
                          levels:
                            type: array
                            items:
                              type: object
                              properties:
                                id:
                                  type: string
                                label:
                                  type: string
                                approved:
                                  type: boolean
                                approvedBy:
                                  type: array
                                  items:
                                    type: object
                                    properties:
                                      userId:
                                        type: string
                                      approvedAt:
                                        type: string
                                        format: date-time
                                      levelId:
                                        type: string
                                    required:
                                    - userId
                                    - approvedAt
                              required:
                              - id
                              - label
                              - approved
                              - approvedBy
                        required:
                        - status
                        - approved
                        - type
                        - completedLevels
                        - totalLevels
                        - levels
                      published:
                        type: boolean
                      scheduledSet:
                        type: boolean
                      teamOnly:
                        type: boolean
                      archived:
                        type: boolean
                      modifiedAt:
                        type: string
                        format: date-time
                      mediaType:
                        type: string
                      labels:
                        type: array
                        items:
                          type: object
                          properties:
                            uuid:
                              type: string
                            text:
                              type: string
                            color:
                              type: string
                          required:
                          - uuid
                          - text
                          - color
                      commentsCounter:
                        type: number
                      notesCounter:
                        type: number
                      publicShareLink:
                        type: string
                        format: uri
                      publishedPostLink:
                        type: string
                        format: uri
                      groupId:
                        type: string
                      groupPageIds:
                        type: array
                        items:
                          type: string
                      groupSync:
                        type: boolean
                      pinterest:
                        type: object
                        properties:
                          boardId:
                            type: string
                          boardName:
                            type: string
                          title:
                            type:
                            - string
                            - 'null'
                          link:
                            type:
                            - string
                            - 'null'
                          description:
                            type:
                            - string
                            - 'null'
                        required:
                        - boardId
                        - boardName
                        - title
                        - link
                        - description
                    required:
                    - id
                    - workspaceId
                    - pageId
                    - type
                    - classification
                    - plainText
                    - createdAt
                    - campaignId
                    - media
                    - scheduledAt
                    - status
                    - approved
                    - approval
                    - published
                    - scheduledSet
                    - teamOnly
                    - archived
                    - commentsCounter
                    - notesCounter
                required:
                - data

# --- truncated at 32 KB (62 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/planable/refs/heads/main/openapi/planable-posts-api-openapi.yml