Megaphone Promo Orders API
The Promo Orders API from Megaphone — 2 operation(s) for promo orders.
The Promo Orders API from Megaphone — 2 operation(s) for promo orders.
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/megaphone:megaphone-promo-orders-api"
curl "https://apis.io/api/v1/apis?limit=25"
Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.
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: Megaphone Promo Orders API
version: 1.0.0
description: 'The Megaphone API (https://cms.megaphone.fm/api) allows podcast producers and partners to view, create, update, and delete podcasts and episodes. Note that the Megaphone API is rate limited at 60 requests per minute (1 request per second). ## Direct Sales API Breaking Change Notice
⚠️ **IMPORTANT** ⚠️
The legacy Direct Sales endpoints for Advertisers, Campaigns, Orders, Advertisements and Geos are being replaced with new v2 endpoints with enhanced functionality. ### Timeline
**Phase 1: Before April 15, 2026**
- Only legacy endpoints are available
- Continue using existing Direct Sales API endpoints
**Phase 2: April 15, 2026 10:00:00 AM EST - July 14, 2026 11:59:59 UTC (Migration Period)**
- **v2 endpoints become available**
- Legacy endpoints continue to work during this period
- Both legacy and v2 endpoints are operational
- **We strongly encourage you to start testing and migrating to v2 endpoints as soon as they become available to ensure a smooth transition before the sunset date and to continue ad delivery without disruption.**
**Phase 3: After July 14, 2026 11:59:59 UTC**
- Legacy endpoints are **removed and will stop working**
- Only v2 endpoints will be supported
- [Old] Standard campaigns can use v2 GET endpoints
### What''s Changing
**API Version:** v2 REST API for managing advertisers, campaigns, orders, assets, advertisements, and targeting. **Effective Date:** New endpoints (v2) will be effective on **April 15, 2026 10:00:00 AM EST**
**Sunset Date:** Legacy endpoints stop for [Old] Standard on **July 14, 2026 11:59:59 UTC**
##### Capability Matrix
API endpoint availability by resource, campaign type, and version
| Resource | Campaign Type | GET (v2) | POST / PATCH (v2) | DELETE (v2) | Legacy POST / PUT / GET / DELETE |
| ------------------ | ------------------- | :------: | :---------------: | :---------: | :------------------------------: |
| Advertisers | N/A | ✅ | ✅ | ✅ | ✅ |
| Campaigns | Standard / Priority | ✅ | ✅ (Archive)† | ❌ | ❌ |
| Campaigns | [Old] Standard* | ✅ | ❌ | ❌ | ✅ |
| Orders | Standard / Priority | ✅ | ✅ (Archive)† | ❌ | ❌ |
| Orders | [Old] Standard | ✅ | ❌ | ❌ | ✅ |
| Advertisements | Standard / Priority | ✅ | ✅ (Archive)† | ❌ | ❌ |
| Advertisements | [Old] Standard | ✅ | ❌ | ❌ | ✅ |
| Assets** | Standard / Priority | ✅ | ✅ | ❌ | ❌ |
| Geo Targeting*** | Standard / Priority | ✅ | N/A | N/A | ❌ |
| Episode Topics | Standard / Priority | ✅ | N/A | N/A | ❌ |
| Audience Interests | Standard / Priority | ✅ | N/A | N/A | ❌ |
*"[Old] Standard" refers to campaigns that will end after the sunset date
**Assets to be used for Standard/Priority campaigns
***Geo Targeting includes Countries, Regions, DMAs, Cities, and Postal Codes lookup endpoints. Not applicable to [Old] Standard campaigns. [Old] Standard campaign orders can continue to use the legacy geo endpoints below. †v2 uses PATCH with `status: "archived"` instead of DELETE for Campaigns, Orders, and Advertisements. See migration guide for details.'
contact:
name: Megaphone Support
url: https://support.megaphone.fm/
servers:
- url: https://cms.megaphone.fm
description: Production
security:
- ApiToken: []
tags:
- name: Promo Orders
paths:
/api/organizations/{organization_id}/promos:
get:
tags:
- Promo Orders
summary: List All Promo Orders
description: Returns metadata about all the promo orders you are authorized to access in the Megaphone platform.
operationId: listAllPromoOrders
parameters:
- name: organization_id
in: path
required: true
schema:
type: string
format: uuid
description: ID of the Organization in the form of a UUID
example: 731851fc-9fad-11e6-a338-072240a555ac
- name: updated_since
in: query
required: false
schema:
type: string
description: 'Optional query param that will scope the response to only podcasts that have
been updated since the Date and Time that is provided.
'
example: 2019-11-22T19:44:09+0000
responses:
'200':
description: Success
content:
application/json:
schema:
type: array
items:
type: object
properties:
id:
type: string
format: uuid
createdAt:
type: string
format: date-time
updatedAt:
type: string
format: date-time
title: {}
region:
type: string
scheduledAt:
type: string
format: date-time
impressionsCap:
type: integer
organizationId:
type: string
format: uuid
startAt: {}
endAt: {}
adhash: {}
priority:
type: integer
position:
type: integer
impressionsGoal: {}
revenueCents: {}
revenueCurrency:
type: string
notes: {}
flightTimezone: {}
geotargets:
type: array
items:
type: string
geoexclusions:
type: array
items: {}
geonameIdInclusions:
type: array
items:
type: string
geonameIdExclusions:
type: array
items: {}
state:
type: string
audioStatus:
type: string
copyNeeded:
type: boolean
promoCode: {}
vanityUrl: {}
targets:
type: array
items:
type: object
properties:
type:
type: string
id:
type: string
format: uuid
promo:
type: boolean
example:
- id: ee2d5bb6-a526-11e6-9164-e3c1235770c1
createdAt: '2016-11-07T20:15:30.465Z'
updatedAt: '2016-11-07T20:15:30.465Z'
title: null
region: all
scheduledAt: '2016-11-07T20:15:30.466Z'
impressionsCap: 0
organizationId: 731851fc-9fad-11e6-a338-072240a555ac
startAt: null
endAt: null
adhash: null
priority: 1
position: 1
impressionsGoal: null
revenueCents: null
revenueCurrency: USD
notes: null
flightTimezone: null
geotargets:
- US
geoexclusions: []
geonameIdInclusions:
- '6252001'
geonameIdExclusions: []
state: enabled
audioStatus: needs_audio
copyNeeded: true
promoCode: null
vanityUrl: null
targets:
- type: episode
id: 3fe4881a-a2d1-11e6-8e62-8b11e4f93efb
promo: true
- id: e489be38-a526-11e6-9164-772d8df78c4a
createdAt: '2016-11-07T20:15:14.293Z'
updatedAt: '2016-11-07T20:15:14.293Z'
title: null
region: all
scheduledAt: '2016-11-07T20:15:14.294Z'
impressionsCap: 0
organizationId: 731851fc-9fad-11e6-a338-072240a555ac
startAt: null
endAt: null
adhash: null
priority: 1
position: 1
impressionsGoal: null
revenueCents: null
revenueCurrency: USD
notes: null
flightTimezone: null
geotargets:
- US
geoexclusions: []
geonameIdInclusions:
- '6252001'
geonameIdExclusions: []
state: enabled
audioStatus: needs_audio
copyNeeded: true
promoCode: null
vanityUrl: null
targets:
- type: episode
id: 3fe4881a-a2d1-11e6-8e62-8b11e4f93efb
promo: true
'401':
$ref: '#/components/responses/401'
'403':
$ref: '#/components/responses/403'
'429':
$ref: '#/components/responses/429'
'404':
$ref: '#/components/responses/404'
post:
tags:
- Promo Orders
summary: Create a New Promo Order
description: Create a new promo order by passing in required fields of information into the request body.
operationId: createANewPromoOrder
parameters:
- name: organization_id
in: path
required: true
schema:
type: string
format: uuid
description: ID of the Organization in the form of a UUID
example: 731851fc-9fad-11e6-a338-072240a555ac
- name: updated_since
in: query
required: false
schema:
type: string
description: 'Optional query param that will scope the response to only podcasts that have
been updated since the Date and Time that is provided.
'
example: 2019-11-22T19:44:09+0000
responses:
'200':
description: Success
content:
application/json:
schema:
type: object
properties:
id:
type: string
format: uuid
createdAt:
type: string
format: date-time
updatedAt:
type: string
format: date-time
title:
type: string
region:
type: string
scheduledAt:
type: string
format: date-time
impressionsCap:
type: integer
organizationId:
type: string
format: uuid
startAt:
type: string
format: date-time
endAt:
type: string
format: date-time
adhash:
type: string
priority:
type: integer
position:
type: integer
impressionsGoal: {}
revenueCents: {}
revenueCurrency:
type: string
notes: {}
flightTimezone: {}
geotargets:
type: array
items:
type: string
geoexclusions:
type: array
items: {}
geonameIdInclusions:
type: array
items:
type: string
geonameIdExclusions:
type: array
items: {}
state:
type: string
audioStatus:
type: string
copyNeeded:
type: boolean
promoCode: {}
vanityUrl: {}
targets:
type: array
items:
type: object
properties:
type:
type: string
id:
type: string
format: uuid
promo:
type: boolean
example:
id: bdcad5bc-a6b5-11e6-b1f6-5b0e62100551
createdAt: '2016-11-09T19:50:18.484Z'
updatedAt: '2016-11-09T19:50:18.484Z'
title: New promo title
region: all
scheduledAt: '2016-11-09T19:50:18.484Z'
impressionsCap: 0
organizationId: 731851fc-9fad-11e6-a338-072240a555ac
startAt: '2016-11-07T20:15:14.293Z'
endAt: '2016-12-07T20:15:14.293Z'
adhash: '00122'
priority: 1
position: 1
impressionsGoal: null
revenueCents: null
revenueCurrency: USD
notes: null
flightTimezone: null
geotargets:
- US
geoexclusions: []
geonameIdInclusions:
- '6252001'
geonameIdExclusions: []
state: enabled
audioStatus: needs_audio
copyNeeded: true
promoCode: null
vanityUrl: null
targets:
- type: episode
id: 3fe4881a-a2d1-11e6-8e62-8b11e4f93efb
- type: podcast
id: 3ec8458e-a2d1-11e6-8e62-236c02acd07b
promo: true
'401':
$ref: '#/components/responses/401'
'403':
$ref: '#/components/responses/403'
'429':
$ref: '#/components/responses/429'
'422':
$ref: '#/components/responses/422'
/api/organizations/{organization_id}/promos/{id}:
get:
tags:
- Promo Orders
summary: Show a Promo Order
description: Get metadata about a single promo order.
operationId: showAPromoOrder
parameters:
- name: organization_id
in: path
required: true
schema:
type: string
format: uuid
description: ID of the Organization in the form of a UUID
example: 731851fc-9fad-11e6-a338-072240a555ac
- name: id
in: path
required: true
schema:
type: string
format: uuid
description: ID of the Promo in the form of the a UUID
example: bdcad5bc-a6b5-11e6-b1f6-5b0e62100551
responses:
'200':
description: Success
content:
application/json:
schema:
type: object
properties:
id:
type: string
format: uuid
createdAt:
type: string
format: date-time
updatedAt:
type: string
format: date-time
title:
type: string
region:
type: string
scheduledAt:
type: string
format: date-time
impressionsCap:
type: integer
organizationId:
type: string
format: uuid
startAt:
type: string
format: date-time
endAt:
type: string
format: date-time
adhash:
type: string
priority:
type: integer
position:
type: integer
impressionsGoal: {}
revenueCents: {}
revenueCurrency:
type: string
notes: {}
flightTimezone: {}
geotargets:
type: array
items:
type: string
geoexclusions:
type: array
items: {}
geonameIdInclusions:
type: array
items:
type: string
geonameIdExclusions:
type: array
items: {}
state:
type: string
audioStatus:
type: string
copyNeeded:
type: boolean
promoCode: {}
vanityUrl: {}
targets:
type: array
items:
type: object
properties:
type:
type: string
id:
type: string
format: uuid
promo:
type: boolean
example:
id: bdcad5bc-a6b5-11e6-b1f6-5b0e62100551
createdAt: '2016-11-09T19:50:18.484Z'
updatedAt: '2016-11-09T19:50:18.484Z'
title: New promo title
region: all
scheduledAt: '2016-11-09T19:50:18.484Z'
impressionsCap: 0
organizationId: 731851fc-9fad-11e6-a338-072240a555ac
startAt: '2016-11-07T20:15:14.293Z'
endAt: '2016-12-07T20:15:14.293Z'
adhash: '00122'
priority: 1
position: 1
impressionsGoal: null
revenueCents: null
revenueCurrency: USD
notes: null
flightTimezone: null
geotargets:
- US
geoexclusions: []
geonameIdInclusions:
- '6252001'
geonameIdExclusions: []
state: enabled
audioStatus: needs_audio
copyNeeded: true
promoCode: null
vanityUrl: null
targets:
- type: episode
id: 3fe4881a-a2d1-11e6-8e62-8b11e4f93efb
- type: podcast
id: 3ec8458e-a2d1-11e6-8e62-236c02acd07b
promo: true
'401':
$ref: '#/components/responses/401'
'403':
$ref: '#/components/responses/403'
'429':
$ref: '#/components/responses/429'
'404':
$ref: '#/components/responses/404'
put:
tags:
- Promo Orders
summary: Update a Promo Order
description: Update an existing promo order by sending the attributes that you wish to update in the request body.
operationId: updateAPromoOrder
parameters:
- name: organization_id
in: path
required: true
schema:
type: string
format: uuid
description: ID of the Organization in the form of a UUID
example: 731851fc-9fad-11e6-a338-072240a555ac
- name: id
in: path
required: true
schema:
type: string
format: uuid
description: ID of the Promo in the form of the a UUID
example: bdcad5bc-a6b5-11e6-b1f6-5b0e62100551
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
title:
type: string
adhash:
type: string
example:
title: Updated title
adhash: '01112'
responses:
'200':
description: Success
content:
application/json:
schema:
type: object
properties:
id:
type: string
format: uuid
createdAt:
type: string
format: date-time
updatedAt:
type: string
format: date-time
title:
type: string
region:
type: string
scheduledAt:
type: string
format: date-time
impressionsCap:
type: integer
organizationId:
type: string
format: uuid
startAt:
type: string
format: date-time
endAt:
type: string
format: date-time
adhash:
type: string
priority:
type: integer
position:
type: integer
impressionsGoal: {}
revenueCents: {}
revenueCurrency:
type: string
notes: {}
flightTimezone: {}
geotargets:
type: array
items:
type: string
geoexclusions:
type: array
items: {}
geonameIdInclusions:
type: array
items:
type: string
geonameIdExclusions:
type: array
items: {}
state:
type: string
audioStatus:
type: string
copyNeeded:
type: boolean
promoCode: {}
vanityUrl: {}
targets:
type: array
items:
type: object
properties:
type:
type: string
id:
type: string
format: uuid
promo:
type: boolean
example:
id: bdcad5bc-a6b5-11e6-b1f6-5b0e62100551
createdAt: '2016-11-09T19:50:18.484Z'
updatedAt: '2016-11-09T19:54:11.911Z'
title: Updated title
region: all
scheduledAt: '2016-11-09T19:50:18.484Z'
impressionsCap: 0
organizationId: 731851fc-9fad-11e6-a338-072240a555ac
startAt: '2016-11-07T20:15:14.293Z'
endAt: '2016-12-07T20:15:14.293Z'
adhash: '01112'
priority: 1
position: 1
impressionsGoal: null
revenueCents: null
revenueCurrency: USD
notes: null
flightTimezone: null
geotargets:
- US
geoexclusions: []
geonameIdInclusions:
- '6252001'
geonameIdExclusions: []
state: enabled
audioStatus: needs_audio
copyNeeded: true
promoCode: null
vanityUrl: null
targets:
- type: episode
id: 3fe4881a-a2d1-11e6-8e62-8b11e4f93efb
- type: podcast
id: 3ec8458e-a2d1-11e6-8e62-236c02acd07b
promo: true
'401':
$ref: '#/components/responses/401'
'403':
$ref: '#/components/responses/403'
'429':
$ref: '#/components/responses/429'
'422':
$ref: '#/components/responses/422'
'404':
$ref: '#/components/responses/404'
delete:
tags:
- Promo Orders
summary: Delete a Promo Order
description: Remove a promo order from the Megaphone platform.
operationId: deleteAPromoOrder
parameters:
- name: organization_id
in: path
required: true
schema:
type: string
format: uuid
description: ID of the Organization in the form of a UUID
example: 731851fc-9fad-11e6-a338-072240a555ac
- name: id
in: path
required: true
schema:
type: string
format: uuid
description: ID of the Promo in the form of the a UUID
example: bdcad5bc-a6b5-11e6-b1f6-5b0e62100551
responses:
'200':
description: Success
content:
application/json:
schema:
type: object
properties:
success:
type: string
example:
success: Promo with id bdcad5bc-a6b5-11e6-b1f6-5b0e62100551 successfully destroyed
'401':
$ref: '#/components/responses/401'
'403':
$ref: '#/components/responses/403'
'429':
$ref: '#/components/responses/429'
'422':
$ref: '#/components/responses/422'
'404':
$ref: '#/components/responses/404'
components:
responses:
'422':
description: Validation failed. The request body contains invalid or missing fields.
content:
application/json:
schema:
type: object
properties:
errors:
type: object
additionalProperties:
type: array
items:
type: string
example:
title:
- can't be blank
'404':
description: The requested resource was not found.
content:
application/json:
schema:
type: object
properties:
errors:
type: array
items:
type: string
example:
- Not found
'401':
description: Authentication failed. The `Authorization` header is missing or the token is invalid.
content:
application/json:
schema:
type: object
properties:
errors:
type: array
items:
type: string
example:
- Access denied
'429':
description: Rate limit exceeded. The API is limited to 60 requests per minute.
content:
application/json:
schema:
type: object
properties:
errors:
type: array
items:
type: string
example:
- Rate limit exceeded
'403':
description: The token's organization does not have API access, or the user lacks permission for this resource.
content:
application/json:
schema:
type: object
properties:
errors:
type: array
items:
type: string
example:
- Forbidden
securitySchemes:
ApiToken:
type: apiKey
in: header
name: Authorization
description: A Megaphone API token, sent as `Token token="<your-token>"`.
ServiceAuthJwt:
type: http
scheme: bearer
bearerFormat: JWT
description: Spotify service-auth JWT. Internal callers only.