Operations 9
Documentation
APIReference
https://api.mountain.com/docs
Documentation
https://api.mountain.com/docs
APIReference
https://api3.mountain.com/docs
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
find_apisBrowse and filter every API in the catalog.get_api_artifactsOne API's artifacts, grouped by type.get_openapiThe primary OpenAPI for this API.find_similar_apisAPIs that look like this one.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.curl "https://apis.io/api/v1/apis/mntn-campaigns-api"
curl "https://apis.io/api/v1/apis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: PTV Campaigns API
description: PTV API authoritative source of truth for PTV data.
version: '1.0'
contact:
name: MNTN Platform
url: https://api.mountain.com
email: support@mountain.com
license:
name: Proprietary
servers:
- url: https://api.mountain.com/ptv
description: MNTN Performance TV API gateway
security:
- Bearer: []
- API Key: []
tags:
- name: campaigns
description: Campaign list, lookup, and lifecycle.
paths:
/api/v1/campaigns:
get:
description: 'Returns campaigns the caller is authorized to see, filtered by advertiser, campaign, status, objective, or search text.
**Filters:** `advertiserId`, `campaignId` (repeatable), `objective`, `search`, `status` (repeatable).
**Sorting:** `sortBy` (`name`, `status`, `objective`, `totalBudget`, `monthlyBudget`, `spend`, `startTime`, `endTime`, `createdAt`, `updatedAt`) with `sortOrder` (`asc`/`desc`, default `asc`).
**Notes:** Each campaign carries `creativeIds` for its attached creatives; fetch a single campaign with `expand=creatives` for click URLs and weights.'
operationId: campaigns.list
parameters:
- name: page
required: false
in: query
description: 1-based page number.
schema:
minimum: 1
type: number
- name: perPage
required: false
in: query
description: Results per page (maximum 100).
schema:
minimum: 1
maximum: 100
type: number
- name: status
required: false
in: query
description: Repeatable campaign status filter.
schema:
type: array
items:
type: string
- name: objective
required: false
in: query
description: Campaign objective filter.
schema:
type: string
- name: sortBy
required: false
in: query
description: 'Field to sort by: `name`, `status`, `objective`, `totalBudget`, `monthlyBudget`, `spend`, `startTime`, `endTime`, `createdAt`, `updatedAt`.'
schema:
type: string
enum:
- name
- status
- objective
- totalBudget
- monthlyBudget
- spend
- startTime
- endTime
- createdAt
- updatedAt
- name: sortOrder
required: false
in: query
description: Sort order (default `asc` when `sortBy` is set).
schema:
type: string
enum:
- asc
- desc
- name: search
required: false
in: query
description: Case-insensitive substring match on campaign name. Numeric values also match campaign ID and advertiser ID.
schema:
type: string
- name: campaignId
required: false
in: query
description: Repeatable campaign ID filter.
schema:
type: array
items:
type: string
- name: advertiserId
required: false
in: query
description: Advertiser ID to retrieve campaigns for.
schema:
exclusiveMinimum: true
type: number
minimum: 0
responses:
'200':
description: Paginated campaign list.
content:
application/json:
example:
data:
- id: '501'
name: Spring prospecting
status: live
objective: PROSPECTING
totalBudget: 10000
monthlyBudget: 2500
spend: 1250.5
startTime: '2026-01-01T00:00:00.000Z'
endTime: '2026-03-31T23:59:59.000Z'
goalType: CPA
goalValue: 25
createdAt: '2025-12-01T10:00:00.000Z'
updatedAt: '2026-01-15T14:30:00.000Z'
snapshotUrl: https://c.mountain.com/storage/video/44821/poster/poster.jpg
videoPreview:
name: Spring prospecting creative
videoUrl: https://c.mountain.com/storage/video/44821/video/video.mp4
posterUrl: https://c.mountain.com/storage/video/44821/poster/poster.jpg
campaignGoal: Traffic & Sales
advertiserId: 44
currentFlightId: 88001
audienceId: 9001
creativeIds:
- 44821
- 44900
pagination:
total: 42
perPage: 25
page: 1
previousPageUrl: null
nextPageUrl: https://api.example.com/api/v1/campaigns?page=2&advertiserId=44
default:
description: Unexpected error response.
content:
application/json:
schema:
$ref: '#/components/schemas/PaginatedCampaignsResponseDto_Output'
summary: List campaigns
tags:
- campaigns
post:
description: 'Creates a campaign for an advertiser with the given objective, optionally linking an existing audience, opening an initial budget, and attaching library creatives in the same call.
**Notes:** Creation is a multi-step operation against the campaign provider and is not idempotent, so a client retry may create a duplicate. `audienceIds` accepts at most one audience; an optional `budget` opens the campaign''s first flight.
**Creatives:** `creatives` attaches library creatives after the campaign is created — each entry carries the creative `id`, an optional `clickUrl`, and an optional serving `weight`. Explicit weights are used verbatim and creatives without one split the remaining share of 100 equally, so the attached set always totals 100 (launch-ready). A creative attached without a click-through URL cannot be approved or launched until one is set. Creatives still processing or in review may be attached; they serve once approved. If any creation step fails, the campaign is rolled back and its creatives are released — no partially-created campaign survives.'
operationId: campaigns.create
parameters: []
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/CreateCampaignDto'
responses:
'201':
description: Created campaign.
content:
application/json:
example:
data:
id: '501'
name: Spring prospecting
status: live
objective: PROSPECTING
totalBudget: 10000
monthlyBudget: 2500
spend: 1250.5
startTime: '2026-01-01T00:00:00.000Z'
endTime: '2026-03-31T23:59:59.000Z'
goalType: CPA
goalValue: 25
createdAt: '2025-12-01T10:00:00.000Z'
updatedAt: '2026-01-15T14:30:00.000Z'
snapshotUrl: https://c.mountain.com/storage/video/44821/poster/poster.jpg
videoPreview:
name: Spring prospecting creative
videoUrl: https://c.mountain.com/storage/video/44821/video/video.mp4
posterUrl: https://c.mountain.com/storage/video/44821/poster/poster.jpg
campaignGoal: Traffic & Sales
advertiserId: 44
currentFlightId: 88001
audienceId: 9001
creativeIds:
- 44821
- 44900
creatives:
- id: 44821
clickUrl: https://example.com/spring
weight: 60
- id: 44900
clickUrl: https://example.com/spring
weight: 40
currentFlight:
id: 88001
campaignGroupId: 501
budget: 10000
startTime: '2026-01-01T00:00:00.000Z'
endTime: '2026-03-31T23:59:59.000Z'
status: LIVE
budgetTypeId: 1
audience:
id: 9001
name: Holiday shoppers
totalUsers: 50000
createdAt: '2025-11-01T12:00:00.000Z'
geoLists: null
geo: null
updatedTime: null
isTest: false
default:
description: Unexpected error response.
content:
application/json:
schema:
$ref: '#/components/schemas/CampaignSingleResponseDto_Output'
summary: Create a campaign
tags:
- campaigns
/api/v1/campaigns/{id}:
get:
description: 'Returns the canonical campaign representation for a given campaign ID, including its primary audience link.
**Notes:** Attached creative ids are always present as `creativeIds`. Pass `expand=currentFlight` for the active flight (Gary), `expand=audience` for the full audience record, and `expand=creatives` for the full attached-creative records (click URL, weight).'
operationId: campaigns.get
parameters:
- name: id
required: true
in: path
description: Campaign identifier.
schema:
type: string
- name: expand
required: false
in: query
description: 'Expand relations: `currentFlight`, `audience`, `creatives`. Use `expand=value`, repeat, or `expand[]=value`.'
schema:
type:
- array
- 'null'
items:
type: string
enum:
- currentFlight
- audience
- creatives
responses:
'200':
description: Single campaign.
content:
application/json:
example:
data:
id: '501'
name: Spring prospecting
status: live
objective: PROSPECTING
totalBudget: 10000
monthlyBudget: 2500
spend: 1250.5
startTime: '2026-01-01T00:00:00.000Z'
endTime: '2026-03-31T23:59:59.000Z'
goalType: CPA
goalValue: 25
createdAt: '2025-12-01T10:00:00.000Z'
updatedAt: '2026-01-15T14:30:00.000Z'
snapshotUrl: https://c.mountain.com/storage/video/44821/poster/poster.jpg
videoPreview:
name: Spring prospecting creative
videoUrl: https://c.mountain.com/storage/video/44821/video/video.mp4
posterUrl: https://c.mountain.com/storage/video/44821/poster/poster.jpg
campaignGoal: Traffic & Sales
advertiserId: 44
currentFlightId: 88001
audienceId: 9001
creativeIds:
- 44821
- 44900
creatives:
- id: 44821
clickUrl: https://example.com/spring
weight: 60
- id: 44900
clickUrl: https://example.com/spring
weight: 40
currentFlight:
id: 88001
campaignGroupId: 501
budget: 10000
startTime: '2026-01-01T00:00:00.000Z'
endTime: '2026-03-31T23:59:59.000Z'
status: LIVE
budgetTypeId: 1
audience:
id: 9001
name: Holiday shoppers
totalUsers: 50000
createdAt: '2025-11-01T12:00:00.000Z'
geoLists: null
geo: null
updatedTime: null
isTest: false
default:
description: Unexpected error response.
content:
application/json:
schema:
$ref: '#/components/schemas/CampaignSingleResponseDto_Output'
summary: Get a campaign
tags:
- campaigns
patch:
description: 'Updates an existing campaign''s editable fields. Only the fields present in the request body are changed; omitted fields are left untouched.
**Notes:** A campaign''s `objective` is immutable and any attempt to change it is rejected. `audienceIds` accepts at most one audience; sending an empty array clears the assigned audience.
**Creatives:** `creatives` is the campaign''s desired full creative set — entries not yet attached are attached, attached creatives missing from the array are detached, and weights are applied to the survivors. Explicit weights are used verbatim; entries without one split the remaining share of 100 equally, so the resulting set always totals 100 (a weightless array means an even split, replacing any previous weights). A creative attached without a click-through URL cannot be approved or launched until one is set. Unlike `audienceIds`, an empty array is rejected. The reconcile is not atomic: additions apply one at a time (detachments and weights apply together), so a failure can leave the set partially updated — retrying the same request converges. If creatives are changed concurrently by another client, the request may fail or a concurrently-attached creative may survive; retrying resolves both.'
operationId: campaigns.update
parameters:
- name: id
required: true
in: path
description: Campaign (campaign group) ID.
schema:
type: string
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/UpdateCampaignDto'
responses:
'200':
description: Updated campaign.
content:
application/json:
example:
data:
id: '501'
name: Spring prospecting
status: live
objective: PROSPECTING
totalBudget: 10000
monthlyBudget: 2500
spend: 1250.5
startTime: '2026-01-01T00:00:00.000Z'
endTime: '2026-03-31T23:59:59.000Z'
goalType: CPA
goalValue: 25
createdAt: '2025-12-01T10:00:00.000Z'
updatedAt: '2026-01-15T14:30:00.000Z'
snapshotUrl: https://c.mountain.com/storage/video/44821/poster/poster.jpg
videoPreview:
name: Spring prospecting creative
videoUrl: https://c.mountain.com/storage/video/44821/video/video.mp4
posterUrl: https://c.mountain.com/storage/video/44821/poster/poster.jpg
campaignGoal: Traffic & Sales
advertiserId: 44
currentFlightId: 88001
audienceId: 9001
creativeIds:
- 44821
- 44900
creatives:
- id: 44821
clickUrl: https://example.com/spring
weight: 60
- id: 44900
clickUrl: https://example.com/spring
weight: 40
currentFlight:
id: 88001
campaignGroupId: 501
budget: 10000
startTime: '2026-01-01T00:00:00.000Z'
endTime: '2026-03-31T23:59:59.000Z'
status: LIVE
budgetTypeId: 1
audience:
id: 9001
name: Holiday shoppers
totalUsers: 50000
createdAt: '2025-11-01T12:00:00.000Z'
geoLists: null
geo: null
updatedTime: null
isTest: false
default:
description: Unexpected error response.
content:
application/json:
schema:
$ref: '#/components/schemas/CampaignSingleResponseDto_Output'
summary: Update a campaign
tags:
- campaigns
delete:
description: 'Archives a campaign so it no longer runs or appears in active listings. This is a soft delete: the campaign moves to the `archived` status rather than being permanently removed.
**Notes:** Archiving a live campaign pauses it first, and the campaign''s creatives are disassociated. The archived campaign is returned so the caller can confirm the new status.'
operationId: campaigns.archive
parameters:
- name: id
required: true
in: path
description: Campaign (campaign group) ID.
schema:
type: string
responses:
'200':
description: Archived campaign.
content:
application/json:
example:
data:
id: '501'
name: Spring prospecting
status: live
objective: PROSPECTING
totalBudget: 10000
monthlyBudget: 2500
spend: 1250.5
startTime: '2026-01-01T00:00:00.000Z'
endTime: '2026-03-31T23:59:59.000Z'
goalType: CPA
goalValue: 25
createdAt: '2025-12-01T10:00:00.000Z'
updatedAt: '2026-01-15T14:30:00.000Z'
snapshotUrl: https://c.mountain.com/storage/video/44821/poster/poster.jpg
videoPreview:
name: Spring prospecting creative
videoUrl: https://c.mountain.com/storage/video/44821/video/video.mp4
posterUrl: https://c.mountain.com/storage/video/44821/poster/poster.jpg
campaignGoal: Traffic & Sales
advertiserId: 44
currentFlightId: 88001
audienceId: 9001
creativeIds:
- 44821
- 44900
creatives:
- id: 44821
clickUrl: https://example.com/spring
weight: 60
- id: 44900
clickUrl: https://example.com/spring
weight: 40
currentFlight:
id: 88001
campaignGroupId: 501
budget: 10000
startTime: '2026-01-01T00:00:00.000Z'
endTime: '2026-03-31T23:59:59.000Z'
status: LIVE
budgetTypeId: 1
audience:
id: 9001
name: Holiday shoppers
totalUsers: 50000
createdAt: '2025-11-01T12:00:00.000Z'
geoLists: null
geo: null
updatedTime: null
isTest: false
default:
description: Unexpected error response.
content:
application/json:
schema:
$ref: '#/components/schemas/CampaignSingleResponseDto_Output'
summary: Delete a campaign
tags:
- campaigns
/api/v1/campaigns/{id}/recommended-audience:
post:
description: Creates a new audience for the campaign's advertiser whose keywords are derived server-side from the advertiser's AI-recommended keywords, and links it to the campaign. Rejects with 422 if the campaign already has an audience or if the advertiser has no recommendations available. On link failure after a successful audience-create, the error surfaces the underlying cause (e.g. 403 authz, upstream failure) and reports the orphan audience id so it can be reconciled out-of-band.
operationId: CampaignsController_createRecommendedAudience_v1
parameters:
- name: id
required: true
in: path
description: Campaign identifier.
schema:
type: string
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/CreateRecommendedAudienceDto'
responses:
'201':
description: Created audience in envelope shape `{ data }`.
content:
application/json:
example:
data:
id: 1001
name: High-intent shoppers
totalUsers: 125000
createdAt: '2025-11-01T09:00:00.000Z'
geoLists:
include:
- 200
exclude: []
geo:
include:
- 237
exclude: []
updatedTime: '2025-11-02T12:00:00.000Z'
isTest: false
geoLocations:
include:
- id: 237
name: Los Angeles
geoType:
id: 4
name: Media Market
exclude: []
default:
description: Unexpected error response.
content:
application/json:
schema:
$ref: '#/components/schemas/AudienceSingleResponseDto_Output'
summary: Create and link a recommended audience for a campaign
tags:
- campaigns
/api/v1/campaigns/{id}/launch:
post:
description: 'Launches a campaign so it begins delivering.
**Notes:** Only a campaign in a launchable state can be launched; an `incomplete` campaign is rejected with `422` before anything is sent upstream (it needs an active budget, a goal, an audience, installed pixels, and approved creatives). The launched campaign is returned so the caller can confirm the new status. If the campaign''s budget schedule already started (elapsed or in-flight budget periods will not be recovered), the launch proceeds without additional confirmation — calling this endpoint is the confirmation.'
operationId: campaigns.launch
parameters:
- name: id
required: true
in: path
description: Campaign (campaign group) ID.
schema:
type: string
responses:
'200':
description: Launched campaign.
content:
application/json:
example:
data:
id: '501'
name: Spring prospecting
status: live
objective: PROSPECTING
totalBudget: 10000
monthlyBudget: 2500
spend: 1250.5
startTime: '2026-01-01T00:00:00.000Z'
endTime: '2026-03-31T23:59:59.000Z'
goalType: CPA
goalValue: 25
createdAt: '2025-12-01T10:00:00.000Z'
updatedAt: '2026-01-15T14:30:00.000Z'
snapshotUrl: https://c.mountain.com/storage/video/44821/poster/poster.jpg
videoPreview:
name: Spring prospecting creative
videoUrl: https://c.mountain.com/storage/video/44821/video/video.mp4
posterUrl: https://c.mountain.com/storage/video/44821/poster/poster.jpg
campaignGoal: Traffic & Sales
advertiserId: 44
currentFlightId: 88001
audienceId: 9001
creativeIds:
- 44821
- 44900
creatives:
- id: 44821
clickUrl: https://example.com/spring
weight: 60
- id: 44900
clickUrl: https://example.com/spring
weight: 40
currentFlight:
id: 88001
campaignGroupId: 501
budget: 10000
startTime: '2026-01-01T00:00:00.000Z'
endTime: '2026-03-31T23:59:59.000Z'
status: LIVE
budgetTypeId: 1
audience:
id: 9001
name: Holiday shoppers
totalUsers: 50000
createdAt: '2025-11-01T12:00:00.000Z'
geoLists: null
geo: null
updatedTime: null
isTest: false
default:
description: Unexpected error response.
content:
application/json:
schema:
$ref: '#/components/schemas/CampaignSingleResponseDto_Output'
summary: Launch a campaign
tags:
- campaigns
/api/v1/campaigns/{id}/pause:
post:
description: 'Pauses a live campaign so it stops delivering.
**Notes:** Only a live campaign can be paused. An optional `pause_reason` records why the campaign was paused. The paused campaign is returned so the caller can confirm the new status.'
operationId: campaigns.pause
parameters:
- name: id
required: true
in: path
description: Campaign (campaign group) ID.
schema:
type: string
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/PauseCampaignBodyDto'
responses:
'200':
description: Paused campaign.
content:
application/json:
example:
data:
id: '501'
name: Spring prospecting
status: live
objective: PROSPECTING
totalBudget: 10000
monthlyBudget: 2500
spend: 1250.5
startTime: '2026-01-01T00:00:00.000Z'
endTime: '2026-03-31T23:59:59.000Z'
goalType: CPA
goalValue: 25
createdAt: '2025-12-01T10:00:00.000Z'
updatedAt: '2026-01-15T14:30:00.000Z'
snapshotUrl: https://c.mountain.com/storage/video/44821/poster/poster.jpg
videoPreview:
name: Spring prospecting creative
videoUrl: https://c.mountain.com/storage/video/44821/video/video.mp4
posterUrl: https://c.mountain.com/storage/video/44821/poster/poster.jpg
campaignGoal: Traffic & Sales
advertiserId: 44
currentFlightId: 88001
audienceId: 9001
creativeIds:
- 44821
- 44900
creatives:
- id: 44821
clickUrl: https://example.com/spring
weight: 60
- id: 44900
clickUrl: https://example.com/spring
weight: 40
currentFlight:
id: 88001
campaignGroupId: 501
budget: 10000
startTime: '2026-01-01T00:00:00.000Z'
endTime: '2026-03-31T23:59:59.000Z'
status: LIVE
budgetTypeId: 1
audience:
id: 9001
name: Holiday shoppers
totalUsers: 50000
createdAt: '2025-11-01T12:00:00.000Z'
geoLists: null
geo: null
updatedTime: null
isTest: false
default:
description: Unexpected error response.
content:
application/json:
schema:
$ref: '#/components/schemas/CampaignSingleResponseDto_Output'
summary: Pause a campaign
tags:
- campaigns
/api/v1/audiences/{id}/campaigns:
get:
description: Returns campaigns attached to the given audience. Same response shape as GET /campaigns.
operationId: audiences.campaigns.list
parameters:
- name: id
required: true
in: path
description: Audience identifier.
schema:
type: number
- name: page
required: false
in: query
description: 1-based page number.
schema:
minimum: 1
type: number
- name: perPage
required: false
in: query
description: Results per page (maximum 100).
schema:
minimum: 1
maximum: 100
type: number
responses:
'200':
description: Paginated campaign list.
content:
application/json:
example:
data:
- id: '501'
name: Spring prospecting
status: live
objective: PROSPECTING
totalBudget: 10000
monthlyBudget: 2500
spend: 1250.5
startTime: '2026-01-01T00:00:00.000Z'
endTime: '2026-03-31T23:59:59.000Z'
goalType: CPA
goalValue: 25
createdAt: '2025-12-01T10:00:00.000Z'
updatedAt: '2026-01-15T14:30:00.000Z'
snapshotUrl: https://c.mountain.com/storage/video/44821/poster/poster.jpg
videoPreview:
name: Spring prospecting creative
videoUrl: https://c.mountain.com/storage/video/44821/video/video.mp4
posterUrl: https://c.mountain.com/storage/video/44821/poster/poster.jpg
campaignGoal: Traffic & Sales
advertiserId: 44
currentFlightId: 88001
audienceId: 9001
creativeIds:
- 44821
- 44900
pagination:
total: 42
perPage: 25
page: 1
previousPageUrl: null
nextPageUrl: https://api.example.com/api/v1/campaigns?page=2&advertiserId=44
default:
description: Unexpected error response.
content:
application/json:
schema:
$ref: '#/components/schemas/PaginatedCampaignsResponseDto_Output'
summary: List campaigns linked to an audience
tags:
- campaigns
components:
schemas:
CreateCampaignDto:
type: object
properties:
name:
description: Optional campaign display name. A provider default is used when omitted.
type: string
objective:
type: string
enum:
- CONVERSIONS
- RETARGETING
- PROSPECTING
- AWARENESS
description: Campaign objective used for optimization strategy.
advertiserId:
type: number
exclusiveMinimum: true
description: Owning advertiser identifier for the campaign.
minimum: 0
audienceIds:
description: Optional audience assignment. At most one audience is supported.
maxItems: 1
type: array
items:
type: number
exclusiveMinimum: true
description: Positive integer entity identifier.
minimum: 0
goalType:
description: Optional optimization goal type.
type: string
goalValue:
description: Optional numeric target value for goalType.
type: number
budget:
type: object
properties:
type:
type: string
enum:
- TOTAL
- MONTHLY
description: Budget mode for the created campaign.
amount:
type: number
exclusiveMinimum: true
description: Budget amount in currency USD (dollars only).
minimum: 0
schedule:
type: object
properties:
startTime:
type: string
desc
# --- truncated at 32 KB (77 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/mntn/refs/heads/main/openapi/mntn-campaigns-api-openapi.yml