Bloom Uploads API
Stage private local files for brand sources, the Library, and other supported operations.
Stage private local files for brand sources, the Library, and other supported operations.
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-uploads-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 Uploads API
version: 1.0.0
description: Stage private local files for brand sources, the Library, and other supported operations.
servers:
- url: https://www.rainbrand.com/api/v1
security:
- apiKey: []
- bearer: []
- oauth: []
tags:
- name: Uploads
description: Stage private local files for brand sources, the Library, and other supported operations.
paths:
/uploads:
post:
operationId: uploads.create
summary: Upload files
description: 'Make local files available to Rainbrand requests, such as Acme Inc.''s brand guide or an Atlas Pro product photo.
This endpoint reserves storage and returns an `uploadUrl` for each file. Send each file''s raw bytes with `PUT` to its `uploadUrl`, using the returned `headers`.
Once the upload is complete, use `uploadId` to:
- Supply file sources when you add a brand or prepare a Brand Edit.
- Save media in a Brand Library for reuse.
- Upload a custom brand font.
- Request a Review of an image or provide supporting images.
For generation requests, pass the returned `url` where the model''s input schema expects a file URL. Set `contentType` on this upload request to match the file. The `uploadUrl` is only for sending the bytes.
Uploads are temporary and expire at `expiresAt`. Uploading alone does not add the file to a brand or its Library.'
tags:
- Uploads
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
workspaceId:
type: string
minLength: 1
description: Team ID from GET /workspaces. Omit for your personal account.
files:
type: array
minItems: 1
maxItems: 30
items:
type: object
properties:
filename:
type: string
minLength: 1
maxLength: 240
description: Original filename used when the upload is consumed
byteLength:
type: integer
minimum: -9007199254740991
maximum: 104857600
exclusiveMinimum: 0
description: Exact file size in bytes
contentType:
type: string
maxLength: 255
description: 'The file''s MIME type, such as image/png. Set it before passing the upload''s url to a model, so the file is served with that type. Supported types are kept: PNG, JPEG, WebP, AVIF, GIF, SVG, MP4, WebM, MOV, MP3, WAV, OGG, FLAC, AAC, M4A, and PDF. Others, or none, are stored as application/octet-stream.'
required:
- filename
- byteLength
additionalProperties: false
description: Local files to stage (1–30, at most 100 MiB each and 256 MiB combined)
required:
- files
additionalProperties: false
examples:
- files:
- filename: atlas-pro-front.png
byteLength: 1458200
contentType: image/png
responses:
'201':
description: OK
content:
application/json:
schema:
type: object
properties:
data:
type: object
properties:
uploads:
type: array
items:
type: object
properties:
uploadId:
type: string
format: uuid
filename:
type: string
byteLength:
type: integer
minimum: -9007199254740991
maximum: 9007199254740991
exclusiveMinimum: 0
uploadUrl:
type: string
format: uri
url:
type: string
format: uri
description: Temporary link to the uploaded file, valid until expiresAt once the PUT completes. Pass it where a model input expects a file URL in POST /generations, after reserving the upload with its contentType. Use uploadId everywhere else.
method:
const: PUT
headers:
type: object
properties:
content-type:
type: string
description: The requested contentType when it is kept, otherwise application/octet-stream.
cache-control:
const: max-age=3600
x-upsert:
const: 'false'
required:
- content-type
- cache-control
- x-upsert
expiresAt:
type: string
format: date-time
x-native-type: date
required:
- uploadId
- filename
- byteLength
- uploadUrl
- url
- method
- headers
- expiresAt
required:
- uploads
required:
- data
example:
data:
uploads:
- uploadId: 3f2b8c1e-9a4d-4e7b-8c2f-1d5e6a7b8c9d
filename: atlas-pro-front.png
byteLength: 1458200
uploadUrl: https://uploads.acme.com/atlas-pro-front.png
url: https://assets.acme.com/atlas-pro-front.png
method: PUT
headers:
cache-control: max-age=3600
x-upsert: 'false'
content-type: image/png
expiresAt: '2026-10-25T09:00:00.000Z'
'400':
description: '400'
content:
application/json:
schema:
$ref: '#/components/schemas/UploadsCreate400ErrorResponse'
'401':
description: '401'
content:
application/json:
schema:
$ref: '#/components/schemas/UploadsCreate401ErrorResponse'
'403':
description: '403'
content:
application/json:
schema:
$ref: '#/components/schemas/UploadsCreate403ErrorResponse'
'404':
description: '404'
content:
application/json:
schema:
$ref: '#/components/schemas/UploadsCreate404ErrorResponse'
'429':
description: '429'
content:
application/json:
schema:
$ref: '#/components/schemas/UploadsCreate429ErrorResponse'
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/UploadsCreate500ErrorResponse'
x-codeSamples:
- lang: bash
label: cURL
source: "curl --request POST \\\n --url 'https://www.rainbrand.com/api/v1/uploads' \\\n --header \"x-api-key: $RAINBRAND_API_KEY\" \\\n --header \"Content-Type: application/json\" \\\n --data '{\n \"files\": [\n {\n \"filename\": \"atlas-pro-front.png\",\n \"byteLength\": 1458200,\n \"contentType\": \"image/png\"\n }\n ]\n}'"
components:
schemas:
UploadsCreate403ErrorResponse:
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
UploadsCreate400ErrorResponse:
type: object
properties:
error:
allOf:
- $ref: '#/components/schemas/ApiError'
- anyOf:
- type: object
properties:
code:
const: INVALID_UPLOAD
status:
const: 400
message:
type: string
default: Invalid upload 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
UploadsCreate404ErrorResponse:
type: object
properties:
error:
allOf:
- $ref: '#/components/schemas/ApiError'
- anyOf:
- type: object
properties:
code:
const: WORKSPACE_NOT_FOUND
status:
const: 404
message:
type: string
default: Workspace not found or not accessible
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
UploadsCreate429ErrorResponse:
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: UPLOAD_QUOTA_EXCEEDED
status:
const: 429
message:
type: string
default: Temporary upload limit reached
data: {}
required:
- code
- status
- message
- type: object
properties:
code:
type: string
status:
type: integer
message:
type: string
data: {}
required:
- code
- status
- message
required:
- error
UploadsCreate401ErrorResponse:
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
UploadsCreate500ErrorResponse:
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 uploads
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.