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-audio-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 Audio API
version: 1.0.0
description: Retrieve and manage audio files.
servers:
- url: https://www.rainbrand.com/api/v1
security:
- apiKey: []
- bearer: []
- oauth: []
tags:
- name: Audio
description: Retrieve and manage audio files.
paths:
/audio:
get:
operationId: audio.list
summary: List audio files
description: List audio files across your brands, newest first.
tags:
- Audio
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: ad118d28-e741-45a5-b942-b284fb653a77
type: audio
source: generated
brandSessionId: e6220a5e-4a68-4d39-8bb9-5105e9a3a164
workspaceId: null
mimeType: audio/mpeg
url: https://assets.acme.com/atlas-pro/voiceover.mp3
fileSize: 128000
durationMs: 8000
width: null
height: null
description: Atlas Pro launch voiceover.
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/AudioList401ErrorResponse'
'403':
description: '403'
content:
application/json:
schema:
$ref: '#/components/schemas/AudioList403ErrorResponse'
'429':
description: '429'
content:
application/json:
schema:
$ref: '#/components/schemas/AudioList429ErrorResponse'
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/audio' \\\n --header \"x-api-key: $RAINBRAND_API_KEY\""
/audio/{id}:
get:
operationId: audio.get
summary: Get an audio file
description: Read one audio file by media ID.
tags:
- Audio
parameters:
- name: id
in: path
required: true
schema:
type: string
format: uuid
description: Media ID.
example: ad118d28-e741-45a5-b942-b284fb653a77
example: ad118d28-e741-45a5-b942-b284fb653a77
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: ad118d28-e741-45a5-b942-b284fb653a77
type: audio
source: generated
brandSessionId: e6220a5e-4a68-4d39-8bb9-5105e9a3a164
workspaceId: null
mimeType: audio/mpeg
url: https://assets.acme.com/atlas-pro/voiceover.mp3
fileSize: 128000
durationMs: 8000
width: null
height: null
description: Atlas Pro launch voiceover.
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/AudioGet401ErrorResponse'
'403':
description: '403'
content:
application/json:
schema:
$ref: '#/components/schemas/AudioGet403ErrorResponse'
'404':
description: '404'
content:
application/json:
schema:
$ref: '#/components/schemas/AudioGet404ErrorResponse'
'429':
description: '429'
content:
application/json:
schema:
$ref: '#/components/schemas/AudioGet429ErrorResponse'
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/audio/ad118d28-e741-45a5-b942-b284fb653a77' \\\n --header \"x-api-key: $RAINBRAND_API_KEY\""
delete:
operationId: audio.delete
summary: Delete an audio file
description: Permanently delete one audio file. This cannot be undone.
tags:
- Audio
parameters:
- name: id
in: path
required: true
schema:
type: string
format: uuid
description: Media ID.
example: ad118d28-e741-45a5-b942-b284fb653a77
example: ad118d28-e741-45a5-b942-b284fb653a77
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: ad118d28-e741-45a5-b942-b284fb653a77
deleted: true
'401':
description: '401'
content:
application/json:
schema:
$ref: '#/components/schemas/AudioDelete401ErrorResponse'
'403':
description: '403'
content:
application/json:
schema:
$ref: '#/components/schemas/AudioDelete403ErrorResponse'
'404':
description: '404'
content:
application/json:
schema:
$ref: '#/components/schemas/AudioDelete404ErrorResponse'
'429':
description: '429'
content:
application/json:
schema:
$ref: '#/components/schemas/AudioDelete429ErrorResponse'
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/audio/ad118d28-e741-45a5-b942-b284fb653a77' \\\n --header \"x-api-key: $RAINBRAND_API_KEY\""
components:
schemas:
AudioDelete404ErrorResponse:
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: Audio 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
AudioList401ErrorResponse:
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
AudioList429ErrorResponse:
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
AudioDelete403ErrorResponse:
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
AudioDelete429ErrorResponse:
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
AudioGet404ErrorResponse:
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: Audio 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
AudioDelete401ErrorResponse:
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
AudioGet429ErrorResponse:
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
AudioGet403ErrorResponse:
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
AudioGet401ErrorResponse:
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
AudioList403ErrorResponse:
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
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.