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

# Create idea

> Create a new idea in the workspace. At least one channel (linkedIn, x, or tikTok) is required.



## OpenAPI

````yaml /api/openapi.json post /ideas
openapi: 3.1.0
info:
  title: Ordinal API
  version: 1.0.0
  description: API to create and manage Ordinal workspaces, posts, profiles, and analytics
servers:
  - url: https://app.tryordinal.com/api/v1
    description: Production server
security:
  - bearerAuth: []
tags:
  - name: Analytics
    description: Social media analytics data
  - name: Approvals
    description: Post approval workflows
  - name: Comments
    description: >-
      Post comments for team collaboration. Supports @mentions using the format
      @[Display Name](userId).
  - name: Engagements
    description: Auto-engagements for posts (likes, comments, reposts)
  - name: Invites
    description: Workspace invitations for adding new users
  - name: Labels
    description: Labels for organizing posts
  - name: Instagram
    description: Instagram utilities for location search and tagging
  - name: LinkedIn
    description: LinkedIn utilities for profile lookups, tagging, and mentions
  - name: Posts
    description: Create and manage posts
  - name: Profiles
    description: List connected social profiles
  - name: Slack Boosts
    description: >-
      List connected Slack channels (webhooks), then create and manage slack
      boosts so teams get notified in Slack when posts publish. Requires Slack
      connected with marketing boost channels.
  - name: Subscribers
    description: Post subscribers for notifications
  - name: File Uploads
    description: >-
      Upload files from URLs for use in posts. Supports images (JPEG, PNG, GIF,
      WebP) up to 10 MB and videos (MP4, MOV) up to 350 MB.
  - name: Ideas
    description: >-
      Create and manage content ideas. Ideas are draft posts without scheduled
      dates that can be converted to calendar posts.
  - name: Inline Comments
    description: >-
      Text-anchored comments on specific post content. Read-only API for
      retrieving inline comments across channels.
  - name: Users
    description: Workspace users
  - name: Webhooks
    description: >-
      Create, list, get, update, and delete webhooks to receive real-time event
      notifications
  - name: Workspaces
    description: Workspace information
paths:
  /ideas:
    post:
      tags:
        - Ideas
      summary: Create idea
      description: >-
        Create a new idea in the workspace. At least one channel (linkedIn, x,
        or tikTok) is required.
      operationId: ideas-create
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - title
              properties:
                title:
                  type: string
                  description: Idea title
                labelIds:
                  type: array
                  items:
                    type: string
                    format: uuid
                  default: []
                  description: Label IDs to attach to the idea
                campaignId:
                  type: string
                  format: uuid
                  description: Campaign ID to link the idea to
                linkedIn:
                  type: object
                  description: LinkedIn channel configuration
                  properties:
                    profileId:
                      type: string
                      format: uuid
                      description: LinkedIn profile ID to post from
                    copy:
                      type: string
                      description: >-
                        Post content text. To tag someone, use the format
                        `@[Display Name](urn)`. See [LinkedIn
                        Mentions](/api/linkedin-mentions) for details.
                    assets:
                      type: array
                      description: Array of assets to attach. Maximum 20 attachments.
                      items:
                        $ref: '#/components/schemas/ChannelAssetRef'
                      maxItems: 20
                    poll:
                      type: object
                      properties:
                        question:
                          type: string
                        duration:
                          type: string
                          enum:
                            - ONE_DAY
                            - THREE_DAYS
                            - ONE_WEEK
                            - TWO_WEEKS
                        options:
                          type: array
                          items:
                            type: object
                            properties:
                              id:
                                type: string
                              text:
                                type: string
                    linkPreview:
                      type: object
                      properties:
                        url:
                          type: string
                          format: uri
                        title:
                          type: string
                        description:
                          type: string
                        thumbnailId:
                          type: string
                x:
                  type: object
                  description: X (Twitter) channel configuration
                  required:
                    - profileId
                    - tweets
                  properties:
                    profileId:
                      type: string
                      format: uuid
                      description: X (Twitter) profile ID to post from
                    tweets:
                      type: array
                      description: >-
                        Array of tweets. For threads, include multiple tweets in
                        order.
                      minItems: 1
                      items:
                        type: object
                        required:
                          - copy
                        properties:
                          copy:
                            type: string
                            minLength: 1
                            description: Tweet text content
                          assets:
                            type: array
                            description: Array of assets to attach. Maximum 4 per tweet.
                            items:
                              $ref: '#/components/schemas/ChannelAssetRef'
                            maxItems: 4
                tikTok:
                  $ref: '#/components/schemas/TikTokConfig'
                youTubeShorts:
                  $ref: '#/components/schemas/YouTubeShortsConfig'
                notes:
                  type: string
                  description: Internal notes for the idea
            example:
              title: My Idea
              linkedIn:
                copy: This is my idea content for LinkedIn
      responses:
        '200':
          description: Idea created successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/IdeaCreateResponse'
              example:
                id: 550e8400-e29b-41d4-a716-446655440000
                url: >-
                  https://app.tryordinal.com/workspace/ideas/550e8400-e29b-41d4-a716-446655440000
                title: My Idea
                channels:
                  - LinkedIn
                status: Idea
                createdAt: '2026-02-18T14:30:00.000Z'
                updatedAt: '2026-02-18T14:30:00.000Z'
                linkedIn:
                  copy: This is my idea content for LinkedIn
                  assets: []
                x: null
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
components:
  schemas:
    ChannelAssetRef:
      type: object
      description: A reference to an asset to attach to a post.
      required:
        - assetId
      properties:
        assetId:
          type: string
          format: uuid
          description: Asset ID from the Uploads API
    TikTokConfig:
      type: object
      description: >-
        TikTok channel configuration for creating or updating posts. TikTok
        posts require exactly one video asset.
      required:
        - profileId
        - copy
        - assets
      properties:
        profileId:
          type: string
          format: uuid
          description: TikTok profile ID to post from
        copy:
          type: string
          maxLength: 2200
          description: Caption text. Maximum 2,200 characters.
        assets:
          type: array
          description: Array containing exactly one video asset.
          minItems: 1
          maxItems: 1
          items:
            $ref: '#/components/schemas/ChannelAssetRef'
        privacyLevel:
          $ref: '#/components/schemas/TikTokPrivacyLevel'
        isCommentDisabled:
          type: boolean
          description: Disable comments on the video.
        isDuetDisabled:
          type: boolean
          description: Disable Duet on the video.
        isStitchDisabled:
          type: boolean
          description: Disable Stitch on the video.
        isPromotingBusiness:
          type: boolean
          description: >-
            Mark the video as promoting the creator's own business (branded
            content disclosure).
        isPaidPartnership:
          type: boolean
          description: >-
            Mark the video as a paid partnership with a third-party brand
            (branded content disclosure).
        videoCoverTimestampMs:
          type: integer
          format: int32
          minimum: 0
          maximum: 2147483647
          nullable: true
          description: >-
            Timestamp (in milliseconds) of the video frame TikTok should use as
            the cover thumbnail. Defaults to the first frame when omitted or
            null.
    YouTubeShortsConfig:
      type: object
      description: >-
        YouTube Shorts channel configuration for creating or updating posts.
        YouTube Shorts posts require exactly one video asset (1s–3min).
      required:
        - profileId
        - title
        - assets
      properties:
        profileId:
          type: string
          format: uuid
          description: YouTube channel profile ID to post from
        title:
          type: string
          maxLength: 100
          description: Video title. Required by YouTube. Maximum 100 characters.
        description:
          type: string
          maxLength: 5000
          description: Video description. Maximum 5,000 characters.
        assets:
          type: array
          description: Array containing exactly one video asset (1s–3min duration).
          minItems: 1
          maxItems: 1
          items:
            $ref: '#/components/schemas/ChannelAssetRef'
        privacyStatus:
          $ref: '#/components/schemas/YouTubePrivacyStatus'
        categoryId:
          type: string
          description: YouTube category ID for the video.
        notifySubscribers:
          type: boolean
          description: Whether to notify channel subscribers when the video is published.
        isEmbeddable:
          type: boolean
          description: Whether the video can be embedded on other sites.
        isSelfDeclaredMadeForKids:
          type: boolean
          description: Whether the video is self-declared as made for kids.
    IdeaCreateResponse:
      type: object
      description: Response when creating an idea
      properties:
        id:
          type: string
          format: uuid
        url:
          type: string
          format: uri
        title:
          type: string
        channels:
          type: array
          items:
            type: string
        status:
          type: string
        createdAt:
          type: string
          format: date-time
        updatedAt:
          type: string
          format: date-time
        linkedIn:
          type: object
          nullable: true
          properties:
            copy:
              type: string
            assets:
              type: array
              items:
                $ref: '#/components/schemas/Asset'
        x:
          type: object
          nullable: true
          properties:
            tweets:
              type: array
              items:
                type: object
                properties:
                  copy:
                    type: string
                  assets:
                    type: array
                    items:
                      $ref: '#/components/schemas/Asset'
        tikTok:
          $ref: '#/components/schemas/TikTokContent'
        youTubeShorts:
          $ref: '#/components/schemas/YouTubeShortsContent'
    TikTokPrivacyLevel:
      type: string
      description: Audience visibility for the TikTok video.
      enum:
        - PUBLIC_TO_EVERYONE
        - FOLLOWER_OF_CREATOR
        - MUTUAL_FOLLOW_FRIENDS
        - SELF_ONLY
    YouTubePrivacyStatus:
      type: string
      description: Audience visibility for the YouTube Shorts video.
      enum:
        - public
        - private
        - unlisted
    Asset:
      type: object
      description: Asset metadata for files attached to posts
      properties:
        id:
          type: string
          format: uuid
          description: Asset ID
        name:
          type: string
          description: Original filename
        url:
          type: string
          format: uri
          description: URL to access the asset
        mimetype:
          type: string
          description: MIME type of the file (e.g., image/jpeg, video/mp4)
        size:
          type: integer
          description: File size in bytes
        width:
          type: integer
          nullable: true
          description: Width in pixels for images and videos
        height:
          type: integer
          nullable: true
          description: Height in pixels for images and videos
        duration:
          type: number
          nullable: true
          description: Duration in seconds for videos
    TikTokContent:
      type: object
      nullable: true
      description: TikTok content. Present when the post targets the TikTok channel.
      properties:
        profile:
          allOf:
            - $ref: '#/components/schemas/ChannelProfile'
          nullable: true
        copy:
          type: string
          description: Caption text
        assets:
          type: array
          description: Assets attached to the TikTok post (one video).
          items:
            $ref: '#/components/schemas/Asset'
        privacyLevel:
          $ref: '#/components/schemas/TikTokPrivacyLevel'
        isCommentDisabled:
          type: boolean
        isDuetDisabled:
          type: boolean
        isStitchDisabled:
          type: boolean
        isPromotingBusiness:
          type: boolean
        isPaidPartnership:
          type: boolean
        videoCoverTimestampMs:
          type: integer
          format: int32
          nullable: true
          description: >-
            Timestamp (in milliseconds) of the video frame used as the cover
            thumbnail. Null when not set.
    YouTubeShortsContent:
      type: object
      nullable: true
      description: >-
        YouTube Shorts content. Present when the post targets the YouTube Shorts
        channel.
      properties:
        profile:
          allOf:
            - $ref: '#/components/schemas/ChannelProfile'
          nullable: true
        title:
          type: string
          nullable: true
          description: Video title
        description:
          type: string
          nullable: true
          description: Video description
        assets:
          type: array
          description: Assets attached to the YouTube Shorts post (one video).
          items:
            $ref: '#/components/schemas/Asset'
        privacyStatus:
          $ref: '#/components/schemas/YouTubePrivacyStatus'
        categoryId:
          type: string
          nullable: true
        notifySubscribers:
          type: boolean
        isEmbeddable:
          type: boolean
        isSelfDeclaredMadeForKids:
          type: boolean
    ValidationError:
      type: object
      properties:
        code:
          type: string
        message:
          type: string
        data:
          type: object
          properties:
            errors:
              type: object
              additionalProperties:
                type: array
                items:
                  type: string
    Error:
      type: object
      properties:
        code:
          type: string
        message:
          type: string
    ChannelProfile:
      type: object
      description: Profile information for a channel (LinkedIn, X, or Instagram)
      properties:
        id:
          type: string
          format: uuid
          description: Profile ID
        name:
          type: string
          nullable: true
          description: Profile name
        detail:
          type: string
          nullable: true
          description: Profile detail (vanity name for LinkedIn, @username for X)
  responses:
    BadRequest:
      description: Bad Request - Invalid input parameters
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ValidationError'
          example:
            code: BAD_REQUEST
            message: Bad Request
            data:
              errors:
                publishAt:
                  - Invalid date format
                status:
                  - Invalid enum value
    Unauthorized:
      description: Unauthorized - Missing or invalid API key
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            code: UNAUTHORIZED
            message: Invalid or unauthorized API key
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: >-
        API key authentication. Generate an API key from your workspace
        settings.

````