{"paths":{"/api/v2/generations":{"get":{"responses":{"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Missing or invalid credentials"},"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerationList"}}}}},"security":[{"ApiKeyAuth":[]},{"SessionAuth":[]}],"parameters":[{"schema":{"type":"integer","minimum":1,"maximum":100,"default":20},"name":"limit","in":"query"},{"name":"cursor","in":"query","description":"next_cursor from the previous page, unchanged","schema":{"type":"string"}}],"operationId":"listGenerations","summary":"List generations","description":"Your generations, newest first. Page with next_cursor.","tags":["Generations"]},"post":{"description":"Submits an image or video generation. The model's type decides which; parameters beyond model and prompt vary per model (see GET /api/v2/models/{id}). Credits are reserved when the job is accepted and refunded automatically if it fails. Every prompt is screened against the content policy first. A job that cannot be started answers 502 generation_failed with its id and charges nothing; GET /api/v2/generations/{id} then carries the reason.","tags":["Generations"],"responses":{"202":{"description":"Accepted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerationAccepted"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Missing or invalid credentials"},"402":{"description":"Insufficient credits","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"A dependency is unavailable; retry later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"generation_failed: the job could not be started and nothing was charged. id names the failed job; GET /api/v2/generations/{id} carries the reason a few seconds later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"ApiKeyAuth":[]},{"SessionAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerationRequest"}}}},"operationId":"createGeneration","summary":"Start a generation"}},"/api/v2/generations/estimate":{"post":{"operationId":"estimateGeneration","summary":"Price a generation","description":"Same body as POST /api/v2/generations. Runs the same checks, answering the same 400 errors, and returns the credit cost without starting anything or charging. Input images and videos are optional here, so a request can be priced before its files are uploaded.","tags":["Generations"],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerationEstimate"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"ApiKeyAuth":[]},{"SessionAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerationRequest"}}}}}},"/api/v2/generations/{id}":{"get":{"tags":["Generations"],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Generation"}}},"description":"OK"},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"ApiKeyAuth":[]},{"SessionAuth":[]}],"parameters":[{"schema":{"type":"string"},"name":"id","in":"path","required":true}],"operationId":"getGeneration","summary":"Read a generation","description":"Status, cost and output files of one generation. Poll this until status is failed, or completed with a non-empty outputs array: the files are attached a moment after the status turns completed. Output URLs are unguessable links that work without authentication; anyone you share one with can download the file."}},"/api/v2/uploads":{"post":{"description":"Multipart form with one field named file (image or video, up to 95 MB). Returns a URL to pass as an image or video input to a generation.","tags":["Uploads"],"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadResult"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"ApiKeyAuth":[]},{"SessionAuth":[]}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Upload"}}}},"operationId":"createUpload","summary":"Upload an input file"}},"/api/v2/prompts/moderate":{"post":{"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModerateResult"}}},"description":"OK"},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Missing or invalid credentials"},"402":{"description":"Insufficient credits","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"A dependency is unavailable; retry later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"ApiKeyAuth":[]},{"SessionAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModerateRequest"}}}},"operationId":"moderatePrompt","summary":"Screen a prompt","description":"Runs the content-policy screen a generation would run and returns the decision (allow, deny) without generating. Costs credits.","tags":["Prompts"]}},"/api/v2/account":{"get":{"operationId":"getAccount","summary":"Account and credit balance","description":"The account behind the credentials and its current credit balance.","tags":["Account"],"responses":{"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Missing or invalid credentials"},"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Account"}}}}},"security":[{"ApiKeyAuth":[]},{"SessionAuth":[]}]}},"/api/v2/models":{"get":{"operationId":"listModels","summary":"List models","description":"Every model the generation endpoint accepts, with the fields each one takes, their defaults and allowed values, and the credits a request that sends only a prompt costs, the same figure POST /api/v2/generations/estimate returns for it. When pricing.varies is true, other resolutions, durations or inputs cost differently: estimate those before submitting. Public.","tags":["Models"],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModelList"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid request"}},"security":[]}},"/api/v2/prompts/enhance":{"post":{"description":"Expands a short prompt into a detailed one, using the target model's own prompting guide when a model is given. Costs credits (see GET /api/v2/models pricing for prompt-enhance). The same rewrite is free when requested inside a generation with enhance_prompt: true.","tags":["Prompts"],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhanceResult"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Insufficient credits","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"A dependency is unavailable; retry later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"ApiKeyAuth":[]},{"SessionAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhanceRequest"}}}},"operationId":"enhancePrompt","summary":"Rewrite a prompt for a model"}},"/api/v2/api-keys":{"get":{"operationId":"listAPIKeys","summary":"List API keys","description":"Active keys of the account: id, name, display prefix and creation date. Secrets are never returned.","tags":["API keys"],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIKeyList"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"ApiKeyAuth":[]},{"SessionAuth":[]}]},"post":{"tags":["API keys"],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIKeyCreated"}}},"description":"Created"},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"ApiKeyAuth":[]},{"SessionAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIKeyRequest"}}}},"operationId":"createAPIKey","summary":"Create an API key","description":"Mints a key. The secret is in this response only and is stored hashed; it cannot be shown again."}},"/api/v2/api-keys/{id}":{"delete":{"summary":"Revoke an API key","description":"Deletes the key. Requests signed with it answer 401 from then on.","tags":["API keys"],"responses":{"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Missing or invalid credentials"},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"204":{"description":"No Content"}},"security":[{"ApiKeyAuth":[]},{"SessionAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"operationId":"deleteAPIKey"}},"/api/v2/models/{id}":{"get":{"operationId":"getModel","summary":"Describe one model","description":"Fields, defaults, allowed values (enum, or minimum and maximum for a numeric range) and default price of one model. Public.","tags":["Models"],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Model"}}},"description":"OK"},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}}},"components":{"securitySchemes":{"ApiKeyAuth":{"type":"http","scheme":"bearer","bearerFormat":"sk-...","description":"API key as `Authorization: Bearer sk-...`. The same secret is also accepted in an `X-API-Key` header, with or without the `Bearer ` prefix. Create keys with POST /api/v2/api-keys or from the profile page."},"SessionAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"PocketBase session token, as issued to the web app."}},"schemas":{"Error":{"type":"object","required":["error","code"],"properties":{"error":{"type":"string"},"code":{"type":"string"},"cost":{"type":"number"},"balance":{"type":"number"},"id":{"type":"string","description":"The failed generation, on generation_failed"}}},"ModerateResult":{"type":"object","properties":{"decision":{"type":"string","enum":["allow","deny"]},"cost":{"type":"number"}}},"ModelList":{"properties":{"models":{"type":"array","items":{"$ref":"#/components/schemas/Model"}}},"type":"object"},"GenerationAccepted":{"type":"object","properties":{"type":{"type":"string","enum":["image","video"]},"status":{"enum":["pending"],"type":"string"},"cost":{"type":"number"},"id":{"type":"string"},"model":{"type":"string"}}},"Generation":{"type":"object","properties":{"model":{"type":"string"},"type":{"type":"string","enum":["image","video"]},"created":{"type":"string","format":"date-time"},"updated":{"type":"string","format":"date-time"},"outputs":{"type":"array","items":{"$ref":"#/components/schemas/Output"}},"error":{"type":"string","description":"Why it failed, when it did"},"status":{"enum":["pending","completed","failed","stalled","canceled"],"type":"string"},"cost":{"description":"Credits the generation was priced at, taken when it was accepted","type":"number"},"input":{"type":"object","description":"The request body as submitted"},"id":{"type":"string"}}},"UploadResult":{"type":"object","properties":{"id":{"type":"string"},"url":{"type":"string","format":"uri"},"filename":{"type":"string"},"size":{"type":"integer"},"content_type":{"type":"string"}}},"EnhanceResult":{"type":"object","properties":{"prompt":{"type":"string"},"model":{"type":"string"},"type":{"type":"string"},"cost":{"type":"number"}}},"APIKey":{"type":"object","properties":{"created":{"type":"string","format":"date-time"},"id":{"type":"string"},"name":{"type":"string"},"prefix":{"description":"First characters of the secret, for telling keys apart","type":"string"}}},"APIKeyRequest":{"properties":{"name":{"type":"string","maxLength":100}},"type":"object","required":["name"]},"FieldInfo":{"type":"object","properties":{"description":{"type":"string"},"name":{"type":"string"},"type":{"type":"string","enum":["string","integer","number","boolean","array"]},"required":{"type":"boolean"},"default":{},"enum":{"items":{"type":"string"},"type":"array"}}},"GenerationRequest":{"type":"object","required":["model"],"properties":{"sample_shift":{"type":"number","description":"Sample shift factor"},"num_inference_steps":{"type":"integer","description":"Number of denoising steps"},"megapixels":{"type":"string","description":"Approximate output size in megapixels"},"background":{"type":"string","description":"Set whether the background is transparent or opaque or choose automatically"},"veo31_watermark":{"type":"string","description":"Watermark text to put on the video"},"high_performance":{"description":"Use high performance mode (better quality)","type":"boolean"},"thinking_mode":{"description":"Reason about the prompt before generating; text-to-image without enable_sequential only","type":"boolean"},"aspect_ratio":{"type":"string","description":"Output aspect ratio"},"input_image":{"description":"Input image URL","type":"string"},"negative_prompt":{"description":"Negative prompt to avoid certain content","type":"string"},"camera_fixed":{"type":"boolean","description":"Keep the camera position fixed"},"watermark":{"type":"boolean","description":"Add a watermark to the output"},"image_size":{"type":"string","description":"Image size specification (e.g., '1:1', '1024x1024')"},"generate_audio":{"type":"boolean","description":"Generate a soundtrack for the video"},"veo31_model":{"type":"string","description":"Model variant: veo3 (quality) or veo3_fast (faster)"},"go_fast":{"type":"boolean","description":"Use faster generation mode"},"video_input":{"description":"Multiple video URLs for video-to-video generation","type":"array","items":{"type":"string"}},"max_images":{"type":"integer","description":"Maximum number of images to generate"},"lora_weights_transformer":{"type":"string","description":"URL of LoRA weights (.safetensors) for the transformer"},"output_format":{"description":"Output image format","type":"string"},"web_search":{"type":"boolean","description":"Let the model look up the prompt's subject on the web; text-to-video only"},"first_clip_url":{"description":"URL of a video clip to continue (image-to-video mode); use instead of image and last_image","type":"string"},"output_quality":{"type":"integer","description":"Output quality (1-100)"},"lora_weights":{"type":"string","description":"LoRA weights URL or identifier"},"n":{"type":"integer","description":"Number of images, billed per image: 1-4, or 1-12 with enable_sequential; larger values are capped. 4, or 12 with enable_sequential, when omitted"},"prompt_strength":{"type":"number","description":"Strength of prompt influence for image-to-image"},"infer_steps":{"description":"Number of denoising steps","type":"integer"},"fps":{"type":"integer","description":"Frames per second"},"num_layers":{"type":"integer","description":"Number of layers to split the image into, 2 to 8 (billed per layer)"},"reference_audios":{"items":{"type":"string"},"description":"Up to 3 audio URLs that steer the soundtrack; ignored when image or last_image is set","type":"array"},"quality":{"type":"string","description":"Quality level: basic (2K) or high (4K)"},"audio":{"type":"string","description":"URL of an audio file (voice or music) the video syncs to"},"width":{"type":"integer","description":"Output width in pixels"},"character_orientation":{"type":"string","description":"Character orientation source for motion control"},"veo31_generation_type":{"type":"string","description":"Generation mode; when omitted, set by the number of veo31_image_urls (none: TEXT_2_VIDEO, 1 or 2: FIRST_AND_LAST_FRAMES_2_VIDEO, 3: REFERENCE_2_VIDEO, which takes veo3_fast and 16:9 only)"},"lora_scale_transformer":{"description":"How strongly the transformer LoRA is applied","type":"number"},"seed":{"type":"integer","description":"Random seed for reproducibility"},"resolution":{"type":"string","description":"Output resolution"},"video_length":{"type":"integer","description":"Video length in frames"},"height":{"type":"integer","description":"Output height in pixels"},"guidance_scale":{"type":"number","description":"Guidance scale (CFG scale)"},"google_search":{"description":"Enable Google Search grounding for image generation","type":"boolean"},"last_image":{"type":"string","description":"URL of the image the video ends on; pair with image, which it starts on"},"optimize_prompt":{"type":"boolean","description":"Translate the prompt to Chinese before generating"},"enhance_prompt":{"type":"boolean","description":"Rewrite the prompt with the model's prompting guide before generating (bundled, no extra charge)"},"lora_scale_transformer_2":{"type":"number","description":"How strongly the second transformer LoRA is applied"},"lora_weights_transformer_2":{"type":"string","description":"URL of a second set of LoRA weights (.safetensors) for the transformer"},"audio_setting":{"type":"string","description":"Video editing: auto generates new audio, origin keeps the input video's audio"},"enable_sequential":{"type":"boolean","description":"Batch mode: generate a set of related images (up to 12)"},"model":{"type":"string","enum":["flux-dev","flux-kontext-pro","gpt-image-2","gpt-image-2.5","hunyuan","imagen-4-ultra","motion-control","nano-banana","nano-banana-2","nano-banana-2-lite","nano-banana-pro","qwen-image","qwen-image-2.1","qwen-image-edit","qwen-image-edit-plus","qwen-image-edit-plus-lora","qwen-image-layered","recraft-crisp-upscale","remove-background","restore-image","seedance-2","seedance-2-mini","seedance-2.5","seedance-pro","seedream-3","seedream-4","seedream-4.5","veo2","veo3","veo3-fast","veo3.1","wan-2.2","wan-2.6","wan-2.7","wan-2.7-image"],"description":"Model id from GET /api/v2/models"},"prompt":{"type":"string","description":"The prompt to generate from"},"num_outputs":{"type":"integer","description":"Number of outputs to generate"},"duration":{"type":"integer","description":"Video duration in seconds"},"lora_scale":{"type":"number","description":"LoRA scale factor"},"translate_prompt":{"description":"Translate the prompt to English before generating","type":"boolean"},"veo31_image_urls":{"type":"array","items":{"type":"string"},"description":"1 to 3 image URLs. Without veo31_generation_type: 1 image is animated, 2 are the first and last frames, 3 are reference images"},"num_frames":{"type":"integer","description":"Number of frames to generate"},"guidance":{"type":"number","description":"Guidance scale (CFG scale)"},"prompt_extend":{"type":"boolean","description":"Let the model expand the prompt before generating"},"image":{"type":"string","description":"Single image URL for image-to-image or image-to-video generation"},"image_input":{"type":"array","items":{"type":"string"},"description":"Multiple image URLs for editing or reference"},"is_pro":{"type":"boolean","description":"Use Pro variant"},"size":{"type":"string","description":"Size preset (1K, 2K, 4K, regular, etc.)"}},"description":"model, plus the fields that model takes (GET /api/v2/models/{id}) and enhance_prompt / translate_prompt, which every model takes. A field the model does not take, a missing required field or an invalid value answers 400 validation_failed, on the estimate as on the generation, except that the estimate does not require input images or videos, so a request can be priced before its files are uploaded. (A web-app session is lenient: it may estimate before the prompt exists, and its extra fields are ignored.)"},"GenerationEstimate":{"properties":{"variant":{"type":"string"},"model":{"type":"string"},"type":{"type":"string","enum":["image","video"]},"cost":{"type":"number"}},"type":"object"},"Output":{"type":"object","properties":{"filename":{"type":"string"},"content_type":{"type":"string"},"id":{"type":"string"},"url":{"type":"string","format":"uri","description":"Unguessable link that downloads without authentication; anyone holding it can fetch the file"}}},"GenerationList":{"type":"object","properties":{"generations":{"type":"array","items":{"$ref":"#/components/schemas/Generation"}},"next_cursor":{"type":"string","description":"Opaque; pass it unchanged as cursor to fetch the next page. Absent on the last page"}}},"ModerateRequest":{"type":"object","required":["prompt"],"properties":{"prompt":{"type":"string","maxLength":10000}}},"Account":{"type":"object","properties":{"credits":{"type":"number"},"id":{"type":"string"},"email":{"type":"string"}}},"APIKeyList":{"type":"object","properties":{"api_keys":{"type":"array","items":{"$ref":"#/components/schemas/APIKey"}}}},"Model":{"properties":{"id":{"type":"string"},"type":{"type":"string","enum":["image","video"]},"requires_image":{"type":"boolean","description":"True when an image or video input is required, so a prompt alone is refused"},"pricing":{"type":"object","properties":{"credits":{"type":"number","description":"Total credits for a request that sends only a prompt, the figure the estimate endpoint returns for it (a video model's is the whole default clip); absent when the pricing row is missing"},"varies":{"description":"True when resolution, duration or inputs change the price; estimate those requests","type":"boolean"},"variant":{"type":"string","description":"Pricing row charged for a default request"}}},"fields":{"type":"array","items":{"$ref":"#/components/schemas/FieldInfo"}}},"type":"object"},"Upload":{"type":"object","required":["file"],"properties":{"file":{"type":"string","format":"binary","description":"Image or video, up to 95 MB"}}},"EnhanceRequest":{"required":["prompt"],"properties":{"prompt":{"type":"string","maxLength":10000},"model":{"type":"string","enum":["flux-dev","flux-kontext-pro","gpt-image-2","gpt-image-2.5","hunyuan","imagen-4-ultra","motion-control","nano-banana","nano-banana-2","nano-banana-2-lite","nano-banana-pro","qwen-image","qwen-image-2.1","qwen-image-edit","qwen-image-edit-plus","qwen-image-edit-plus-lora","qwen-image-layered","recraft-crisp-upscale","remove-background","restore-image","seedance-2","seedance-2-mini","seedance-2.5","seedance-pro","seedream-3","seedream-4","seedream-4.5","veo2","veo3","veo3-fast","veo3.1","wan-2.2","wan-2.6","wan-2.7","wan-2.7-image"],"description":"Use this model's prompting guide; sets type"},"type":{"type":"string","enum":["image","video"],"description":"image when omitted; ignored when model is set"}},"type":"object"},"APIKeyCreated":{"allOf":[{"$ref":"#/components/schemas/APIKey"},{"properties":{"key":{"type":"string","description":"The secret. Shown once; stored hashed."}},"type":"object"}]}}},"openapi":"3.0.3","info":{"description":"Image and video generation, prompt tools and account access for Azurade AI.\n\nCredits: one balance per account, shared with the web app, same prices. Credits do not expire and are not reset by any billing cycle. A failed generation is refunded automatically. Prices are in credits; the model catalogue carries the price of a default request and POST /api/v2/generations/estimate the exact price of a specific one.\n\nErrors: every non-2xx body is {\"error\": <text>, \"code\": <snake_case>}. Codes worth handling: unknown_model, validation_failed, insufficient_credits (402), prompt_rejected (400, revise the prompt, do not retry it unchanged), moderation_unavailable and enhance_unavailable (503, safe to retry), generation_failed (502, the job could not be started and nothing was charged; its id is in the body and GET /api/v2/generations/{id} carries the reason), not_found (404, also for records that belong to another account).\n\nGenerations are asynchronous: POST answers 202 with an id, GET /api/v2/generations/{id} moves from pending to completed or failed, and completed carries the output files. The files are attached a moment after the status turns completed, so poll until status is failed, or completed with a non-empty outputs array.","contact":{"name":"Azurade AI support","email":"support@azurade.com"},"title":"Azurade AI API","version":"2"},"servers":[{"url":"https://azurade.com"}],"tags":[{"name":"Models","description":"What can be generated, with the parameters and price of each model. Public."},{"name":"Generations","description":"Submit image and video jobs, price them before submitting, and poll them to completion."},{"name":"Uploads","description":"Put an image or video on our storage so a generation can take it as input."},{"name":"Prompts","description":"Rewrite a prompt for a model, or screen one against the content policy, without generating."},{"name":"Account","description":"Who the credentials belong to and what the balance is."},{"name":"API keys","description":"Mint and revoke the keys that sign these requests."}]}