Bloom Uploads API

Stage private local files for brand sources, the Library, and other supported operations.

Operations 1

POST /uploads Upload files #

Specifications

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.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/trybloom:trybloom-uploads-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

trybloom-uploads-api-openapi.yml Raw ↑
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.