{
  "openapi": "3.1.0",
  "info": {
    "title": "CaptionCraft API",
    "version": "1.0.0",
    "description": "Create captioned MP4 videos from a video URL. Jobs are asynchronous. Poll every 5 seconds. Media is retained for 24 hours; request a fresh job response to retrieve result URLs. All word timestamps use seconds."
  },
  "servers": [
    {
      "url": "https://api.captioncraft.studio"
    }
  ],
  "components": {
    "securitySchemes": {
      "apiKey": {
        "type": "http",
        "scheme": "bearer",
        "bearerFormat": "cc_ API key"
      }
    },
    "schemas": {
      "SubtitleRequest": {
        "type": "object",
        "properties": {
          "video_url": {
            "type": "string",
            "maxLength": 4096,
            "format": "uri",
            "description": "Direct HTTPS MP4, MOV, or WebM URL. No redirects or extra auth headers. Maximum 500 MiB; must remain valid until downloaded.",
            "examples": [
              "https://your-cdn.example/video.mp4"
            ]
          },
          "preset": {
            "default": "classic",
            "type": "string",
            "enum": [
              "classic",
              "highlight",
              "smash",
              "box",
              "push",
              "elegant",
              "ogre",
              "outline",
              "paper-ink",
              "action",
              "prompter",
              "storytelling",
              "karaoke",
              "glow",
              "thin&bold",
              "background"
            ],
            "description": "Caption preset. Omitted style properties use this preset's defaults."
          },
          "language": {
            "type": "string",
            "pattern": "^[a-z]{2,3}$",
            "description": "Optional lowercase two- or three-letter language code supported by transcription. Omit for automatic language detection. Does not translate.",
            "examples": [
              "en"
            ]
          },
          "max_duration_seconds": {
            "default": 60,
            "type": "integer",
            "minimum": 1,
            "maximum": 600,
            "description": "Hard duration limit and initial prepaid reservation. Does not trim the video. Actual duration must fit this limit."
          },
          "style": {
            "default": {},
            "type": "object",
            "properties": {
              "position": {
                "description": "Vertical caption placement; omitted values use the preset's default.",
                "type": "string",
                "enum": [
                  "top",
                  "center",
                  "bottom"
                ]
              },
              "horizontal_position": {
                "description": "Horizontal placement of the caption block.",
                "type": "string",
                "enum": [
                  "left",
                  "center",
                  "right"
                ]
              },
              "text_color": {
                "description": "Text color as a six-digit hexadecimal color.",
                "type": "string",
                "pattern": "^#[0-9a-fA-F]{6}$"
              },
              "highlight_color": {
                "description": "Active-word color for highlight, push, action and karaoke; active-word box color for box. Ignored by other presets for compatibility.",
                "type": "string",
                "pattern": "^#[0-9a-fA-F]{6}$"
              },
              "font_family": {
                "description": "A bundled font; custom font URLs are not accepted.",
                "type": "string",
                "enum": [
                  "Inter",
                  "Urbanist",
                  "Rubik",
                  "Bangers",
                  "Paytone One",
                  "Slackey",
                  "Permanent Marker",
                  "Caveat Brush",
                  "Zilla Slab",
                  "Young Serif",
                  "Instrument Serif",
                  "Bebas Neue",
                  "Coiny"
                ]
              },
              "font_size": {
                "description": "Font size in pixels on the 1080px caption canvas, before scale. Omit to derive from font_family and text_width.",
                "type": "number",
                "minimum": 12,
                "maximum": 240
              },
              "font_weight": {
                "description": "Regular (400) or bold (700). thin&bold animates its own weight.",
                "anyOf": [
                  {
                    "type": "number",
                    "const": 400
                  },
                  {
                    "type": "number",
                    "const": 700
                  }
                ]
              },
              "font_style": {
                "type": "string",
                "enum": [
                  "normal",
                  "italic"
                ]
              },
              "text_alignment": {
                "description": "Alignment of lines within the caption block.",
                "type": "string",
                "enum": [
                  "left",
                  "center",
                  "right"
                ]
              },
              "text_case": {
                "description": "Visual casing only; downloaded transcripts preserve the original words.",
                "type": "string",
                "enum": [
                  "none",
                  "uppercase",
                  "lowercase",
                  "capitalize"
                ]
              },
              "text_width": {
                "description": "Text density: small uses larger type and fewer words per line. Defaults to the preset's width for portrait/square, large for landscape. Ignored when font_size is explicit.",
                "type": "string",
                "enum": [
                  "small",
                  "medium",
                  "large"
                ]
              },
              "line_count": {
                "description": "Maximum lines per cue. 0 displays one word at a time; 100 allows up to 100 lines. Smash defaults to 0.",
                "anyOf": [
                  {
                    "type": "number",
                    "const": 0
                  },
                  {
                    "type": "number",
                    "const": 1
                  },
                  {
                    "type": "number",
                    "const": 2
                  },
                  {
                    "type": "number",
                    "const": 3
                  },
                  {
                    "type": "number",
                    "const": 100
                  }
                ]
              },
              "scale": {
                "description": "Caption scale multiplied by video width / 1080. Defaults to the preset's scale for portrait/square, 0.55 for landscape.",
                "type": "number",
                "minimum": 0.2,
                "maximum": 1
              },
              "offset": {
                "description": "Pixel offsets in output-video coordinates. Left minus right moves horizontally; top minus bottom vertically. Unspecified top/bottom inherit the preset plus an inset on the selected edge: 20% of height for portrait/square, 14% for landscape. Explicit values replace the resolved offset, including zero.",
                "type": "object",
                "properties": {
                  "left": {
                    "type": "number",
                    "minimum": -1920,
                    "maximum": 1920
                  },
                  "top": {
                    "type": "number",
                    "minimum": -1920,
                    "maximum": 1920
                  },
                  "right": {
                    "type": "number",
                    "minimum": -1920,
                    "maximum": 1920
                  },
                  "bottom": {
                    "type": "number",
                    "minimum": -1920,
                    "maximum": 1920
                  }
                },
                "additionalProperties": false
              },
              "background": {
                "description": "Caption background. Set type to enable it; color and opacity alone preserve the preset's background type.",
                "type": "object",
                "properties": {
                  "type": {
                    "type": "string",
                    "enum": [
                      "none",
                      "line",
                      "line-rounded",
                      "box",
                      "box-rounded"
                    ]
                  },
                  "color": {
                    "type": "string",
                    "pattern": "^#[0-9a-fA-F]{6}$"
                  },
                  "opacity": {
                    "type": "number",
                    "minimum": 0,
                    "maximum": 1
                  }
                },
                "additionalProperties": false
              },
              "outline": {
                "description": "Text outline on the caption canvas. Thickness 0 disables it.",
                "type": "object",
                "properties": {
                  "color": {
                    "type": "string",
                    "pattern": "^#[0-9a-fA-F]{6}$"
                  },
                  "thickness": {
                    "type": "number",
                    "minimum": 0,
                    "maximum": 20
                  }
                },
                "additionalProperties": false
              },
              "shadow": {
                "description": "Text shadow. Set enabled to show it. Distance and angle determine its position: 0 degrees points down, 90 points right.",
                "type": "object",
                "properties": {
                  "enabled": {
                    "type": "boolean"
                  },
                  "color": {
                    "type": "string",
                    "pattern": "^#[0-9a-fA-F]{6}$"
                  },
                  "blur": {
                    "type": "number",
                    "minimum": 0,
                    "maximum": 40
                  },
                  "distance": {
                    "type": "number",
                    "minimum": 0,
                    "maximum": 20
                  },
                  "angle": {
                    "type": "number",
                    "minimum": -180,
                    "maximum": 180
                  }
                },
                "additionalProperties": false
              }
            },
            "additionalProperties": false,
            "description": "Optional caption style overrides. Omitted fields (including nested fields) inherit the selected preset. GET /v1/presets lists defaults, supported controls and preset-specific behavior."
          }
        },
        "required": [
          "video_url"
        ],
        "additionalProperties": false,
        "examples": [
          {
            "video_url": "https://your-cdn.example/video.mp4",
            "preset": "highlight",
            "max_duration_seconds": 60,
            "style": {
              "highlight_color": "#7651E8"
            }
          }
        ]
      },
      "SubtitleStyle": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "position": {
            "description": "Vertical caption placement.",
            "type": "string",
            "enum": [
              "top",
              "center",
              "bottom"
            ]
          },
          "horizontal_position": {
            "description": "Horizontal placement of the caption block.",
            "type": "string",
            "enum": [
              "left",
              "center",
              "right"
            ]
          },
          "text_color": {
            "description": "Text fill as a six-digit hex color.",
            "type": "string",
            "pattern": "^#[0-9a-fA-F]{6}$"
          },
          "highlight_color": {
            "description": "Active-word color for highlight, push, action and karaoke; active-word box color for box. Ignored by other presets for compatibility.",
            "type": "string",
            "pattern": "^#[0-9a-fA-F]{6}$"
          },
          "font_family": {
            "description": "A bundled font; custom font URLs are not accepted.",
            "type": "string",
            "enum": [
              "Inter",
              "Urbanist",
              "Rubik",
              "Bangers",
              "Paytone One",
              "Slackey",
              "Permanent Marker",
              "Caveat Brush",
              "Zilla Slab",
              "Young Serif",
              "Instrument Serif",
              "Bebas Neue",
              "Coiny"
            ]
          },
          "font_size": {
            "description": "Font size in pixels on the 1080px caption canvas, before scale. Omit to derive from font_family and text_width.",
            "type": "number",
            "minimum": 12,
            "maximum": 240
          },
          "font_weight": {
            "description": "Regular (400) or bold (700). thin&bold animates its own weight.",
            "anyOf": [
              {
                "type": "number",
                "const": 400
              },
              {
                "type": "number",
                "const": 700
              }
            ]
          },
          "font_style": {
            "type": "string",
            "enum": [
              "normal",
              "italic"
            ]
          },
          "text_alignment": {
            "description": "Alignment of lines within the caption block.",
            "type": "string",
            "enum": [
              "left",
              "center",
              "right"
            ]
          },
          "text_case": {
            "description": "Visual casing only; downloaded transcripts preserve the original words.",
            "type": "string",
            "enum": [
              "none",
              "uppercase",
              "lowercase",
              "capitalize"
            ]
          },
          "text_width": {
            "description": "Text density: small uses larger type and fewer words per line. Defaults to the preset's width for portrait/square, large for landscape. Ignored when font_size is explicit.",
            "type": "string",
            "enum": [
              "small",
              "medium",
              "large"
            ]
          },
          "line_count": {
            "description": "Maximum lines per cue. 0 displays one word at a time; 100 allows up to 100 lines. Smash defaults to 0.",
            "anyOf": [
              {
                "type": "number",
                "const": 0
              },
              {
                "type": "number",
                "const": 1
              },
              {
                "type": "number",
                "const": 2
              },
              {
                "type": "number",
                "const": 3
              },
              {
                "type": "number",
                "const": 100
              }
            ]
          },
          "scale": {
            "description": "Caption scale multiplied by video width / 1080. Defaults to the preset's scale for portrait/square, 0.55 for landscape.",
            "type": "number",
            "minimum": 0.2,
            "maximum": 1
          },
          "offset": {
            "description": "Pixel offsets in output-video coordinates. Left minus right moves horizontally; top minus bottom vertically. Unspecified top/bottom inherit the preset plus an inset on the selected edge: 20% of height for portrait/square, 14% for landscape. Explicit values replace the resolved offset, including zero.",
            "type": "object",
            "properties": {
              "left": {
                "type": "number",
                "minimum": -1920,
                "maximum": 1920
              },
              "top": {
                "type": "number",
                "minimum": -1920,
                "maximum": 1920
              },
              "right": {
                "type": "number",
                "minimum": -1920,
                "maximum": 1920
              },
              "bottom": {
                "type": "number",
                "minimum": -1920,
                "maximum": 1920
              }
            },
            "additionalProperties": false
          },
          "background": {
            "description": "Caption background. Set type to enable it; color and opacity alone preserve the preset's background type.",
            "type": "object",
            "properties": {
              "type": {
                "type": "string",
                "enum": [
                  "none",
                  "line",
                  "line-rounded",
                  "box",
                  "box-rounded"
                ]
              },
              "color": {
                "type": "string",
                "pattern": "^#[0-9a-fA-F]{6}$"
              },
              "opacity": {
                "type": "number",
                "minimum": 0,
                "maximum": 1
              }
            },
            "additionalProperties": false
          },
          "outline": {
            "description": "Text outline on the caption canvas. Thickness 0 disables it.",
            "type": "object",
            "properties": {
              "color": {
                "type": "string",
                "pattern": "^#[0-9a-fA-F]{6}$"
              },
              "thickness": {
                "type": "number",
                "minimum": 0,
                "maximum": 20
              }
            },
            "additionalProperties": false
          },
          "shadow": {
            "description": "Text shadow. Set enabled to show it. Distance and angle determine its position: 0 degrees points down, 90 points right.",
            "type": "object",
            "properties": {
              "enabled": {
                "type": "boolean"
              },
              "color": {
                "type": "string",
                "pattern": "^#[0-9a-fA-F]{6}$"
              },
              "blur": {
                "type": "number",
                "minimum": 0,
                "maximum": 40
              },
              "distance": {
                "type": "number",
                "minimum": 0,
                "maximum": 20
              },
              "angle": {
                "type": "number",
                "minimum": -180,
                "maximum": 180
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false
      },
      "Preset": {
        "type": "object",
        "required": [
          "id",
          "name",
          "description",
          "animation",
          "defaults",
          "supported_style_fields",
          "style_notes"
        ],
        "properties": {
          "id": {
            "type": "string",
            "enum": [
              "classic",
              "highlight",
              "smash",
              "box",
              "push",
              "elegant",
              "ogre",
              "outline",
              "paper-ink",
              "action",
              "prompter",
              "storytelling",
              "karaoke",
              "glow",
              "thin&bold",
              "background"
            ]
          },
          "name": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "animation": {
            "type": "string",
            "description": "Animation selected by the preset; read-only."
          },
          "defaults": {
            "$ref": "#/components/schemas/SubtitleStyle"
          },
          "supported_style_fields": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "position",
                "horizontal_position",
                "text_color",
                "highlight_color",
                "font_family",
                "font_size",
                "font_weight",
                "font_style",
                "text_alignment",
                "text_case",
                "text_width",
                "line_count",
                "scale",
                "offset",
                "background",
                "outline",
                "shadow"
              ]
            },
            "description": "Style fields that affect this preset. Nested groups are partially overridable."
          },
          "style_notes": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            },
            "description": "Preset-specific behavior keyed by style field path."
          }
        }
      },
      "Error": {
        "type": "object",
        "required": [
          "error"
        ],
        "properties": {
          "error": {
            "type": "object",
            "properties": {
              "code": {
                "type": "string"
              },
              "message": {
                "type": "string"
              },
              "request_id": {
                "type": "string"
              }
            },
            "required": [
              "code",
              "message",
              "request_id"
            ]
          }
        }
      },
      "Job": {
        "type": "object",
        "required": [
          "id",
          "status",
          "progress",
          "usage"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "status": {
            "enum": [
              "queued",
              "ingesting",
              "transcribing",
              "rendering",
              "completed",
              "failed",
              "canceled"
            ]
          },
          "progress": {
            "type": "number",
            "minimum": 0,
            "maximum": 100,
            "description": "Progress from 0 to 100; not an estimate of remaining time."
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "expires_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "description": "Result retention deadline, 24 hours after the terminal transition."
          },
          "video": {
            "type": [
              "object",
              "null"
            ],
            "properties": {
              "url": {
                "type": "string",
                "format": "uri"
              },
              "content_type": {
                "const": "video/mp4"
              }
            },
            "description": "Video download details. Null before completion or after expiration."
          },
          "subtitles": {
            "type": "object",
            "properties": {
              "srt_url": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "transcript_url": {
                "type": [
                  "string",
                  "null"
                ]
              }
            },
            "description": "Download URLs are null until completion and after expiration."
          },
          "usage": {
            "type": "object",
            "properties": {
              "reserved_seconds": {
                "type": "integer"
              },
              "billed_seconds": {
                "type": "integer"
              }
            },
            "description": "Current reservation and final charge, in whole seconds."
          },
          "error": {
            "type": [
              "object",
              "null"
            ],
            "properties": {
              "code": {
                "type": "string"
              },
              "message": {
                "type": "string"
              }
            }
          },
          "metadata": {
            "type": [
              "object",
              "null"
            ],
            "description": "Source dimensions and duration, available after inspection.",
            "properties": {
              "width": {
                "type": "integer"
              },
              "height": {
                "type": "integer"
              },
              "duration_seconds": {
                "type": "number"
              }
            }
          }
        }
      }
    }
  },
  "paths": {
    "/v1/presets": {
      "get": {
        "operationId": "listPresets",
        "summary": "List available caption styles",
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "presets": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Preset"
                      }
                    }
                  }
                },
                "example": {
                  "presets": [
                    {
                      "id": "classic",
                      "name": "Classic",
                      "description": "White Inter captions with a dark outline.",
                      "animation": "classic",
                      "defaults": {
                        "position": "bottom",
                        "horizontal_position": "center",
                        "text_color": "#ffffff",
                        "font_family": "Inter",
                        "font_size": 111,
                        "font_weight": 700,
                        "font_style": "normal",
                        "text_alignment": "center",
                        "text_case": "none",
                        "text_width": "small",
                        "line_count": 2,
                        "scale": 0.75,
                        "offset": {
                          "left": 0,
                          "right": 0
                        },
                        "background": {
                          "type": "none",
                          "color": "#000000",
                          "opacity": 1
                        },
                        "outline": {
                          "color": "#000000",
                          "thickness": 8
                        },
                        "shadow": {
                          "enabled": false,
                          "color": "#000000",
                          "blur": 0,
                          "distance": 8,
                          "angle": 0
                        }
                      },
                      "supported_style_fields": [
                        "position",
                        "horizontal_position",
                        "text_color",
                        "font_family",
                        "font_size",
                        "font_weight",
                        "font_style",
                        "text_alignment",
                        "text_case",
                        "text_width",
                        "line_count",
                        "scale",
                        "offset",
                        "background",
                        "outline",
                        "shadow"
                      ],
                      "style_notes": {}
                    },
                    {
                      "id": "highlight",
                      "name": "Highlight",
                      "description": "Uppercase Rubik captions highlighting the current word.",
                      "animation": "colorHighlight",
                      "defaults": {
                        "position": "bottom",
                        "horizontal_position": "center",
                        "text_color": "#ffffff",
                        "highlight_color": "#ffff00",
                        "font_family": "Rubik",
                        "font_size": 92,
                        "font_weight": 700,
                        "font_style": "normal",
                        "text_alignment": "center",
                        "text_case": "uppercase",
                        "text_width": "medium",
                        "line_count": 2,
                        "scale": 0.7,
                        "offset": {
                          "left": 0,
                          "right": 0
                        },
                        "background": {
                          "type": "none",
                          "color": "#000000",
                          "opacity": 1
                        },
                        "outline": {
                          "color": "#000000",
                          "thickness": 0
                        },
                        "shadow": {
                          "enabled": true,
                          "color": "#3d3d3d",
                          "blur": 7,
                          "distance": 0,
                          "angle": 0
                        }
                      },
                      "supported_style_fields": [
                        "position",
                        "horizontal_position",
                        "text_color",
                        "highlight_color",
                        "font_family",
                        "font_size",
                        "font_weight",
                        "font_style",
                        "text_alignment",
                        "text_case",
                        "text_width",
                        "line_count",
                        "scale",
                        "offset",
                        "background",
                        "outline",
                        "shadow"
                      ],
                      "style_notes": {
                        "highlight_color": "Color of the active word."
                      }
                    },
                    {
                      "id": "smash",
                      "name": "Smash",
                      "description": "Outlined Paytone One captions that pop in one word at a time.",
                      "animation": "popIn",
                      "defaults": {
                        "position": "bottom",
                        "horizontal_position": "center",
                        "text_color": "#ffffff",
                        "font_family": "Paytone One",
                        "font_size": 84,
                        "font_weight": 700,
                        "font_style": "normal",
                        "text_alignment": "center",
                        "text_case": "uppercase",
                        "text_width": "medium",
                        "line_count": 0,
                        "scale": 1,
                        "offset": {
                          "left": 0,
                          "right": 0
                        },
                        "background": {
                          "type": "none",
                          "color": "#000000",
                          "opacity": 1
                        },
                        "outline": {
                          "color": "#000000",
                          "thickness": 19
                        },
                        "shadow": {
                          "enabled": false,
                          "color": "#000000",
                          "blur": 0,
                          "distance": 8,
                          "angle": 0
                        }
                      },
                      "supported_style_fields": [
                        "position",
                        "horizontal_position",
                        "text_color",
                        "font_family",
                        "font_size",
                        "font_weight",
                        "font_style",
                        "text_alignment",
                        "text_case",
                        "text_width",
                        "line_count",
                        "scale",
                        "offset",
                        "background",
                        "outline",
                        "shadow"
                      ],
                      "style_notes": {
                        "line_count": "Defaults to 0 (one word per cue). Set 1, 2 or 3 to group words into lines."
                      }
                    },
                    {
                      "id": "box",
                      "name": "Box",
                      "description": "Inter captions with a colored box behind the active word.",
                      "animation": "boxHighlight",
                      "defaults": {
                        "position": "bottom",
                        "horizontal_position": "center",
                        "text_color": "#ffffff",
                        "highlight_color": "#7447E3",
                        "font_family": "Inter",
                        "font_size": 111,
                        "font_weight": 700,
                        "font_style": "normal",
                        "text_alignment": "center",
                        "text_case": "none",
                        "text_width": "small",
                        "line_count": 2,
                        "scale": 0.62,
                        "offset": {
                          "left": 0,
                          "right": 0
                        },
                        "background": {
                          "type": "none",
                          "color": "#000000",
                          "opacity": 1
                        },
                        "outline": {
                          "color": "#000000",
                          "thickness": 0
                        },
                        "shadow": {
                          "enabled": true,
                          "color": "#828282",
                          "blur": 8,
                          "distance": 0,
                          "angle": 0
                        }
                      },
                      "supported_style_fields": [
                        "position",
                        "horizontal_position",
                        "text_color",
                        "highlight_color",
                        "font_family",
                        "font_size",
                        "font_weight",
                        "font_style",
                        "text_alignment",
                        "text_case",
                        "text_width",
                        "line_count",
                        "scale",
                        "offset",
                        "background",
                        "outline",
                        "shadow"
                      ],
                      "style_notes": {
                        "highlight_color": "Color of the box behind the active word; independent of background.color."
                      }
                    },
                    {
                      "id": "push",
                      "name": "Push",
                      "description": "Uppercase Rubik captions with a green highlight and a scale animation.",
                      "animation": "colorHighlightScale",
                      "defaults": {
                        "position": "bottom",
                        "horizontal_position": "center",
                        "text_color": "#ffffff",
                        "highlight_color": "#00ff4f",
                        "font_family": "Rubik",
                        "font_size": 113,
                        "font_weight": 700,
                        "font_style": "normal",
                        "text_alignment": "center",
                        "text_case": "uppercase",
                        "text_width": "small",
                        "line_count": 2,
                        "scale": 0.72,
                        "offset": {
                          "left": 0,
                          "right": 0
                        },
                        "background": {
                          "type": "none",
                          "color": "#000000",
                          "opacity": 1
                        },
                        "outline": {
                          "color": "#000000",
                          "thickness": 18
                        },
                        "shadow": {
                          "enabled": false,
                          "color": "#000000",
                          "blur": 0,
                          "distance": 8,
                          "angle": 0
                        }
                      },
                      "supported_style_fields": [
                        "position",
                        "horizontal_position",
                        "text_color",
                        "highlight_color",
                        "font_family",
                        "font_size",
                        "font_weight",
                        "font_style",
                        "text_alignment",
                        "text_case",
                        "text_width",
                        "line_count",
                        "scale",
                        "offset",
                        "background",
                        "outline",
                        "shadow"
                      ],
                      "style_notes": {
                        "highlight_color": "Color of the active word during the scale animation."
                      }
                    },
                    {
                      "id": "elegant",
                      "name": "Elegant",
                      "description": "Uppercase Inter captions that float into place with a soft shadow.",
                      "animation": "floatInTop",
                      "defaults": {
                        "position": "bottom",
                        "horizontal_position": "center",
                        "text_color": "#ffffff",
                        "font_family": "Inter",
                        "font_size": 92,
                        "font_weight": 700,
                        "font_style": "normal",
                        "text_alignment": "center",
                        "text_case": "uppercase",
                        "text_width": "medium",
                        "line_count": 2,
                        "scale": 0.65,
                        "offset": {
                          "left": 0,
                          "right": 0
                        },
                        "background": {
                          "type": "none",
                          "color": "#000000",
                          "opacity": 1
                        },
                        "outline": {
                          "color": "#000000",
                          "thickness": 0
                        },
                        "shadow": {
                          "enabled": true,
                          "color": "#000000",
                          "blur": 7,
                          "distance": 0,
                          "angle": 0
                        }
                      },
                      "supported_style_fields": [
                        "position",
                        "horizontal_position",
                        "text_color",
                        "font_family",
                        "font_size",
                        "font_weight",
                        "font_style",
                        "text_alignment",
                        "text_case",
                        "text_width",
                        "line_count",
                        "scale",
                        "offset",
                        "background",
                        "outline",
                        "shadow"
                      ],
                      "style_notes": {}
                    },
                    {
                      "id": "ogre",
                      "name": "Ogre",
                      "description": "Green Caveat Brush captions that pop into the center of the video.",
                      "animation": "popIn",
                      "defaults": {
                        "position": "center",
                        "horizontal_position": "center",
                        "text_color": "#1c9311",
                        "font_family": "Caveat Brush",
                        "font_size": 144,
                        "font_weight": 700,
                        "font_style": "normal",
                        "text_alignment": "center",
                        "text_case": "uppercase",
                        "text_width": "small",
                        "line_count": 1,
                        "scale": 0.6,
                        "offset": {
                          "left": 0,
                          "right": 0
                        },
                        "background": {
                          "type": "none",
                          "color": "#ffffff",
                          "opacity": 1
                        },
                        "outline": {
                          "color": "#000000",
                          "thickness": 0
                        },
                        "shadow": {
                          "enabled": false,
                          "color": "#000000",
                          "blur": 0,
                          "distance": 8,
                          "angle": 0
                        }
                      },
                      "supported_style_fields": [
                        "position",
                        "horizontal_position",
                        "text_color",
                        "font_family",
                        "font_size",
                        "font_weight",
                        "font_style",
                        "text_alignment",
                        "text_case",
                        "text_width",
                        "line_count",
                        "scale",
                        "offset",
                        "background",
                        "outline",
                        "shadow"
                      ],
                      "style_notes": {}
                    },
                    {
                      "id": "outline",
                      "name": "Outline",
                      "description": "Warm Rubik captions with a thick orange outline and changing opacity.",
                      "animation": "fillOpacity",
                      "defaults": {
                        "position": "bottom",
                        "horizontal_position": "center",
                        "text_color": "#ffe4bb",
                        "font_family": "Rubik",
                        "font_size": 82,
                        "font_weight": 700,
                        "font_style": "normal",
                        "text_alignment": "center",
                        "text_case": "none",
                        "text_width": "large",
                        "line_count": 1,
                        "scale": 0.72,
                        "offset": {
                          "left": 0,
                          "right": 0
                        },
                        "background": {
                          "type": "none",
                          "color": "#000000",
                          "opacity": 1
                        },
                        "outline": {
                          "color": "#cb8003",
                          "thickness": 20
                        },
                        "shadow": {
                          "enabled": false,
                          "color": "#000000",
                          "blur": 0,
                          "distance": 8,
                          "angle": 0
                        }
                      },
                      "supported_style_fields": [
                        "position",
                        "horizontal_position",
                        "text_color",
                        "font_family",
                        "font_size",
                        "font_weight",
                        "font_style",
                        "text_alignment",
                        "text_case",
                        "text_width",
                        "line_count",
                        "scale",
                        "offset",
                        "background",
                        "outline",
                        "shadow"
                      ],
                      "style_notes": {}
                    },
                    {
                      "id": "paper-ink",
                      "name": "PaperInk",
                      "description": "Black Rubik captions on rounded white lines at the top.",
                      "animation": "fillOpacity",
                      "defaults": {
                        "position": "top",
                        "horizontal_position": "center",
                        "text_color": "#000000",
                        "font_family": "Rubik",
                        "font_size": 82,
                        "font_weight": 700,
                        "font_style": "normal",
                        "text_alignment": "center",
                        "text_case": "none",
                        "text_width": "large",
                        "line_count": 1,
                        "scale": 0.72,
                        "offset": {
                          "left": 0,
                          "right": 0
                        },
                        "background": {
                          "type": "line-rounded",
                          "color": "#ffffff",
                          "opacity": 1
                        },
                        "outline": {
                          "color": "#cb8003",
                          "thickness": 0
                        },
                        "shadow": {
                          "enabled": false,
                          "color": "#000000",
                          "blur": 0,
                          "distance": 8,
                          "angle": 0
                        }
                      },
                      "supported_style_fields": [
                        "position",
                        "horizontal_position",
                        "text_color",
                        "font_family",
                        "font_size",
                        "font_weight",
                        "font_style",
                        "text_alignment",
                        "text_case",
                        "text_width",
                        "line_count",
                        "scale",
                        "offset",
                        "background",
                        "outline",
                        "shadow"
                      ],
                      "style_notes": {}
                    },
                    {
                      "id": "action",
                      "name": "Action",
                      "description": "Italic Bebas Neue captions with an outline, shadow and active-word color.",
                      "animation": "colorHighlightAppear",
                      "defaults": {
                        "position": "bottom",
                        "horizontal_position": "center",
                        "text_color": "#ffffff",
                        "highlight_color": "#FFFF00",
                        "font_family": "Bebas Neue",
                        "font_size": 122,
                        "font_weight": 700,
                        "font_style": "italic",
                        "text_alignment": "center",
                        "text_case": "none",
                        "text_width": "medium",
                        "line_count": 2,
                        "scale": 0.7,
                        "offset": {
                          "left": 0,
                          "right": 0
                        },
                        "background": {
                          "type": "none",
                          "color": "#000000",
                          "opacity": 1
                        },
                        "outline": {
                          "color": "#000000",
                          "thickness": 12
                        },
                        "shadow": {
                          "enabled": true,
                          "color": "#000000",
                          "blur": 0,
                          "distance": 12,
                          "angle": 0
                        }
                      },
                      "supported_style_fields": [
                        "position",
                        "horizontal_position",
                        "text_color",
                        "highlight_color",
                        "font_family",
                        "font_size",
                        "font_weight",
                        "font_style",
                        "text_alignment",
                        "text_case",
                        "text_width",
                        "line_count",
                        "scale",
                        "offset",
                        "background",
                        "outline",
                        "shadow"
                      ],
                      "style_notes": {
                        "highlight_color": "Color of the active word as it appears."
                      }
                    },
                    {
                      "id": "prompter",
                      "name": "Prompter",
                      "description": "Centered Zilla Slab captions with a white outline and active-word opacity.",
                      "animation": "highlight",
                      "defaults": {
                        "position": "center",
                        "horizontal_position": "center",
                        "text_color": "#000000",
                        "font_family": "Zilla Slab",
                        "font_size": 98,
                        "font_weight": 700,
                        "font_style": "normal",
                        "text_alignment": "center",
                        "text_case": "uppercase",
                        "text_width": "medium",
                        "line_count": 1,
                        "scale": 0.66,
                        "offset": {
                          "left": 0,
                          "right": 0
                        },
                        "background": {
                          "type": "none",
                          "color": "#ffffff",
                          "opacity": 1
                        },
                        "outline": {
                          "color": "#ffffff",
                          "thickness": 17
                        },
                        "shadow": {
                          "enabled": false,
                          "color": "#ff00c7",
                          "blur": 10,
                          "distance": 0,
                          "angle": 0
                        }
                      },
                      "supported_style_fields": [
                        "position",
                        "horizontal_position",
                        "text_color",
                        "font_family",
                        "font_size",
                        "font_weight",
                        "font_style",
                        "text_alignment",
                        "text_case",
                        "text_width",
                        "line_count",
                        "scale",
                        "offset",
                        "background",
                        "outline",
                        "shadow"
                      ],
                      "style_notes": {
                        "highlight_color": "This preset highlights by opacity, so highlight_color has no effect."
                      }
                    },
                    {
                      "id": "storytelling",
                      "name": "Storytelling",
                      "description": "Gold Instrument Serif captions with a red outline and offset shadow.",
                      "animation": "slideInLeft",
                      "defaults": {
                        "position": "bottom",
                        "horizontal_position": "center",
                        "text_color": "#ffbf00",
                        "font_family": "Instrument Serif",
                        "font_size": 124,
                        "font_weight": 700,
                        "font_style": "normal",
                        "text_alignment": "center",
                        "text_case": "none",
                        "text_width": "medium",
                        "line_count": 2,
                        "scale": 0.68,
                        "offset": {
                          "left": 0,
                          "right": 0
                        },
                        "background": {
                          "type": "none",
                          "color": "#000000",
                          "opacity": 1
                        },
                        "outline": {
                          "color": "#ff0000",
                          "thickness": 13
                        },
                        "shadow": {
                          "enabled": true,
                          "color": "#ff0000",
                          "blur": 0,
                          "distance": 14,
                          "angle": 51
                        }
                      },
                      "supported_style_fields": [
                        "position",
                        "horizontal_position",
                        "text_color",
                        "font_family",
                        "font_size",
                        "font_weight",
                        "font_style",
                        "text_alignment",
                        "text_case",
                        "text_width",
                        "line_count",
                        "scale",
                        "offset",
                        "background",
                        "outline",
                        "shadow"
                      ],
                      "style_notes": {}
                    },
                    {
                      "id": "karaoke",
                      "name": "Karaoke",
                      "description": "Rounded Coiny lettering with a progressive karaoke fill.",
                      "animation": "twoToneFill",
                      "defaults": {
                        "position": "bottom",
                        "horizontal_position": "center",
                        "text_color": "#ffffff",
                        "highlight_color": "#634afc",
                        "font_family": "Coiny",
                        "font_size": 99,
                        "font_weight": 700,
                        "font_style": "normal",
                        "text_alignment": "center",
                        "text_case": "uppercase",
                        "text_width": "small",
                        "line_count": 2,
                        "scale": 0.6,
                        "offset": {
                          "left": 0,
                          "right": 0
                        },
                        "background": {
                          "type": "none",
                          "color": "#000000",
                          "opacity": 1
                        },
                        "outline": {
                          "color": "#ffffff",
                          "thickness": 18
                        },
                        "shadow": {
                          "enabled": false,
                          "color": "#3d3d3d",
                          "blur": 7,
                          "distance": 0,
                          "angle": 0
                        }
                      },
                      "supported_style_fields": [
                        "position",
                        "horizontal_position",
                        "text_color",
                        "highlight_color",
                        "font_family",
                        "font_size",
                        "font_weight",
                        "font_style",
                        "text_alignment",
                        "text_case",
                        "text_width",
                        "line_count",
                        "scale",
                        "offset",
                        "background",
                        "outline",
                        "shadow"
                      ],
                      "style_notes": {
                        "highlight_color": "Progressive fill color of spoken words."
                      }
                    },
                    {
                      "id": "glow",
                      "name": "Glow",
                      "description": "Rubik captions with a pink glow and a fade-in animation.",
                      "animation": "fadeIn",
                      "defaults": {
                        "position": "bottom",
                        "horizontal_position": "center",
                        "text_color": "#ffffff",
                        "font_family": "Rubik",
                        "font_size": 113,
                        "font_weight": 700,
                        "font_style": "normal",
                        "text_alignment": "center",
                        "text_case": "none",
                        "text_width": "small",
                        "line_count": 2,
                        "scale": 0.65,
                        "offset": {
                          "left": 0,
                          "right": 0
                        },
                        "background": {
                          "type": "none",
                          "color": "#000000",
                          "opacity": 1
                        },
                        "outline": {
                          "color": "#000000",
                          "thickness": 0
                        },
                        "shadow": {
                          "enabled": true,
                          "color": "#ff00de",
                          "blur": 12,
                          "distance": 0,
                          "angle": 0
                        }
                      },
                      "supported_style_fields": [
                        "position",
                        "horizontal_position",
                        "text_color",
                        "font_family",
                        "font_size",
                        "font_weight",
                        "font_style",
                        "text_alignment",
                        "text_case",
                        "text_width",
                        "line_count",
                        "scale",
                        "offset",
                        "background",
                        "outline",
                        "shadow"
                      ],
                      "style_notes": {}
                    },
                    {
                      "id": "thin&bold",
                      "name": "Thin&Bold",
                      "description": "Uppercase Inter captions with animated thin and bold weights.",
                      "animation": "bolder",
                      "defaults": {
                        "position": "bottom",
                        "horizontal_position": "center",
                        "text_color": "#ffffff",
                        "font_family": "Inter",
                        "font_size": 92,
                        "font_weight": 700,
                        "font_style": "normal",
                        "text_alignment": "center",
                        "text_case": "uppercase",
                        "text_width": "medium",
                        "line_count": 2,
                        "scale": 0.7,
                        "offset": {
                          "left": 0,
                          "right": 0
                        },
                        "background": {
                          "type": "none",
                          "color": "#000000",
                          "opacity": 1
                        },
                        "outline": {
                          "color": "#000000",
                          "thickness": 0
                        },
                        "shadow": {
                          "enabled": true,
                          "color": "#000000",
                          "blur": 5,
                          "distance": 0,
                          "angle": 0
                        }
                      },
                      "supported_style_fields": [
                        "position",
                        "horizontal_position",
                        "text_color",
                        "font_family",
                        "font_size",
                        "font_style",
                        "text_alignment",
                        "text_case",
                        "text_width",
                        "line_count",
                        "scale",
                        "offset",
                        "background",
                        "outline",
                        "shadow"
                      ],
                      "style_notes": {
                        "font_weight": "The animation uses weights 200 and 700; font_weight does not change them."
                      }
                    },
                    {
                      "id": "background",
                      "name": "Background",
                      "description": "Urbanist captions on a rounded black background.",
                      "animation": "classic",
                      "defaults": {
                        "position": "bottom",
                        "horizontal_position": "center",
                        "text_color": "#ffffff",
                        "font_family": "Urbanist",
                        "font_size": 87,
                        "font_weight": 700,
                        "font_style": "normal",
                        "text_alignment": "center",
                        "text_case": "none",
                        "text_width": "large",
                        "line_count": 2,
                        "scale": 0.65,
                        "offset": {
                          "left": 0,
                          "right": 0
                        },
                        "background": {
                          "type": "box-rounded",
                          "color": "#000000",
                          "opacity": 1
                        },
                        "outline": {
                          "color": "#000000",
                          "thickness": 0
                        },
                        "shadow": {
                          "enabled": false,
                          "color": "#000000",
                          "blur": 0,
                          "distance": 8,
                          "angle": 0
                        }
                      },
                      "supported_style_fields": [
                        "position",
                        "horizontal_position",
                        "text_color",
                        "font_family",
                        "font_size",
                        "font_weight",
                        "font_style",
                        "text_alignment",
                        "text_case",
                        "text_width",
                        "line_count",
                        "scale",
                        "offset",
                        "background",
                        "outline",
                        "shadow"
                      ],
                      "style_notes": {}
                    }
                  ]
                }
              }
            }
          }
        }
      }
    },
    "/v1/subtitles": {
      "post": {
        "operationId": "createSubtitles",
        "summary": "Create a captioned video",
        "description": "Reserves max_duration_seconds (default 60, maximum 600) from prepaid credit. Once probed, excess is released. Charges ceil(actual duration) exactly once on success; failures and cancellations release the reservation. Direct HTTPS MP4/MOV/WebM URLs only; redirects are not followed. Maximum 500 MiB and 1080p in either orientation.",
        "security": [
          {
            "apiKey": []
          }
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 8,
              "maxLength": 128,
              "pattern": "^[A-Za-z0-9._:-]{8,128}$"
            },
            "description": "Reuse with the same input to retry safely. Different input with the same key returns 409."
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SubtitleRequest"
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Accepted; poll status_url every five seconds",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "id",
                    "status",
                    "status_url"
                  ],
                  "properties": {
                    "id": {
                      "type": "string"
                    },
                    "status": {
                      "type": "string"
                    },
                    "status_url": {
                      "type": "string",
                      "format": "uri"
                    },
                    "replayed": {
                      "type": "boolean"
                    }
                  }
                },
                "example": {
                  "id": "example_job_id",
                  "status": "ingesting",
                  "status_url": "https://api.captioncraft.studio/v1/jobs/example_job_id",
                  "replayed": false
                }
              }
            },
            "headers": {
              "Location": {
                "description": "Status URL for the accepted job.",
                "schema": {
                  "type": "string",
                  "format": "uri"
                }
              },
              "Retry-After": {
                "description": "Recommended polling interval in seconds.",
                "schema": {
                  "type": "integer",
                  "example": 5
                }
              }
            }
          },
          "400": {
            "description": "Invalid request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "402": {
            "description": "Insufficient prepaid seconds",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Missing key scope or disabled account",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "Idempotency key reused with different input",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "413": {
            "description": "JSON body exceeds 16 KiB",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "415": {
            "description": "Use Content-Type: application/json",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Rate or concurrency limit exceeded; honor Retry-After",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Minimum retry delay in seconds.",
                "schema": {
                  "type": "integer",
                  "example": 5
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Processing is not configured",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/jobs/{id}": {
      "get": {
        "operationId": "getSubtitleJob",
        "summary": "Get progress and result downloads",
        "security": [
          {
            "apiKey": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Job ID returned by a create request. The job must belong to your account."
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Job"
                },
                "example": {
                  "id": "example_job_id",
                  "status": "ingesting",
                  "progress": 0,
                  "created_at": "2026-09-21T10:00:00Z",
                  "expires_at": null,
                  "video": null,
                  "subtitles": {
                    "srt_url": null,
                    "transcript_url": null
                  },
                  "metadata": null,
                  "usage": {
                    "reserved_seconds": 60,
                    "billed_seconds": 0
                  },
                  "error": null
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Missing key scope or disabled account",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Job or endpoint not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Rate or concurrency limit exceeded; honor Retry-After",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Minimum retry delay in seconds.",
                "schema": {
                  "type": "integer",
                  "example": 5
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/jobs/{id}/cancel": {
      "post": {
        "operationId": "cancelSubtitleJob",
        "summary": "Cancel an unfinished job and release credits",
        "security": [
          {
            "apiKey": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Job ID returned by a create request. The job must belong to your account."
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string"
                    },
                    "status": {
                      "type": "string"
                    }
                  }
                },
                "example": {
                  "id": "example_job_id",
                  "status": "canceled"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Missing key scope or disabled account",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Job or endpoint not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Rate or concurrency limit exceeded; honor Retry-After",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Minimum retry delay in seconds.",
                "schema": {
                  "type": "integer",
                  "example": 5
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/usage": {
      "get": {
        "operationId": "getUsage",
        "summary": "Read prepaid usage in seconds",
        "security": [
          {
            "apiKey": []
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "available_seconds": {
                      "type": "integer",
                      "minimum": 0
                    },
                    "reserved_seconds": {
                      "type": "integer",
                      "minimum": 0
                    },
                    "consumed_seconds": {
                      "type": "integer",
                      "minimum": 0
                    },
                    "active_jobs": {
                      "type": "integer",
                      "minimum": 0
                    },
                    "concurrency_limit": {
                      "type": "integer",
                      "minimum": 0
                    }
                  }
                },
                "example": {
                  "available_seconds": 300,
                  "reserved_seconds": 60,
                  "consumed_seconds": 24,
                  "active_jobs": 1,
                  "concurrency_limit": 2
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Missing key scope or disabled account",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Rate or concurrency limit exceeded; honor Retry-After",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Minimum retry delay in seconds.",
                "schema": {
                  "type": "integer",
                  "example": 5
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    }
  }
}
