> ## 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.

# Make a pose view

> A pose seen from another place on the Camera Angles globe. Pick one of the pose's
mannequins (`figure`) and a place (`azimuth`, `elevation`): the mannequin's front picture
is turned there, a check confirms it is the same pose and where the camera landed, and the
view joins the library for everyone, credited to you. There are no private views.

**Places.** `azimuth` is where the camera stands around the figure, in steps of 45: `0`
front, `45` front right, `90` right side (the camera moved to the viewer's right, so the
figure's left side shows), `135` back right, `180` back, `225` back left, `270` left side
and `315` front left (where the pose's own three-quarter picture sits). `elevation` is how
high it stands: `0` eye level, `30` from above, `60` from high above.

**Answer:** `200` with `status: made` and the `picture` when the place already has a view
(free). Otherwise `202` with `status: making` and the `job`: follow it with
`GET /v1/poses/views/{id}` every 10 to 15 seconds until `status` is `done` (the view is in
`picture`), `missed` or `failed`. A view usually takes 30 to 90 seconds. One job per place:
when someone is already making the view you ask for, you join their job (`joined: true`)
and pay nothing.

**Using it:** a pose's answer (`GET /v1/poses/{handle}`) lists every view with its
`mention`. Write it after a character in a prompt: `@seiza_pose.back`, or `.right`,
`.left`, `.front_right`, `.back_left`, `.back_right`, `.three_quarter`, `.above` (front
from above), `.top` (front from high above), or a code like `.az135_el30`.

**Price:** 40 credits, charged only when the view lands where you asked (a second try is
free when the first misses). A try that lands on another empty place is kept there for
everyone, free (`landed_picture` on the job). Up to 50 new views a day (`429` past that).




## OpenAPI

````yaml /openapi.yaml post /poses/{handle}/views
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:
  /poses/{handle}/views:
    post:
      tags:
        - Poses
      summary: Make a pose view
      description: >
        A pose seen from another place on the Camera Angles globe. Pick one of
        the pose's

        mannequins (`figure`) and a place (`azimuth`, `elevation`): the
        mannequin's front picture

        is turned there, a check confirms it is the same pose and where the
        camera landed, and the

        view joins the library for everyone, credited to you. There are no
        private views.


        **Places.** `azimuth` is where the camera stands around the figure, in
        steps of 45: `0`

        front, `45` front right, `90` right side (the camera moved to the
        viewer's right, so the

        figure's left side shows), `135` back right, `180` back, `225` back
        left, `270` left side

        and `315` front left (where the pose's own three-quarter picture sits).
        `elevation` is how

        high it stands: `0` eye level, `30` from above, `60` from high above.


        **Answer:** `200` with `status: made` and the `picture` when the place
        already has a view

        (free). Otherwise `202` with `status: making` and the `job`: follow it
        with

        `GET /v1/poses/views/{id}` every 10 to 15 seconds until `status` is
        `done` (the view is in

        `picture`), `missed` or `failed`. A view usually takes 30 to 90 seconds.
        One job per place:

        when someone is already making the view you ask for, you join their job
        (`joined: true`)

        and pay nothing.


        **Using it:** a pose's answer (`GET /v1/poses/{handle}`) lists every
        view with its

        `mention`. Write it after a character in a prompt: `@seiza_pose.back`,
        or `.right`,

        `.left`, `.front_right`, `.back_left`, `.back_right`, `.three_quarter`,
        `.above` (front

        from above), `.top` (front from high above), or a code like
        `.az135_el30`.


        **Price:** 40 credits, charged only when the view lands where you asked
        (a second try is

        free when the first misses). A try that lands on another empty place is
        kept there for

        everyone, free (`landed_picture` on the job). Up to 50 new views a day
        (`429` past that).
      operationId: makePoseView
      parameters:
        - description: The pose's handle, with or without the `@` (`seiza_pose`).
          in: path
          name: handle
          required: true
          schema:
            type: string
      requestBody:
        content:
          application/json:
            example:
              azimuth: 135
              elevation: 30
              figure: woman
            schema:
              properties:
                azimuth:
                  description: >-
                    Where the camera stands around the figure: `0` front, `45`
                    front right, `90` right side (the figure's left side shows),
                    `135` back right, `180` back, `225` back left, `270` left
                    side, `315` front left.
                  enum:
                    - 0
                    - 45
                    - 90
                    - 135
                    - 180
                    - 225
                    - 270
                    - 315
                  type: integer
                elevation:
                  description: '`0` eye level, `30` from above, `60` from high above.'
                  enum:
                    - 0
                    - 30
                    - 60
                  type: integer
                figure:
                  description: >-
                    The mannequin to turn. A mention sends the one that matches
                    the character's gender (the woman when it isn't known).
                  enum:
                    - woman
                    - man
                  type: string
              required:
                - figure
                - azimuth
                - elevation
              type: object
        required: true
      responses:
        '200':
          content:
            application/json:
              schema:
                properties:
                  picture:
                    $ref: '#/components/schemas/PosePicture'
                  status:
                    enum:
                      - made
                    type: string
                type: object
          description: The place already has a view; nothing was charged.
        '202':
          content:
            application/json:
              schema:
                properties:
                  job:
                    $ref: '#/components/schemas/PoseViewJob'
                  joined:
                    description: >-
                      `true` when someone else was already making this view: you
                      follow their job and pay nothing.
                    type: boolean
                  price:
                    description: >-
                      On a job you just started, its price, charged only when
                      the view lands where you asked.
                    example: 40
                    type: integer
                  status:
                    enum:
                      - making
                    type: string
                type: object
          description: A job is making the view; follow it with `GET /v1/poses/views/{id}`.
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '402':
          content:
            application/json:
              schema:
                properties:
                  error:
                    example: A new angle costs 40 credits.
                    type: string
                  error_code:
                    example: insufficient_credits
                    type: string
                  required_credits:
                    example: 40
                    type: integer
                type: object
          description: >-
            Not enough credits for the view (your jobs still running hold their
            price).
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '409':
          content:
            application/json:
              schema:
                properties:
                  error:
                    example: >-
                      Back right has not come out right for this pose yet. Try a
                      nearby angle.
                    type: string
                  error_code:
                    example: angle_unavailable
                    type: string
                type: object
          description: >-
            This place missed twice in the last 30 days for this pose and
            figure; nothing is tried and nothing is charged.
        '429':
          content:
            application/json:
              schema:
                properties:
                  error:
                    example: You can ask for 50 new angles a day. Try again tomorrow.
                    type: string
                  error_code:
                    example: daily_cap
                    type: string
                type: object
          description: You asked for 50 new views in the last 24 hours.
components:
  schemas:
    PosePicture:
      description: >-
        One mannequin picture of a pose, from one place on the Camera Angles
        globe.
      properties:
        angle:
          description: >-
            The picture's name: one of the house's angles (`front`,
            `three_quarter`, `side`, `back`, `high` from above, `low` from
            below) or, on a member's view, its place as a code (`az135_el30`).
            To use a picture in a prompt, write its `mention`.
          example: front
          type: string
        azimuth:
          description: >-
            Where the camera stands around the figure, in degrees: `0` front,
            `45` front right, `90` right side (the figure's left side shows),
            `135` back right, `180` back, `225` back left, `270` left side,
            `315` front left (the pose's three-quarter picture).
          example: 0
          type: integer
        elevation:
          description: >-
            How high the camera stands: `0` eye level, `30` from above, `60`
            from high above (`-30`, from below, on the house's `low` pictures).
          example: 0
          type: integer
        figure:
          description: >-
            The mannequin: a mention sends the one that matches the character's
            gender (the woman when it isn't known).
          enum:
            - woman
            - man
          type: string
        height:
          example: 1152
          type: integer
        id:
          type: string
        label:
          description: The place in words.
          example: Back left · from above
          type: string
        made_by:
          description: On a member's view, the username of the member who made it.
          type: string
        mention:
          description: >-
            In a pose's answers: write this after a character in a prompt to use
            this picture's view.
          example: '@seiza_pose.back'
          type: string
        thumbnail_url:
          description: A small version for a list or a grid.
          format: uri
          type: string
        url:
          description: The full-size picture.
          format: uri
          type: string
        view:
          description: >-
            `true` on a view a member made from the pose's front picture (`POST
            /v1/poses/{handle}/views`); `false` on the pose's own pictures.
          type: boolean
        width:
          example: 864
          type: integer
      type: object
    PoseViewJob:
      description: >-
        A job making a pose view, one mannequin of a pose seen from one place on
        the Camera Angles globe.
      properties:
        angle:
          description: >-
            The name the view's picture carries: `front`, `three_quarter`, or a
            code like `az135_el30`.
          example: az135_el30
          type: string
        attempts:
          description: Tries so far, at most 2.
          example: 1
          type: integer
        azimuth:
          example: 135
          type: integer
        created_at:
          format: date-time
          type: string
        credits_charged:
          description: >-
            `40` once the view is kept where it was asked, charged to the member
            who started the job (joining is free); `0` otherwise.
          type: integer
        elevation:
          example: 30
          type: integer
        figure:
          enum:
            - woman
            - man
          type: string
        id:
          format: uuid
          type: string
        label:
          description: The place in words.
          example: Back right · from above
          type: string
        landed_picture:
          $ref: '#/components/schemas/PosePicture'
        message:
          description: What to tell the person.
          example: Back right · from above is in the library now, for everyone.
          type: string
        picture:
          $ref: '#/components/schemas/PosePicture'
        pose_id:
          type: string
        status:
          description: >-
            `queued` and `working` are still at it; `done` carries the view in
            `picture`; `missed` and `failed` say why in `message` and are not
            charged. On any of them, `landed_picture` is a try that landed on
            another empty place, kept there for everyone, free.
          enum:
            - queued
            - working
            - done
            - missed
            - failed
          type: string
        updated_at:
          format: date-time
          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
  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.
    NotFound:
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
      description: The requested job was not found.
  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.