Discovery needs no key. Ratings and market analysis are Pro.
Get an API 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.
openapi: 3.2.0
info:
title: Captivate Media API
version: '1.0'
description: Public REST API for the Captivate podcast hosting, distribution, and analytics platform.
contact:
name: Captivate API Support
email: api@captivate.fm
url: https://docs.captivate.fm/
x-endpoints-source: Paths and request fields confirmed from the public Captivate API Postman collection (docs.captivate.fm). Response bodies are modeled.
servers:
- url: https://api.captivate.fm
description: Captivate production API
security:
- bearerAuth: []
tags:
- name: Media
description: Upload, read, list, and search a show's audio media.
paths:
/media/{id}:
get:
operationId: getMedia
tags:
- Media
summary: Get Media
description: Get the information for this media ID.
parameters:
- $ref: '#/components/parameters/MediaId'
responses:
'200':
description: The media record (modeled).
content:
application/json:
schema:
$ref: '#/components/schemas/GenericObject'
'401':
$ref: '#/components/responses/Unauthorized'
/shows/{id}/media:
post:
operationId: uploadMedia
tags:
- Media
summary: Upload Media
description: Upload a media (audio) file and assign it to the given show ID. Captivate processes the file server-side.
parameters:
- $ref: '#/components/parameters/ShowId'
requestBody:
required: true
content:
multipart/form-data:
schema:
type: object
required:
- file
properties:
file:
type: string
format: binary
description: The audio media file to upload.
responses:
'200':
description: The uploaded media record (modeled).
content:
application/json:
schema:
$ref: '#/components/schemas/GenericObject'
'401':
$ref: '#/components/responses/Unauthorized'
get:
operationId: getShowMedia
tags:
- Media
summary: Get Show Media
description: Get all media for the given show ID. Media cannot be shared across shows, so this is scoped to a single show.
parameters:
- $ref: '#/components/parameters/ShowId'
- name: offset
in: query
schema:
type: integer
default: 0
- name: order
in: query
schema:
type: string
default: created_at
- name: sort
in: query
schema:
type: string
enum:
- ASC
- DESC
default: DESC
responses:
'200':
description: The show's media list (modeled).
content:
application/json:
schema:
$ref: '#/components/schemas/GenericObject'
'401':
$ref: '#/components/responses/Unauthorized'
/shows/{id}/media/search:
get:
operationId: searchShowMedia
tags:
- Media
summary: Search Show Media
description: Search a show's media by media name.
parameters:
- $ref: '#/components/parameters/ShowId'
- name: search
in: query
required: true
schema:
type: string
description: The media name search query.
- name: offset
in: query
schema:
type: integer
default: 0
- name: order
in: query
schema:
type: string
default: created_at
- name: sort
in: query
schema:
type: string
enum:
- ASC
- DESC
default: DESC
responses:
'200':
description: Matching media (modeled).
content:
application/json:
schema:
$ref: '#/components/schemas/GenericObject'
'401':
$ref: '#/components/responses/Unauthorized'
components:
parameters:
ShowId:
name: id
in: path
required: true
description: The show ID (UUID).
schema:
type: string
MediaId:
name: id
in: path
required: true
description: The media ID (UUID).
schema:
type: string
responses:
Unauthorized:
description: Missing or invalid Bearer token.
content:
application/json:
schema:
$ref: '#/components/schemas/GenericObject'
schemas:
GenericObject:
type: object
description: Modeled response object. Captivate's public documentation describes requests and fields but does not publish full JSON response schemas, so response bodies are represented generically.
additionalProperties: true
securitySchemes:
bearerAuth:
type: http
scheme: bearer
description: 'Bearer token obtained from POST /authenticate/token. Sent as Authorization: Bearer {token}.'