# Campaigns

9 LinkedIn Ads tools, each with its inputs, hosted support and CLI command.

LinkedIn's editor ignores post edits on a live ad, so to change copy you recreate it: `delete_ad` plus `create_image_ad`.

## create_campaign_group

Create the LinkedIn campaign group and campaign (the ad group), as drafts.

Create a campaign group (the top-level 'campaign'). Defaults to DRAFT.

LinkedIn Ads. Hosted.

Runs as part of:

```
adwarp launch --brief <brief.json>
```

| Input | Type | What it is |
| --- | --- | --- |
| `accountId` (required) | string | Numeric ad account id (no urn prefix) |
| `name` (required) | string |  |
| `status` | DRAFT \| ACTIVE \| PAUSED \| ARCHIVED |  |
| `totalBudget` | object |  |
| `runSchedule` | object |  |

## create_campaign

Create the LinkedIn campaign group and campaign (the ad group), as drafts.

Create a campaign (the 'ad group') with targeting, budget, bid or bidding strategy (optimizationTargetType MAX_CLICK = Maximum Delivery on landing page clicks), schedule, and optional ad rotation (creativeSelection: OPTIMIZED or ROUND_ROBIN = rotate ads evenly). Defaults to DRAFT.

LinkedIn Ads. Hosted.

Runs as part of:

```
adwarp launch --brief <brief.json>
```

| Input | Type | What it is |
| --- | --- | --- |
| `accountId` (required) | string |  |
| `campaignGroupId` (required) | string | Numeric campaign group id |
| `name` (required) | string |  |
| `type` | SPONSORED_UPDATES \| TEXT_AD \| SPONSORED_INMAILS |  |
| `objectiveType` | BRAND_AWARENESS \| ENGAGEMENT \| JOB_APPLICANT \| LEAD_GENERATION \| VIDEO_VIEW \| WEBSITE_CONVERSION \| WEBSITE_VISIT | Campaign objective. Required to be ENGAGEMENT to sponsor another member's post (thought-leader ads). |
| `costType` | CPC \| CPM \| CPV |  |
| `dailyBudget` | object |  |
| `totalBudget` | same as dailyBudget |  |
| `unitCost` | same as dailyBudget | Bid amount |
| `optimizationTargetType` | NONE \| MAX_CLICK \| MAX_IMPRESSION \| MAX_CONVERSION \| MAX_LEAD \| MAX_VIDEO_VIEW \| MAX_REACH \| TARGET_COST_PER_CLICK \| TARGET_COST_PER_IMPRESSION \| TARGET_COST_PER_VIDEO_VIEW \| ENHANCED_CONVERSION | Bidding strategy. MAX_CLICK = Maximum Delivery optimized for landing page clicks (automated bid, charged CPM, unitCost ignored). Omit or NONE for a manual bid. |
| `locale` | object |  |
| `runSchedule` (required) | object |  |
| `status` | DRAFT \| ACTIVE \| PAUSED \| ARCHIVED |  |
| `creativeSelection` | OPTIMIZED \| ROUND_ROBIN | Ad rotation: OPTIMIZED (LinkedIn default, favors the predicted winner) or ROUND_ROBIN (rotate ads evenly) |
| `targetingCriteria` | object |  |
| `targeting` | object |  |
| `audienceSegmentUrn` | string | urn:li:adSegment:... to target a matched audience |
| `geoUrns` | string[] | urn:li:geo:... locations to include |
| `politicalIntent` | NOT_POLITICAL \| POLITICAL \| NOT_DECLARED |  |
| `conversionIds` | string[] |  |
| `applyDefaultExclusions` | boolean |  |
| `applyDefaultConversion` | boolean |  |

## update_campaign

Change an existing campaign (the ad group) in place: targeting, name, status, budget, bid, bidding strategy, schedule, or ad rotation. Pass `dryRun` first to preview the patch.

Update an existing campaign (the 'ad group') in place: change its targeting and/or name, status, budget, bid, bidding strategy (optimizationTargetType, costType), schedule, ad rotation (creativeSelection: OPTIMIZED or ROUND_ROBIN = rotate ads evenly). Only the fields you pass change. Targeting is REPLACED when you pass any targeting form: a structured `targeting` spec, the `audienceSegmentUrn` (+ optional `geoUrns`) shorthand, or a raw `targetingCriteria`, and default exclusions are re-applied unless applyDefaultExclusions=false. Audience Expansion / Audience Network stay off. Pass dryRun=true first to preview the patch before touching a live campaign.

LinkedIn Ads. Hosted.

CLI:

```
adwarp campaigns update <campaignId> ... [--apply]
```

| Input | Type | What it is |
| --- | --- | --- |
| `accountId` (required) | string |  |
| `campaignId` (required) | string | Numeric campaign (ad group) id to update |
| `targetingCriteria` | object |  |
| `targeting` | object |  |
| `audienceSegmentUrn` | string | urn:li:adSegment:... (or bare id) matched audience to target, which replaces existing targeting |
| `geoUrns` | string[] | urn:li:geo:... locations to include alongside the audience |
| `applyDefaultExclusions` | boolean |  |
| `name` | string |  |
| `status` | DRAFT \| ACTIVE \| PAUSED \| ARCHIVED |  |
| `dailyBudget` | object |  |
| `totalBudget` | same as dailyBudget |  |
| `costType` | CPC \| CPM \| CPV | Change the cost type (CPM for Maximum Delivery) |
| `unitCost` | same as dailyBudget | Bid amount |
| `optimizationTargetType` | NONE \| MAX_CLICK \| MAX_IMPRESSION \| MAX_CONVERSION \| MAX_LEAD \| MAX_VIDEO_VIEW \| MAX_REACH \| TARGET_COST_PER_CLICK \| TARGET_COST_PER_IMPRESSION \| TARGET_COST_PER_VIDEO_VIEW \| ENHANCED_CONVERSION | Bidding strategy. MAX_CLICK = Maximum Delivery optimized for landing page clicks (automated bid, charged CPM, unitCost ignored). Omit or NONE for a manual bid. |
| `runSchedule` | object |  |
| `creativeSelection` | OPTIMIZED \| ROUND_ROBIN | Ad rotation: OPTIMIZED (favors the predicted winner) or ROUND_ROBIN (rotate ads evenly) |
| `dryRun` | boolean |  |

## create_text_ad

Create draft ads.

Create a Text Ad creative (DRAFT by default).

LinkedIn Ads. Hosted.

Runs as part of:

```
adwarp launch --brief <brief.json>
```

| Input | Type | What it is |
| --- | --- | --- |
| `accountId` (required) | string |  |
| `campaignId` (required) | string |  |
| `title` (required) | string |  |
| `text` (required) | string |  |
| `clickUri` (required) | string |  |
| `status` | DRAFT \| ACTIVE \| PAUSED |  |

## create_image_ad

Create draft ads.

Create a single-image Sponsored Content creative (DRAFT). Omit imagePath to leave the campaign ready for an image later.

LinkedIn Ads. Hosted.

Runs as part of:

```
adwarp launch --brief <brief.json>
```

| Input | Type | What it is |
| --- | --- | --- |
| `accountId` (required) | string |  |
| `campaignId` (required) | string |  |
| `organizationUrn` (required) | string | urn:li:organization:... that owns the post |
| `commentary` (required) | string | The post body / ad intro text |
| `clickUri` (required) | string |  |
| `headline` (required) | string |  |
| `callToAction` | LEARN_MORE \| APPLY \| DOWNLOAD \| VIEW_QUOTE \| SIGN_UP \| SUBSCRIBE \| REGISTER \| JOIN \| ATTEND \| REQUEST_DEMO \| SEE_MORE | Call-to-action button label |
| `imagePath` | string |  |
| `name` | string | Ad name shown in Campaign Manager |
| `status` | DRAFT \| ACTIVE \| PAUSED |  |

## list_campaigns

The account structure, campaign groups and their ad groups, with drafts included, unlike reporting, which only shows entities with spend.

List the account structure: campaign groups (campaigns) and/or their campaigns (ad groups), DRAFTS INCLUDED, unlike performance reports, which only show entities with spend. Pass level=groups for campaign groups only, level=campaigns for ad groups (optionally scoped by groupId), or level=both (default) for the full tree.

LinkedIn Ads. Hosted.

CLI:

```
adwarp campaigns list [--group <id>] [--all]
```

| Input | Type | What it is |
| --- | --- | --- |
| `accountId` | string |  |
| `level` | groups \| campaigns \| both |  |
| `groupId` | string | Scope campaigns to one campaign group id |
| `includeArchived` | boolean |  |

## list_ads

The ads in an ad group, drafts included.

List the creatives (ads) in a campaign (ad group), drafts included: id, name, status, and backing post urn.

LinkedIn Ads. Hosted.

CLI:

```
adwarp ad list <campaignId>
```

| Input | Type | What it is |
| --- | --- | --- |
| `accountId` | string |  |
| `campaignId` (required) | string |  |

## delete_ad

Removes the creative and, best effort, its Direct Sponsored Content post.

Delete an ad: removes the creative and (best-effort) the Direct Sponsored Content post behind it. Accepts a numeric creative id or a full urn:li:sponsoredCreative URN. Use for cleaning up drafts or replacing an ad whose copy must change (Campaign Manager's editor does not reflect post edits, so recreate instead).

LinkedIn Ads. Hosted.

CLI:

```
adwarp ad delete <creativeId>
```

| Input | Type | What it is |
| --- | --- | --- |
| `accountId` | string |  |
| `creativeId` (required) | string |  |

## update_ad

Pauses, resumes, or archives a single ad by setting its `status` to `PAUSED`, `ACTIVE`, or `ARCHIVED`, without touching the rest of its ad group. Setting `ACTIVE` starts spend, so the assistant sets it only when you explicitly ask. An `ACTIVE` ad serves only while its ad group is active, and LinkedIn refuses to pause an ad that is still in review. Pass `dryRun` first to preview the patch.

Change a single ad's (creative's) status in place: PAUSED stops it serving, ACTIVE starts it serving, ARCHIVED retires it. Use PAUSED to stop an ad without touching the rest of its ad group. Accepts a numeric creative id or a full urn:li:sponsoredCreative URN. Setting ACTIVE starts spend, so set it only when the user explicitly asks to turn the ad on, never as a side effect of another request. An ACTIVE ad still only serves while its campaign (ad group) is ACTIVE. LinkedIn refuses to pause an ad that is still in review. Pass dryRun=true to preview the patch without sending it.

LinkedIn Ads. Hosted.

CLI:

```
adwarp ad pause <creativeId> [--apply]
adwarp ad resume <creativeId> [--apply]
adwarp ad archive <creativeId> [--apply]
```

| Input | Type | What it is |
| --- | --- | --- |
| `accountId` | string | Numeric ad account id; defaults to the configured account |
| `creativeId` (required) | string | Numeric creative (ad) id or a full urn:li:sponsoredCreative URN |
| `status` (required) | ACTIVE \| PAUSED \| ARCHIVED | PAUSED stops the ad serving. ACTIVE starts it serving and spending: set it only when the user explicitly asks. ARCHIVED retires it. |
| `dryRun` | boolean | Return the patch without sending it |

Canonical page: https://adwarp.dev/docs/tools/campaigns
Last updated: 2026-10-18
