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

# Create Creative

> Create a new creative in a campaign. Use content_reference to sponsor an existing post, or inline_content to create a new post and creative in one call. Two ad formats are supported inline: SINGLE_IMAGE (one image, one headline, one destination) and CAROUSEL (two to ten cards, each with its own image, headline and destination, and no call-to-action). The format must match the campaign's — LinkedIn freezes an ad set's format when it is first saved. LinkedIn offers seven other formats we do not model. VOCABULARY: the API's `creative` is what Campaign Manager shows as "Ad" (campaignGroup="Campaign", campaign="Ad set", creative="Ad"). Say both names when reporting to a user, or they will look in the wrong tab and think nothing happened.



## OpenAPI

````yaml /api-reference/openapi.yaml post /linkedin/mcp#create_creative
openapi: 3.1.0
info:
  title: Multi-Source Ads API
  version: 1.0.0
  description: >-
    Unified API for managing ad campaigns across Meta, LinkedIn, and Google. MCP
    tools are accessed via JSON-RPC 2.0 over HTTP (`POST /{source}/mcp`). Google
    Sheets/Drive endpoints use standard REST.
servers:
  - url: https://api.adside.ai
    description: Production
  - url: http://localhost:3100
    description: Local development
security:
  - bearerAuth: []
tags:
  - name: Accounts
    description: ''
  - name: Ads
    description: ''
  - name: Analytics
    description: ''
  - name: Asset Groups
    description: ''
  - name: Assets
    description: ''
  - name: Audiences
    description: ''
  - name: Campaign Groups
    description: ''
  - name: Campaigns
    description: ''
  - name: Conversions
    description: ''
  - name: Creatives
    description: ''
  - name: Drive
    description: ''
  - name: Google
    description: ''
  - name: Google Ads
    description: ''
  - name: Google Tag Manager
    description: ''
  - name: Keywords
    description: ''
  - name: Linkedin
    description: ''
  - name: Meta
    description: ''
  - name: Meta Reporting
    description: ''
  - name: OAuth
    description: ''
  - name: Other
    description: ''
  - name: Reports
    description: ''
  - name: Sheets
    description: ''
  - name: Targeting
    description: ''
  - name: Tiktok
    description: ''
  - name: Workspace
    description: ''
paths:
  /linkedin/mcp#create_creative:
    post:
      tags:
        - Linkedin
        - Creatives
      summary: Create Creative
      description: >-
        Create a new creative in a campaign. Use content_reference to sponsor an
        existing post, or inline_content to create a new post and creative in
        one call. Two ad formats are supported inline: SINGLE_IMAGE (one image,
        one headline, one destination) and CAROUSEL (two to ten cards, each with
        its own image, headline and destination, and no call-to-action). The
        format must match the campaign's — LinkedIn freezes an ad set's format
        when it is first saved. LinkedIn offers seven other formats we do not
        model. VOCABULARY: the API's `creative` is what Campaign Manager shows
        as "Ad" (campaignGroup="Campaign", campaign="Ad set", creative="Ad").
        Say both names when reporting to a user, or they will look in the wrong
        tab and think nothing happened.
      operationId: linkedin_create_creative
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - jsonrpc
                - method
                - params
              properties:
                jsonrpc:
                  type: string
                  const: '2.0'
                id:
                  type: string
                  example: '1'
                method:
                  type: string
                  const: tools/call
                params:
                  type: object
                  required:
                    - name
                    - arguments
                  properties:
                    name:
                      type: string
                      const: create_creative
                    arguments:
                      $ref: '#/components/schemas/linkedin_create_creative_input'
      responses:
        '200':
          description: JSON-RPC response with tool result
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/McpToolResponse'
        '401':
          description: Missing or invalid API key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '403':
          description: Channel not connected or access denied
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '429':
          description: Rate limit exceeded
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      security:
        - bearerAuth: []
components:
  schemas:
    linkedin_create_creative_input:
      type: object
      properties:
        account_id:
          description: >-
            LinkedIn Ad Account ID. Omit it: it defaults to the account this
            client is connected to, and any other account is refused.
          type: string
        campaign_id:
          type: string
          description: Campaign ID or URN to associate the creative with
        intended_status:
          default: DRAFT
          description: >-
            Initial intended status. DRAFT is what 'create without delivering'
            means here — a creative cannot be born PAUSED (LinkedIn refuses null
            → PAUSED while review.reviewStatus is unset, measured 2026-08-05).
            Pause it with update_creative once it has been reviewed.
          type: string
          enum:
            - ACTIVE
            - DRAFT
        content_reference:
          description: >-
            URN of existing content to sponsor (e.g. urn:li:share:{id} or
            urn:li:ugcPost:{id}). Use this OR inline_content, not both.
          type: string
        inline_content:
          description: >-
            Inline content to create a new post and creative in one call. Use
            this OR content_reference, not both. Pick the `format` branch that
            matches the campaign's own format: LinkedIn freezes an ad set's
            format the first time it is saved — 'Your objective and ad format
            cannot be changed once you save.'
          oneOf:
            - type: object
              properties:
                format:
                  type: string
                  const: SINGLE_IMAGE
                  description: >-
                    One image (or video), one headline, one destination. The
                    shape Campaign Manager calls a 'Single image' ad.
                author:
                  type: string
                  description: Author URN (e.g. urn:li:organization:{id})
                commentary:
                  type: string
                  description: Post commentary text
                media_id:
                  description: Media URN (e.g. urn:li:image:{id} or urn:li:video:{id})
                  type: string
                  minLength: 1
                media_title:
                  description: Title for the media
                  type: string
                alt_text:
                  description: >-
                    Alternate text describing the image, read aloud by screen
                    readers. Recommended under 120 characters. Describe what the
                    image SHOWS — not the brand, not the offer, which the
                    commentary already says.
                  type: string
                  maxLength: 4086
                landing_page:
                  description: Landing page URL for click-through
                  type: string
                call_to_action_label:
                  description: >-
                    Call-to-action button label. The twelve Campaign Manager
                    offers on a single-image ad. Not every format takes one: a
                    carousel has no call-to-action at all under Website visits,
                    a video REQUIRES one, and a spotlight takes free text rather
                    than a label (swept from the UI 2026-08-05).
                  type: string
                  enum:
                    - APPLY
                    - DOWNLOAD
                    - VIEW_QUOTE
                    - LEARN_MORE
                    - SIGN_UP
                    - SUBSCRIBE
                    - REGISTER
                    - REQUEST_DEMO
                    - JOIN
                    - ATTEND
                    - BUY_NOW
                    - SHOP_NOW
              required:
                - format
                - author
                - commentary
            - type: object
              properties:
                format:
                  type: string
                  const: CAROUSEL
                  description: >-
                    Two to ten swipeable cards, each with its own image,
                    headline and destination. The shape Campaign Manager calls a
                    'Carousel image' ad.
                author:
                  type: string
                  description: Author URN (e.g. urn:li:organization:{id})
                commentary:
                  type: string
                  description: Post commentary text
                cards:
                  minItems: 2
                  maxItems: 10
                  type: array
                  items:
                    type: object
                    properties:
                      image_id:
                        type: string
                        minLength: 1
                        description: >-
                          Image URN for this card (urn:li:image:{id}) — get one
                          from upload_image. Cards may repeat the same URN;
                          LinkedIn's own example does. Only images are
                          supported, never video.
                      title:
                        type: string
                        minLength: 1
                        maxLength: 400
                        description: >-
                          The card's headline. Required. The API allows 400
                          characters but Campaign Manager's own editor caps it
                          at 45 (30 when the ad points at a lead gen form) and
                          truncates after two lines — write for 45.
                      landing_page:
                        type: string
                        format: uri
                        description: >-
                          Where this card goes when clicked. Required, and
                          per-card: the whole point of a carousel is that cards
                          can lead to different pages.
                      alt_text:
                        description: >-
                          Alternate text for this card's image, read aloud by
                          screen readers. Describe what the image SHOWS.
                        type: string
                        maxLength: 4086
                    required:
                      - image_id
                      - title
                      - landing_page
                  description: >-
                    The cards, in display order. Campaign Manager states the
                    bounds as its own spec: 'You must have a minimum of two
                    cards. You cannot have more than 10 cards.'
                landing_page:
                  description: >-
                    Fallback destination for the ad as a whole
                    (`contentLandingPage`), separate from each card's own. Cards
                    keep their individual links.
                  type: string
                  format: uri
              required:
                - format
                - author
                - commentary
                - cards
        name:
          description: Creative name for reference
          type: string
        leadgen_form_id:
          description: >-
            Lead gen form URN (required for LEAD_GENERATION campaigns), e.g.
            urn:li:adForm:1022720550. Get it from list_lead_gen_forms — the form
            must already exist on the account, this cannot create one. Measured
            on 54 live creatives: the URN form is what LinkedIn stores here.
          type: string
        leadgen_cta_label:
          description: >-
            Call-to-action label for a lead gen form. A different set from
            `inline_content.call_to_action_label` — do not assume the two lists
            match.
          type: string
          enum:
            - APPLY
            - DOWNLOAD
            - VIEW_QUOTE
            - LEARN_MORE
            - SIGN_UP
            - SUBSCRIBE
            - REGISTER
            - REQUEST_DEMO
            - JOIN
            - ATTEND
      required:
        - campaign_id
      $schema: http://json-schema.org/draft-07/schema#
    McpToolResponse:
      type: object
      properties:
        jsonrpc:
          type: string
          const: '2.0'
        id:
          type: string
        result:
          type: object
          properties:
            content:
              type: array
              items:
                type: object
                properties:
                  type:
                    type: string
                    const: text
                  text:
                    type: string
                    description: JSON-stringified tool result
    ErrorResponse:
      type: object
      properties:
        error:
          type: string
          description: Error message
        code:
          type: string
          enum:
            - UNAUTHORIZED
            - FORBIDDEN
            - NOT_FOUND
            - RATE_LIMITED
            - INTERNAL_ERROR
          description: Error code
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: >-
        API key (sk_live_*) — SHA256 hashed, looked up in Redis. Generate via
        the web app's workspace settings.

````