> ## Documentation Index
> Fetch the complete documentation index at: https://docs.trybloom.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Create a brand

> Queue brand creation from either the single website/Instagram `url` input retained for existing integrations or an ordered `sources` array containing a website, Instagram account, and files. Both inputs build a Brand Skill unless `logoUrl` is supplied with `url`; that explicit-logo compatibility option uses the older Visual DNA onboarding workflow. Bloom determines the brand name from the supplied evidence. Returns `202` with the stable Brand ID and `status: analyzing`; call `GET /brands/{id}?wait=true` with that ID and generate only when `status` is `ready`. Temporary file URLs must use HTTPS; Bloom copies their bytes into private storage before processing. Defaults to the caller's personal workspace; pass `workspaceId` to create in a team workspace.



## OpenAPI

````yaml https://www.trybloom.ai/api/v1/spec.json post /brands
openapi: 3.1.1
info:
  title: Bloom API
  version: 1.0.0
servers:
  - url: https://www.trybloom.ai/api/v1
security:
  - apiKey: []
  - bearer: []
tags:
  - name: Account
    description: >-
      Inspect the authenticated account — profile, credit balance, and
      accessible workspaces.
  - name: Brands
    description: Manage brands and brand identity.
  - name: Images
    description: Generate, edit, and retrieve images.
paths:
  /brands:
    post:
      tags:
        - Brands
      summary: Create a brand
      description: >-
        Queue brand creation from either the single website/Instagram `url`
        input retained for existing integrations or an ordered `sources` array
        containing a website, Instagram account, and files. Both inputs build a
        Brand Skill unless `logoUrl` is supplied with `url`; that explicit-logo
        compatibility option uses the older Visual DNA onboarding workflow.
        Bloom determines the brand name from the supplied evidence. Returns
        `202` with the stable Brand ID and `status: analyzing`; call `GET
        /brands/{id}?wait=true` with that ID and generate only when `status` is
        `ready`. Temporary file URLs must use HTTPS; Bloom copies their bytes
        into private storage before processing. Defaults to the caller's
        personal workspace; pass `workspaceId` to create in a team workspace.
      operationId: brands.create
      requestBody:
        required: true
        content:
          application/json:
            schema:
              anyOf:
                - type: object
                  properties:
                    url:
                      type: string
                      format: uri
                      description: >-
                        Website or Instagram profile URL to analyze (e.g.
                        https://acme.com or https://instagram.com/acme)
                    workspaceId:
                      type: string
                      minLength: 1
                      description: >-
                        Team workspace ID. The brand is created in that
                        workspace and billed to its customer. Omit to create in
                        the caller's personal workspace.
                    logoUrl:
                      type: string
                      format: uri
                      description: >-
                        Explicit-logo compatibility option. If provided with
                        url, uses the older Visual DNA onboarding workflow and
                        skips automatic logo extraction.
                  required:
                    - url
                  additionalProperties: false
                  title: Website or Instagram URL
                - type: object
                  properties:
                    sources:
                      type: array
                      minItems: 1
                      maxItems: 30
                      items:
                        anyOf:
                          - type: object
                            properties:
                              kind:
                                enum:
                                  - website
                                type: string
                                description: Source type for a public website
                              url:
                                type: string
                                format: uri
                                description: Public website URL to turn into a Brand Skill
                            required:
                              - kind
                              - url
                            title: Website
                          - type: object
                            properties:
                              kind:
                                enum:
                                  - instagram
                                type: string
                                description: Source type for an Instagram account
                              username:
                                type: string
                                minLength: 1
                                maxLength: 31
                                description: Instagram username to use as brand evidence
                            required:
                              - kind
                              - username
                            title: Instagram
                          - type: object
                            properties:
                              kind:
                                enum:
                                  - file
                                type: string
                                description: >-
                                  Source type for an uploaded file, including a
                                  PDF
                              url:
                                type: string
                                format: uri
                                description: >-
                                  Temporary public HTTPS URL for a file up to
                                  100 MiB, including a PDF
                              filename:
                                type: string
                                minLength: 1
                                maxLength: 240
                                description: >-
                                  Original filename used for source labels. It
                                  defaults from the URL when possible.
                            required:
                              - kind
                              - url
                            title: File
                      description: >-
                        Sources to combine into a Brand Skill. At most one
                        website and one Instagram account can be included. Files
                        may be up to 100 MiB each and 256 MiB combined.
                    instructions:
                      type: string
                      maxLength: 4000
                      description: >-
                        Optional instructions passed to the Brand Agent for this
                        run. The Agent applies them using its existing judgment.
                    workspaceId:
                      type: string
                      minLength: 1
                      description: >-
                        Team workspace ID. The brand is created in that
                        workspace and billed to its customer. Omit to create in
                        the caller's personal workspace.
                  required:
                    - sources
                  additionalProperties: false
                  title: One or more sources
      responses:
        '202':
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: object
                    properties:
                      id:
                        type: string
                        format: uuid
                      status:
                        const: analyzing
                    required:
                      - id
                      - status
                required:
                  - data
        '400':
          description: '400'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BrandsCreate400ErrorResponse'
        '401':
          description: '401'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BrandsCreate401ErrorResponse'
        '403':
          description: '403'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BrandsCreate403ErrorResponse'
        '404':
          description: '404'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BrandsCreate404ErrorResponse'
        '429':
          description: '429'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BrandsCreate429ErrorResponse'
          headers:
            Retry-After:
              description: >-
                Seconds until the API-key request limit resets. Present only
                when the request-rate limiter can calculate the delay.
              schema:
                type: integer
                minimum: 0
        '500':
          description: '500'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BrandsCreate500ErrorResponse'
        '503':
          description: '503'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BrandsCreate503ErrorResponse'
components:
  schemas:
    BrandsCreate400ErrorResponse:
      type: object
      properties:
        error:
          allOf:
            - $ref: '#/components/schemas/ApiError'
            - anyOf:
                - type: object
                  properties:
                    code:
                      const: INVALID_URL
                    status:
                      const: 400
                    message:
                      type: string
                      default: Invalid URL
                    data: {}
                  required:
                    - code
                    - status
                    - message
                - type: object
                  properties:
                    code:
                      const: UNSUPPORTED_SOURCE
                    status:
                      const: 400
                    message:
                      type: string
                      default: This brand source is not supported
                    data: {}
                  required:
                    - code
                    - status
                    - message
                - type: object
                  properties:
                    code:
                      const: INVALID_SOURCE
                    status:
                      const: 400
                    message:
                      type: string
                      default: Invalid brand source
                    data: {}
                  required:
                    - code
                    - status
                    - message
                - type: object
                  properties:
                    code:
                      type: string
                    status:
                      type: integer
                    message:
                      type: string
                    data: {}
                  required:
                    - code
                    - status
                    - message
      required:
        - error
    BrandsCreate401ErrorResponse:
      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
    BrandsCreate403ErrorResponse:
      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: TARGET_RESTRICTED
                    status:
                      const: 403
                    message:
                      type: string
                      default: This brand cannot be added on a free account right now
                    data:
                      type: object
                      properties:
                        supportReference:
                          type: string
                      required:
                        - supportReference
                  required:
                    - code
                    - status
                    - message
                    - data
                - type: object
                  properties:
                    code:
                      type: string
                    status:
                      type: integer
                    message:
                      type: string
                    data: {}
                  required:
                    - code
                    - status
                    - message
      required:
        - error
    BrandsCreate404ErrorResponse:
      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
    BrandsCreate429ErrorResponse:
      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
    BrandsCreate500ErrorResponse:
      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 start brand creation
                    data: {}
                  required:
                    - code
                    - status
                    - message
                - type: object
                  properties:
                    code:
                      type: string
                    status:
                      type: integer
                    message:
                      type: string
                    data: {}
                  required:
                    - code
                    - status
                    - message
      required:
        - error
    BrandsCreate503ErrorResponse:
      type: object
      properties:
        error:
          allOf:
            - $ref: '#/components/schemas/ApiError'
            - anyOf:
                - type: object
                  properties:
                    code:
                      const: SCRAPE_FAILED
                    status:
                      const: 503
                    message:
                      type: string
                      default: Couldn't reach that URL. Please try again.
                    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
  securitySchemes:
    apiKey:
      type: apiKey
      in: header
      name: x-api-key
      description: 'Bloom API key, for example `x-api-key: bloom_sk_...`.'
    bearer:
      type: http
      scheme: bearer
      description: Bloom API key (`Bearer bloom_sk_...`) or Bloom OAuth access token.

````