---
title: "Add a creative (ad) to a LinkedIn campaign (ad set)"
method: POST
path: "/api/v1/tools/linkedin_add_creative/execute"
tags: ["LinkedIn Ads"]
---

# Add a creative (ad) to a LinkedIn campaign (ad set)

`POST /api/v1/tools/linkedin_add_creative/execute`

## Request

- Base URL: `https://adako.ai`
- URL: `https://adako.ai/api/v1/tools/linkedin_add_creative/execute`
- Auth: HTTP bearer

Adds one more creative (an ad in Campaign Manager) to an existing campaign (ad set) — either from a new image URL (uploaded and posted as a dark post) or from a post URN that already exists. LinkedIn refuses a paused creative before its review, so inside a campaign that is not live it is created ACTIVE (reviewed now, held back by the campaign) and inside a campaign that is already ACTIVE it is created DRAFT.
Use when: adding a variant to test against the current ad, or finishing a campaign whose create chain failed partway. This is the tool that repairs a campaign with no ad in it; do not re-run the create tool for that.
Do not add a fifth variant to a campaign: LinkedIn's delivery optimisation splits budget across creatives and beyond three or four none of them gets enough impressions to prove anything.
Do not add a creative whose image has not been checked — a failed upload here wastes a task and leaves nothing useful behind.
Do not use it on a LEAD_GENERATION campaign: every ad there needs a Lead Gen Form this server cannot attach, so it is refused; add those ads in Campaign Manager.
Returns the creative read back with its review status. A DRAFT creative serves nothing until the user approves linkedin_resume_creative; an ACTIVE one serves once its campaign is resumed and LinkedIn approves it.

## Headers

- `Idempotency-Key` string

## Request body

- object
  - `arguments` object, required
    - `ad_account_id` string: LinkedIn ad account id — the numeric id from Campaign Manager, as a string ("506699162"). Omit it to use the primary account; pass it when the user manages several.
    - `campaign_id` string, required: The campaign to add the creative to. LinkedIn ids are numeric strings; a full urn:li:… value is also accepted.
    - `post_urn` string: An existing post (urn:li:share:… or urn:li:ugcPost:…) to sponsor. Use this or image_url.
    - `organization_urn` string: Company page that authors the new post. Required when image_url is used.
    - `image_url` string, uri: A new creative image. Adako hosts no files: the platform downloads this URL itself, from its own servers and often hours later, so it must be a public link straight to the file — not a file on the computer, not a Drive, Dropbox or design-tool share page, not a link that expires or asks for a login. Call check_media first: it repairs the usual share links, checks the file against this platform, and says where to put a file that has no link yet.
    - `headline` string: Headline for the new image.
    - `commentary` string: Post text above the new image. Sent as plain text: #hashtags and @mentions are not linked.
    - `landing_page_url` string, uri: Where the new creative sends people.
    - `name` string: A name for the creative, for your own reference.
    - `idempotency_key` string: Optional caller-supplied key; identical keys never execute twice.
    - `raw_data` boolean: Return compact JSON only (no markdown). Use when you will compute on the result.

## Response `200`

The tool ran. A write returns proposal_id and approve_url while the change waits for approval.

- SuccessEnvelope
  - `success` unknown, required
  - `tool` string, required
  - `data` object, required: Machine-readable result.
  - `markdown` string, required: The same result written for a person or a model.
  - `quota` Quota: Task usage for the current billing period.
    - `plan` string
    - `used` integer
    - `limit` integer
    - `period_end` string
    - `upgrade_url` string
  - `proposal_id` string: Present for writes. Nothing changes on the ad platform until it is approved.
  - `approve_url` string: Where a person approves the proposal.
  - `request_id` string, required

## Other responses

- `400`: Invalid arguments, or the ad account could not be resolved.
- `401`: Missing, invalid, revoked or expired API key.
- `402`: Monthly task quota used up, or the plan does not include this tool.
- `403`: The connected ad account lacks the access level this tool needs.
- `404`: Unknown tool name.
- `409`: Not connected, reconnect needed, confirmation required, a proposal already pending or no longer pending, an identical create that failed earlier today (proposal_failed_before), a create that duplicates an approved one (duplicate_create), the ad-account limit of the plan reached (account_limit), or an Idempotency-Key reused with different arguments.
- `429`: Rate limited by Adako or by the ad platform. See Retry-After.
- `500`: Unexpected error inside Adako.
- `502`: The ad platform returned an error.

---

[API](https://skmtc.dev/adako/apis/adako-rest-api.md) · [All operations](https://skmtc.dev/adako/apis/adako-rest-api/llms.txt) · [OpenAPI document](https://skmtc.dev/adako/apis/adako-rest-api/revisions/59ee60d48a56?raw)
