Skip to main content
Glama
Pinterest Ads MCP Server

Pinterest Ads MCP Server

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
PINTEREST_ADS_HOMENoPer-user folder for secrets/, logs/ and an optional .env.~/.pinterest-ads-mcp
PINTEREST_ADS_HOSTNoHTTP bind address.127.0.0.1
PINTEREST_ADS_PORTNoHTTP bind port.8000
PINTEREST_ADS_APP_IDNoYour Pinterest app's ID.
PINTEREST_ADS_DRY_RUNNoSet to true to preview writes without sending them.
PINTEREST_ADS_MAX_BIDNoOptional bid cap in the account currency (not micro-units).
PINTEREST_ADS_SANDBOXNoSet to true to use Pinterest's Sandbox (api-sandbox.pinterest.com).
PINTEREST_ADS_TIMEOUTNoRequest timeout in seconds.30
PINTEREST_ADS_AUDIT_LOGNoAudit log path.~/.pinterest-ads-mcp/logs/audit.jsonl
PINTEREST_ADS_LOG_LEVELNoLog level: DEBUG, INFO, WARNING or ERROR. Logs go to stderr.
PINTEREST_ADS_PAGE_SIZENoList page size (max 250).100
PINTEREST_ADS_READ_ONLYNoSet to true to register only read-only tools.
PINTEREST_ADS_TRANSPORTNoTransport: stdio, streamable-http (served at /mcp), or sse (deprecated).stdio
PINTEREST_ADS_APP_SECRETNoYour Pinterest app's secret key.
PINTEREST_ADS_MAX_BUDGETNoOptional budget cap in the account currency (not micro-units).
PINTEREST_ADS_TOKEN_FILENoRefresh-token file written by the auth command. If you keep the token file somewhere else, set this to its absolute path.~/.pinterest-ads-mcp/secrets/pinterest-ads-token.json
PINTEREST_ADS_TOOL_GROUPSNoComma-separated tool groups: accounts, campaigns, ad_groups, ads, pins, keywords, targeting, conversions, catalogs, analytics, reporting, bulk, request. Unknown names stop the server at startup. Server tools are always on.
PINTEREST_ADS_ACCESS_TOKENNoA fixed access token (e.g. a test or Sandbox token) instead of OAuth; it can't be refreshed.
PINTEREST_ADS_ALLOW_REMOTENoSet to true (or pass --allow-remote) to allow binding HTTP to a non-local address. There is no sign-in; only use behind your own authenticating proxy.
PINTEREST_ADS_AD_ACCOUNT_IDNoDefault Pinterest ad account ID.
PINTEREST_ADS_REFRESH_TOKENNoThe refresh token itself, instead of the token file. The token file is better because renewed tokens are saved there.
PINTEREST_ADS_BULK_THRESHOLDNoNumber of items per write before confirm="APPLY" is needed.10
PINTEREST_ADS_AUDIT_SNAPSHOTSNoSet to false to stop keeping the old values of changed fields.
PINTEREST_ADS_MAX_DOWNLOAD_MBNoLargest report or export file to download, in MB.200
PINTEREST_ADS_MAX_INCREASE_PCTNoBid or budget rise percentage that needs confirm="APPLY".20
PINTEREST_ADS_AUDIT_RETENTION_DAYSNoDays to keep audit entries, pruned at startup. Set to 0 to keep them.30

Instructions

Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.

Pinterest API v5 (ads): ad accounts, campaigns, ad groups, ads, keywords, audiences, catalogs, analytics, reports. Start with pinterest_ads_describe_server and pinterest_ads_health_check; pick an ad_account_id from pinterest_ads_list_ad_accounts. Writes change live ads and spend. Pinterest requires the user to approve each change: rehearse in dry-run (pinterest_ads_set_dry_run) and show them what will change first. Money fields are micro-units (1.00 = 1000000). New campaigns, ad groups and ads start PAUSED. Archives, deletes, big batches and bid or budget rises need confirm ('ARCHIVE', 'DELETE' or 'APPLY'). Don't combine one Pinterest account's data with another account's or other services' data beyond what this user asked for, and don't make benchmark or competitor claims. Every write is in the audit log (pinterest_ads_audit_tail). Tools can be limited with PINTEREST_ADS_TOOL_GROUPS or PINTEREST_ADS_READ_ONLY=true.

Capabilities

Features and capabilities supported by this server

Protocol revision2025-11-25

CapabilityDetails
tools
{
  "listChanged": false
}
prompts
{
  "listChanged": false
}
resources
{
  "subscribe": false,
  "listChanged": false
}

Tools

Functions exposed to the LLM to take actions

NameDescription
pinterest_ads_describe_serverA

Show which API host, default ad account and safety settings this server uses.

pinterest_ads_health_checkA

Check the setup: refresh the access token, read the signed-in account, then list the ad accounts it can use. Also reports granted scopes and the rate-limit headers.

pinterest_ads_audit_lookupA

Look up an audit log entry by ID: the request, response summary and old values of a write.

pinterest_ads_audit_tailB

Show the most recent audit log entries (writes and dry-run rehearsals).

pinterest_ads_set_dry_runA

Turn dry-run on or off for this session. In dry-run, writes are recorded in the audit log and returned as a preview but NOT sent to Pinterest; reads still work.

pinterest_ads_list_ad_accountsA

List the ad accounts this token can use: owned ones and, by default, ones shared through business access (agency and partner access). Each has id, name, currency, country, owner and the user's permissions on it.

pinterest_ads_get_ad_accountB

Get one ad account: name, currency, country, time zone, owner and permissions.

pinterest_ads_get_user_accountA

Get the Pinterest account behind the token (username, account type, business name).

With ad_account_id, returns the account that owns that ad account instead.

pinterest_ads_list_businessesA

List the businesses the signed-in user belongs to (Business Manager), with their IDs and a summary of their assets. Needs the biz_access:read scope.

pinterest_ads_list_business_assetsA

List a business's assets: ad accounts (default), profiles, catalogs or asset groups, with the permissions the user holds on each. Needs the biz_access:read scope.

permissions filters by role, e.g. ['ADMIN', 'CAMPAIGN_MANAGER', 'ANALYST'].

pinterest_ads_list_campaignsA

List campaigns in an ad account.

Filters: ids (this entity's IDs, up to 250) plus none where supported. statuses defaults to ACTIVE and PAUSED; pass ['ARCHIVED'] or ['ALL'] to widen it (IDs are found in any status). Returns at most max_results items. summary_status shows whether each one is actually delivering.

pinterest_ads_create_campaignsA

Create campaigns (up to 500 per call, sent 30 at a time). Changes the live account.

items: one object per campaign, sent as-is. Example: {"name": "Spring sale", "objective_type": "SALES", "intended_promotion_type": "STANDARD_AD", "daily_spend_cap": 20000000, "is_campaign_budget_optimization": true}. objective_type is one of AWARENESS, CONSIDERATION, VIDEO_COMPLETION, SALES, LEADS, APP_INSTALL; SALES and CONSIDERATION take intended_promotion_type STANDARD_AD (ads from Pins) or CATALOG (product group promotions). start_time/end_time are Unix seconds. Money fields (daily_spend_cap, lifetime_spend_cap) are micro-units of the account currency (1.00 = 1000000). Items without a status are created PAUSED. Large batches and values over PINTEREST_ADS_MAX_BUDGET/PINTEREST_ADS_MAX_BID need confirm='APPLY'. Rehearse with dry-run first.

pinterest_ads_update_campaignsA

Update campaigns (up to 500 per call). Changes the live account.

items: objects with id plus only the fields to change. Example: {"id": "626747269410", "daily_spend_cap": 25000000} or {"id": "...", "status": "PAUSED"}. Pinterest rejects daily budget rises smaller than 1.00 USD (or local equivalent). objective_type can only change on draft campaigns. Money fields (daily_spend_cap, lifetime_spend_cap) are micro-units of the account currency (1.00 = 1000000). Current values are read first and their old values kept in the audit log. Bid or budget rises above PINTEREST_ADS_MAX_INCREASE_PCT, and large batches, need confirm='APPLY'; setting status ARCHIVED needs confirm='ARCHIVE'.

pinterest_ads_archive_campaignsA

Archive campaigns by ID. Archived campaigns stop serving and Pinterest can't un-archive them, so this needs confirm='ARCHIVE' after the user agrees. To stop them temporarily, use pinterest_ads_set_statuses with PAUSED instead.

pinterest_ads_list_ad_groupsA

List ad groups in an ad account.

Filters: ids (this entity's IDs, up to 250) plus campaign_ids where supported. statuses defaults to ACTIVE and PAUSED; pass ['ARCHIVED'] or ['ALL'] to widen it (IDs are found in any status). Returns at most max_results items. summary_status shows whether each one is actually delivering.

pinterest_ads_create_ad_groupsA

Create ad groups (up to 500 per call, sent 30 at a time). Changes the live account.

items: one object per ad group, sent as-is. Example: {"name": "UK women 25-44", "campaign_id": "626747269410", "billable_event": "CLICKTHROUGH", "bid_strategy_type": "AUTOMATIC_BID", "budget_in_micro_currency": 10000000, "budget_type": "DAILY", "targeting_spec": {"LOCATION": ["GB"], "GENDER": ["female"], "AGE_BUCKET": ["25-34", "35-44"]}}. For SALES or LEADS campaigns set "optimization_goal_metadata": {"conversion_tag_v3_goal_metadata": {"conversion_tag_id": "...", "conversion_event": "CHECKOUT"}} (CHECKOUT or ADD_TO_CART for SALES, SIGNUP or LEAD for LEADS). targeting_spec needs LOCATION or GEO. Use pinterest_ads_get_targeting_options for valid codes. Money fields (budget_in_micro_currency, bid_in_micro_currency) are micro-units of the account currency (1.00 = 1000000). Items without a status are created PAUSED. Large batches and values over PINTEREST_ADS_MAX_BUDGET/PINTEREST_ADS_MAX_BID need confirm='APPLY'. Rehearse with dry-run first.

pinterest_ads_update_ad_groupsA

Update ad groups (up to 500 per call). Changes the live account.

items: objects with id plus only the fields to change. Example: {"id": "2680059592705", "bid_in_micro_currency": 1500000} or {"id": "...", "targeting_spec": {...}}. targeting_spec replaces the whole spec. Money fields (budget_in_micro_currency, bid_in_micro_currency) are micro-units of the account currency (1.00 = 1000000). Current values are read first and their old values kept in the audit log. Bid or budget rises above PINTEREST_ADS_MAX_INCREASE_PCT, and large batches, need confirm='APPLY'; setting status ARCHIVED needs confirm='ARCHIVE'.

pinterest_ads_archive_ad_groupsA

Archive ad groups by ID. Archived ad groups stop serving and Pinterest can't un-archive them, so this needs confirm='ARCHIVE' after the user agrees. To stop them temporarily, use pinterest_ads_set_statuses with PAUSED instead.

pinterest_ads_get_bid_floorsA

Get the minimum bids Pinterest accepts for ad groups. Changes nothing.

bid_floor_specs: e.g. [{"billable_event": "CLICKTHROUGH", "objective_type": "CONSIDERATION", "creative_type": "REGULAR", "countries": ["GB"], "currency": "GBP"}]. targeting_spec is optional, as in ad group create. Values are micro-units (1.00 = 1000000).

pinterest_ads_list_adsA

List ads in an ad account.

Filters: ids (this entity's IDs, up to 250) plus ad_group_ids, campaign_ids where supported. statuses defaults to ACTIVE and PAUSED; pass ['ARCHIVED'] or ['ALL'] to widen it (IDs are found in any status). Returns at most max_results items. summary_status shows whether each one is actually delivering.

pinterest_ads_create_adsA

Create ads (up to 500 per call, sent 30 at a time). Changes the live account.

items: one object per ad, sent as-is. Example: {"ad_group_id": "2680059592705", "pin_id": "813744226420795884", "creative_type": "REGULAR", "name": "Red trainers", "destination_url": "https://example.com/red-trainers"}. The Pin must belong to the ad account's profile (find one with pinterest_ads_list_pins or make one with pinterest_ads_create_ad_pin). creative_type follows the Pin: REGULAR (image), VIDEO, MAX_VIDEO, CAROUSEL, IDEA, COLLECTION, SHOPPING, QUIZ. Ads go through Pinterest's review before they serve. Items without a status are created PAUSED. Large batches and values over PINTEREST_ADS_MAX_BUDGET/PINTEREST_ADS_MAX_BID need confirm='APPLY'. Rehearse with dry-run first.

pinterest_ads_update_adsA

Update ads (up to 500 per call). Changes the live account.

items: objects with id plus only the fields to change. Example: {"id": "687195134316", "status": "PAUSED"} or {"id": "...", "destination_url": "https://example.com/new"}. Current values are read first and their old values kept in the audit log. Bid or budget rises above PINTEREST_ADS_MAX_INCREASE_PCT, and large batches, need confirm='APPLY'; setting status ARCHIVED needs confirm='ARCHIVE'.

pinterest_ads_archive_adsA

Archive ads by ID. Archived ads stop serving and Pinterest can't un-archive them, so this needs confirm='ARCHIVE' after the user agrees. To stop them temporarily, use pinterest_ads_set_statuses with PAUSED instead.

pinterest_ads_list_product_group_promotionsA

List product group promotions: the catalog product groups an ad group promotes.

Filter by ids, ad_group_id and statuses (default ACTIVE and PAUSED; ['ALL'] for every status).

pinterest_ads_create_product_group_promotionsA

Promote catalog product groups in an ad group (catalog ads). Changes the live account.

items: e.g. [{"catalog_product_group_id": "1231235", "creative_type": "SHOPPING", "bid_in_micro_currency": 1200000}]. Use with SALES or CONSIDERATION campaigns whose intended_promotion_type is CATALOG. Items without a status are created PAUSED. Values over PINTEREST_ADS_MAX_BID and large batches need confirm='APPLY'.

pinterest_ads_update_product_group_promotionsA

Update product group promotions in one ad group. Changes the live account.

items: objects with id plus the fields to change, e.g. {"id": "...", "status": "PAUSED"} or {"id": "...", "bid_in_micro_currency": 900000}. Bid rises above PINTEREST_ADS_MAX_INCREASE_PCT and large batches need confirm='APPLY'; status ARCHIVED needs confirm='ARCHIVE'.

pinterest_ads_list_pinsA

List Pins you could promote. Pass ad_account_id to list the Pins of the profile that owns that ad account (needed when it isn't your own).

pin_filter: 'has_been_promoted', 'exclude_repins' or 'exclude_native'. include_protected_pins=true adds ad-only Pins. creative_types e.g. ['REGULAR', 'VIDEO'].

pinterest_ads_get_pinA

Get one Pin: title, link, media, board and whether it has been promoted. Pass ad_account_id when the Pin belongs to that ad account's profile. Apps registered on or after 14 September 2026 may get HTTP 403 PINNER_DATA_ACCESS_DENIED here until Pinterest approves Pinner data access; don't retry.

pinterest_ads_list_boardsA

List boards (yours, or the ad account owner's with ad_account_id), to find Pins.

privacy: ALL, PUBLIC, PROTECTED (ad-only), SECRET or PUBLIC_AND_SECRET.

pinterest_ads_list_board_pinsA

List the Pins on a board, e.g. the protected 'Ad-only Pins' board, to pick one for an ad. Apps registered on or after 14 September 2026 may get HTTP 403 PINNER_DATA_ACCESS_DENIED here until Pinterest approves Pinner data access; don't retry.

pinterest_ads_create_ad_pinA

Create an ad-only Pin from an image URL, to use as an ad's pin_id.

Ad-only Pins sit on a protected 'Ad-only Pins' board: they can't be saved by others or shown organically. Pass ad_account_id so the Pin belongs to that ad account's profile. ai_disclosures: ['AI_MODIFIED'] and/or ['SYNTHETIC_PERFORMER'] when the image was made or changed with AI. Needs the pins:write scope (run pinterest-ads-mcp auth --scopes with it). Trial-access apps create Pins only their creator can see.

pinterest_ads_list_keywordsA

List keywords and negative keywords for an ad group, several ad groups or a campaign.

match_types filters, e.g. ['EXACT_NEGATIVE', 'PHRASE_NEGATIVE'] for negatives only. Archived keywords have archived=true.

pinterest_ads_create_keywordsA

Add targeting keywords to an ad group. Changes the live account.

keywords: strings (use match_type, default BROAD) or objects like {"value": "linen dress", "match_type": "PHRASE"}. Match types: BROAD, PHRASE, EXACT. More than PINTEREST_ADS_BULK_THRESHOLD keywords need confirm='APPLY'.

pinterest_ads_create_negative_keywordsA

Add negative keywords so ads don't show on those searches. Changes the live account.

parent_id: an ad group ID, a campaign ID (applies to every ad group in it) or the ad account ID (applies to the whole account). match_type: PHRASE_NEGATIVE (default) or EXACT_NEGATIVE. More than PINTEREST_ADS_BULK_THRESHOLD keywords need confirm='APPLY'.

pinterest_ads_archive_keywordsA

Archive keywords or negative keywords by ID (find IDs with pinterest_ads_list_keywords).

Archived keywords stop applying and can't be restored, so this needs confirm='ARCHIVE' after the user agrees. Up to 1000 IDs per call.

pinterest_ads_get_keyword_metricsA

Monthly search volume on Pinterest for keywords in one country (e.g. 'GB', 'US').

Up to 2000 keywords. Aggregated across Pinterest; use it to size keyword ideas.

pinterest_ads_suggest_keywordsC

Keyword ideas for a seed term: popular suggested terms and related terms.

pinterest_ads_get_targeting_optionsA

Valid values for an ad group targeting_spec field.

targeting_type: LOCATION (countries and US metros), GEO (regions, postcodes), INTEREST, AGE_BUCKET, GENDER, LOCALE, APPTYPE, KEYWORD, AUDIENCE_INCLUDE or AUDIENCE_EXCLUDE. search filters the (often long) list, e.g. search='united kingdom'.

pinterest_ads_list_targeting_templatesC

List saved targeting templates (reusable targeting for ad groups).

pinterest_ads_estimate_audience_sizeB

Estimate how many people an ad group's targeting would reach. Changes nothing.

targeting_spec as in ad group create, e.g. {"LOCATION": ["GB"], "AGE_BUCKET": ["25-34"]}. keywords: [{"value": "linen dress", "match_type": "BROAD"}].

pinterest_ads_list_audiencesA

List audiences (customer list, visitor, engagement, actalike and persona audiences).

ownership_type: OWNED or RECEIVED (shared with this account). Audiences need at least 100 matched people before they can be used.

pinterest_ads_get_audienceC

Get one audience: type, rule, size and status.

pinterest_ads_create_audienceA

Create an audience for targeting. Changes the live account.

audience_type and rule, for example:

  • CUSTOMER_LIST: {"customer_list_id": "..."}

  • VISITOR: {"visitor_source_id": "", "retention_days": 30, "event": "checkout"}

  • ENGAGEMENT: {"engager_type": 1, "retention_days": 180}

  • ACTALIKE: {"seed_id": [""], "country": "GB", "percentage": 5} Use only data you have the rights and consents to use under Pinterest's Ad Data Terms.

pinterest_ads_update_audienceA

Rename an audience or change its description or rule. Changes the live account.

pinterest_ads_delete_audienceA

Remove an audience. Ad groups targeting it lose that targeting, and it can't be undone, so this needs confirm='DELETE' after the user agrees.

pinterest_ads_list_customer_listsB

List customer lists (uploaded customer identifiers) with their size and status.

Status TOO_SMALL means fewer than 100 matched Pinterest users.

pinterest_ads_create_customer_listA

Upload a customer list (emails or mobile ad IDs) for targeting. Changes the account.

list_type: EMAIL (default), MAID, IDFA, LR_ID, DLX_ID or HASHED_PINNER_ID. Emails and ad IDs are trimmed, lower-cased and SHA-256 hashed here before sending (unless already hashed). Up to 50,000 identifiers per call. Only upload people who agreed to this use; then turn the list into an audience with pinterest_ads_create_audience.

pinterest_ads_update_customer_listA

Add people to, or remove people from, a customer list. Changes the account.

operation: ADD or REMOVE. Identifiers are hashed as in pinterest_ads_create_customer_list. Up to 50,000 per call.

pinterest_ads_list_conversion_tagsB

List the ad account's conversion tags (Pinterest Tag), with their IDs and status.

A SALES or LEADS ad group needs one of these IDs as optimization_goal_metadata.conversion_tag_v3_goal_metadata.conversion_tag_id.

pinterest_ads_get_conversion_tagB

Get one conversion tag: name, status, last fired time and configuration.

pinterest_ads_list_catalogsC

List catalogs (retail, hotel or creative assets) and their IDs.

pinterest_ads_list_catalog_feedsC

List product feeds (data sources): location, format, schedule, status, country.

pinterest_ads_list_feed_processing_resultsA

Recent processing runs of a feed: status, item counts, and error and warning totals.

Use a result's id with pinterest_ads_list_item_issues to see item-level problems.

pinterest_ads_list_item_issuesC

Item-level errors and warnings from one feed processing run.

pinterest_ads_get_catalog_itemsC

Look up catalog items by item ID (your feed's id column). Changes nothing.

country e.g. 'GB', language e.g. 'en-GB' or 'EN'. Up to 100 item IDs.

pinterest_ads_ingest_catalog_feedA

Ask Pinterest to fetch and process a feed now instead of waiting for its schedule.

pinterest_ads_batch_catalog_itemsA

Create, update, upsert or delete catalog items in one batch (up to 1000).

operation: CREATE, UPDATE (change some attributes), UPSERT (send every attribute) or DELETE. items: [{"item_id": "SKU1", "attributes": {"price": "24.99 GBP", "availability": "in stock"}}]; DELETE needs only item_id. If a feed manages the catalog, Pinterest recommends changing items through the feed. DELETE needs confirm='DELETE'; more than PINTEREST_ADS_BULK_THRESHOLD items need confirm='APPLY'. Returns a batch_id to check with pinterest_ads_get_catalog_items_batch.

pinterest_ads_get_catalog_items_batchB

Status of an item batch: whether it finished, and any per-item errors.

pinterest_ads_list_product_groupsC

List catalog product groups (the sets of products catalog ads promote).

pinterest_ads_create_product_groupB

Create a catalog product group. Changes the account.

product_group, for a retail catalog: {"catalog_id": "...", "catalog_type": "RETAIL", "country": "GB", "locale": "en-GB", "name": "Trainers under 50", "filters": {"all_of": [{"PRODUCT_TYPE_0": {"values": ["shoes"]}}, {"MAX_PRICE": {"values": 50, "inclusion": true}}]}}. Feed-based groups use feed_id instead of catalog_id.

pinterest_ads_update_product_groupA

Rename a product group or change its description, filters or featured flag.

changes: e.g. {"name": "Trainers under 60", "filters": {...}}. For a retail catalog group include "catalog_type": "RETAIL". The old values are kept in the audit log.

pinterest_ads_delete_product_groupA

Delete a catalog product group. Ads promoting it stop, and it can't be undone, so this needs confirm='DELETE' after the user agrees.

pinterest_ads_get_product_group_product_countsC

How many products a product group contains.

pinterest_ads_list_product_group_productsC

List the products (product Pins) in a product group.

pinterest_ads_get_analyticsA

Get ads metrics right away (synchronous) for the ad account, or for up to 250 campaigns, ad groups, ads or product groups. Changes nothing.

level: account, campaign, ad_group, ad or product_group (ids required except for account). Dates are YYYY-MM-DD. granularity: TOTAL, DAY, WEEK, MONTH or HOUR. targeting_types breaks results down by targeting, e.g. ['LOCATION'], ['KEYWORD'], ['AGE_BUCKET_AND_GENDER'] (not for product groups). Attribution windows default to Pinterest's (30-day click and engagement, 1-day view); conversion_report_time TIME_OF_AD_ACTION (default) or TIME_OF_CONVERSION; reporting_timezone PINTEREST_TIME_ZONE (UTC, default) or AD_ACCOUNT_TIME_ZONE.

Common columns: SPEND_IN_DOLLAR (account currency, despite the name), PAID_IMPRESSION, IMPRESSION_1, CLICKTHROUGH_1 (Pin clicks), OUTBOUND_CLICK_1, CTR, OUTBOUND_CTR_1, CPC_IN_MICRO_DOLLAR, CPM_IN_DOLLAR, TOTAL_ENGAGEMENT, TOTAL_CONVERSIONS, TOTAL_CHECKOUT, TOTAL_CHECKOUT_VALUE_IN_MICRO_DOLLAR, CHECKOUT_ROAS, TOTAL_ADD_TO_CART, TOTAL_LEAD, TOTAL_SIGNUP, CAMPAIGN_NAME, CAMPAIGN_ID. _1 metrics are paid, _2 earned (saves of ads). pinterest_ads_list_metrics lists every column with its definition. HOUR granularity no longer includes conversion metrics.

pinterest_ads_list_metricsA

Definitions of the metrics (columns) reports can return, with Ads Manager names.

search filters by name or definition, e.g. 'checkout'. report_type: SYNC or ASYNC.

pinterest_ads_get_metrics_ready_stateB

Whether conversion and other metrics for a date (YYYY-MM-DD) are final yet.

pinterest_ads_get_audience_insightsB

Interests and demographics of the account's audience over the last 30 days.

audience_insight_type: YOUR_ENGAGED_AUDIENCE (default), YOUR_TOTAL_AUDIENCE or PINTEREST_TOTAL_AUDIENCE. Aggregated data only; don't use it for competitor or platform benchmarking.

pinterest_ads_create_reportA

Request an ads report. Pinterest builds it in the background: poll pinterest_ads_get_report with the returned token, then call pinterest_ads_download_report (or use pinterest_ads_run_report to do all three). Changes nothing in the account.

level: ADVERTISER, CAMPAIGN, AD_GROUP, PIN_PROMOTION (ads), KEYWORD, PRODUCT_GROUP, PRODUCT_ITEM, or a *_TARGETING level with targeting_types (up to 5, e.g. ['LOCATION']). Dates are YYYY-MM-DD; granularity TOTAL, DAY, WEEK, MONTH or HOUR. filters adds other request fields, e.g. {"campaign_ids": ["..."], "campaign_statuses": ["RUNNING"]} (campaign_objective_types should include SALES and LEADS, not only the retiring CATALOG_SALES and WEB_CONVERSION). report_format JSON (default) or CSV. To re-run a report saved in Ads Manager, pass template_id (see pinterest_ads_list_report_templates) with dates and granularity only.

Common columns: SPEND_IN_DOLLAR (account currency, despite the name), PAID_IMPRESSION, IMPRESSION_1, CLICKTHROUGH_1 (Pin clicks), OUTBOUND_CLICK_1, CTR, OUTBOUND_CTR_1, CPC_IN_MICRO_DOLLAR, CPM_IN_DOLLAR, TOTAL_ENGAGEMENT, TOTAL_CONVERSIONS, TOTAL_CHECKOUT, TOTAL_CHECKOUT_VALUE_IN_MICRO_DOLLAR, CHECKOUT_ROAS, TOTAL_ADD_TO_CART, TOTAL_LEAD, TOTAL_SIGNUP, CAMPAIGN_NAME, CAMPAIGN_ID. _1 metrics are paid, _2 earned (saves of ads). pinterest_ads_list_metrics lists every column with its definition. HOUR granularity no longer includes conversion metrics.

pinterest_ads_get_reportA

Check a report's status: IN_PROGRESS, FINISHED, FAILED, CANCELLED or EXPIRED.

When FINISHED, call pinterest_ads_download_report with the same token.

pinterest_ads_download_reportA

Download a FINISHED report and return its rows (up to max_rows), held in memory only.

row_count is the full count; truncated says whether rows were cut to max_rows. report_format must match the one the report was requested in.

pinterest_ads_run_reportA

Request a report, wait for it with progress updates, and return its rows. Same arguments as pinterest_ads_create_report, plus max_rows (default 1000), timeout_seconds (default 600) and poll_seconds (default 10). If it times out the token is returned so you can check later with pinterest_ads_get_report. Changes nothing in the account.

level: ADVERTISER, CAMPAIGN, AD_GROUP, PIN_PROMOTION (ads), KEYWORD, PRODUCT_GROUP, PRODUCT_ITEM, or a *_TARGETING level with targeting_types (up to 5, e.g. ['LOCATION']). Dates are YYYY-MM-DD; granularity TOTAL, DAY, WEEK, MONTH or HOUR. filters adds other request fields, e.g. {"campaign_ids": ["..."], "campaign_statuses": ["RUNNING"]} (campaign_objective_types should include SALES and LEADS, not only the retiring CATALOG_SALES and WEB_CONVERSION). report_format JSON (default) or CSV. To re-run a report saved in Ads Manager, pass template_id (see pinterest_ads_list_report_templates) with dates and granularity only.

Common columns: SPEND_IN_DOLLAR (account currency, despite the name), PAID_IMPRESSION, IMPRESSION_1, CLICKTHROUGH_1 (Pin clicks), OUTBOUND_CLICK_1, CTR, OUTBOUND_CTR_1, CPC_IN_MICRO_DOLLAR, CPM_IN_DOLLAR, TOTAL_ENGAGEMENT, TOTAL_CONVERSIONS, TOTAL_CHECKOUT, TOTAL_CHECKOUT_VALUE_IN_MICRO_DOLLAR, CHECKOUT_ROAS, TOTAL_ADD_TO_CART, TOTAL_LEAD, TOTAL_SIGNUP, CAMPAIGN_NAME, CAMPAIGN_ID. _1 metrics are paid, _2 earned (saves of ads). pinterest_ads_list_metrics lists every column with its definition. HOUR granularity no longer includes conversion metrics.

pinterest_ads_list_report_templatesB

List custom report templates saved in Ads Manager, to re-run them by template_id.

pinterest_ads_set_statusesA

Pause or activate many campaigns, ad groups or ads at once, with progress.

entity: 'campaigns', 'ad_groups' or 'ads'. status: 'PAUSED' or 'ACTIVE' (to archive, use the matching archive tool). ACTIVE starts spending as soon as the parents are active too. More than PINTEREST_ADS_BULK_THRESHOLD items need confirm='APPLY'. Current statuses are kept in the audit log.

pinterest_ads_adjust_ad_group_bidsA

Change many ad group bids at once, with progress.

Pass change_pct (e.g. -10 lowers each bid by 10%) or set_bid (one value for all, in the account currency, e.g. 0.85). New bids stay between min_bid and max_bid (currency units). Ad groups on automatic bidding have no bid and are skipped. Current bids are read first; the result lists old and new values.

Needs confirm='APPLY' for more than PINTEREST_ADS_BULK_THRESHOLD ad groups or any rise above PINTEREST_ADS_MAX_INCREASE_PCT. Run in dry-run first and show the user the table.

pinterest_ads_adjust_budgetsA

Change many campaign or ad group budgets at once, with progress.

entity: 'campaigns' (budget 'daily' -> daily_spend_cap, 'lifetime' -> lifetime_spend_cap) or 'ad_groups' (budget_in_micro_currency). Pass change_pct (e.g. 15 raises by 15%) or set_budget in the account currency (e.g. 40). Pinterest rejects daily rises smaller than 1.00 USD (or local equivalent).

Needs confirm='APPLY' for more than PINTEREST_ADS_BULK_THRESHOLD items, any rise above PINTEREST_ADS_MAX_INCREASE_PCT, or a value over PINTEREST_ADS_MAX_BUDGET.

pinterest_ads_bulk_upsertA

Create and/or update many ad entities in one asynchronous Pinterest bulk job.

create / update: objects with lists under campaigns, ad_groups, ads, product_groups (product group promotions: {"ad_group_id", "product_group_promotion"}), keywords ({"parent_id", "keywords"}), catalog_product_groups, labels or schedules. Each entry uses the same fields as the matching create or update tool (updates need id). Campaign create entries without a status are sent PAUSED.

Pinterest applies the job in the background and this server can't check every change, so it always needs confirm='APPLY' (confirm='ARCHIVE' if anything is set to ARCHIVED). Returns a request_id to follow with pinterest_ads_get_bulk_request.

pinterest_ads_get_bulk_requestB

Status of a bulk upsert or bulk export: RUNNING, SUCCEEDED or FAILED.

With download=true and status SUCCEEDED, fetches the result file and returns its rows (up to max_rows), held in memory only.

pinterest_ads_bulk_exportA

Export ad entities in bulk (one background job), wait with progress, return rows.

entity_types: up to 6 of CAMPAIGN, AD_GROUP, PRODUCT_GROUP, AD, KEYWORD, LABEL, SCHEDULE. Pinterest exports active entities only. campaign_filter e.g. {"campaign_status": ["RUNNING"], "objective_type": ["SALES"]}. updated_since is a timestamp string to export only recent changes. Changes nothing in the account.

pinterest_ads_read_requestA

Read from any Pinterest API v5 endpoint the other tools don't cover.

Only GET, and POSTs that just read (report and export requests, audience sizing, bid floors, delivery estimates, catalog item lookups), are allowed; use pinterest_ads_request for writes. path is relative to the v5 base, e.g. '/ad_accounts/123/ads/targeting_analytics'. List values in query are sent as repeated parameters; join them with commas yourself where the API wants that.

pinterest_ads_requestA

Call any Pinterest API v5 endpoint the other tools don't cover (e.g. lead forms, ad previews, labels, schedules, conversion events, asynchronous customer list uploads).

path is relative to the v5 base and starts with '/', e.g. '/ad_accounts/123/labels'. GET and read-only POSTs are reads. Every other call is a write: it is audited, follows dry-run, and needs confirm='APPLY' because this tool can't check what it changes. OAuth endpoints are blocked.

Prompts

Interactive templates invoked by user choice

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription

No resources

TDQS

B3.3/5.0

Scored across 81 tools

Disambiguation4/5

The bulk of the surface is cleanly partitioned by resource (campaigns, ad_groups, ads, keywords, audiences, catalogs, product_groups) with matching list/create/update/archive verbs, so misselection is unlikely. The main overlaps are the metrics path (get_analytics vs. the create/get/download/run_report family) and run_report as a wrapper around create_report, which the descriptions do address but still leave two ways to accomplish the same read.

Naming Consistency4/5

Nearly all tools follow a consistent pinterest_ads_ verb_noun pattern (list_, get_, create_, update_, archive_, delete_, set_, adjust_, estimate_, suggest_). Minor deviations exist in pinterest_ads_request / pinterest_ads_read_request (no verb_noun) and the bulk/batch utilities (bulk_upsert, bulk_export, batch_catalog_items), but overall it is predictable.

Tool Count2/5

81 tools is far past the point where an agent can scan the set comfortably, and several tools are thin wrappers or conveniences (run_report vs create_report, read_request vs request). The domain is genuinely broad, but the surface is heavy enough that batching/consolidation would materially help.

Completeness4/5

CRUD/lifecycle coverage is strong across campaigns, ad groups, ads, keywords, audiences, customer lists, catalogs and product groups, plus reporting and escape-hatch raw endpoints. Minor gaps remain, e.g. targeting templates are list-only and conversion tags are read-only, but these are workable via the generic request tools.

Maintenance

ActivityMaintained
ResponsivenessNo recent community issues