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

# Upload Image

> Upload an image from a public URL to LinkedIn for use in creatives. Returns the image URN to use in create_creative. The image is also registered in the ad account's media library under `name`, which is where a human finds it afterwards. An uploaded image can never be deleted — only archived — so it is worth naming.



## OpenAPI

````yaml /api-reference/openapi.yaml post /linkedin/mcp#upload_image
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#upload_image:
    post:
      tags:
        - Linkedin
        - Ads
      summary: Upload Image
      description: >-
        Upload an image from a public URL to LinkedIn for use in creatives.
        Returns the image URN to use in create_creative. The image is also
        registered in the ad account's media library under `name`, which is
        where a human finds it afterwards. An uploaded image can never be
        deleted — only archived — so it is worth naming.
      operationId: linkedin_upload_image
      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: upload_image
                    arguments:
                      $ref: '#/components/schemas/linkedin_upload_image_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_upload_image_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
        image_url:
          type: string
          format: uri
          description: >-
            Public HTTPS URL of the image to upload to LinkedIn. Must not
            redirect: the download does not follow 3xx (a redirect could send an
            allowed hostname to an internal address), so pass the final URL.
        name:
          description: >-
            Name the image gets in the ad account's media library, where it can
            later be found and archived. Defaults to the file name from the URL.
            There is no way to DELETE an uploaded image — archiving it is the
            only removal there is, so a recognisable name matters.
          type: string
      required:
        - image_url
      $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.

````