Work with this as data
Every API here is available over the APIs.io API and to AI agents over MCP.
MCP server
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
Tools for apis
7 MCP tools reach this
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.
Call it yourself
curl for this page
This API
curl "https://apis.io/api/v1/apis/trybloom:trybloom-videos-api"
All apis
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.
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.
A second provider on the same verified email joins the account you already have.
OpenAPI Specification
openapi: 3.2.0
info:
title: Rainbrand Videos API
version: 1.0.0
description: Retrieve and manage video files.
servers:
- url: https://www.rainbrand.com/api/v1
security:
- apiKey: []
- bearer: []
- oauth: []
tags:
- name: Videos
description: Retrieve and manage video files.
paths:
/videos:
get:
operationId: videos.list
summary: List videos
description: List videos across your brands, newest first.
tags:
- Videos
parameters:
- name: brandSessionId
in: query
schema:
type: string
format: uuid
description: Only this brand.
allowEmptyValue: true
allowReserved: true
- name: workspaceId
in: query
schema:
type: string
description: Only this workspace.
allowEmptyValue: true
allowReserved: true
- name: source
in: query
schema:
enum:
- uploaded
- scraped
- generated
type: string
description: Only files from this source.
allowEmptyValue: true
allowReserved: true
- name: inLibrary
in: query
schema:
enum:
- 'true'
- 'false'
type: string
description: Only files in (true) or not in (false) the Library.
allowEmptyValue: true
allowReserved: true
- name: limit
in: query
schema:
type: integer
minimum: 1
maximum: 100
default: 50
description: Results per page (1–100, default 50)
allowEmptyValue: true
allowReserved: true
- name: cursor
in: query
schema:
type: string
description: Pagination cursor from a previous response's nextCursor
allowEmptyValue: true
allowReserved: true
responses:
'200':
description: OK
content:
application/json:
schema:
type: object
properties:
data:
type: object
properties:
items:
type: array
items:
type: object
properties:
id:
type: string
format: uuid
description: Media ID.
type:
type: string
description: 'Media family: image, video, or audio. More values may be added.'
source:
type: string
description: 'How the file entered Rainbrand: uploaded, scraped (collected from a brand source), or generated. More values may be added.'
brandSessionId:
type: string
format: uuid
description: Brand that owns the file.
workspaceId:
anyOf:
- type: string
- type: 'null'
description: Workspace that owns the brand. Null for a personal workspace.
mimeType:
type: string
description: The file's MIME type.
url:
type: string
format: uri
description: Stable link to the file. Stops working when the file is deleted.
fileSize:
type: integer
minimum: 0
maximum: 9007199254740991
description: Size in bytes.
durationMs:
anyOf:
- type: integer
minimum: -9007199254740991
maximum: 9007199254740991
- type: 'null'
description: Duration in milliseconds, when known.
width:
anyOf:
- type: integer
minimum: -9007199254740991
maximum: 9007199254740991
- type: 'null'
description: Width in pixels, when known.
height:
anyOf:
- type: integer
minimum: -9007199254740991
maximum: 9007199254740991
- type: 'null'
description: Height in pixels, when known.
description:
anyOf:
- type: string
- type: 'null'
description: Description of the file's contents, when Rainbrand has one.
inLibrary:
type: boolean
description: Whether the file is in its brand's Library.
addedToLibraryAt:
anyOf:
- type: string
format: date-time
- type: 'null'
description: When the file was added to the Library, or null.
generationId:
anyOf:
- type: string
format: uuid
- type: 'null'
description: Generation that produced the file, or null.
createdAt:
type: string
format: date-time
description: When the file was stored.
required:
- id
- type
- source
- brandSessionId
- workspaceId
- mimeType
- url
- fileSize
- durationMs
- width
- height
- description
- inLibrary
- addedToLibraryAt
- generationId
- createdAt
nextCursor:
anyOf:
- type: string
- type: 'null'
hasMore:
type: boolean
required:
- items
- nextCursor
- hasMore
required:
- data
example:
data:
items:
- id: 4c880cf7-9297-482c-9b10-5e5a72cd6241
type: video
source: generated
brandSessionId: e6220a5e-4a68-4d39-8bb9-5105e9a3a164
workspaceId: null
mimeType: video/mp4
url: https://assets.acme.com/atlas-pro/launch.mp4
fileSize: 4200000
durationMs: 8000
width: 1920
height: 1080
description: Atlas Pro launch film.
inLibrary: true
addedToLibraryAt: '2026-10-24T09:00:00.000Z'
generationId: null
createdAt: '2026-10-24T09:00:00.000Z'
nextCursor: null
hasMore: false
'401':
description: '401'
content:
application/json:
schema:
$ref: '#/components/schemas/VideosList401ErrorResponse'
'403':
description: '403'
content:
application/json:
schema:
$ref: '#/components/schemas/VideosList403ErrorResponse'
'429':
description: '429'
content:
application/json:
schema:
$ref: '#/components/schemas/VideosList429ErrorResponse'
headers:
Retry-After:
description: Seconds until the applicable request or operation limit resets. Present when the limiter can calculate the delay.
schema:
type: integer
minimum: 0
x-codeSamples:
- lang: bash
label: cURL
source: "curl --request GET \\\n --url 'https://www.rainbrand.com/api/v1/videos' \\\n --header \"x-api-key: $RAINBRAND_API_KEY\""
/videos/{id}:
get:
operationId: videos.get
summary: Get a video file
description: Read one video file by media ID.
tags:
- Videos
parameters:
- name: id
in: path
required: true
schema:
type: string
format: uuid
description: Media ID.
example: 4c880cf7-9297-482c-9b10-5e5a72cd6241
example: 4c880cf7-9297-482c-9b10-5e5a72cd6241
responses:
'200':
description: OK
content:
application/json:
schema:
type: object
properties:
data:
type: object
properties:
id:
type: string
format: uuid
description: Media ID.
type:
type: string
description: 'Media family: image, video, or audio. More values may be added.'
source:
type: string
description: 'How the file entered Rainbrand: uploaded, scraped (collected from a brand source), or generated. More values may be added.'
brandSessionId:
type: string
format: uuid
description: Brand that owns the file.
workspaceId:
anyOf:
- type: string
- type: 'null'
description: Workspace that owns the brand. Null for a personal workspace.
mimeType:
type: string
description: The file's MIME type.
url:
type: string
format: uri
description: Stable link to the file. Stops working when the file is deleted.
fileSize:
type: integer
minimum: 0
maximum: 9007199254740991
description: Size in bytes.
durationMs:
anyOf:
- type: integer
minimum: -9007199254740991
maximum: 9007199254740991
- type: 'null'
description: Duration in milliseconds, when known.
width:
anyOf:
- type: integer
minimum: -9007199254740991
maximum: 9007199254740991
- type: 'null'
description: Width in pixels, when known.
height:
anyOf:
- type: integer
minimum: -9007199254740991
maximum: 9007199254740991
- type: 'null'
description: Height in pixels, when known.
description:
anyOf:
- type: string
- type: 'null'
description: Description of the file's contents, when Rainbrand has one.
inLibrary:
type: boolean
description: Whether the file is in its brand's Library.
addedToLibraryAt:
anyOf:
- type: string
format: date-time
- type: 'null'
description: When the file was added to the Library, or null.
generationId:
anyOf:
- type: string
format: uuid
- type: 'null'
description: Generation that produced the file, or null.
createdAt:
type: string
format: date-time
description: When the file was stored.
required:
- id
- type
- source
- brandSessionId
- workspaceId
- mimeType
- url
- fileSize
- durationMs
- width
- height
- description
- inLibrary
- addedToLibraryAt
- generationId
- createdAt
required:
- data
example:
data:
id: 4c880cf7-9297-482c-9b10-5e5a72cd6241
type: video
source: generated
brandSessionId: e6220a5e-4a68-4d39-8bb9-5105e9a3a164
workspaceId: null
mimeType: video/mp4
url: https://assets.acme.com/atlas-pro/launch.mp4
fileSize: 4200000
durationMs: 8000
width: 1920
height: 1080
description: Atlas Pro launch film.
inLibrary: true
addedToLibraryAt: '2026-10-24T09:00:00.000Z'
generationId: null
createdAt: '2026-10-24T09:00:00.000Z'
'401':
description: '401'
content:
application/json:
schema:
$ref: '#/components/schemas/VideosGet401ErrorResponse'
'403':
description: '403'
content:
application/json:
schema:
$ref: '#/components/schemas/VideosGet403ErrorResponse'
'404':
description: '404'
content:
application/json:
schema:
$ref: '#/components/schemas/VideosGet404ErrorResponse'
'429':
description: '429'
content:
application/json:
schema:
$ref: '#/components/schemas/VideosGet429ErrorResponse'
headers:
Retry-After:
description: Seconds until the applicable request or operation limit resets. Present when the limiter can calculate the delay.
schema:
type: integer
minimum: 0
x-codeSamples:
- lang: bash
label: cURL
source: "curl --request GET \\\n --url 'https://www.rainbrand.com/api/v1/videos/4c880cf7-9297-482c-9b10-5e5a72cd6241' \\\n --header \"x-api-key: $RAINBRAND_API_KEY\""
delete:
operationId: videos.delete
summary: Delete a video file
description: Permanently delete one video file. This cannot be undone.
tags:
- Videos
parameters:
- name: id
in: path
required: true
schema:
type: string
format: uuid
description: Media ID.
example: 4c880cf7-9297-482c-9b10-5e5a72cd6241
example: 4c880cf7-9297-482c-9b10-5e5a72cd6241
responses:
'200':
description: OK
content:
application/json:
schema:
type: object
properties:
data:
type: object
properties:
id:
type: string
format: uuid
deleted:
const: true
required:
- id
- deleted
required:
- data
example:
data:
id: 4c880cf7-9297-482c-9b10-5e5a72cd6241
deleted: true
'401':
description: '401'
content:
application/json:
schema:
$ref: '#/components/schemas/VideosDelete401ErrorResponse'
'403':
description: '403'
content:
application/json:
schema:
$ref: '#/components/schemas/VideosDelete403ErrorResponse'
'404':
description: '404'
content:
application/json:
schema:
$ref: '#/components/schemas/VideosDelete404ErrorResponse'
'429':
description: '429'
content:
application/json:
schema:
$ref: '#/components/schemas/VideosDelete429ErrorResponse'
headers:
Retry-After:
description: Seconds until the applicable request or operation limit resets. Present when the limiter can calculate the delay.
schema:
type: integer
minimum: 0
x-codeSamples:
- lang: bash
label: cURL
source: "curl --request DELETE \\\n --url 'https://www.rainbrand.com/api/v1/videos/4c880cf7-9297-482c-9b10-5e5a72cd6241' \\\n --header \"x-api-key: $RAINBRAND_API_KEY\""
components:
schemas:
VideosDelete429ErrorResponse:
type: object
properties:
error:
allOf:
- $ref: '#/components/schemas/ApiError'
- anyOf:
- type: object
properties:
code:
const: TOO_MANY_REQUESTS
status:
const: 429
message:
type: string
default: Rate limit exceeded
data: {}
required:
- code
- status
- message
- type: object
properties:
code:
type: string
status:
type: integer
message:
type: string
data: {}
required:
- code
- status
- message
required:
- error
ApiError:
type: object
properties:
code:
type: string
status:
type: integer
message:
type: string
data: {}
required:
- code
- status
- message
VideosGet429ErrorResponse:
type: object
properties:
error:
allOf:
- $ref: '#/components/schemas/ApiError'
- anyOf:
- type: object
properties:
code:
const: TOO_MANY_REQUESTS
status:
const: 429
message:
type: string
default: Rate limit exceeded
data: {}
required:
- code
- status
- message
- type: object
properties:
code:
type: string
status:
type: integer
message:
type: string
data: {}
required:
- code
- status
- message
required:
- error
VideosGet404ErrorResponse:
type: object
properties:
error:
allOf:
- $ref: '#/components/schemas/ApiError'
- anyOf:
- type: object
properties:
code:
const: MEDIA_NOT_FOUND
status:
const: 404
message:
type: string
default: Video not found
data: {}
required:
- code
- status
- message
- type: object
properties:
code:
type: string
status:
type: integer
message:
type: string
data: {}
required:
- code
- status
- message
required:
- error
VideosList429ErrorResponse:
type: object
properties:
error:
allOf:
- $ref: '#/components/schemas/ApiError'
- anyOf:
- type: object
properties:
code:
const: TOO_MANY_REQUESTS
status:
const: 429
message:
type: string
default: Rate limit exceeded
data: {}
required:
- code
- status
- message
- type: object
properties:
code:
type: string
status:
type: integer
message:
type: string
data: {}
required:
- code
- status
- message
required:
- error
VideosDelete401ErrorResponse:
type: object
properties:
error:
allOf:
- $ref: '#/components/schemas/ApiError'
- anyOf:
- type: object
properties:
code:
const: UNAUTHORIZED
status:
const: 401
message:
type: string
default: Invalid or missing API credentials
data: {}
required:
- code
- status
- message
- type: object
properties:
code:
type: string
status:
type: integer
message:
type: string
data: {}
required:
- code
- status
- message
required:
- error
VideosList403ErrorResponse:
type: object
properties:
error:
allOf:
- $ref: '#/components/schemas/ApiError'
- anyOf:
- type: object
properties:
code:
const: ACCOUNT_BANNED
status:
const: 403
message:
type: string
default: This account has been suspended.
data: {}
required:
- code
- status
- message
- type: object
properties:
code:
const: FORBIDDEN
status:
const: 403
message:
type: string
default: Plan upgrade required
data: {}
required:
- code
- status
- message
- type: object
properties:
code:
const: FEATURE_NOT_AVAILABLE
status:
const: 403
message:
type: string
default: This operation isn't available for this integration.
data: {}
required:
- code
- status
- message
- type: object
properties:
code:
type: string
status:
type: integer
message:
type: string
data: {}
required:
- code
- status
- message
required:
- error
VideosList401ErrorResponse:
type: object
properties:
error:
allOf:
- $ref: '#/components/schemas/ApiError'
- anyOf:
- type: object
properties:
code:
const: UNAUTHORIZED
status:
const: 401
message:
type: string
default: Invalid or missing API credentials
data: {}
required:
- code
- status
- message
- type: object
properties:
code:
type: string
status:
type: integer
message:
type: string
data: {}
required:
- code
- status
- message
required:
- error
VideosGet403ErrorResponse:
type: object
properties:
error:
allOf:
- $ref: '#/components/schemas/ApiError'
- anyOf:
- type: object
properties:
code:
const: ACCOUNT_BANNED
status:
const: 403
message:
type: string
default: This account has been suspended.
data: {}
required:
- code
- status
- message
- type: object
properties:
code:
const: FORBIDDEN
status:
const: 403
message:
type: string
default: Plan upgrade required
data: {}
required:
- code
- status
- message
- type: object
properties:
code:
const: FEATURE_NOT_AVAILABLE
status:
const: 403
message:
type: string
default: This operation isn't available for this integration.
data: {}
required:
- code
- status
- message
- type: object
properties:
code:
type: string
status:
type: integer
message:
type: string
data: {}
required:
- code
- status
- message
required:
- error
VideosDelete404ErrorResponse:
type: object
properties:
error:
allOf:
- $ref: '#/components/schemas/ApiError'
- anyOf:
- type: object
properties:
code:
const: MEDIA_NOT_FOUND
status:
const: 404
message:
type: string
default: Video not found
data: {}
required:
- code
- status
- message
- type: object
properties:
code:
type: string
status:
type: integer
message:
type: string
data: {}
required:
- code
- status
- message
required:
- error
VideosDelete403ErrorResponse:
type: object
properties:
error:
allOf:
- $ref: '#/components/schemas/ApiError'
- anyOf:
- type: object
properties:
code:
const: ACCOUNT_BANNED
status:
const: 403
message:
type: string
default: This account has been suspended.
data: {}
required:
- code
- status
- message
- type: object
properties:
code:
const: FORBIDDEN
status:
const: 403
message:
type: string
default: Plan upgrade required
data: {}
required:
- code
- status
- message
- type: object
properties:
code:
const: FEATURE_NOT_AVAILABLE
status:
const: 403
message:
type: string
default: This operation isn't available for this integration.
data: {}
required:
- code
- status
- message
- type: object
properties:
code:
type: string
status:
type: integer
message:
type: string
data: {}
required:
- code
- status
- message
required:
- error
VideosGet401ErrorResponse:
type: object
properties:
error:
allOf:
- $ref: '#/components/schemas/ApiError'
- anyOf:
- type: object
properties:
code:
const: UNAUTHORIZED
status:
const: 401
message:
type: string
default: Invalid or missing API credentials
data: {}
required:
- code
- status
- message
- type: object
properties:
code:
type: string
status:
type: integer
message:
type: string
data: {}
required:
- code
- status
- message
required:
- error
securitySchemes:
apiKey:
type: apiKey
in: header
name: x-api-key
description: 'Rainbrand API key, for example `x-api-key: bloom_sk_...`.'
bearer:
type: http
scheme: bearer
description: Rainbrand API key (`Bearer bloom_sk_...`) or Rainbrand OAuth access token.
oauth:
type: oauth2
description: Authorization Code with PKCE S256. See [Authentication](https://docs.rainbrand.com/api/authentication).
flows:
authorizationCode:
authorizationUrl: https://www.rainbrand.com/api/auth/oauth2/authorize
tokenUrl: https://www.rainbrand.com/api/auth/oauth2/token
scopes:
openid: Authenticate the user's identity with OpenID Connect.
offline_access: Request a refresh token for access when the user is offline.