---
title: "Edit a LinkedIn campaign (ad set)"
method: POST
path: "/api/v1/tools/linkedin_update_campaign/execute"
tags: ["LinkedIn Ads"]
---

# Edit a LinkedIn campaign (ad set)

`POST /api/v1/tools/linkedin_update_campaign/execute`

## Request

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

Changes the name, daily or lifetime budget, bid, run dates, targeting or delivery settings of a campaign (an ad set in Campaign Manager). Targeting is **merged**, never replaced: facets you do not mention are left exactly as they are.
Use when: the user has named a specific change. Read the campaign first with linkedin_list_campaigns so you are changing what is actually there.
Do not use it to pause or resume — linkedin_pause_campaign and linkedin_resume_campaign exist so the risk of that change is stated properly before approval.
Do not add targeting without resolving URNs through linkedin_search_targeting; free text is refused. After any targeting change, re-check the audience with linkedin_estimate_audience_size — a merge can push it under the platform minimum or make it far broader than intended.
Do not double a budget casually: LinkedIn re-enters a learning phase after a large change and costs rise for a few days first. If the user says "increase the budget" without a number, ask.
Do not set a bid on a campaign that bids automatically without saying so: it switches the campaign to manual bidding, and the preview refuses until cost_type says whether the bid is per click or per 1,000 impressions — ask the user.
Returns the campaign read back from LinkedIn, so the new values are confirmed rather than assumed. The objective, type and format of an existing campaign cannot be changed at all — that needs a new campaign.

## 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 edit. LinkedIn ids are numeric strings; a full urn:li:… value is also accepted.
    - `name` string: New campaign name.
    - `daily_budget` number: New daily budget, a decimal in the account currency.
    - `total_budget` number: New lifetime ceiling for this campaign.
    - `bid` number: New manual bid, a decimal in the account currency, billed the way the campaign already is. On a campaign using LinkedIn's automated bidding this switches it to manual bidding and needs cost_type.
    - `cost_type` 'CPM' | 'CPC' | 'CPV': How the new bid is billed: CPC per click, CPM per 1,000 impressions, CPV per video view. Only with bid. Required when the campaign bids automatically today — ask the user, never guess.
    - `start_date` string: New start date, YYYY-MM-DD. Leave it out to keep the current start exactly as it is.
    - `end_date` string: New end date, YYYY-MM-DD. Changing only this keeps the current start untouched.
    - `add_targeting` object: Entity URNs to ADD to the existing targeting.
      - `locations` string[]
      - `titles` string[]
      - `industries` string[]
      - `seniorities` string[]
      - `staffCountRanges` string[]
      - `skills` string[]
      - `interests` string[]
      - `memberBehaviors` string[]
      - `employers` string[]
      - `degrees` string[]
      - `fieldsOfStudy` string[]
      - `interfaceLocales` string[]
    - `remove_targeting` object: Entity URNs to REMOVE from the existing targeting.
      - `locations` string[]
      - `titles` string[]
      - `industries` string[]
      - `seniorities` string[]
      - `staffCountRanges` string[]
      - `skills` string[]
      - `interests` string[]
      - `memberBehaviors` string[]
      - `employers` string[]
      - `degrees` string[]
      - `fieldsOfStudy` string[]
      - `interfaceLocales` string[]
    - `exclude_targeting` object: Entity URNs to add to the exclusion list.
      - `locations` string[]
      - `titles` string[]
      - `industries` string[]
      - `seniorities` string[]
      - `staffCountRanges` string[]
      - `skills` string[]
      - `interests` string[]
      - `memberBehaviors` string[]
      - `employers` string[]
      - `degrees` string[]
      - `fieldsOfStudy` string[]
      - `interfaceLocales` string[]
    - `audience_expansion` boolean: Turn LinkedIn audience expansion on or off.
    - `audience_network` boolean: Turn off-LinkedIn delivery (LinkedIn Audience Network) on or off. LinkedIn refuses it for text ads, lead generation, and carousels on WEBSITE_VISIT or ENGAGEMENT.
    - `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)
