> ## 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 Linkedin Campaign

> Create a new campaign in a LinkedIn Ad Account. Requires campaign group, name, type, objective, cost type, locale, and budget. Optionally set targeting, schedule, and format. VOCABULARY: the API's `campaign` is what Campaign Manager shows as "Ad set" (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_linkedin_campaign
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_linkedin_campaign:
    post:
      tags:
        - Linkedin
        - Campaigns
      summary: Create Linkedin Campaign
      description: >-
        Create a new campaign in a LinkedIn Ad Account. Requires campaign group,
        name, type, objective, cost type, locale, and budget. Optionally set
        targeting, schedule, and format. VOCABULARY: the API's `campaign` is
        what Campaign Manager shows as "Ad set" (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_linkedin_campaign
      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_linkedin_campaign
                    arguments:
                      $ref: >-
                        #/components/schemas/linkedin_create_linkedin_campaign_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_linkedin_campaign_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_group_id:
          type: string
          description: Campaign group ID to create the campaign in
        name:
          type: string
          description: Campaign name
        type:
          type: string
          enum:
            - TEXT_AD
            - SPONSORED_UPDATES
            - SPONSORED_INMAILS
            - DYNAMIC
          description: Campaign type
        status:
          default: DRAFT
          description: Initial status
          type: string
          enum:
            - ACTIVE
            - DRAFT
            - PAUSED
        objective_type:
          type: string
          enum:
            - BRAND_AWARENESS
            - ENGAGEMENT
            - JOB_APPLICANT
            - LEAD_GENERATION
            - WEBSITE_CONVERSION
            - WEBSITE_VISIT
            - VIDEO_VIEW
          description: Campaign objective
        cost_type:
          type: string
          enum:
            - CPM
            - CPC
            - CPV
          description: >-
            Cost/billing type. Constrained by optimization_target_type — see
            that field.
        daily_budget_amount:
          description: Daily budget amount (e.g. "50.00")
          type: string
        daily_budget_currency:
          description: ISO currency code for daily budget
          type: string
        total_budget_amount:
          description: Total budget amount (e.g. "1000.00")
          type: string
        total_budget_currency:
          description: ISO currency code for total budget
          type: string
        unit_cost_amount:
          description: Bid amount (e.g. "5.00"). Omit unless bidding manually.
          type: string
        unit_cost_currency:
          description: ISO currency code for bid. Defaults to USD when a bid is set.
          type: string
        optimization_target_type:
          description: >-
            Optimization target. This is what selects the bidding mode:
            NONE/ENHANCED_CONVERSION keep manual bidding, MAX_* activate
            auto-bidding, TARGET_COST_PER_* activate target-cost bidding
            (cost_type must be CPC/CPM/CPV respectively),
            CAP_COST_AND_MAXIMIZE_* activate cost-cap bidding (cost_type must be
            CPM).
          type: string
          enum:
            - NONE
            - ENHANCED_CONVERSION
            - MAX_IMPRESSION
            - MAX_CLICK
            - MAX_CONVERSION
            - MAX_VIDEO_VIEW
            - MAX_LEAD
            - MAX_QUALIFIED_LEAD
            - MAX_REACH
            - TARGET_COST_PER_CLICK
            - TARGET_COST_PER_IMPRESSION
            - TARGET_COST_PER_VIDEO_VIEW
            - CAP_COST_AND_MAXIMIZE_CLICKS
            - CAP_COST_AND_MAXIMIZE_IMPRESSIONS
            - CAP_COST_AND_MAXIMIZE_VIDEO_VIEWS
            - CAP_COST_AND_MAXIMIZE_LEADS
        locale_country:
          default: US
          description: ISO-3166 2-letter country code (uppercase)
          type: string
        locale_language:
          default: en
          description: ISO-639 2-letter language code (lowercase)
          type: string
        offsite_delivery_enabled:
          default: false
          description: Enable LinkedIn Audience Network delivery
          type: boolean
        audience_expansion_enabled:
          description: Enable audience expansion
          type: boolean
        run_schedule_start:
          description: >-
            Start date as epoch milliseconds. Required by LinkedIn; omit it to
            start now rather than computing a timestamp. A start date in the
            future puts the campaign on CAMPAIGN_START_DATE_HOLD and Campaign
            Manager filters it out of the default view — it will look like it
            was never created (measured 2026-08-05).
          type: number
        run_schedule_end:
          description: End date as epoch milliseconds
          type: number
        political_intent:
          type: string
          enum:
            - POLITICAL
            - NOT_POLITICAL
            - NOT_DECLARED
          description: >-
            Whether the campaign is political advertising under EU law. Required
            by LinkedIn. Ask the client rather than assuming; send NOT_DECLARED
            if unknown.
        creative_selection:
          description: 'Creative selection strategy (default: OPTIMIZED)'
          type: string
          enum:
            - ROUND_ROBIN
            - OPTIMIZED
        format:
          description: >-
            Campaign format. Measured valid: STANDARD_UPDATE, CAROUSEL,
            SINGLE_VIDEO, TEXT_AD, SPOTLIGHT, FOLLOW_COMPANY, SPONSORED_MESSAGE,
            SPONSORED_INMAIL, JOBS, SPONSORED_UPDATE_NATIVE_DOCUMENT,
            SPONSORED_UPDATE_EVENT. Campaign Manager names these differently
            from the API, so translate the user's words first: "Single
            image"=STANDARD_UPDATE, "Carousel image"=CAROUSEL,
            "Video"=SINGLE_VIDEO, "Text"=TEXT_AD, "Spotlight"=SPOTLIGHT,
            "Follower"=FOLLOW_COMPANY,
            "Document"=SPONSORED_UPDATE_NATIVE_DOCUMENT,
            "Event"=SPONSORED_UPDATE_EVENT, "Conversation"=SPONSORED_MESSAGE and
            "Message"=SPONSORED_INMAIL (those last two are corroborated by how
            advertisers named 51 real campaigns, not proved by the API — say so
            if the user's choice depends on it). "Jobs"/"Single job" both
            plausibly map to JOBS and nothing separates them; "Article and
            newsletter" has no known symbol — ask the user rather than guessing,
            since every guessed spelling so far was rejected. The list is
            measured-complete, not complete: a campaign can even come back with
            format="$UNKNOWN", LinkedIn's placeholder for a symbol its own
            schema lacks. The format must also be consistent with the campaign
            `type`: LinkedIn refuses the mismatch with
            INVALID_PLACEMENT_SELECTION, naming both (measured for
            SPONSORED_INMAIL under type=SPONSORED_UPDATES, which needs
            type=SPONSORED_INMAILS). Campaign Manager only offers certain
            format/objective_type pairs (VIDEO_VIEW shows SINGLE_VIDEO alone);
            the others are accepted at create but may not deliver, so they are
            flagged as a warning rather than refused.
          type: string
          minLength: 1
        associated_entity:
          description: >-
            URN of associated entity (e.g. company page). Required for Sponsored
            Content.
          type: string
        targeting_criteria:
          description: >-
            Who the campaign targets. Keys are FACET URNs, not bare names:
            {"include":{"and":[{"or":{"urn:li:adTargetingFacet:locations":["urn:li:geo:105015875"]}}]}}.
            Get URNs from search_targeting_facets, and segment URNs from
            list_ad_segments. Omitting this creates a campaign with NO audience
            that cannot reach anyone; update_linkedin_campaign can add one
            afterwards, so this is recoverable, but a campaign left this way
            reaches nobody.
          type: object
          properties:
            include:
              type: object
              properties:
                and:
                  type: array
                  items:
                    type: object
                    properties:
                      or:
                        type: object
                        propertyNames:
                          type: string
                        additionalProperties:
                          type: array
                          items:
                            type: string
                    required:
                      - or
              required:
                - and
            exclude:
              type: object
              properties:
                or:
                  type: object
                  propertyNames:
                    type: string
                  additionalProperties:
                    type: array
                    items:
                      type: string
              required:
                - or
          required:
            - include
      required:
        - campaign_group_id
        - name
        - type
        - objective_type
        - cost_type
        - political_intent
      $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.

````