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

# Add an outfit

> Add clothes to your wardrobe so a character can wear them, from one source:

- `image_url`: any picture's own address, one of your BudgetPixel pictures, or a shop's
  **product page**. A page is read once for the product picture and name it publishes for
  link previews. Many shops don't allow automatic reading, or show no product picture; then
  the answer is `422` with `code: link_unreadable`, a `link_problem` (`blocked`, `login`,
  `not_found`, `no_image`, `not_clothes`, `bad_url`, `failed`) and a message that says what to
  do instead: use the product picture's own address (right-click it, *Copy image address*),
  or send the picture itself.
- `image_data`: the picture as base64 or a data URL.
- `description`: the clothes in words, designed for you (a link inside is read like `image_url`).

`mode` (optional): `photo` (someone wears it: the clothes are taken out onto an invisible
mannequin), `clean` (the picture shows only the clothes: used as it is) or `text` (from the
description). A picture from a link that shows the clothes on their own is used as it is,
whatever the mode: there is nobody to take them off.

**Price:** a clean picture is free; `photo` and `text` run an image model at its usual price
(`model`, default `nano-banana-2.1`), charged on success. Limited to 60 calls per day and 10 a minute per account.

**Answer:** `201` with the outfit when it is ready at once (a clean picture), else `202` with
its `id` and `status: processing`: the picture usually takes about a minute.
`GET /v1/wardrobe/{id}` returns it when `status` is `ready`, with its final handle.




## OpenAPI

````yaml /openapi.yaml post /wardrobe
openapi: 3.1.0
info:
  contact:
    email: support@budgetpixel.com
    name: BudgetPixel Support
  description: >
    The BudgetPixel developer API for programmatic image, video, music and

    sound-effect generation.


    Generation is **asynchronous**: you create a job, then poll its status until
    it

    reaches a terminal state (`succeeded` / `failed`). You are charged in
    credits

    only on success — never for failures, timeouts, or content blocked before

    generation.


    **Authentication.** All requests require an API key sent as a bearer token:

        Authorization: Bearer bpx_live_xxx

    Create and manage keys from your BudgetPixel account dashboard. The
    developer

    API is available on **every paid plan**. On the **Free** plan, API keys can
    call

    the free library searches only: `GET /v1/stock/images`,

    `GET /v1/stock/sound-effects` and `GET /v1/stock/music`.


    **Pricing.** API usage is metered in credits at each model's published price

    (see `GET /v1/models`), and your plan's model discounts and active
    promotions

    apply to API charges exactly as they do on the web — `POST /v1/cost` quotes

    your discounted price. Pro and Ultra plans include a daily free-models

    allowance (a shared pool of free generations per day across qualified image

    models such as FLUX 2 Klein and Qwen-Image) that covers API

    requests too — the standard price applies once the day's pool is used.

    Other promotional free daily generations remain web/app-only. Failed

    generations are never charged.


    **Rate limits.** Requests are limited per minute: **600 requests/min per API

    key** and **1200 requests/min per source IP** (defaults; subject to tuning).

    Every response carries `X-RateLimit-Limit`, `X-RateLimit-Remaining`, and

    `X-RateLimit-Reset` (seconds until the window resets). Exceeding a limit

    returns HTTP `429` with a `Retry-After` header — wait that long before

    retrying. Rejected requests still count against the window, so a tight retry

    loop keeps you limited; back off instead. Generation jobs additionally have
    a

    per-plan concurrency cap (the same one as the web workshop), independent of

    these request limits. `POST /v1/uploads` also has a dedicated **60
    uploads/min

    per account** cap (it's free/unmetered) on top of these limits. Every `429`

    this API returns carries `Retry-After`, including a full concurrency queue

    (a suggested wait) and the monthly spend limit (seconds until the month

    resets).


    **Characters.** Write `@handle` in the prompt of an image or video
    generation to cast a

    character: one of the free BudgetPixel AI influencers (`@barry`, `@rosa`,
    ...) or a character

    of your own. Its picture and look go with the mention, so the same face
    appears in every

    post. `GET /v1/characters` lists the ones you can cast, `GET
    /v1/characters/{handle}` gives

    one in full with every picture, and `POST /v1/characters/recommend` picks
    influencers for a

    brief.


    **Wardrobe.** Dress a character by writing an outfit's `@handle` next to
    theirs:

    `@barry wearing @camel_belted_overcoat_outfit`. The outfit's picture goes
    with the mention and

    the character wears it in place of their own clothes. `GET /v1/wardrobe`
    lists the outfits you

    can use (your own, the ones you saved and the free library) and `GET
    /v1/wardrobe/{handle}`

    gives one in full.


    **Output retention.** Generated files are kept for 24 hours after the job is

    created. Job status responses give the exact time as `expires_at`; after it,

    `expired` is `true` and no download URLs are returned.
  title: BudgetPixel API
  version: '2026-06-20'
servers:
  - description: Production
    url: https://api.budgetpixel.com/v1
security:
  - ApiKeyAuth: []
tags:
  - description: Account and credit balance
    name: Account
  - description: Discover available models and pricing
    name: Models
  - description: Upload input media for image/video generation
    name: Uploads
  - description: Image job status
    name: Images
  - description: FLUX image models
    name: Black Forest Labs
  - description: SeeDream image models
    name: Bytedance
  - description: Video job status
    name: Videos
  - description: Kuaishou Kling video models
    name: Kling
  - description: SeeDance video models
    name: ByteDance (SeeDance)
  - description: Music and sound-effect job status
    name: Audios
  - description: Music generation models
    name: Music
  - description: Text-to-sound-effect models (priced per second)
    name: Sound Effects
  - description: >-
      Image-to-3D models — a picture in, a textured 3D model (GLB, plus
      FBX/USDZ/STL on Meshy) out
    name: 3D Models
  - description: Format conversion for images, video, and audio
    name: Conversions
  - description: Publish posts to your BudgetPixel feed and enter clan themes
    name: Social
  - description: Cast BudgetPixel AI influencers and your own characters with @mentions
    name: Characters
  - description: >-
      Outfits your characters can wear, called with an @mention next to the
      character
    name: Wardrobe
  - description: >-
      Body poses your characters can take, called with an @mention after the
      character
    name: Poses
  - description: Content moderation — NSFW rating and CSAM detection
    name: Moderation
  - description: Content classification — music genre detection
    name: Classification
  - description: >-
      Search the free stock image library — available on every plan, including
      Free
    name: Stock Images
  - description: >-
      Search the free sound effect library — available on every plan, including
      Free
    name: Stock Sound Effects
  - description: >-
      Search the free background music library — available on every plan,
      including Free
    name: Stock Music
  - description: >-
      Turn a video into a depth map video to guide other video models with its
      structure and motion
    name: Depth Maps
paths:
  /wardrobe:
    post:
      tags:
        - Wardrobe
      summary: Add an outfit
      description: >
        Add clothes to your wardrobe so a character can wear them, from one
        source:


        - `image_url`: any picture's own address, one of your BudgetPixel
        pictures, or a shop's
          **product page**. A page is read once for the product picture and name it publishes for
          link previews. Many shops don't allow automatic reading, or show no product picture; then
          the answer is `422` with `code: link_unreadable`, a `link_problem` (`blocked`, `login`,
          `not_found`, `no_image`, `not_clothes`, `bad_url`, `failed`) and a message that says what to
          do instead: use the product picture's own address (right-click it, *Copy image address*),
          or send the picture itself.
        - `image_data`: the picture as base64 or a data URL.

        - `description`: the clothes in words, designed for you (a link inside
        is read like `image_url`).


        `mode` (optional): `photo` (someone wears it: the clothes are taken out
        onto an invisible

        mannequin), `clean` (the picture shows only the clothes: used as it is)
        or `text` (from the

        description). A picture from a link that shows the clothes on their own
        is used as it is,

        whatever the mode: there is nobody to take them off.


        **Price:** a clean picture is free; `photo` and `text` run an image
        model at its usual price

        (`model`, default `nano-banana-2.1`), charged on success. Limited to 60
        calls per day and 10 a minute per account.


        **Answer:** `201` with the outfit when it is ready at once (a clean
        picture), else `202` with

        its `id` and `status: processing`: the picture usually takes about a
        minute.

        `GET /v1/wardrobe/{id}` returns it when `status` is `ready`, with its
        final handle.
      operationId: addWardrobeItem
      requestBody:
        content:
          application/json:
            example:
              image_url: https://shop.example.com/products/linen-shirt
            schema:
              properties:
                category:
                  enum:
                    - everyday
                    - work
                    - formal
                    - party
                    - sport
                    - swim
                    - outerwear
                    - sleepwear
                    - underwear
                    - costume
                    - traditional
                    - seasonal
                  type: string
                description:
                  description: The clothes in words.
                  type: string
                fit:
                  enum:
                    - women
                    - men
                    - unisex
                  type: string
                handle:
                  type: string
                image_data:
                  description: The picture as base64 or a data URL.
                  type: string
                image_url:
                  description: >-
                    A picture's own address, one of your BudgetPixel pictures,
                    or a shop's product page.
                  type: string
                mode:
                  enum:
                    - photo
                    - clean
                    - text
                  type: string
                model:
                  enum:
                    - nano-banana-2.1
                    - seedream-5.0-pro
                    - gpt-image-2.5-sunburst
                  type: string
                name:
                  type: string
                note:
                  description: >-
                    With a photo: what to take when it shows more ("only the
                    leather jacket").
                  type: string
              type: object
        required: true
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WardrobeItemDetail'
          description: The outfit, ready.
        '202':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WardrobeItemDetail'
          description: The outfit is being made; poll `GET /v1/wardrobe/{id}`.
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '422':
          content:
            application/json:
              schema:
                properties:
                  error:
                    properties:
                      code:
                        example: link_unreadable
                        type: string
                      link_problem:
                        enum:
                          - blocked
                          - login
                          - not_found
                          - no_image
                          - not_clothes
                          - bad_url
                          - failed
                        type: string
                      message:
                        type: string
                      type:
                        example: invalid_request_error
                        type: string
                    type: object
                type: object
          description: >-
            The link can't be used. `link_problem` says why and the message what
            to do instead.
        '429':
          $ref: '#/components/responses/TooManyRequests'
components:
  schemas:
    WardrobeItemDetail:
      allOf:
        - $ref: '#/components/schemas/WardrobeItem'
        - properties:
            error:
              type: string
            how_to_use:
              type: string
            picture_url:
              description: >-
                The full-size picture a mention sends: 896x1200 for an outfit
                made from a photo or a description, a clean picture at its own
                size (a signed link that expires after a few hours).
              format: uri
              type: string
            status:
              description: >-
                On an outfit you are adding: `processing` while its picture is
                made (its handle is final once `ready`), or `failed` with
                `error`.
              enum:
                - processing
                - ready
                - failed
              type: string
          type: object
    WardrobeItem:
      description: >-
        An outfit a character can wear, called by writing its `mention` next to
        the character in a prompt.
      properties:
        category:
          example: outerwear
          type: string
        colors:
          example:
            - camel
            - black
          items:
            type: string
          type: array
        costume_character:
          description: >-
            On a famous character's outfit (anime, game, film), the character.
            Absent otherwise. It is in the tags too, so `q` finds it.
          example: Ada Wong
          type: string
        costume_franchise:
          description: >-
            On a famous character's outfit, where the character is from. Absent
            otherwise.
          example: Resident Evil
          type: string
        description:
          description: >-
            What the outfit is, word for word as it is added to the prompt with
            the mention.
          example: >-
            Camel mid-length wool blend overcoat with waist belt, black
            turtleneck, black tailored trousers, black leather dress shoes.
          type: string
        handle:
          example: camel_belted_overcoat_outfit
          type: string
        id:
          format: uuid
          type: string
        kind:
          example: outfit
          type: string
        mention:
          description: Write this next to a character in an image or video prompt.
          example: '@camel_belted_overcoat_outfit'
          type: string
        name:
          example: Camel Belted Overcoat Outfit
          type: string
        preview_url:
          description: >-
            The picture at most 800 px on its long side, for a preview (a signed
            link that expires after a few hours).
          format: uri
          type: string
        source:
          description: >-
            `mine` = made by you; `saved` = kept from the free library or from
            another member; `house` = the free library.
          enum:
            - mine
            - saved
            - house
          type: string
        tags:
          example:
            - minimalist
            - autumn
            - smart
          items:
            type: string
          type: array
        thumbnail_url:
          description: >-
            The picture at most 350 px on its long side, for a list or a grid (a
            signed link that expires after a few hours).
          format: uri
          type: string
      type: object
    Error:
      properties:
        error:
          properties:
            code:
              description: Stable machine-readable code.
              example: model_not_available
              type: string
            message:
              type: string
            type:
              description: Error category.
              example: invalid_request_error
              type: string
          required:
            - type
            - code
            - message
          type: object
      required:
        - error
      type: object
    ModerationBlocked:
      description: >-
        Returned (with HTTP 400) when the input content moderation gate blocks a
        generation request. The block is a property of the request's prompt or
        input media — reword the prompt or change the input and retry. Branch on
        `restriction_reason`, which is stable and machine-readable.
      properties:
        error:
          description: Human-readable explanation of the block.
          type: string
        restriction_reason:
          description: Stable machine-readable block reason.
          enum:
            - input_csam
            - input_explicit_adult
            - input_upload_nudity
            - input_celebrity_likeness
            - strict_model_nsfw
          type: string
      required:
        - error
        - restriction_reason
      type: object
    QueueFull:
      description: |
        `429` body when your account already has as many jobs of this kind
        (image, video or audio) in flight as its concurrency cap allows. Submit
        the next job when one of your running jobs finishes.
      properties:
        active_jobs:
          description: Jobs of this kind in flight right now.
          type: integer
        code:
          enum:
            - queue_full
          type: string
        error:
          description: Human-readable message.
          type: string
        queue_full:
          enum:
            - true
          type: boolean
        queue_limit:
          description: Your concurrency cap for this kind of job.
          type: integer
        retry_after_seconds:
          description: Same value as the `Retry-After` header.
          type: integer
      required:
        - error
        - code
        - queue_full
        - queue_limit
        - active_jobs
        - retry_after_seconds
      type: object
  responses:
    BadRequest:
      content:
        application/json:
          schema:
            oneOf:
              - $ref: '#/components/schemas/Error'
              - $ref: '#/components/schemas/ModerationBlocked'
      description: >-
        The request was malformed, referenced an unavailable model, or was
        blocked by input content moderation (moderation blocks carry a
        `restriction_reason` — see ModerationBlocked).
    Unauthorized:
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
      description: Missing or invalid API key.
    Forbidden:
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
      description: >-
        Authenticated but not permitted (plan gate, ownership, account
        restriction). Content-moderation blocks are 400, not 403.
    TooManyRequests:
      content:
        application/json:
          schema:
            oneOf:
              - $ref: '#/components/schemas/Error'
              - $ref: '#/components/schemas/QueueFull'
      description: >
        A limit was reached. Every `429` carries `Retry-After` (seconds). The

        per-minute rate limit, the upload limit and the hourly API post cap
        answer

        with the `Error` envelope, code `rate_limited`. The monthly spend limit
        answers with

        code `monthly_spend_limit_reached`, and its `Retry-After` counts down to
        the

        start of next month (raising the limit in the console clears it sooner).

        A full concurrency queue answers with the flat `QueueFull` body (3D
        jobs:

        the `Error` envelope with code `queue_full`); its `Retry-After` is a

        suggested wait, because a slot frees as soon as one of your running jobs

        finishes.
      headers:
        Retry-After:
          description: Seconds to wait before retrying.
          schema:
            minimum: 1
            type: integer
  securitySchemes:
    ApiKeyAuth:
      bearerFormat: bpx_live_*
      description: 'API key as a bearer token: Authorization: Bearer bpx_live_xxx'
      scheme: bearer
      type: http

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.