Menu

API reference · Ads Visualizer

LinkedIn Ads

ads_visualizer · linkedin_ads · 5 operations

GET/v1/ads-visualizer/linkedin-ads/accounts/{account_id}/campaigns

List the LinkedIn Ads campaigns of a connected account

ads_visualizer.linkedin_ads.campaigns.list

ReadIdempotentSince 2026-11-01

Lists the campaigns of a LinkedIn Ads account connected to the organization: account_id is the ad account id from ads_visualizer.accounts.list (digits, or its urn:li:sponsoredAccount URN). Only enabled and paused campaigns exist here (removed, archived or deleted ones never come); filter with status (enabled, paused, all by default) and search (part of the name or the exact id). Each campaign has id, name, status, state (the Delivery column of the ads managers: active, paused, finished or scheduled), start_at/end_at (its run schedule, epoch ms; end_at null = no end date) and delivery_state, derived from those dates when the request runs. LinkedIn has no ad groups: the creatives hang from the campaign (ads_visualizer.linkedin_ads.ads.list). It does not return metrics: use ads_visualizer.linkedin_ads.metrics.get or ads_visualizer.linkedin_ads.delivery.get. Sorted by name. Paginated by cursor (limit up to 200; follow next_cursor while has_more is true). Read live from LinkedIn Ads (the same data as the Ads Visualizer screen, cached for 5 minutes): it can take a few seconds and counts one unit of the organization's external quota for LinkedIn Ads. Requires view access to the Ads Visualizer. Errors: 404 external_account_not_linked (the account is not connected to this organization); 409 integration_not_connected, integration_reconnect_required (reconnect it in Settings → Integrations; details.reason says why) or external_rejected (details.provider_code and details.provider_message have the platform's own code and words); 429 external_rate_limited and 503 external_unavailable (retry after Retry-After). Through the API and the MCP it depends on the terms of LinkedIn: where they do not allow it, it answers 403 platform_terms_restricted (the permissions guide lists what each platform allows).

Instructions for agents

Report state as the campaign's status: an enabled campaign past its end date reads finished, and paused wins over everything.

Scope
ads_visualizer:read
Permission
View the module
MCP tool
ads_visualizer_linkedin_ads_campaigns_listOn the full surface; on the compact one, mb_execute_operation with id: "ads_visualizer.linkedin_ads.campaigns.list".

Declared cost: up to 4 reads and 0 writes per call (they count against the daily quota). Touches an external platform (linkedin): it counts against the external operations quota.

Parameters

account_idstringpathrequired

The LinkedIn Ads account: the LinkedIn ad account id (digits, or its urn:li:sponsoredAccount URN). It must be connected to the organization (ads_visualizer.accounts.list).

statusenumqueryoptional

enabled (or active, the same), paused or all (both; the default). Removed, archived and deleted items never come.

Values: all, enabled, paused, active · Default: "all"

searchstringqueryoptional

Part of the name (case-insensitive) or the exact id.

limitintegerqueryoptional

Page size, 1 to 200 (default 50).

Default: 50

cursorstringqueryoptional

next_cursor of the previous page, with the same filters.

Response

dataarray<object>
has_moreboolean
next_cursorstring

Errors

Example

curl "https://api.mb-suite.com/v1/ads-visualizer/linkedin-ads/accounts/{account_id}/campaigns" \
  -H "Authorization: Bearer $MB_API_KEY"

Try it with your test API key

With a test API key the request always goes to your practice organization: example data you can reset. In the practice organization this operation is not simulated (it reaches another platform): it answers 409 sandbox_external_unavailable.

GET/v1/ads-visualizer/linkedin-ads/accounts/{account_id}/campaigns/{campaign_id}

Get the configuration of a LinkedIn Ads campaign

ads_visualizer.linkedin_ads.campaigns.get

ReadIdempotentSince 2026-11-01

Returns how a LinkedIn Ads campaign of an account connected to the organization is set up (cached for 5 minutes): type (SPONSORED_UPDATES, TEXT_AD…), cost_type (CPC, CPM), format and objective_type. campaign_id is the id from ads_visualizer.linkedin_ads.campaigns.list, and it must be a campaign of that account (LinkedIn answers with its own error otherwise). It does not return metrics or budget pacing: use dashboards.data.query or ads_visualizer.linkedin_ads.metrics.get. account_id is the ad account id from ads_visualizer.accounts.list (digits, or its urn:li:sponsoredAccount URN). Read live from LinkedIn Ads (the same data as the Ads Visualizer screen, cached for 5 minutes): it can take a few seconds and counts one unit of the organization's external quota for LinkedIn Ads. Requires view access to the Ads Visualizer. Errors: 404 external_account_not_linked (the account is not connected to this organization); 409 integration_not_connected, integration_reconnect_required (reconnect it in Settings → Integrations; details.reason says why) or external_rejected (details.provider_code and details.provider_message have the platform's own code and words); 429 external_rate_limited and 503 external_unavailable (retry after Retry-After). Through the API and the MCP it depends on the terms of LinkedIn: where they do not allow it, it answers 403 platform_terms_restricted (the permissions guide lists what each platform allows).

Scope
ads_visualizer:read
Permission
View the module
MCP tool
ads_visualizer_linkedin_ads_campaigns_getOn the full surface; on the compact one, mb_execute_operation with id: "ads_visualizer.linkedin_ads.campaigns.get".

Declared cost: up to 4 reads and 0 writes per call (they count against the daily quota). Touches an external platform (linkedin): it counts against the external operations quota.

Parameters

account_idstringpathrequired

The ad account, as ads_visualizer.accounts.list gives it (it must be connected to the organization).

campaign_idstringpathrequired

The campaign (id from the campaigns.list operation of the same platform).

Response

platformenum

Values: google_ads, meta_ads, tiktok_ads, linkedin_ads

campaign_typestring
bidding_strategystring
network_settingsobject
geo_targetsarray<string>
languagesarray<string>
buying_typestring
special_ad_categoriesarray<string>
optimization_goalstring
bid_strategystring
budget_optimize_onboolean
objective_typestring
typestring
cost_typestring
formatstring
statusstring

enabled, paused, archived, removed or draft, the vocabulary of the lists (another platform state comes in lowercase); platform_status has the platform's own value.

platform_statusstring

The status as the platform names it (ENABLED, CAMPAIGN_STATUS_DISABLE…).

account_idstring

The ad account it belongs to.

Errors

Example

curl "https://api.mb-suite.com/v1/ads-visualizer/linkedin-ads/accounts/{account_id}/campaigns/{campaign_id}" \
  -H "Authorization: Bearer $MB_API_KEY"

Try it with your test API key

With a test API key the request always goes to your practice organization: example data you can reset. In the practice organization this operation is not simulated (it reaches another platform): it answers 409 sandbox_external_unavailable.

GET/v1/ads-visualizer/linkedin-ads/accounts/{account_id}/campaigns/{campaign_id}/ads

List the creatives of a LinkedIn Ads campaign

ads_visualizer.linkedin_ads.ads.list

ReadIdempotentSince 2026-11-01

Lists the creatives of one campaign of a LinkedIn Ads account connected to the organization (LinkedIn has no ad groups: campaign_id from ads_visualizer.linkedin_ads.campaigns.list; each creative's ad_group_id is its campaign). preview (kind linkedin) carries ad_type (SPONSORED_CONTENT, MESSAGE_AD, CONVERSATION_AD, TEXT_AD, SPOTLIGHT_AD, FOLLOWER_AD), headline, body, image_url, is_video and video_url, cta_type, destination_url, company_name and company_logo_url and, for message and conversation ads, sender_name, sender_photo_url, subject and cta_options. At most 100 creatives per campaign; filter with status and search; sorted by name. account_id: the ad account id from ads_visualizer.accounts.list (digits, or its urn:li:sponsoredAccount URN). Paginated by cursor (limit up to 200; follow next_cursor while has_more is true). Read live from LinkedIn Ads (the same data as the Ads Visualizer screen, cached for 5 minutes): it can take a few seconds and counts one unit of the organization's external quota for LinkedIn Ads. Requires view access to the Ads Visualizer. Errors: 404 external_account_not_linked (the account is not connected to this organization); 409 integration_not_connected, integration_reconnect_required (reconnect it in Settings → Integrations; details.reason says why) or external_rejected (details.provider_code and details.provider_message have the platform's own code and words); 429 external_rate_limited and 503 external_unavailable (retry after Retry-After). Through the API and the MCP it depends on the terms of LinkedIn: where they do not allow it, it answers 403 platform_terms_restricted (the permissions guide lists what each platform allows).

Scope
ads_visualizer:read
Permission
View the module
MCP tool
ads_visualizer_linkedin_ads_ads_listOn the full surface; on the compact one, mb_execute_operation with id: "ads_visualizer.linkedin_ads.ads.list".

Declared cost: up to 4 reads and 0 writes per call (they count against the daily quota). Touches an external platform (linkedin): it counts against the external operations quota.

Parameters

account_idstringpathrequired

The LinkedIn Ads account: the LinkedIn ad account id (digits, or its urn:li:sponsoredAccount URN). It must be connected to the organization (ads_visualizer.accounts.list).

campaign_idstringpathrequired

The campaign (id from ads_visualizer.linkedin_ads.campaigns.list).

statusenumqueryoptional

enabled (or active, the same), paused or all (both; the default). Removed, archived and deleted items never come.

Values: all, enabled, paused, active · Default: "all"

searchstringqueryoptional

Part of the name (case-insensitive) or the exact id.

limitintegerqueryoptional

Page size, 1 to 200 (default 50).

Default: 50

cursorstringqueryoptional

next_cursor of the previous page, with the same filters.

Response

dataarray<object>
has_moreboolean
next_cursorstring

Errors

Example

curl "https://api.mb-suite.com/v1/ads-visualizer/linkedin-ads/accounts/{account_id}/campaigns/{campaign_id}/ads" \
  -H "Authorization: Bearer $MB_API_KEY"

Try it with your test API key

With a test API key the request always goes to your practice organization: example data you can reset. In the practice organization this operation is not simulated (it reaches another platform): it answers 409 sandbox_external_unavailable.

GET/v1/ads-visualizer/linkedin-ads/accounts/{account_id}/campaigns/{campaign_id}/metrics

Get the performance of each creative of a LinkedIn Ads campaign

ads_visualizer.linkedin_ads.metrics.get

ReadIdempotentSince 2026-11-01

Returns the performance of each creative of one campaign of a LinkedIn Ads account connected to the organization: impressions, clicks, ctr (in %), cost, cpc and cpm (in the account's currency, returned in currency), conversions (website conversions), cost_per_conversion, conversion_rate, leads (Lead Gen form submissions), cost_per_lead and social_actions (likes + comments + shares). The campaign must be an active or paused campaign of that account (404 ad_campaign_not_found otherwise): LinkedIn reports by campaign, so MB Suite first confirms the campaign belongs to the account. Sorted by cost, highest first. Range: start_date and end_date (YYYY-MM-DD, together, at most 400 days) or period 7d, 14d or 30d (default 30d), complete days ending yesterday in the organization's reporting time zone; the response has the exact dates. Ads without impressions in the range are left out (an empty data means it did not deliver). account_id: the ad account id from ads_visualizer.accounts.list (digits, or its urn:li:sponsoredAccount URN). Read live from LinkedIn Ads (the same data as the Ads Visualizer screen, cached for 5 minutes): it can take a few seconds and counts two units (the campaign check and the report) of the organization's external quota for LinkedIn Ads. Requires view access to the Ads Visualizer. Errors: 404 external_account_not_linked (the account is not connected to this organization); 409 integration_not_connected, integration_reconnect_required (reconnect it in Settings → Integrations; details.reason says why) or external_rejected (details.provider_code and details.provider_message have the platform's own code and words); 429 external_rate_limited and 503 external_unavailable (retry after Retry-After). Through the API and the MCP it depends on the terms of LinkedIn: where they do not allow it, it answers 403 platform_terms_restricted (the permissions guide lists what each platform allows).

Instructions for agents

Costs are in the account's currency (the currency field): name it. An ad missing from data had no impressions in the range.

Scope
ads_visualizer:read
Permission
View the module
MCP tool
ads_visualizer_linkedin_ads_metrics_getOn the full surface; on the compact one, mb_execute_operation with id: "ads_visualizer.linkedin_ads.metrics.get".

Declared cost: up to 4 reads and 0 writes per call (they count against the daily quota). Touches an external platform (linkedin): it counts against the external operations quota.

Parameters

account_idstringpathrequired

The LinkedIn Ads account: the LinkedIn ad account id (digits, or its urn:li:sponsoredAccount URN). It must be connected to the organization (ads_visualizer.accounts.list).

campaign_idstringpathrequired

The campaign (id from ads_visualizer.linkedin_ads.campaigns.list).

periodenumqueryoptional

7d, 14d or 30d (default): that many complete days ending yesterday. Ignored when start_date and end_date come.

Values: 7d, 14d, 30d · Default: "30d"

start_datestringqueryoptional

First day of the range (YYYY-MM-DD, in the account's time zone). Send it with end_date.

end_datestringqueryoptional

Last day of the range (YYYY-MM-DD, included). At most 400 days after start_date.

Response

platformenum

Ad platform.

Values: google_ads, meta_ads, tiktok_ads, linkedin_ads

account_idstring

The ad account.

ad_group_idstring | null

The ad group measured (Google, Meta, TikTok); null in LinkedIn.

campaign_idstring | null

The campaign measured (LinkedIn); null in the others, where the ad group says which.

start_datestring

First day (YYYY-MM-DD).

end_datestring

Last day (YYYY-MM-DD, included).

currencystring | null

Currency of the amounts.

dataarray<object>

One row per ad, by spend (highest first).

Errors

Example

curl "https://api.mb-suite.com/v1/ads-visualizer/linkedin-ads/accounts/{account_id}/campaigns/{campaign_id}/metrics" \
  -H "Authorization: Bearer $MB_API_KEY"

Try it with your test API key

With a test API key the request always goes to your practice organization: example data you can reset. In the practice organization this operation is not simulated (it reaches another platform): it answers 409 sandbox_external_unavailable.

GET/v1/ads-visualizer/linkedin-ads/accounts/{account_id}/delivery

Get the impressions of the last 7 days of each LinkedIn Ads campaign

ads_visualizer.linkedin_ads.delivery.get

ReadIdempotentSince 2026-11-01

Returns the impressions of the last 7 days of each campaign of a LinkedIn Ads account connected to the organization that delivered in that window (campaigns with no impressions are left out), in one request: account_id is the ad account id from ads_visualizer.accounts.list (digits, or its urn:li:sponsoredAccount URN). It is the "only delivering" filter of the ads managers: a campaign can be enabled and within its dates and still not deliver (paused groups, no budget, rejected ads). The window is LinkedIn Ads's own last 7 days. Sorted by impressions, highest first. Read live from LinkedIn Ads (the same data as the Ads Visualizer screen, cached for 5 minutes): it can take a few seconds and counts one unit of the organization's external quota for LinkedIn Ads. Requires view access to the Ads Visualizer. Errors: 404 external_account_not_linked (the account is not connected to this organization); 409 integration_not_connected, integration_reconnect_required (reconnect it in Settings → Integrations; details.reason says why) or external_rejected (details.provider_code and details.provider_message have the platform's own code and words); 429 external_rate_limited and 503 external_unavailable (retry after Retry-After). Through the API and the MCP it depends on the terms of LinkedIn: where they do not allow it, it answers 403 platform_terms_restricted (the permissions guide lists what each platform allows).

Scope
ads_visualizer:read
Permission
View the module
MCP tool
ads_visualizer_linkedin_ads_delivery_getOn the full surface; on the compact one, mb_execute_operation with id: "ads_visualizer.linkedin_ads.delivery.get".

Declared cost: up to 4 reads and 0 writes per call (they count against the daily quota). Touches an external platform (linkedin): it counts against the external operations quota.

Parameters

account_idstringpathrequired

The LinkedIn Ads account: the LinkedIn ad account id (digits, or its urn:li:sponsoredAccount URN). It must be connected to the organization (ads_visualizer.accounts.list).

Response

platformenum

Ad platform.

Values: google_ads, meta_ads, tiktok_ads, linkedin_ads

account_idstring

The ad account.

window"last_7_days"

The window measured.

dataarray<object>

Only the campaigns with impressions, highest first.

Errors

Example

curl "https://api.mb-suite.com/v1/ads-visualizer/linkedin-ads/accounts/{account_id}/delivery" \
  -H "Authorization: Bearer $MB_API_KEY"

Try it with your test API key

With a test API key the request always goes to your practice organization: example data you can reset. In the practice organization this operation is not simulated (it reaches another platform): it answers 409 sandbox_external_unavailable.