Pinterest Ads
Lets an agent report on and manage Pinterest advertising: list ad accounts, campaigns, ad groups and ads, pull spend, impression and click analytics at each level, create campaigns, and change budgets, bids and statuses. Curated from Pinterest's official OpenAPI specification.
Connect this API to an AI agent Browse all specs
What you can do with Pinterest Ads via MCP
Every endpoint below becomes a governed tool your AI agent (Claude, ChatGPT, or a customer-facing VX agent) can call — with scoped permissions, sandbox testing, and audit logs.
| Method | Path | Operation | Description |
|---|---|---|---|
| GET | /ad_accounts |
listAdAccounts | List the ad accounts you can access |
| GET | /ad_accounts/{ad_account_id} |
getAdAccount | Get an ad account (currency, owner, country) |
| GET | /ad_accounts/{ad_account_id}/analytics |
getAdAccountAnalytics | Get account-level spend and performance by day |
| GET | /ad_accounts/{ad_account_id}/campaigns |
listCampaigns | List campaigns with status and budgets |
| POST | /ad_accounts/{ad_account_id}/campaigns |
createCampaigns | Create campaigns (create them PAUSED) |
| PATCH | /ad_accounts/{ad_account_id}/campaigns |
updateCampaigns | Change campaign status, budget or name (batch) |
| GET | /ad_accounts/{ad_account_id}/campaigns/analytics |
getCampaignAnalytics | Get spend and performance for campaigns |
| GET | /ad_accounts/{ad_account_id}/ad_groups |
listAdGroups | List ad groups with bids, budgets and targeting |
| PATCH | /ad_accounts/{ad_account_id}/ad_groups |
updateAdGroups | Change ad group status, bid or budget (batch) |
| GET | /ad_accounts/{ad_account_id}/ad_groups/analytics |
getAdGroupAnalytics | Get spend and performance for ad groups |
| GET | /ad_accounts/{ad_account_id}/ads |
listAds | List ads with their status and Pins |
| PATCH | /ad_accounts/{ad_account_id}/ads |
updateAds | Pause, activate or rename ads (batch) |
| GET | /ad_accounts/{ad_account_id}/ads/analytics |
getAdAnalytics | Get spend and performance for ads |
Authentication
pinterestOAuth
OAuth 2.0
Scopes: ads:read ads:write
Pinterest OAuth 2.0 (authorization code) for a Pinterest app with Ads access.
How to get a credential
- Sign in at developers.pinterest.com with the business account that manages the ads, and Connect app / create an app (Standard access is needed for production ad accounts).
- In the app settings, add the VX Agents redirect URI shown in the credential form and copy the App ID and App secret key.
- Paste them into the VX Agents credential and sign in, approving the
ads:readandads:writescopes. The user must have an Admin, Analyst or Campaign manager role on the ad account.
Permissions used
| Scope | Operations |
|---|---|
ads:read |
listAdAccounts, getAdAccount, getAdAccountAnalytics, listCampaigns, getCampaignAnalytics, listAdGroups, getAdGroupAnalytics, listAds, getAdAnalytics |
ads:write |
createCampaigns, updateCampaigns, updateAdGroups, updateAds |
Common errors
- 401 Unauthorized: access token expired (they last 30 days). Reconnect the credential so it gets a fresh token.
- 403 Forbidden: missing
ads:write/ads:readscope, or the user has no role (or only an Analyst role, which cannot write) on that ad account. - 400 Bad Request: invalid date range (analytics allow up to 90 days per request and data from the last 914 days), unknown
columns, or a budget below the minimum. Read themessagefield. - 429 Too Many Requests: rate limit for the endpoint category. Wait and retry with backoff.
Store the connection as a VX Agents OAuth credential. Never paste tokens into chat.
Usage guide
Setup
- Connect a Pinterest OAuth credential with
ads:readandads:write. The signed-in user needs a role on each ad account (Analyst can only read). - Call
listAdAccountsonce and pinad_account_idas a preset when the agent manages one account. Note the accountcurrency.
Report first
getAdAccountAnalyticswithstart_date/end_date(YYYY-MM-DD, up to 90 days per request),granularity(TOTAL,DAY,WEEK,MONTH) andcolumns, e.g.SPEND_IN_DOLLAR,IMPRESSION_1,CLICKTHROUGH_1,CTR,CPC_IN_MICRO_DOLLAR,TOTAL_CONVERSIONS.listCampaigns(filterentity_statuses=ACTIVE), thengetCampaignAnalyticswithcampaign_ids(comma-separated, max 250) and the same columns to rank campaigns.- Drill down:
listAdGroups/getAdGroupAnalytics(ad_group_ids), thenlistAds/getAdAnalytics(ad_ids). - Summarize spend, CTR, CPC and conversions, and propose changes.
Change campaigns (spends money: confirm first)
- Show the user the exact change (old → new) and wait for a yes before any write.
- Pause/activate or change budgets with
updateCampaigns: an array like[{"id": "626...", "status": "PAUSED"}]or[{"id": "626...", "daily_spend_cap": 50000000}]. - Ad group bids/budgets/status with
updateAdGroups(bid_in_micro_currency,budget_in_micro_currency,status); ad status withupdateAds. - New campaigns via
createCampaignswithad_account_id,name,objective_type(e.g.AWARENESS,CONSIDERATION,WEB_CONVERSION) andstatus: "PAUSED". Let the user activate it.
Good to know
- Money fields ending in
micro_currency/spend_capare in micro units: 1,000,000 = 1.00 in the account currency (50000000= 50.00). - Updates are batch PATCH calls: send only
idplus the fields to change; check each item'sexceptionsin the response. - Statuses:
ACTIVE,PAUSED,ARCHIVED(archived cannot be reactivated, so confirm first). - Analytics are delayed up to a few hours; data older than about 2.5 years is unavailable. Use
reporting_timezoneif the account is not in UTC. - Paging: follow
bookmarkwithpage_sizeup to 250.
How to use this spec
- Create a free VX Agents account (sandbox tools included).
- Open the marketplace and connect “Pinterest Ads” to an agent.
- Expose it as an MCP server for Claude/ChatGPT, or chat with it directly.