Bloom Briefs API
Get brand guidance and selected assets for a specific task.
Get brand guidance and selected assets for a specific task.
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/trybloom:trybloom-briefs-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: Rainbrand Briefs API
version: 1.0.0
description: Get brand guidance and selected assets for a specific task.
servers:
- url: https://www.rainbrand.com/api/v1
security:
- apiKey: []
- bearer: []
- oauth: []
tags:
- name: Briefs
description: Get brand guidance and selected assets for a specific task.
paths:
/briefs:
post:
operationId: briefs.create
summary: Request a Brief
description: Prepare brand guidance and selected assets for a specific task. Retrieve the result with Get a Brief.
tags:
- Briefs
parameters:
- name: idempotency-key
in: header
schema:
type: string
minLength: 1
maxLength: 255
description: Optional key for safely retrying this request. Reuse it only with the same body.
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
brandSessionId:
type: string
format: uuid
description: Brand to prepare the brief from.
task:
type: string
minLength: 1
maxLength: 4000
description: What you are about to make, in plain language. Include any context or instructions that would help select the right brand guidance and files.
required:
- brandSessionId
- task
additionalProperties: false
examples:
- brandSessionId: e6220a5e-4a68-4d39-8bb9-5105e9a3a164
task: A landscape launch image for Acme Inc. Atlas Pro. Center the product and include the headline "Meet Atlas Pro" and the call to action "Explore Atlas Pro".
responses:
'202':
description: OK
content:
application/json:
schema:
type: object
properties:
data:
type: object
properties:
id:
type: string
format: uuid
description: Brief ID.
status:
enum:
- pending
- processing
- completed
- failed
type: string
required:
- id
- status
required:
- data
example:
data:
id: 657bcf79-1f2f-47fa-90f8-9245142980ed
status: pending
'401':
description: '401'
content:
application/json:
schema:
$ref: '#/components/schemas/BriefsCreate401ErrorResponse'
'402':
description: '402'
content:
application/json:
schema:
$ref: '#/components/schemas/BriefsCreate402ErrorResponse'
'403':
description: '403'
content:
application/json:
schema:
$ref: '#/components/schemas/BriefsCreate403ErrorResponse'
'404':
description: '404'
content:
application/json:
schema:
$ref: '#/components/schemas/BriefsCreate404ErrorResponse'
'409':
description: '409'
content:
application/json:
schema:
$ref: '#/components/schemas/BriefsCreate409ErrorResponse'
'429':
description: '429'
content:
application/json:
schema:
$ref: '#/components/schemas/BriefsCreate429ErrorResponse'
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
'500':
description: '500'
content:
application/json:
schema:
$ref: '#/components/schemas/BriefsCreate500ErrorResponse'
x-mint:
href: /api-reference/briefs/request-a-brief
x-codeSamples:
- lang: bash
label: cURL
source: "curl --request POST \\\n --url 'https://www.rainbrand.com/api/v1/briefs' \\\n --header \"x-api-key: $RAINBRAND_API_KEY\" \\\n --header \"Content-Type: application/json\" \\\n --data '{\n \"brandSessionId\": \"e6220a5e-4a68-4d39-8bb9-5105e9a3a164\",\n \"task\": \"A landscape launch image for Acme Inc. Atlas Pro. Center the product and include the headline \\\"Meet Atlas Pro\\\" and the call to action \\\"Explore Atlas Pro\\\".\"\n}'"
/briefs/{id}:
get:
operationId: briefs.get
summary: Get a Brief
description: Get a Brief's current status and, when complete, its Markdown guidance and selected assets.
tags:
- Briefs
parameters:
- name: id
in: path
required: true
schema:
type: string
format: uuid
description: Brief ID.
example: 657bcf79-1f2f-47fa-90f8-9245142980ed
example: 657bcf79-1f2f-47fa-90f8-9245142980ed
- name: wait
in: query
schema:
anyOf:
- type: boolean
- enum:
- '0'
- '1'
- 'true'
- 'false'
type: string
default: false
description: Hold the connection until the resource reaches a terminal status
allowEmptyValue: true
allowReserved: true
- name: timeout
in: query
schema:
type: integer
minimum: 1
maximum: 295
default: 120
description: Max seconds to wait (default 120, max 295)
allowEmptyValue: true
allowReserved: true
responses:
'200':
description: OK
content:
application/json:
schema:
type: object
properties:
data:
type: object
properties:
id:
type: string
format: uuid
description: Brief ID.
status:
enum:
- pending
- processing
- completed
- failed
type: string
description: Current status of the brief.
skillId:
anyOf:
- type: string
format: uuid
- type: 'null'
description: Brand Skill version used to prepare the brief, or null if that version was deleted.
createdAt:
type: string
format: date-time
description: When the brief was requested.
completedAt:
type: string
format: date-time
description: When the brief completed.
guidance:
type: string
description: Brand guidance for the task, in Markdown. Available when completed.
assets:
type: array
items:
type: object
properties:
kind:
enum:
- logo
- image
- font
- font_render
type: string
description: Asset type. A font render is an image preview of a font.
mediaType:
enum:
- image/avif
- image/gif
- image/jpeg
- image/png
- image/svg+xml
- image/webp
- image/x-icon
- font/otf
- font/ttf
- font/woff
- font/woff2
type: string
description: MIME type of the image or font file.
url:
type: string
format: uri
description: Stable Rainbrand asset URL with no scheduled expiry. Redirects to fresh storage access while the completed brief, brand, saved Brand Skill version, and asset remain available. Anyone with this link can access the asset without signing in.
mediaId:
type: string
format: uuid
description: Media ID when the asset is a Library file. Absent for files that live inside the Brand Skill, such as fonts.
required:
- kind
- mediaType
- url
additionalProperties: false
description: Files selected for the task. Available when completed.
error:
type: object
properties:
code:
type: string
description: Error code identifying the failure.
message:
type: string
description: Human-readable explanation of the failure.
retryable:
type: boolean
description: Whether you can retry by creating a new brief with a new idempotency key.
required:
- code
- message
- retryable
description: Failure details. Available when the brief failed.
failedAt:
type: string
format: date-time
description: When the brief failed.
required:
- id
- status
- skillId
- createdAt
required:
- data
example:
data:
id: 657bcf79-1f2f-47fa-90f8-9245142980ed
status: completed
skillId: 6590fb89-c177-45b3-85d4-74ab6b92dc2a
createdAt: '2026-10-24T09:00:00.000Z'
completedAt: '2026-10-24T09:00:30.000Z'
guidance: '# Atlas Pro launch image
Use Acme Inc. yellow #FFD600. Center Atlas Pro with room for the headline "Meet Atlas Pro" and call to action "Explore Atlas Pro".'
assets:
- kind: image
mediaType: image/png
url: https://assets.acme.com/atlas-pro/product.png
'401':
description: '401'
content:
application/json:
schema:
$ref: '#/components/schemas/BriefsGet401ErrorResponse'
'403':
description: '403'
content:
application/json:
schema:
$ref: '#/components/schemas/BriefsGet403ErrorResponse'
'404':
description: '404'
content:
application/json:
schema:
$ref: '#/components/schemas/BriefsGet404ErrorResponse'
'429':
description: '429'
content:
application/json:
schema:
$ref: '#/components/schemas/BriefsGet429ErrorResponse'
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/briefs/657bcf79-1f2f-47fa-90f8-9245142980ed' \\\n --header \"x-api-key: $RAINBRAND_API_KEY\""
components:
schemas:
BriefsGet429ErrorResponse:
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
BriefsGet403ErrorResponse:
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
BriefsCreate402ErrorResponse:
type: object
properties:
error:
allOf:
- $ref: '#/components/schemas/ApiError'
- anyOf:
- type: object
properties:
code:
const: INSUFFICIENT_CREDITS
status:
const: 402
message:
type: string
default: Not enough credits to create a brief
data:
type: object
properties:
action_url:
type: string
format: uri
description: Deep link to /pricing for the caller to top up credits
credits_required:
type: number
description: Credits the refused request needed
balance:
type: number
description: The workspace's credit balance when the request was refused
pricing_version:
type: integer
minimum: -9007199254740991
maximum: 9007199254740991
description: The workspace's pricing version. Credit amounts are comparable only within one version.
required:
- action_url
required:
- code
- status
- message
- data
- type: object
properties:
code:
const: PAYMENT_REQUIRED
status:
const: 402
message:
type: string
default: Subscription paused — complete payment to resume
data:
type: object
properties:
action_url:
type: string
format: uri
description: Deep link to /pricing to complete the pending payment
required:
- action_url
required:
- code
- status
- message
- data
- 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
BriefsCreate409ErrorResponse:
type: object
properties:
error:
allOf:
- $ref: '#/components/schemas/ApiError'
- anyOf:
- type: object
properties:
code:
const: BRAND_SKILL_UNAVAILABLE
status:
const: 409
message:
type: string
default: This brand is not ready for briefs yet
data: {}
required:
- code
- status
- message
- type: object
properties:
code:
const: IDEMPOTENCY_CONFLICT
status:
const: 409
message:
type: string
default: Idempotency-Key was already used with a different request
data: {}
required:
- code
- status
- message
- type: object
properties:
code:
type: string
status:
type: integer
message:
type: string
data: {}
required:
- code
- status
- message
required:
- error
BriefsCreate403ErrorResponse:
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
BriefsGet401ErrorResponse:
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
BriefsCreate500ErrorResponse:
type: object
properties:
error:
allOf:
- $ref: '#/components/schemas/ApiError'
- anyOf:
- type: object
properties:
code:
const: INTERNAL_ERROR
status:
const: 500
message:
type: string
default: Failed to create brief
data: {}
required:
- code
- status
- message
- type: object
properties:
code:
type: string
status:
type: integer
message:
type: string
data: {}
required:
- code
- status
- message
required:
- error
BriefsCreate401ErrorResponse:
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
BriefsGet404ErrorResponse:
type: object
properties:
error:
allOf:
- $ref: '#/components/schemas/ApiError'
- anyOf:
- type: object
properties:
code:
const: BRIEF_NOT_FOUND
status:
const: 404
message:
type: string
default: Brief not found
data: {}
required:
- code
- status
- message
- type: object
properties:
code:
const: BRAND_NOT_FOUND
status:
const: 404
message:
type: string
default: Brand 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
BriefsCreate429ErrorResponse:
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:
const: ACTIVE_BRIEF_LIMIT_REACHED
status:
const: 429
message:
type: string
default: Too many briefs are already running
data: {}
required:
- code
- status
- message
- type: object
properties:
code:
type: string
status:
type: integer
message:
type: string
data: {}
required:
- code
- status
- message
required:
- error
BriefsCreate404ErrorResponse:
type: object
properties:
error:
allOf:
- $ref: '#/components/schemas/ApiError'
- anyOf:
- type: object
properties:
code:
const: BRAND_NOT_FOUND
status:
const: 404
message:
type: string
default: Brand 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
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.