openapi: 3.0.3 info: title: FastPix API version: '1.0' description: >- FastPix is a developer-first video platform providing APIs for video on-demand (upload, ingest, encode, playback), live streaming, simulcasting, secure playback with signing keys and DRM, in-video AI (transcription, summaries, chapters, moderation, named entities), and video data / views analytics. All endpoints are served under the versioned base URL and secured with HTTP Basic authentication using an Access Token ID (username) and Secret Key (password) generated in the FastPix dashboard. contact: name: FastPix url: https://www.fastpix.io x-logo: url: https://kinlane-images.s3.amazonaws.com/shared/apis-json/apis-json-logo.jpg servers: - url: https://api.fastpix.io/v1 description: FastPix production API security: - basicAuth: [] tags: - name: On-Demand description: Upload, import, manage, and encode video-on-demand media. - name: Live Streaming description: Create and manage live streams and their playback. - name: Simulcast description: Restream a live stream to third-party RTMP destinations. - name: Playback description: Manage playback IDs for media and live streams. - name: Signing Keys description: Manage keys used to sign JWTs for secure, tokenized playback. - name: DRM description: Retrieve DRM configurations for protected playback. - name: In-Video AI description: AI-driven media enrichment - summaries, chapters, moderation, named entities, subtitles. - name: Data description: Video views, metrics, dimensions, errors, and timeseries analytics. paths: /on-demand: post: tags: [On-Demand] operationId: createMedia summary: Create media from a URL description: Creates a new on-demand media asset by importing a publicly accessible video file URL. requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CreateMediaRequest' responses: '201': description: Media created content: application/json: schema: $ref: '#/components/schemas/MediaResponse' get: tags: [On-Demand] operationId: listMedia summary: List all media parameters: - name: limit in: query schema: { type: integer, default: 20 } - name: offset in: query schema: { type: integer, default: 1 } responses: '200': description: A list of media assets content: application/json: schema: $ref: '#/components/schemas/MediaListResponse' /on-demand/upload: post: tags: [On-Demand] operationId: createUpload summary: Upload media from a device description: Requests a signed URL for a direct, resumable device upload of a video file. requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CreateUploadRequest' responses: '201': description: Signed upload URL created content: application/json: schema: $ref: '#/components/schemas/UploadResponse' /on-demand/uploads: get: tags: [On-Demand] operationId: listUploads summary: List unused upload URLs responses: '200': { description: A list of unused uploads } /on-demand/upload/{uploadId}: put: tags: [On-Demand] operationId: cancelUpload summary: Cancel an in-progress upload parameters: - { name: uploadId, in: path, required: true, schema: { type: string } } responses: '200': { description: Upload cancelled } /on-demand/{mediaId}: get: tags: [On-Demand] operationId: getMedia summary: Get a media asset by ID parameters: - { name: mediaId, in: path, required: true, schema: { type: string } } responses: '200': description: The media asset content: application/json: schema: $ref: '#/components/schemas/MediaResponse' patch: tags: [On-Demand] operationId: updateMedia summary: Update a media asset description: >- Updates media metadata and enrichment flags. Used to enable in-video AI features such as summary, chapters, named entities, and moderation. parameters: - { name: mediaId, in: path, required: true, schema: { type: string } } requestBody: content: application/json: schema: $ref: '#/components/schemas/UpdateMediaRequest' responses: '200': { description: Updated media asset } delete: tags: [On-Demand] operationId: deleteMedia summary: Delete a media asset parameters: - { name: mediaId, in: path, required: true, schema: { type: string } } responses: '200': { description: Media deleted } /on-demand/{mediaId}/media-clips: get: tags: [On-Demand] operationId: listMediaClips summary: List clips generated from a media asset parameters: - { name: mediaId, in: path, required: true, schema: { type: string } } responses: '200': { description: A list of clips } /on-demand/{mediaId}/source: patch: tags: [On-Demand] operationId: updateSourceAccess summary: Update source access for a media asset parameters: - { name: mediaId, in: path, required: true, schema: { type: string } } responses: '200': { description: Source access updated } /on-demand/{mediaId}/update-mp4Support: patch: tags: [On-Demand] operationId: updateMp4Support summary: Enable or update MP4 downloads for a media asset parameters: - { name: mediaId, in: path, required: true, schema: { type: string } } responses: '200': { description: MP4 support updated } /on-demand/{mediaId}/tracks: post: tags: [On-Demand] operationId: addMediaTrack summary: Add an audio or subtitle track to a media asset parameters: - { name: mediaId, in: path, required: true, schema: { type: string } } responses: '201': { description: Track added } /on-demand/{mediaId}/tracks/{trackId}: patch: tags: [On-Demand] operationId: updateMediaTrack summary: Update a media track parameters: - { name: mediaId, in: path, required: true, schema: { type: string } } - { name: trackId, in: path, required: true, schema: { type: string } } responses: '200': { description: Track updated } delete: tags: [On-Demand] operationId: deleteMediaTrack summary: Delete a media track parameters: - { name: mediaId, in: path, required: true, schema: { type: string } } - { name: trackId, in: path, required: true, schema: { type: string } } responses: '200': { description: Track deleted } /on-demand/{mediaId}/tracks/{trackId}/generate-subtitle: post: tags: [In-Video AI] operationId: generateSubtitleTrack summary: Generate a subtitle track from an audio track parameters: - { name: mediaId, in: path, required: true, schema: { type: string } } - { name: trackId, in: path, required: true, schema: { type: string } } responses: '201': { description: Subtitle track generation started } /live/streams: post: tags: [Live Streaming] operationId: createStream summary: Create a new live stream requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CreateStreamRequest' responses: '201': description: Live stream created content: application/json: schema: $ref: '#/components/schemas/StreamResponse' get: tags: [Live Streaming] operationId: listStreams summary: List all live streams responses: '200': { description: A list of live streams } /live/streams/{streamId}: get: tags: [Live Streaming] operationId: getStream summary: Get a live stream by ID parameters: - { name: streamId, in: path, required: true, schema: { type: string } } responses: '200': description: The live stream content: application/json: schema: $ref: '#/components/schemas/StreamResponse' patch: tags: [Live Streaming] operationId: updateStream summary: Update a live stream parameters: - { name: streamId, in: path, required: true, schema: { type: string } } responses: '200': { description: Live stream updated } delete: tags: [Live Streaming] operationId: deleteStream summary: Delete a live stream parameters: - { name: streamId, in: path, required: true, schema: { type: string } } responses: '200': { description: Live stream deleted } /live/streams/{streamId}/live-clips: get: tags: [Live Streaming] operationId: listLiveClips summary: List clips generated from a live stream parameters: - { name: streamId, in: path, required: true, schema: { type: string } } responses: '200': { description: A list of live clips } /live/streams/{streamId}/playback-ids: post: tags: [Playback] operationId: createStreamPlaybackId summary: Create a playback ID for a live stream parameters: - { name: streamId, in: path, required: true, schema: { type: string } } responses: '201': { description: Playback ID created } /live/streams/{streamId}/playback-ids/{playbackId}: get: tags: [Playback] operationId: getStreamPlaybackId summary: Get a live stream playback ID parameters: - { name: streamId, in: path, required: true, schema: { type: string } } - { name: playbackId, in: path, required: true, schema: { type: string } } responses: '200': { description: Playback ID details } delete: tags: [Playback] operationId: deleteStreamPlaybackId summary: Delete a live stream playback ID parameters: - { name: streamId, in: path, required: true, schema: { type: string } } - { name: playbackId, in: path, required: true, schema: { type: string } } responses: '200': { description: Playback ID deleted } /live/streams/{streamId}/simulcast: post: tags: [Simulcast] operationId: createSimulcast summary: Create a simulcast target for a live stream parameters: - { name: streamId, in: path, required: true, schema: { type: string } } requestBody: content: application/json: schema: $ref: '#/components/schemas/CreateSimulcastRequest' responses: '201': { description: Simulcast created } /live/streams/{streamId}/simulcast/{simulcastId}: get: tags: [Simulcast] operationId: getSimulcast summary: Get a simulcast target parameters: - { name: streamId, in: path, required: true, schema: { type: string } } - { name: simulcastId, in: path, required: true, schema: { type: string } } responses: '200': { description: Simulcast details } patch: tags: [Simulcast] operationId: updateSimulcast summary: Enable or disable a simulcast target parameters: - { name: streamId, in: path, required: true, schema: { type: string } } - { name: simulcastId, in: path, required: true, schema: { type: string } } responses: '200': { description: Simulcast updated } delete: tags: [Simulcast] operationId: deleteSimulcast summary: Delete a simulcast target parameters: - { name: streamId, in: path, required: true, schema: { type: string } } - { name: simulcastId, in: path, required: true, schema: { type: string } } responses: '200': { description: Simulcast deleted } /security/signing-keys: post: tags: [Signing Keys] operationId: createSigningKey summary: Create a new signing key description: Generates an RSA key pair used to sign JWTs for tokenized, secure playback. responses: '201': description: Signing key created content: application/json: schema: $ref: '#/components/schemas/SigningKeyResponse' get: tags: [Signing Keys] operationId: listSigningKeys summary: List all signing keys responses: '200': { description: A list of signing keys } /security/signing-keys/{signingKeyId}: get: tags: [Signing Keys] operationId: getSigningKey summary: Get a signing key by ID parameters: - { name: signingKeyId, in: path, required: true, schema: { type: string } } responses: '200': { description: Signing key details } delete: tags: [Signing Keys] operationId: deleteSigningKey summary: Delete a signing key parameters: - { name: signingKeyId, in: path, required: true, schema: { type: string } } responses: '200': { description: Signing key deleted } /on-demand/drm-configurations: get: tags: [DRM] operationId: listDrmConfigurations summary: List DRM configurations responses: '200': { description: A list of DRM configurations } /on-demand/drm-configurations/{drmConfigurationId}: get: tags: [DRM] operationId: getDrmConfiguration summary: Get a DRM configuration by ID parameters: - { name: drmConfigurationId, in: path, required: true, schema: { type: string } } responses: '200': { description: DRM configuration details } /data/dimensions: get: tags: [Data] operationId: listDimensions summary: List available viewer/session dimensions responses: '200': { description: A list of dimensions } /data/dimensions/{dimensionId}: get: tags: [Data] operationId: listDimensionValues summary: List values for a dimension parameters: - { name: dimensionId, in: path, required: true, schema: { type: string } } responses: '200': { description: A list of dimension values } /data/views: get: tags: [Data] operationId: listVideoViews summary: List video views responses: '200': description: A list of video views content: application/json: schema: $ref: '#/components/schemas/ViewsListResponse' /data/views/{viewId}: get: tags: [Data] operationId: getVideoView summary: Get details for a single video view parameters: - { name: viewId, in: path, required: true, schema: { type: string } } responses: '200': { description: Video view details } /data/errors: get: tags: [Data] operationId: listErrors summary: List playback errors responses: '200': { description: A list of errors } /data/metrics/timeseries/{metricId}: get: tags: [Data] operationId: getTimeseriesData summary: Get timeseries data for a metric parameters: - { name: metricId, in: path, required: true, schema: { type: string } } responses: '200': { description: Timeseries data points } /data/metrics/breakdown/{metricId}: get: tags: [Data] operationId: getMetricBreakdown summary: Get a metric broken down by a dimension parameters: - { name: metricId, in: path, required: true, schema: { type: string } } responses: '200': { description: Breakdown values } /data/metrics/overall/{metricId}: get: tags: [Data] operationId: getOverallMetric summary: Get overall values for a metric parameters: - { name: metricId, in: path, required: true, schema: { type: string } } responses: '200': { description: Overall metric values } components: securitySchemes: basicAuth: type: http scheme: basic description: >- HTTP Basic authentication. Use your FastPix Access Token ID as the username and your Secret Key as the password. schemas: CreateMediaRequest: type: object required: [inputs] properties: inputs: type: array items: type: object properties: type: { type: string, example: video } url: { type: string, format: uri, example: 'https://static.fastpix.io/sample.mp4' } metadata: type: object additionalProperties: { type: string } accessPolicy: { type: string, enum: [public, private, drm], example: public } maxResolution: { type: string, enum: ['480p', '720p', '1080p', '1440p', '2160p'], example: '1080p' } mp4Support: { type: string, enum: [none, capped_4k, audioOnly], example: none } CreateUploadRequest: type: object properties: corsOrigin: { type: string, example: '*' } pushMediaSettings: type: object properties: accessPolicy: { type: string, enum: [public, private, drm] } maxResolution: { type: string } UploadResponse: type: object properties: success: { type: boolean } data: type: object properties: uploadId: { type: string } url: { type: string, format: uri } MediaResponse: type: object properties: success: { type: boolean } data: $ref: '#/components/schemas/Media' MediaListResponse: type: object properties: success: { type: boolean } data: type: array items: $ref: '#/components/schemas/Media' Media: type: object properties: id: { type: string } status: { type: string, enum: [preparing, ready, errored], example: ready } createdAt: { type: string, format: date-time } duration: { type: string, example: '00:01:23' } maxResolution: { type: string } sourceResolution: { type: string } aspectRatio: { type: string, example: '16:9' } playbackIds: type: array items: $ref: '#/components/schemas/PlaybackId' metadata: type: object additionalProperties: { type: string } UpdateMediaRequest: type: object properties: metadata: type: object additionalProperties: { type: string } summary: { type: boolean, description: Enable AI-generated summary. } chapters: { type: boolean, description: Enable AI-generated chapters. } namedEntities: { type: boolean, description: Enable named-entity extraction. } moderation: type: object properties: type: { type: string, example: video } PlaybackId: type: object properties: id: { type: string } accessPolicy: { type: string, enum: [public, private, drm] } CreateStreamRequest: type: object properties: playbackSettings: type: object properties: accessPolicy: { type: string, enum: [public, private] } inputMediaSettings: type: object properties: maxResolution: { type: string, example: '1080p' } reconnectWindow: { type: integer, example: 60 } mediaPolicy: { type: string, enum: [public, private] } StreamResponse: type: object properties: success: { type: boolean } data: type: object properties: streamId: { type: string } streamKey: { type: string } srtSecretKey: { type: string } status: { type: string, enum: [idle, active, disabled] } playbackIds: type: array items: $ref: '#/components/schemas/PlaybackId' CreateSimulcastRequest: type: object required: [url, streamKey] properties: url: { type: string, example: 'rtmps://live.example.com:443/app' } streamKey: { type: string } metadata: type: object additionalProperties: { type: string } SigningKeyResponse: type: object properties: success: { type: boolean } data: type: object properties: id: { type: string } privateKey: { type: string, description: Base64-encoded PEM private key (returned once). } createdAt: { type: string, format: date-time } ViewsListResponse: type: object properties: success: { type: boolean } data: type: array items: type: object properties: viewId: { type: string } viewerId: { type: string } playbackId: { type: string } watchTime: { type: integer } bufferingCount: { type: integer } startupTime: { type: integer }