{"openapi":"3.1.0","info":{"title":"AsciiThis API","description":"Convert uploaded images, video, GIFs, GLB files, and OBJ files into ASCII assets, or create new image, animation, and 3D assets from text prompts. Completed assets can be customized, published to the Community, and exported as HTML or GIF.\n\nUse an API key from the developer portal at `/api`. In Swagger, click **Authorize**, paste your `aci_...` key, and requests will include `Authorization: Bearer <your key>`. Direct API clients should send the same header.","version":"0.1.0"},"paths":{"/api/my-assets":{"get":{"tags":["assets"],"summary":"List My Assets","description":"Return all assets in your library, ordered newest first. Use `view=summary` or `view=manifest` to avoid returning full frame payloads in list responses.","operationId":"get_my_assets_api_my_assets_get","parameters":[{"name":"view","in":"query","required":false,"schema":{"type":"string","default":"summary","title":"View"}},{"name":"page","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}],"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":100,"minimum":1},{"type":"null"}],"title":"Page Size"}},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":100,"minimum":1},{"type":"null"}],"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"Offset"}},{"name":"ascii_access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ascii Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/my-assets/{asset_id}":{"get":{"tags":["assets"],"summary":"Get Asset","description":"Return a single asset from your library. Use `view=summary` for metadata only, `view=manifest` for a single-frame preview, or `view=full` for the complete frame payload.","operationId":"get_my_asset_api_my_assets__asset_id__get","parameters":[{"name":"asset_id","in":"path","required":true,"schema":{"type":"string","title":"Asset Id"}},{"name":"view","in":"query","required":false,"schema":{"type":"string","default":"full","title":"View"}},{"name":"ascii_access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ascii Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]},"delete":{"tags":["assets"],"summary":"Delete Asset","operationId":"delete_my_asset_api_my_assets__asset_id__delete","parameters":[{"name":"asset_id","in":"path","required":true,"schema":{"type":"string","title":"Asset Id"}},{"name":"ascii_access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ascii Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]},"patch":{"tags":["assets"],"summary":"Update Asset","description":"Update an asset's rendering configuration. All fields are optional - omit any to keep the current value.\n\n**Dimensions**\n- `width` / `height` - grid size in characters (8-480 each, max 230,400 total cells)\n\n**`color_config`** - colour mode and palette\n- `mode`: `monochrome` | `tint` | `intensity` | `spectrum` | `source`\n- `tint` - hex colour for tint mode\n- `shadow`, `mid`, `highlight` - hex colours for intensity mode\n- `spectrumFrom`, `spectrumTo` - hex colours for spectrum mode\n- `spectrumMap`: `brightness` | `horizontal` | `vertical`\n\n**`render_config`** - glyph and colour rendering\n- `charset`: `dense` | `punctuation` | `minimal` | `numbers` | `blocks` | `halfblock` | `braille`\n- `charsets` - array of text charsets for mixed-mode rendering (text charsets only)\n- `gamma` (0.25-1.75), `contrast` (0.5-2.5), `brightnessLift` (−0.15-0.30)\n- `opacity` (0.1-1.0), `hue` (−180-180), `saturation` (0-5.0)\n- `fontWeight`: `mixed` | `thin` | `regular` | `heavy`\n- `fontStyle`: `mixed` | `normal` | `italic`\n- `strictStack` - lock glyph placement to a strict mono grid\n- `background` - hex colour behind the glyphs\n- `blendMode`: `source-over` | `screen` | `lighter` | `multiply`\n- `colorMapEnabled` - enable/disable colour mapping\n\n**`processing_config`** - reprocesses from the original upload source\n- `contrast` (0.5-2.5), `brightnessLift` (−0.25-0.25)\n- `blackPoint` (0-0.9), `whitePoint` (0.1-1.0)\n- `sharpening` (0-3), `quantize` (0-12)\n- `fps`: `6` | `12` | `24`\n\n**`post_fx_config`** - visual effects (applied in the browser renderer and GIF export)\n- `scanlineIntensity`, `vignette`, `noise`, `flicker`, `glitch` (0-1)\n- `glitchSpeed` (0.25-4), `barrelDistortion`, `convergence` (0-1)\n- `filterMode`: `none` | `slot-mask`; `maskIntensity` (0-1), `maskScale` (1-8)\n- `bloomEnabled`, `bloomIntensity`, `bloomThreshold`, `bloomSoftness` (0-1), `bloomRadius` (1-48)\n- `screenBackground` - hex colour for the post-FX background\n\n**`invert`** - invert the brightness of all glyphs (boolean)","operationId":"update_my_asset_api_my_assets__asset_id__patch","parameters":[{"name":"asset_id","in":"path","required":true,"schema":{"type":"string","title":"Asset Id"}},{"name":"ascii_access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ascii Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetConfigPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/my-assets/{asset_id}/details":{"patch":{"tags":["assets"],"summary":"Update Asset Title/Description","description":"Update the user-facing title and description for an asset. Pass `null` to clear a field.","operationId":"update_my_asset_details_api_my_assets__asset_id__details_patch","parameters":[{"name":"asset_id","in":"path","required":true,"schema":{"type":"string","title":"Asset Id"}},{"name":"ascii_access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ascii Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetDetailsPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/my-assets/{asset_id}/download.gif":{"get":{"tags":["assets"],"summary":"Download Asset as GIF","description":"Export the asset as an animated GIF. Respects all saved render settings - charset, gamma, contrast, colour mode, and background colour.","operationId":"download_my_asset_gif_api_my_assets__asset_id__download_gif_get","parameters":[{"name":"asset_id","in":"path","required":true,"schema":{"type":"string","title":"Asset Id"}},{"name":"ascii_access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ascii Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/my-assets/{asset_id}/download.html":{"get":{"tags":["assets"],"summary":"Download Asset as HTML","description":"Export the asset as a self-contained HTML file with an embedded canvas renderer and all frame data. No external dependencies - open in any browser.","operationId":"download_my_asset_html_api_my_assets__asset_id__download_html_get","parameters":[{"name":"asset_id","in":"path","required":true,"schema":{"type":"string","title":"Asset Id"}},{"name":"ascii_access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ascii Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/uploads":{"post":{"tags":["Generation Pipeline"],"summary":"Upload File","description":"Upload a file to convert to ASCII art. Processing starts immediately and returns a lightweight job resource.\n\nPoll `GET /jobs/{job_id}` until `status` is `complete`, then fetch the finished asset from `GET /my-assets/{asset_id}`. This keeps long-running uploads and large frame payloads out of the polling path.\n\n**Supported formats:** JPEG, PNG, WebP, GIF, MP4, WebM, GLB, OBJ\n\n**`config`** - optional JSON string to set render settings upfront. All fields are optional.\n\n```json\n{\n  \"width\": 120,\n  \"height\": 60,\n  \"invert\": false,\n  \"color_config\": { \"mode\": \"tint\", \"tint\": \"#00ff88\" },\n  \"render_config\": { \"charset\": \"blocks\", \"gamma\": 0.7 },\n  \"processing_config\": { \"contrast\": 1.3, \"sharpening\": 2.0, \"fps\": 12 },\n  \"post_fx_config\": { \"scanlineIntensity\": 0.4, \"vignette\": 0.3 }\n}\n```\n\nSee `PATCH /my-assets/{asset_id}` for the full list of available config fields.","operationId":"create_upload_api_uploads_post","parameters":[{"name":"ascii_access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ascii Access Token"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_create_upload_api_uploads_post"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/generate":{"post":{"tags":["Generation Pipeline"],"summary":"Generate ASCII Art","description":"Generate ASCII art from a text prompt. Returns a lightweight job resource for polling.\n\nPoll `GET /jobs/{job_id}` until `status` is `complete`, then fetch the full asset from `GET /my-assets/{asset_id}`. By default the job endpoint returns only summary asset metadata so large video payloads do not ride on every poll request.\n\n**`type`**\n- `video` *(default)* - animated ASCII art from a generated video clip\n- `image` - still ASCII art from a generated image\n- `model` - ASCII art from a generated 3D model\n\nImage generation uses the monthly image quota. Animation and 3D model generation consume generation credits.\n\nOptionally include `color_config`, `render_config`, `post_fx_config`, and `invert` to set render settings on the resulting asset - same fields as `PATCH /my-assets/{asset_id}`.","operationId":"create_generation_job_api_generate_post","parameters":[{"name":"ascii_access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ascii Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateGenerationPayload"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/jobs/{job_id}":{"get":{"tags":["Generation Pipeline"],"summary":"Poll Job Status","description":"Poll the status of any async job. `status` is one of `pending`, `complete`, or `failed`. By default the response includes only summary asset metadata when an asset exists. Use `asset_view=manifest` for a one-frame preview, `asset_view=full` for the complete frame payload, or fetch the asset directly from `GET /my-assets/{asset_id}`.","operationId":"get_job_api_jobs__job_id__get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}},{"name":"asset_view","in":"query","required":false,"schema":{"type":"string","default":"summary","title":"Asset View"}},{"name":"ascii_access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ascii Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/my-assets/{asset_id}/publish":{"post":{"tags":["gallery"],"summary":"Publish Asset to Community","operationId":"publish_asset_api_my_assets__asset_id__publish_post","parameters":[{"name":"asset_id","in":"path","required":true,"schema":{"type":"string","title":"Asset Id"}},{"name":"ascii_access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ascii Access Token"}}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]},"delete":{"tags":["gallery"],"summary":"Unpublish Asset","operationId":"unpublish_asset_api_my_assets__asset_id__publish_delete","parameters":[{"name":"asset_id","in":"path","required":true,"schema":{"type":"string","title":"Asset Id"}},{"name":"ascii_access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ascii Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/billing/summary":{"get":{"tags":["billing"],"summary":"Billing Summary","description":"Return your current plan, paid access flag, feature entitlements, credit balance, and image generation quota usage.","operationId":"get_billing_summary_api_billing_summary_get","parameters":[{"name":"ascii_access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ascii Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/developer/portal":{"get":{"tags":["developer"],"summary":"Developer Portal","operationId":"developer_portal_api_developer_portal_get","parameters":[{"name":"ascii_access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ascii Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/developer/keys":{"post":{"tags":["developer"],"summary":"Create Api Key","operationId":"create_api_key_api_developer_keys_post","parameters":[{"name":"ascii_access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ascii Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateApiKeyPayload"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/api/developer/keys/{key_id}":{"delete":{"tags":["developer"],"summary":"Revoke Api Key","operationId":"revoke_api_key_api_developer_keys__key_id__delete","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}},{"name":"ascii_access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ascii Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}}},"components":{"schemas":{"AssetConfigPayload":{"properties":{"width":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Width"},"height":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Height"},"color_config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Color Config"},"dimension_config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Dimension Config"},"render_config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Render Config"},"processing_config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Processing Config"},"post_fx_config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Post Fx Config"},"crop_config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Crop Config"},"model_view_config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Model View Config"},"invert":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Invert"}},"type":"object","title":"AssetConfigPayload"},"AssetDetailsPayload":{"properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"}},"type":"object","title":"AssetDetailsPayload"},"Body_create_upload_api_uploads_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"},"config":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Config"}},"type":"object","required":["file"],"title":"Body_create_upload_api_uploads_post"},"CreateApiKeyPayload":{"properties":{"name":{"type":"string","title":"Name"}},"type":"object","required":["name"],"title":"CreateApiKeyPayload"},"CreateGenerationPayload":{"properties":{"prompt":{"type":"string","title":"Prompt"},"type":{"type":"string","enum":["video","image","model"],"title":"Type","default":"video"},"color_config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Color Config"},"render_config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Render Config"},"post_fx_config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Post Fx Config"},"invert":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Invert"},"loop":{"type":"boolean","title":"Loop","default":true},"base_image_upload_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Base Image Upload Id"}},"type":"object","required":["prompt"],"title":"CreateGenerationPayload"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}},"securitySchemes":{"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"API Key","description":"Paste an `aci_...` API key from `/api`. Swagger adds the `Bearer ` prefix automatically. Direct clients should send `Authorization: Bearer aci_...`."}}},"tags":[{"name":"Generation Pipeline","description":"Upload files and run async jobs - upload processing, AI ASCII art generation, and 3D model generation. All job types return a `job_id`; poll `GET /jobs/{job_id}` until `status` is `complete` or `failed`."},{"name":"assets","description":"Manage your asset library. Retrieve, customise rendering, download, and delete assets. Assets are created by completing a Generation Pipeline job."},{"name":"gallery","description":"Publish assets to the public gallery and browse community work."},{"name":"billing","description":"Read your current plan, credit balances, and usage."},{"name":"developer","description":"Inspect API access and create or revoke API keys for authenticated accounts."}]}