BudgetPixel Social API

Publish posts to your BudgetPixel feed

GitHub OpenAPI

Operations 2

POST /posts Publish a post #
GET /themes List themes you can post to #

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/budgetpixel:budgetpixel-social-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

budgetpixel-social-api-openapi.yml Raw ↑
openapi: 3.2.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).


    **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 Social API
  version: '2026-06-20'
servers:
- description: Production
  url: https://api.budgetpixel.com/v1
security:
- ApiKeyAuth: []
tags:
- description: Publish posts to your BudgetPixel feed and enter clan themes
  name: Social
paths:
  /posts:
    post:
      description: 'Publish a post to your public BudgetPixel feed — the same posts you create on the

        site, so your local agent can publish on your behalf. **Synchronous**: the response

        carries the live post''s `id` and `url`.


        **Pricing: 10 credits per successful post**, charged only on success. Estimate via

        `POST /v1/cost` with

        `{"model": "create-post"}`.


        **Media composition** (one of):

        - **Images** — 1 to 6 images. Each image can optionally carry `model` and

        `prompt` generation info, shown on the image''s info panel on the post.

        - **Video** — exactly 1 video, optionally with up to 3 accompanying images.

        - **Audio** — exactly 1 audio file (cannot mix with other media). Supports

        `song_name`, `genre`, `lyrics`, and dedicated `cover_image` art (the cover is

        NOT a media item — pass it in its own field).


        Each `media[].file` accepts a public URL, an uploaded-file URL from

        `POST /v1/uploads`, a data URI, or raw

        base64. **Size limits:** images 15 MB; audio 50 MB; video 100 MB — note that URL

        inputs are fetched with a 30 MB cap and uploads support up to 50 MB, so ~50 MB is

        the practical video ceiling via the API.


        **Limits & moderation:**

        - The API allows **5 posts per hour**, inside the site-wide limit of **20 posts

        per hour** per account across all surfaces (shares included) — both on top of

        the API''s global rate limits. Exceeding any of them returns `429`.

        - Posting a byte-identical file you''ve already posted returns `409` with the

        existing post''s id.

        - Posts published through the API carry a public **"via API"** label, like posts

        made with an Ava companion carry hers.

        - Image/video posts are **reviewed after publishing** (content rating and spam

        scoring). Feed and gallery visibility follow that review and your account

        standing; a post hidden by review is not refunded.


        **License:** pass `license` to choose the post''s content license, exactly like the

        license picker in the site''s post composer: `arr` (All Rights Reserved — the

        default), `cc-by` (Creative Commons Attribution 4.0) or `cc0` (Creative Commons Zero,

        public domain). Omit it and the post is published All Rights Reserved. A Creative

        Commons license is a permanent grant: **the license cannot be changed after

        publishing**, in either direction — deleting the post is the only way to stop

        offering it. An unrecognised value is treated as `arr` rather than rejected; the

        response''s `license` always states what the post was published under.


        **Clan themes:** pass `theme_id` to enter the post in a live clan theme, exactly

        like choosing a theme in the site''s post composer. `GET /v1/themes`

        lists the live themes of the clans you own or have joined. Posting to a live theme

        of a clan you haven''t joined joins you to that clan, as it does on the site. The

        theme is checked before anything is fetched or charged: an unknown id returns

        `404 theme_not_found`, a theme that hasn''t started or has ended returns

        `400 theme_not_active`, and a clan you''re banned from (or whose owner you have a

        block with) returns `403 theme_not_permitted`. Theme entries cost the same 10

        credits as any post.'
      operationId: createPost
      requestBody:
        content:
          application/json:
            schema:
              properties:
                content:
                  description: Optional caption (max 2000 characters).
                  type: string
                cover_image:
                  description: Audio posts only — cover art for the track (a public URL, an uploaded-file URL, a data URI, or raw base64; image, max 15 MB). Passed as its own field, never as a `media` item (audio posts can't mix media).
                  type: string
                genre:
                  description: Audio posts only — one of the site's canonical music genres (exact match). Omit to have the genre classified automatically after publishing.
                  enum:
                  - Pop
                  - Rock
                  - Hip-Hop & Rap
                  - R&B & Soul
                  - Electronic & Dance
                  - Lo-fi & Chill
                  - Ambient
                  - Jazz
                  - Classical
                  - Country
                  - Folk & Acoustic
                  - Metal
                  - Blues
                  - Latin
                  - K-Pop & J-Pop
                  - Reggae
                  - Soundtrack & Cinematic
                  - Other
                  type: string
                license:
                  default: arr
                  description: 'Content license for the post: `arr` (All Rights Reserved), `cc-by` (CC BY 4.0) or `cc0` (CC0 1.0). Cannot be changed after publishing.'
                  enum:
                  - arr
                  - cc-by
                  - cc0
                  type: string
                lyrics:
                  description: Audio posts only.
                  type: string
                media:
                  description: 'The post''s media items, in display order. One of: 1-6 images; OR exactly 1 video plus up to 3 images; OR exactly 1 audio file (audio can''t mix with other media).'
                  items:
                    properties:
                      file:
                        description: Public URL, uploaded-file URL, data URI, or raw base64.
                        type: string
                      model:
                        description: Images only — the model that generated this image, shown on the image's info panel (e.g. `seedream-5.0-pro`).
                        maxLength: 100
                        type: string
                      prompt:
                        description: Images only — the prompt that generated this image, shown on the image's info panel.
                        maxLength: 10000
                        type: string
                      type:
                        description: Optional declared kind — validated against the file's actual content.
                        enum:
                        - image
                        - video
                        - audio
                        type: string
                    required:
                    - file
                    type: object
                  maxItems: 6
                  minItems: 1
                  type: array
                song_name:
                  description: Audio posts only — track title.
                  type: string
                theme_id:
                  description: Optional — enter the post in this live clan theme. Get ids from [`GET /v1/themes`](/api-reference/social/list-themes-you-can-post-to) (or the number in a `budgetpixel.com/themes/<id>` URL). Works with any media type.
                  example: 75
                  minimum: 1
                  type: integer
              required:
              - media
              type: object
        required: true
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CreatePostResponse'
          description: Post published.
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '402':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Insufficient credits to publish.
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: '`theme_not_found` — no theme with that `theme_id`.'
        '409':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Duplicate media — you already posted a byte-identical file.
        '429':
          $ref: '#/components/responses/TooManyRequests'
      summary: Publish a post
      tags:
      - Social
  /themes:
    get:
      description: 'List the **live clan themes you can enter** with

        `POST /v1/posts` — pass a theme''s `id` as

        `theme_id`. A theme is a time-boxed creative event hosted by a clan

        (`budgetpixel.com/themes/`); entered posts appear on the theme''s page.


        Includes every live theme of the clans you **own, moderate, or have joined**,

        with your `role` in each clan. Themes of clans you''re banned from, or whose owner

        you have a block with, are left out. Themes that haven''t started or have ended

        are left out too, since they don''t accept entries.


        Ordered by deadline, soonest first (`ends_at`). Returns at most 100 themes.

        **Free** — no credits are charged.'
      operationId: listThemes
      responses:
        '200':
          content:
            application/json:
              schema:
                properties:
                  themes:
                    items:
                      $ref: '#/components/schemas/Theme'
                    type: array
                type: object
          description: The themes you can post to (an empty list when you aren't in any clan with a live theme).
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '429':
          $ref: '#/components/responses/TooManyRequests'
      summary: List themes you can post to
      tags:
      - Social
components:
  schemas:
    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
    CreatePostResponse:
      description: A published post.
      properties:
        credits_charged:
          example: 10
          type: integer
        id:
          description: The post id.
          type: integer
        license:
          description: The content license the post was published under.
          enum:
          - arr
          - cc-by
          - cc0
          example: arr
          type: string
        media_type:
          enum:
          - image
          - video
          - audio
          type: string
        moderation:
          description: Image/video posts are rated after publish; feed visibility follows the review.
          example: pending
          type: string
        theme:
          description: Present only when the post was entered in a theme (`theme_id`).
          properties:
            id:
              example: 75
              type: integer
            title:
              example: Neon Noir
              type: string
            url:
              example: https://budgetpixel.com/themes/75
              format: uri
              type: string
          type: object
        url:
          description: Public URL of the post.
          example: https://budgetpixel.com/p/12345
          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
    Theme:
      description: A live clan theme you can enter with `POST /v1/posts` `theme_id`.
      properties:
        clan:
          description: The clan hosting the theme.
          properties:
            id:
              type: integer
            name:
              example: Neon Collective
              type: string
            role:
              description: Your role in this clan.
              enum:
              - owner
              - moderator
              - member
              type: string
            slug:
              example: neon-collective
              type: string
            url:
              example: https://budgetpixel.com/clans/neon-collective
              format: uri
              type: string
          type: object
        description:
          description: The theme's brief from its host.
          type: string
        ends_at:
          description: Entries close at this time.
          format: date-time
          type: string
        entry_count:
          description: Posts entered so far.
          type: integer
        id:
          description: Pass this as `theme_id` on `POST /v1/posts`.
          example: 75
          type: integer
        participant_count:
          description: Distinct creators who have entered.
          type: integer
        starts_at:
          format: date-time
          type: string
        title:
          example: Neon Noir
          type: string
        url:
          description: Public page listing the theme's entries.
          example: https://budgetpixel.com/themes/75
          format: uri
          type: string
      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:
    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.
    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).
    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
x-provenance:
  method: harvested
  publisher: BudgetPixel
  source: https://api.budgetpixel.com/openapi.yaml
  note: split by refine-openapis from the provider's own published document, verified by fetch (openapi/_original/*.fetch.json);
    stamped by stamp-openapi-provenance.py (roadmap#793)