{"openapi":"3.1.0","info":{"title":"AudioPod AI API","description":"\n# AudioPod AI APIs\n\n## Overview\n\nThe AudioPod AI API provides advanced audio processing, AI-powered music generation, voice cloning, transcription, and audio publishing services over a versioned REST interface, with API-key authentication, typed error responses, and published rate limits.\n\n## Base URL\n```\nhttps://api.audiopod.ai/api/v1\n```\n\n## Authentication\n\n### API Key Authentication (Recommended)\nMost API endpoints use API key authentication. Include your key in the header:\n```\nX-API-Key: ap_your_api_key\n```\n\n### JWT Token Authentication\nFor session-based access (web applications), obtain a token via `/auth/token`:\n```\nAuthorization: Bearer <access_token>\n```\n\n### Public Endpoints\nSome endpoints like newsletter subscription, health checks, and shared content don't require authentication.\n\n## Versioning & Deprecation Policy\n\nThe API is versioned **in the URL path**. The current version is `v1`, served at\n`https://api.audiopod.ai/api/v1`. Integrate against an explicit version — never\nagainst an unversioned path.\n\n- **Additive changes ship in place.** New endpoints, new optional request\n  fields, and new response fields can appear in `v1` at any time. Clients must\n  ignore unknown response fields rather than failing on them.\n- **Breaking changes ship as a new path version** (`/api/v2`). A breaking change\n  is: removing or renaming a field or endpoint, changing a field's type, adding a\n  required request field, or changing the meaning of an existing value.\n- **Retirement is announced on the wire.** When an endpoint or version is\n  scheduled for removal, its responses carry:\n  - `Deprecation: true` — the endpoint is deprecated as of now.\n  - `Sunset: <HTTP-date>` — the date after which it stops responding\n    ([RFC 8594](https://www.rfc-editor.org/rfc/rfc8594)).\n  - `Link: <...>; rel=\"successor-version\"` — where to migrate to.\n- **Minimum notice: 6 months** between the first `Sunset` header and removal, for\n  any endpoint outside a `dev`/preview tag.\n- Deprecated operations are also marked `\"deprecated\": true` in this\n  specification, so a generated client can surface the warning at build time.\n\n## Rate Limiting\n\nLimits are applied per API key (falling back to client IP for unauthenticated\nrequests) and **scale with subscription tier** — higher tiers get proportionally\nmore headroom on the same routes.\n\nIndicative baselines for the free tier:\n\n- **Standard**: 100 requests/minute\n- **Auth endpoints**: 10 requests/minute\n- **Upload endpoints**: 20 requests/minute\n- **Music generation**: `50/minute`\n- **Music retake**: `10/minute`\n- **Music repaint / extend / edit**: `3/minute`\n\nDo not hard-code these numbers. **Read the quota off the response headers**,\nwhich are returned on every rate-limited route (routes with no explicit limit\nsend no quota headers — absence means \"not throttled here\", not \"quota\nexhausted\"):\n\n| Header | Meaning |\n|---|---|\n| `RateLimit-Limit` | Requests allowed in the current window |\n| `RateLimit-Remaining` | Requests still available in the current window |\n| `RateLimit-Reset` | Seconds until the window resets |\n| `RateLimit-Policy` | The quota policy, e.g. `100;w=60` |\n| `Retry-After` | On a `429` only: seconds to wait before retrying |\n\nThe legacy `X-RateLimit-Limit` / `-Remaining` / `-Reset` names are still sent\nalongside the standard ones for older clients.\n\nOn a `429`, back off for at least `Retry-After` seconds. Retries with\nexponential backoff and jitter are expected; tight retry loops are not.\n\n## Errors\n\nEvery `4xx` and `5xx` response uses one typed envelope:\n\n```json\n{\n  \"error\": \"NOT_FOUND\",\n  \"message\": \"The requested resource was not found.\",\n  \"status\": 404,\n  \"detail\": \"...\"\n}\n```\n\n- `error` — a **stable, machine-readable code**. Branch on this.\n- `message` — human-readable prose. Do not parse; wording can change.\n- `status` — the HTTP status, repeated for convenience.\n- `detail` — the legacy payload, retained for backward compatibility. For a\n  `422` it is the array of failing fields.\n\nThe full shape is published as the `ErrorResponse` schema, and each operation\nbelow documents the statuses it can return.\n\n## Services Overview\n\n### 🎵 Music Generation & AI\n- **Music Creation**: Generate music from text prompts\n- **Music Editing**: Retake, repaint, extend, and edit existing tracks\n- **Music Sharing**: Share tracks publicly with custom tokens\n- **Music Interaction**: Like/unlike tracks, view statistics\n\n### 🎤 Voice & Audio Processing\n- **Voice Cloning**: Create custom voice profiles and clone speech\n- **Speaker Analysis**: Diarize, extract, and separate different speakers\n- **Audio Denoising**: Remove noise from audio files\n- **Stem Extraction**: Separate music into individual instruments\n- **Transcription**: Convert speech to text with high accuracy\n\n### 📹 Video Download & Processing\n- **Video Information**: Extract metadata from video URLs\n- **Multi-Platform Support**: YouTube, TikTok, Instagram, Vimeo, Spotify\n- **Format Conversion**: Multiple video and audio formats\n- **Quality Selection**: From 144p to 4K resolution\n- **Livestream policy**: Live streams are detected automatically and are blocked for downloads\n- **Public & Private Access**: Free public downloads with limits, full features for authenticated users\n\n### 🏢 Business Services\n- **Subscription Management**: Handle user subscriptions and billing\n- **Credits System**: Manage user credits and usage\n- **Contact Forms**: Handle general, enterprise, and developer inquiries\n- **Newsletter**: Manage newsletter subscriptions with double opt-in\n\n### 👤 User Management\n- **User Registration**: OAuth (Google, GitHub) and email registration\n- **Profile Management**: Update user information and preferences\n- **API Key Management**: Generate and manage API keys\n- **Dashboard**: View usage statistics and job history\n\n## Error Handling\n\nAll endpoints return standardized error responses:\n```json\n{\n    \"detail\": \"Error message\",\n    \"error_code\": \"ERROR_CODE\",\n    \"timestamp\": \"2024-01-01T12:00:00Z\"\n}\n```\n\nCommon HTTP status codes:\n- `200`: Success\n- `201`: Created\n- `400`: Bad Request\n- `401`: Unauthorized\n- `403`: Forbidden\n- `404`: Not Found\n- `422`: Validation Error\n- `429`: Rate Limit Exceeded\n- `500`: Internal Server Error\n\n## File Upload Guidelines\n\n### Supported Formats\n- **Audio**: WAV, MP3, OGG, FLAC (WAV preferred)\n- **Video**: MP4, MOV, AVI (audio is extracted for processing)\n\n### File Size Limits\n- **Audio files**: 100MB maximum\n- **Video files**: 200MB maximum\n\n### Best Practices\n- Use WAV format for best quality\n- Sample rate: 16kHz or higher\n- Avoid background noise\n- Keep audio samples 10-30 seconds for voice cloning\n\n## API Endpoints\n\n### Authentication & User Management\n\n#### POST /auth/token\nObtain JWT access token for authentication.\n\n**Request:**\n```bash\ncurl -X POST \"https://api.audiopod.ai/api/v1/auth/token\"   -H \"Content-Type: application/x-www-form-urlencoded\"   -d \"username=user@audiopod.ai&password=your_password\"\n```\n\n**Response:**\n```json\n{\n  \"access_token\": \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...\",\n  \"refresh_token\": \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...\",\n  \"token_type\": \"bearer\",\n  \"expires_in\": 3600\n}\n```\n\n#### POST /auth/initiate-registration\nStart user registration process.\n\n**Request:**\n```bash\ncurl -X POST \"https://api.audiopod.ai/api/v1/auth/initiate-registration\"   -H \"Content-Type: application/json\"   -d '{\n    \"email\": \"user@audiopod.ai\",\n    \"password\": \"securepassword123\",\n    \"full_name\": \"John Doe\"\n  }'\n```\n\n**Response:**\n```json\n{\n  \"message\": \"Registration initiated. Check your email for verification code.\",\n  \"email\": \"user@audiopod.ai\"\n}\n```\n\n#### POST /auth/verify-registration\nComplete registration with verification code.\n\n**Request:**\n```bash\ncurl -X POST \"https://api.audiopod.ai/api/v1/auth/verify-registration\"   -H \"Content-Type: application/json\"   -d '{\n    \"email\": \"user@audiopod.ai\",\n    \"verification_code\": \"123456\"\n  }'\n```\n\n#### GET /auth/me\nGet current user profile.\n\n**Request:**\n```bash\ncurl -X GET \"https://api.audiopod.ai/api/v1/auth/me\"   -H \"X-API-Key: ap_your_api_key\"\n```\n\n**Response:**\n```json\n{\n  \"id\": \"user_id\",\n  \"email\": \"user@audiopod.ai\",\n  \"full_name\": \"John Doe\",\n  \"is_active\": true,\n  \"created_at\": \"2024-01-01T12:00:00Z\"\n}\n```\n\n#### PATCH /auth/me\nUpdate user profile.\n\n**Request:**\n```bash\ncurl -X PATCH \"https://api.audiopod.ai/api/v1/auth/me\"   -H \"X-API-Key: ap_your_api_key\"   -H \"Content-Type: application/json\"   -d '{\n    \"full_name\": \"John Updated Doe\"\n  }'\n```\n\n#### POST /auth/api-keys\nCreate a new API key.\n\n**Request:**\n```bash\ncurl -X POST \"https://api.audiopod.ai/api/v1/auth/api-keys\"   -H \"X-API-Key: ap_your_api_key\"   -H \"Content-Type: application/json\"   -d '{\n    \"name\": \"My API Key\",\n    \"description\": \"For production use\"\n  }'\n```\n\n**Response:**\n```json\n{\n  \"id\": \"key_id\",\n  \"name\": \"My API Key\",\n  \"key\": \"ak_live_abcd1234...\",\n  \"status\": \"active\",\n  \"created_at\": \"2024-01-01T12:00:00Z\"\n}\n```\n\n#### GET /auth/api-keys\nList user's API keys.\n\n**Request:**\n```bash\ncurl -X GET \"https://api.audiopod.ai/api/v1/auth/api-keys?status=active\"   -H \"X-API-Key: ap_your_api_key\"\n```\n\n#### DELETE /auth/api-keys/{key_id}\nRevoke an API key.\n\n**Request:**\n```bash\ncurl -X DELETE \"https://api.audiopod.ai/api/v1/auth/api-keys/{key_id}\"   -H \"X-API-Key: ap_your_api_key\"\n```\n\n### Voice Cloning\n\n#### POST /voice-profiles\nUpload a voice sample to create a voice profile.\n\n**Request:**\n```bash\ncurl -X POST \"https://api.audiopod.ai/api/v1/voice/voice-profiles\"   -H \"X-API-Key: ap_your_api_key\"   -F \"file=@voice_sample.wav\"   -F \"name=John's Voice\"   -F \"description=Male voice sample for testing\"\n```\n\n**Response:**\n```json\n{\n  \"id\": 1,\n  \"name\": \"John's Voice\",\n  \"description\": \"Male voice sample for testing\",\n  \"file_path\": \"voices/uuid/sample.wav\",\n  \"created_at\": \"2024-01-01T12:00:00Z\"\n}\n```\n\n#### GET /voice-profiles\nList user's voice profiles.\n\n**Request:**\n```bash\ncurl -X GET \"https://api.audiopod.ai/api/v1/voice/voice-profiles\"   -H \"X-API-Key: ap_your_api_key\"\n```\n\n#### POST /voice-clone\nCreate a voice cloning job.\n\n**Request:**\n```bash\ncurl -X POST \"https://api.audiopod.ai/api/v1/voice/voice-clone\"   -H \"X-API-Key: ap_your_api_key\"   -H \"Content-Type: application/json\"   -d '{\n    \"voice_id\": 1,\n    \"input_text\": \"Hello, this is a test of voice cloning.\",\n    \"speed\": 1.0\n  }'\n```\n\n**Response:**\n```json\n{\n  \"id\": 1,\n  \"voice_id\": 1,\n  \"text\": \"Hello, this is a test of voice cloning.\",\n  \"status\": \"pending\",\n  \"created_at\": \"2024-01-01T12:00:00Z\"\n}\n```\n\n#### GET /clone/{job_id}/status\nGet cloning job status and download URL.\n\n**Request:**\n```bash\ncurl -X GET \"https://api.audiopod.ai/api/v1/voice/clone/{job_id}/status\"   -H \"X-API-Key: ap_your_api_key\"\n```\n\n**Response:**\n```json\n{\n  \"id\": 1,\n  \"status\": \"completed\",\n  \"output_url\": \"https://media.audiopod.ai/output.wav\",\n  \"created_at\": \"2024-01-01T12:00:00Z\",\n  \"completed_at\": \"2024-01-01T12:05:00Z\"\n}\n```\n\n#### DELETE /voices/{voice_id}\nDelete a voice profile.\n\n**Request:**\n```bash\ncurl -X DELETE \"https://api.audiopod.ai/api/v1/voice/voices/{voice_id}\"   -H \"X-API-Key: ap_your_api_key\"\n```\n\n#### DELETE /clone/{job_id}\nDelete a cloning job.\n\n**Request:**\n```bash\ncurl -X DELETE \"https://api.audiopod.ai/api/v1/voice/clone/{job_id}\"   -H \"X-API-Key: ap_your_api_key\"\n```\n\n### Music Generation\n\n#### POST /music/text2music\nGenerate music from a text caption.\n\nMusic creation is task-specific — pick the endpoint that matches the task:\n`text2music` (prompt → full song), `cover`, `prompt2instrumental`,\n`lyric2vocals`, `text2rap`, `extend`, `retake`. There is no generic\n`/music/generate` endpoint.\n\n**Request:**\n```bash\ncurl -X POST \"https://api.audiopod.ai/api/v1/music/text2music\"   -H \"X-API-Key: ap_your_api_key\"   -H \"Content-Type: application/json\"   -d '{\n    \"caption\": \"upbeat electronic dance music, energetic, 90 BPM\",\n    \"duration\": 30\n  }'\n```\n\n**Response:**\n```json\n{\n  \"job\": {\n    \"id\": 1,\n    \"status\": \"pending\",\n    \"task\": \"text2music\",\n    \"created_at\": \"2024-01-01T12:00:00Z\"\n  },\n  \"message\": \"Music generation started\"\n}\n```\n\nPoll `GET /api/v1/music/jobs/{job_id}/status` (note the `/status` suffix)\nfor `COMPLETED` and the output URL.\n\n#### POST /music/retake\nCreate variations of existing music.\n\n**Request:**\n```bash\ncurl -X POST \"https://api.audiopod.ai/api/v1/music/retake\"   -H \"X-API-Key: ap_your_api_key\"   -H \"Content-Type: application/json\"   -d '{\n    \"original_job_id\": 1,\n    \"prompt\": \"make it more jazzy\",\n    \"variation_strength\": 0.7\n  }'\n```\n\n#### POST /music/extend\nExtend existing music track.\n\n**Request:**\n```bash\ncurl -X POST \"https://api.audiopod.ai/api/v1/music/extend\"   -H \"X-API-Key: ap_your_api_key\"   -H \"Content-Type: application/json\"   -d '{\n    \"source_job_id\": 1,\n    \"extension_duration\": 15,\n    \"continuation_prompt\": \"build to a climax\"\n  }'\n```\n\n#### GET /music/jobs/{job_id}/status\nGet music generation job status.\n\n**Request:**\n```bash\ncurl -X GET \"https://api.audiopod.ai/api/v1/music/jobs/{job_id}/status\"   -H \"X-API-Key: ap_your_api_key\"\n```\n\n**Response:**\n```json\n{\n  \"id\": 1,\n  \"status\": \"completed\",\n  \"task\": \"generate\",\n  \"output_url\": \"https://media.audiopod.ai/music.wav\",\n  \"metadata\": {\n    \"duration\": 30,\n    \"format\": \"wav\",\n    \"sample_rate\": 44100\n  },\n  \"created_at\": \"2024-01-01T12:00:00Z\",\n  \"completed_at\": \"2024-01-01T12:05:00Z\"\n}\n```\n\n#### POST /music/jobs/{job_id}/like\nLike a music track.\n\n**Request:**\n```bash\ncurl -X POST \"https://api.audiopod.ai/api/v1/music/jobs/{job_id}/like\"   -H \"X-API-Key: ap_your_api_key\"\n```\n\n#### GET /music/share/{share_token}\nGet public shared music track.\n\n**Request:**\n```bash\ncurl -X GET \"https://api.audiopod.ai/api/v1/music/share/{share_token}\"\n```\n\n**Response:**\n```json\n{\n  \"id\": 1,\n  \"title\": \"My Generated Track\",\n  \"artist\": \"John Doe\",\n  \"duration\": 30,\n  \"audio_url\": \"https://media.audiopod.ai/shared.wav\",\n  \"created_at\": \"2024-01-01T12:00:00Z\",\n  \"stats\": {\n    \"likes\": 5,\n    \"plays\": 25\n  }\n}\n```\n\n### Speaker Analysis\n\nSpeaker work is split into three task-specific endpoints — there is no\ngeneric `/speaker/analyze`:\n`POST /speaker/diarize` (who-spoke-when timeline),\n`POST /speaker/extract` (isolate one speaker's audio), and\n`POST /speaker/separate` (split into per-speaker tracks). Each accepts either\na `file` upload or a `url`.\n\n#### POST /speaker/diarize\nDiarize audio into a who-spoke-when timeline.\n\n**Request:**\n```bash\ncurl -X POST \"https://api.audiopod.ai/api/v1/speaker/diarize\"   -H \"X-API-Key: ap_your_api_key\"   -F \"file=@meeting_audio.wav\"   -F \"num_speakers=3\"\n```\n\n**Response:**\n```json\n{\n  \"id\": 1,\n  \"status\": \"pending\",\n  \"input_path\": \"speaker/inputs/uuid/meeting_audio.wav\",\n  \"num_speakers\": 3,\n  \"created_at\": \"2024-01-01T12:00:00Z\"\n}\n```\n\n#### GET /speaker/jobs/{job_id}\nGet speaker analysis results.\n\n**Request:**\n```bash\ncurl -X GET \"https://api.audiopod.ai/api/v1/speaker/jobs/{job_id}\"   -H \"X-API-Key: ap_your_api_key\"\n```\n\n**Response:**\n```json\n{\n  \"id\": 1,\n  \"status\": \"completed\",\n  \"result\": {\n    \"num_speakers\": 3,\n    \"speakers\": [\n      {\n        \"speaker_id\": \"SPEAKER_00\",\n        \"segments\": [\n          {\n            \"start\": 0.0,\n            \"end\": 5.2,\n            \"text\": \"Hello everyone\"\n          }\n        ]\n      }\n    ]\n  },\n  \"rttm_url\": \"https://media.audiopod.ai/speakers.rttm\"\n}\n```\n\n### Audio Denoising\n\n#### POST /denoiser/denoise\nRemove noise from audio file.\n\n**Request:**\n```bash\ncurl -X POST \"https://api.audiopod.ai/api/v1/denoiser/denoise\"   -H \"X-API-Key: ap_your_api_key\"   -F \"file=@noisy_audio.wav\"   -F \"noise_reduction_level=0.8\"\n```\n\n**Response:**\n```json\n{\n  \"id\": 1,\n  \"status\": \"pending\",\n  \"input_path\": \"denoiser/inputs/uuid/noisy_audio.wav\",\n  \"noise_reduction_level\": 0.8,\n  \"created_at\": \"2024-01-01T12:00:00Z\"\n}\n```\n\n#### GET /denoiser/jobs/{job_id}\nGet denoising job status and result.\n\n**Request:**\n```bash\ncurl -X GET \"https://api.audiopod.ai/api/v1/denoiser/jobs/{job_id}\"   -H \"X-API-Key: ap_your_api_key\"\n```\n\n**Response:**\n```json\n{\n  \"id\": 1,\n  \"status\": \"completed\",\n  \"output_url\": \"https://media.audiopod.ai/denoised.wav\",\n  \"noise_reduction_applied\": 0.8,\n  \"created_at\": \"2024-01-01T12:00:00Z\",\n  \"completed_at\": \"2024-01-01T12:03:00Z\"\n}\n```\n\n### Stem Extraction\n\n#### POST /stem-extraction/api/extract\nSeparate music into individual stems (instruments).\n\n**Request:**\n```bash\ncurl -X POST \"https://api.audiopod.ai/api/v1/stem-extraction/api/extract\"   -H \"X-API-Key: ap_your_api_key\"   -F \"url=https://youtube.com/watch?v=VIDEO_ID\"   -F \"mode=six\"\n```\n\n**Response:**\n```json\n{\n  \"id\": 5512,\n  \"status\": \"PENDING\",\n  \"source_type\": \"URL\",\n  \"mode\": \"six\",\n  \"created_at\": \"2024-01-01T12:00:00Z\"\n}\n```\n\n#### GET /stem-extraction/status/{job_id}\nGet stem extraction results.\n\n**Request:**\n```bash\ncurl -X GET \"https://api.audiopod.ai/api/v1/stem-extraction/status/{job_id}\"   -H \"X-API-Key: ap_your_api_key\"\n```\n\n**Response:**\n```json\n{\n  \"id\": 5512,\n  \"status\": \"COMPLETED\",\n  \"source_type\": \"URL\",\n  \"stem_paths\": {\n    \"vocals\": \"stems/5512/vocals.wav\",\n    \"drums\": \"stems/5512/drums.wav\",\n    \"bass\": \"stems/5512/bass.wav\",\n    \"guitar\": \"stems/5512/guitar.wav\",\n    \"piano\": \"stems/5512/piano.wav\",\n    \"other\": \"stems/5512/other.wav\"\n  },\n  \"download_urls\": {\n    \"vocals\": \"https://media.audiopod.ai/...\",\n    \"drums\": \"https://media.audiopod.ai/...\",\n    \"bass\": \"https://media.audiopod.ai/...\",\n    \"guitar\": \"https://media.audiopod.ai/...\",\n    \"piano\": \"https://media.audiopod.ai/...\",\n    \"other\": \"https://media.audiopod.ai/...\"\n  },\n  \"created_at\": \"2024-01-01T12:00:00Z\"\n}\n```\n\n### Transcription\n\n#### POST /transcription/transcribe\nConvert speech to text with optional speaker diarization.\n\n**Request (URL-based):**\n```bash\ncurl -X POST \"https://api.audiopod.ai/api/v1/transcription/transcribe\"   -H \"X-API-Key: ap_your_api_key\"   -H \"Content-Type: application/json\"   -d '{\n    \"source_urls\": [\"https://youtube.com/watch?v=example\"],\n    \"language\": \"en\",\n    \"enable_speaker_diarization\": true,\n    \"min_speakers\": 2,\n    \"max_speakers\": 4,\n    \"enable_word_timestamps\": true,\n    \"enable_confidence_scores\": true\n  }'\n```\n\n#### POST /transcription/transcribe-upload\nUpload and transcribe audio files.\n\n**Request (File upload):**\n```bash\ncurl -X POST \"https://api.audiopod.ai/api/v1/transcription/transcribe-upload\"   -H \"X-API-Key: ap_your_api_key\"   -F \"files=@speech.wav\"   -F \"language=en\"   -F \"enable_speaker_diarization=true\"   -F \"min_speakers=2\"   -F \"max_speakers=4\"   -F \"enable_word_timestamps=true\"\n```\n\n**Parameters:**\n- `min_speakers` (optional): Minimum number of speakers (1-20) - requires speaker diarization enabled\n- `max_speakers` (optional): Maximum number of speakers (1-20) - requires speaker diarization enabled  \n- `enable_speaker_diarization`: Enable speaker identification and separation\n- `language`: Target language (auto-detect if not specified)\n- `model_type` (optional): accuracy tier — omit it for the default standard tier, or send `premium` / `premium-diarized` for the highest-accuracy tier. Both premium tiers require a paid plan; a free or Basic caller asking for one is refused with `402 PREMIUM_TIER_REQUIRED`\n- `enable_word_timestamps`: Include word-level timestamps\n- `enable_confidence_scores`: Include confidence scores\n\n**Response:**\n```json\n{\n  \"job_id\": 123,\n  \"task_id\": \"abc-123-def\",\n  \"status\": \"PENDING\",\n  \"message\": \"Transcription job created successfully\",\n  \"estimated_credits\": 150,\n  \"estimated_duration\": 3600\n}\n```\n\n### Subscription Management\n\n#### GET /subscriptions/plans\nGet available subscription plans.\n\n**Request:**\n```bash\ncurl -X GET \"https://api.audiopod.ai/api/v1/subscriptions/plans\"\n```\n\n**Response:**\n```json\n{\n  \"basic\": {\n    \"name\": \"Basic\",\n    \"price\": 9.99,\n    \"currency\": \"USD\",\n    \"features\": [\"100 minutes/month\", \"Basic support\"]\n  },\n  \"pro\": {\n    \"name\": \"Pro\",\n    \"price\": 29.99,\n    \"currency\": \"USD\",\n    \"features\": [\"500 minutes/month\", \"Priority support\", \"Advanced features\"]\n  }\n}\n```\n\n#### POST /subscriptions/create-checkout-session\nCreate a Stripe Checkout Session for a subscription. The response includes\na Checkout URL to redirect the user to.\n\n**Request:**\n```bash\ncurl -X POST \"https://api.audiopod.ai/api/v1/subscriptions/create-checkout-session\"   -H \"X-API-Key: ap_your_api_key\"   -H \"Content-Type: application/json\"   -d '{\n    \"price_id\": \"price_xxx\",\n    \"billing_period\": \"monthly\",\n    \"success_url\": \"https://audiopod.ai/dashboard/account?success=true\",\n    \"cancel_url\": \"https://audiopod.ai/pricing\"\n  }'\n```\n\n### Newsletter Management\n\n#### POST /newsletter/subscribe\nSubscribe to newsletter.\n\n**Request:**\n```bash\ncurl -X POST \"https://api.audiopod.ai/api/v1/newsletter/subscribe\"   -H \"Content-Type: application/json\"   -d '{\n    \"email\": \"user@audiopod.ai\"\n  }'\n```\n\n**Response:**\n```json\n{\n  \"message\": \"Subscription successful! Please check your email to confirm.\"\n}\n```\n\n#### GET /newsletter/confirm\nConfirm newsletter subscription (typically called from email link).\n\n**Request:**\n```bash\ncurl -X GET \"https://api.audiopod.ai/api/v1/newsletter/confirm?email=user@audiopod.ai&token=abc123\"\n```\n\n### Contact Forms\n\n#### POST /contact/\nSubmit general contact form.\n\n**Request:**\n```bash\ncurl -X POST \"https://api.audiopod.ai/api/v1/contact/\"   -H \"Content-Type: application/json\"   -d '{\n    \"name\": \"John Doe\",\n    \"email\": \"john@audiopod.ai\",\n    \"subject\": \"General Inquiry\",\n    \"message\": \"I have a question about your service.\"\n  }'\n```\n\n#### POST /contact/enterprise\nSubmit enterprise contact form.\n\n**Request:**\n```bash\ncurl -X POST \"https://api.audiopod.ai/api/v1/contact/enterprise\"   -H \"Content-Type: application/json\"   -d '{\n    \"name\": \"Jane Smith\",\n    \"email\": \"jane@company.ai\",\n    \"company\": \"Tech Corp\",\n    \"employees\": \"100-500\",\n    \"use_case\": \"Enterprise audio processing\"\n  }'\n```\n\n### Health & Monitoring\n\n#### GET /health/live\nLiveness probe endpoint.\n\n**Request:**\n```bash\ncurl -X GET \"https://api.audiopod.ai/api/v1/health/live\"\n```\n\n**Response:**\n```json\n{\n  \"status\": \"healthy\",\n  \"timestamp\": \"2024-01-01T12:00:00Z\"\n}\n```\n\n#### GET /health/ready\nReadiness probe endpoint.\n\n**Request:**\n```bash\ncurl -X GET \"https://api.audiopod.ai/api/v1/health/ready\"\n```\n\n### Dashboard & Analytics\n\n#### GET /dashboard/stats\nGet dashboard statistics and recent tasks.\n\n**Request:**\n```bash\ncurl -X GET \"https://api.audiopod.ai/api/v1/dashboard/stats\"   -H \"X-API-Key: ap_your_api_key\"\n```\n\n**Response:**\n```json\n{\n  \"usage_stats\": {\n    \"total_jobs\": 25,\n    \"completed_jobs\": 23,\n    \"failed_jobs\": 2\n  },\n  \"recent_activities\": [\n    {\n      \"type\": \"music_generation\",\n      \"status\": \"completed\",\n      \"created_at\": \"2024-01-01T12:00:00Z\"\n    }\n  ],\n  \"credits_remaining\": 100\n}\n```\n\n## Webhooks\n\n### Subscription Webhook\nStripe webhook endpoint for subscription events.\n\n**Endpoint:** `POST /subscriptions/webhook`\n\n**Headers:**\n```\nStripe-Signature: webhook_signature\n```\n\n## Rate Limits by Endpoint\n\n| Endpoint Category | Rate Limit | Window |\n|-------------------|------------|--------|\n| Authentication | 10 requests | 1 minute |\n| File Upload | 20 requests | 1 minute |\n| Music Generation | 5 requests | 1 minute |\n| Audio Processing | 10 requests | 1 minute |\n| General API | 100 requests | 1 minute |\n\n## SDK Examples\n\n### Python SDK\n```python\nfrom audiopod import AudioPod\n\n# Initialize with API key\nclient = AudioPod(api_key=\"ap_your_api_key\")\n# Or set AUDIOPOD_API_KEY environment variable\n\n# Separate audio into stems\nresult = client.stems.separate(\n    url=\"https://youtube.com/watch?v=VIDEO_ID\",\n    mode=\"six\"\n)\nfor stem, url in result[\"download_urls\"].items():\n    print(f\"{stem}: {url}\")\n\n# Generate music\nsong = client.music.generate(prompt=\"upbeat jazz music\")\nprint(song[\"output_url\"])\n```\n\n### Node.js SDK\n```javascript\nimport AudioPod from 'audiopod';\n\n// Initialize with API key\nconst client = new AudioPod({ apiKey: 'ap_your_api_key' });\n// Or set AUDIOPOD_API_KEY environment variable\n\n// Separate audio into stems\nconst result = await client.stems.separate({\n  url: 'https://youtube.com/watch?v=VIDEO_ID',\n  mode: 'six'\n});\nfor (const [stem, url] of Object.entries(result.download_urls)) {\n  console.log(`${stem}: ${url}`);\n}\n\n// Generate music  \nconst song = await client.music.generate({\n  prompt: 'upbeat jazz music'\n});\nconsole.log(song.outputUrl);\n```\n\n### cURL\n```bash\n# Set your API key\nexport AUDIOPOD_API_KEY=\"ap_your_api_key\"\n\n# Separate audio into stems\ncurl -X POST \"https://api.audiopod.ai/api/v1/stem-extraction/api/extract\"   -H \"X-API-Key: $AUDIOPOD_API_KEY\"   -F \"url=https://youtube.com/watch?v=VIDEO_ID\"   -F \"mode=six\"\n```\n\n## Support\n\nFor technical support, API questions, or feature requests:\n- **Email**: support@audiopod.ai\n- **Documentation**: https://docs.audiopod.ai\n- **Status Page**: https://status.audiopod.ai\n","version":"2.0.0"},"paths":{"/api/v1/auth/api-keys/scopes":{"get":{"tags":["auth","auth"],"summary":"List Available Scopes","description":"Return the catalog of API key scopes for the dashboard create-key UI.\n\nSingle source of truth — the frontend reads this on dialog open so that\nnew backend scopes don't require a paired frontend deploy. The wildcard\n\"*\" is surfaced as the recommended default.","operationId":"list_available_scopes","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"security":[{"OAuth2PasswordBearer":[]}],"x-original-operation-id":"list_available_scopes_api_v1_auth_api_keys_scopes_get"}},"/api/v1/auth/api-keys":{"post":{"tags":["auth","auth"],"summary":"Create Api Key","description":"Create a new API key for the authenticated user.\n\nKey creation is rate-limited per user (HTTP 429 on burst) and capped at a\nfixed number of active, non-revoked keys per account (HTTP 409 once the\ncap is reached). Revoke a key you no longer use to free a slot.","operationId":"create_api_key","security":[{"OAuth2PasswordBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIKeyCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIKeyResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"create_api_key_api_v1_auth_api_keys_post"},"get":{"tags":["auth","auth"],"summary":"List Api Keys","description":"List API keys for the current user, optionally filtering by status.","operationId":"list_api_keys","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Filter by key status","description":"Filter keys by status: 'active', 'revoked', or 'all'. Defaults to 'active'.","enum":["active","revoked","all"],"default":"active"},"description":"Filter keys by status: 'active', 'revoked', or 'all'. Defaults to 'active'."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/APIKeyResponse"},"title":"Response List Api Keys Api V1 Auth Api Keys Get"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"list_api_keys_api_v1_auth_api_keys_get"}},"/api/v1/auth/api-keys/{key_id}":{"delete":{"tags":["auth","auth"],"summary":"Revoke Api Key","description":"Revoke (disable) an API key. The key record remains but cannot be used.","operationId":"revoke_api_key","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"revoke_api_key_api_v1_auth_api_keys__key_id__delete"}},"/api/v1/auth/api-keys/{key_id}/unrevoke":{"patch":{"tags":["auth","auth"],"summary":"Unrevoke Api Key","description":"Unrevoke (re-enable) a previously revoked API key.","operationId":"unrevoke_api_key","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"unrevoke_api_key_api_v1_auth_api_keys__key_id__unrevoke_patch"}},"/api/v1/auth/api-keys/{key_id}/force":{"delete":{"tags":["auth","auth"],"summary":"Delete Api Key Permanently","description":"Permanently delete an API key record from the database.","operationId":"delete_api_key_permanently","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"delete_api_key_permanently_api_v1_auth_api_keys__key_id__force_delete"}},"/api/v1/auth/initiate-registration":{"post":{"tags":["auth"],"summary":"Initiate Registration","description":"Initiates registration by sending a verification code.","operationId":"initiate_registration","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserCreate"}}},"required":true},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"initiate_registration_api_v1_auth_initiate_registration_post"}},"/api/v1/auth/verify-registration":{"post":{"tags":["auth"],"summary":"Verify Registration","description":"Verify the code and complete the registration process.","operationId":"verify_registration","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyRegistrationRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"verify_registration_api_v1_auth_verify_registration_post"}},"/api/v1/auth/token":{"post":{"tags":["auth"],"summary":"Login","description":"Generate access token for authenticated user","operationId":"login","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_login_api_v1_auth_token_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"login_api_v1_auth_token_post"}},"/api/v1/auth/refresh":{"post":{"tags":["auth"],"summary":"Refresh Token","description":"Get a new access token using a refresh token.","operationId":"refresh_token","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RefreshTokenRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Token"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"refresh_token_api_v1_auth_refresh_post"}},"/api/v1/auth/oauth/{provider}":{"post":{"tags":["auth"],"summary":"Oauth Login","description":"Login/Register via OAuth provider, including signup limit check.","operationId":"oauth_login","parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}},{"name":"auth_fp","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Auth Fp"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthLoginRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"oauth_login_api_v1_auth_oauth__provider__post"}},"/api/v1/auth/token-health":{"get":{"tags":["auth"],"summary":"Check Token Health","description":"Check token health and expiration status","operationId":"check_token_health","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"security":[{"OptionalOAuth2Scheme":[]}],"x-original-operation-id":"check_token_health_api_v1_auth_token_health_get"}},"/api/v1/auth/logout":{"post":{"tags":["auth"],"summary":"Logout","description":"Logout user and invalidate token - stateless JWT approach","operationId":"logout","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"security":[{"OptionalOAuth2Scheme":[]}],"x-original-operation-id":"logout_api_v1_auth_logout_post"}},"/api/v1/auth/session/validate":{"get":{"tags":["auth"],"summary":"Validate Session","description":"Enhanced session validation endpoint with automatic extension and refresh logic.\n\nFeatures:\n- Lightweight validation optimized for frequent polling\n- Automatic session extension within sliding window\n- Background refresh recommendations\n- Grace period handling for race conditions","operationId":"validate_session","security":[{"OptionalOAuth2Scheme":[]}],"parameters":[{"name":"include_user_data","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include User Data"}},{"name":"auto_extend","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Auto Extend"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionValidationResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"validate_session_api_v1_auth_session_validate_get"}},"/api/v1/auth/sessions":{"get":{"tags":["auth"],"summary":"Get Active Sessions","description":"Get all active sessions for the current user.\nUseful for security dashboard and multi-device session management.","operationId":"get_active_sessions","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/SessionInfo"},"type":"array","title":"Response Get Active Sessions Api V1 Auth Sessions Get"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"security":[{"OAuth2PasswordBearer":[]},{"OptionalOAuth2Scheme":[]}],"x-original-operation-id":"get_active_sessions_api_v1_auth_sessions_get"}},"/api/v1/auth/sessions/revoke":{"post":{"tags":["auth"],"summary":"Revoke Sessions","description":"Revoke specific session(s) for security management.\nSupports revoking single session or all other sessions except current.","operationId":"revoke_sessions","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevokeSessionRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"security":[{"OAuth2PasswordBearer":[]},{"OptionalOAuth2Scheme":[]}],"x-original-operation-id":"revoke_sessions_api_v1_auth_sessions_revoke_post"}},"/api/v1/auth/refresh-enhanced":{"post":{"tags":["auth"],"summary":"Refresh Token Enhanced","description":"Enhanced token refresh with automatic session management and extension.\n\nFeatures:\n- Session-aware token refresh\n- Automatic session extension\n- Device tracking and security\n- Background refresh optimization","operationId":"refresh_token_enhanced","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RefreshTokenRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"refresh_token_enhanced_api_v1_auth_refresh_enhanced_post"}},"/api/v1/auth/refresh-silent":{"post":{"tags":["auth"],"summary":"Refresh Token Silent","description":"Silent token refresh for background processes.\nReturns a minimal response for automatic refresh scenarios.","operationId":"refresh_token_silent","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RefreshTokenRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"refresh_token_silent_api_v1_auth_refresh_silent_post"}},"/api/v1/auth/session/sync":{"post":{"tags":["auth"],"summary":"Sync Session With Nextauth","description":"Synchronize backend session with NextAuth frontend session.\n\nThis endpoint helps resolve infinite redirect loops by ensuring\nbackend and frontend session states are aligned.\n\nOPTIMIZED: This endpoint now:\n- Uses asyncio.timeout to prevent hanging under DB pressure\n- Skips expensive DB query if token validation is sufficient\n- Returns gracefully on timeout instead of 500 error","operationId":"sync_session_with_nextauth","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"security":[{"OptionalOAuth2Scheme":[]}],"x-original-operation-id":"sync_session_with_nextauth_api_v1_auth_session_sync_post"}},"/api/v1/auth/session/heartbeat":{"post":{"tags":["auth"],"summary":"Session Heartbeat","description":"Lightweight session heartbeat for maintaining active sessions.\n\nThis endpoint:\n- Updates last_active timestamp\n- Extends session if within sliding window\n- Returns minimal session status","operationId":"session_heartbeat","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"security":[{"OptionalOAuth2Scheme":[]}],"x-original-operation-id":"session_heartbeat_api_v1_auth_session_heartbeat_post"}},"/api/v1/auth/captcha/generate":{"get":{"tags":["auth"],"summary":"Generate Captcha","description":"Generate a CAPTCHA challenge for enhanced security","operationId":"generate_captcha","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"generate_captcha_api_v1_auth_captcha_generate_get"}},"/api/v1/auth/captcha/verify":{"post":{"tags":["auth"],"summary":"Verify Captcha","description":"Verify a CAPTCHA response","operationId":"verify_captcha","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_verify_captcha_api_v1_auth_captcha_verify_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"verify_captcha_api_v1_auth_captcha_verify_post"}},"/api/v1/auth/captcha/required":{"get":{"tags":["auth"],"summary":"Check Captcha Required","description":"Check if CAPTCHA is required for the current IP","operationId":"check_captcha_required","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"check_captcha_required_api_v1_auth_captcha_required_get"}},"/api/v1/auth/verify-email":{"post":{"tags":["auth"],"summary":"Verify Email","description":"Verify user email","operationId":"verify_email","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_verify_email_api_v1_auth_verify_email_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"verify_email_api_v1_auth_verify_email_post"}},"/api/v1/auth/change-password":{"post":{"tags":["auth"],"summary":"Change Password","description":"Change user password","operationId":"change_password","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasswordChange"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"security":[{"OAuth2PasswordBearer":[]}],"x-original-operation-id":"change_password_api_v1_auth_change_password_post"}},"/api/v1/auth/forgot-password":{"post":{"tags":["auth"],"summary":"Forgot Password","description":"Send password reset email","operationId":"forgot_password","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForgotPassword"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"forgot_password_api_v1_auth_forgot_password_post"}},"/api/v1/auth/reset-password":{"post":{"tags":["auth"],"summary":"Reset Password","description":"Reset password using token","operationId":"reset_password","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResetPassword"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"reset_password_api_v1_auth_reset_password_post"}},"/api/v1/auth/me":{"get":{"tags":["auth"],"summary":"Get Current User Data","description":"Get current user data with subscription and credit details.\n\nOPTIMIZED:\n- Uses user data from get_current_user dependency (loaded from read replica)\n- Credits info is returned as null if not set up (no lazy creation on read)\n- No extra DB queries needed for read operations","operationId":"get_current_user_data","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/User"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"security":[{"OAuth2PasswordBearer":[]}],"x-original-operation-id":"get_current_user_data_api_v1_auth_me_get"},"patch":{"tags":["auth"],"summary":"Update User","description":"Update current user data.\n\nOPTIMIZED:\n- Skips DB write if no fields actually changed\n- Uses async timeout on phone verification check\n- Tracks if any changes were made to avoid unnecessary commits\n- Fetches user from primary DB since we need to write","operationId":"update_user","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserUpdate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/User"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"security":[{"OAuth2PasswordBearer":[]}],"x-original-operation-id":"update_user_api_v1_auth_me_patch"}},"/api/v1/auth/me/profile-image":{"post":{"tags":["auth"],"summary":"Upload Profile Image","description":"Upload a profile image for the current user.\n\nAccepts multipart/form-data with a file field named 'file'.\nSupported formats: JPEG, PNG, WebP, GIF\nMax size: 5MB\n\nThe image is:\n1. Validated for type and size\n2. Resized to 256x256 (if larger)\n3. Converted to WebP for optimal size\n4. Uploaded to R2 storage\n5. URL stored in user.image field\n\nReturns the new profile image URL.","operationId":"upload_profile_image","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"security":[{"OAuth2PasswordBearer":[]}],"x-original-operation-id":"upload_profile_image_api_v1_auth_me_profile_image_post"},"delete":{"tags":["auth"],"summary":"Delete Profile Image","description":"Delete the current user's profile image.\n\nThis removes the image from R2 storage and clears the user.image field.","operationId":"delete_profile_image","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"security":[{"OAuth2PasswordBearer":[]}],"x-original-operation-id":"delete_profile_image_api_v1_auth_me_profile_image_delete"}},"/api/v1/auth/account-providers":{"get":{"tags":["auth"],"summary":"Get User Providers","description":"Get all OAuth provider accounts linked to the current user.\n\nReturns a list of connected provider accounts with their details.","operationId":"get_user_providers","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/UserAccountProvider"},"type":"array","title":"Response Get User Providers Api V1 Auth Account Providers Get"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"security":[{"OAuth2PasswordBearer":[]}],"x-original-operation-id":"get_user_providers_api_v1_auth_account_providers_get"},"post":{"tags":["auth"],"summary":"Link Provider Account","description":"Link an OAuth provider account to the current user.\n\nSupported providers: google, github","operationId":"link_provider_account","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserAccountProviderCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserAccountProvider"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"security":[{"OAuth2PasswordBearer":[]}],"x-original-operation-id":"link_provider_account_api_v1_auth_account_providers_post"}},"/api/v1/auth/account-providers/{provider}":{"delete":{"tags":["auth"],"summary":"Unlink Provider","description":"Unlink an OAuth provider from the current user.\n\nParameters:\n- provider: Name of the provider to unlink (e.g. \"google\", \"github\")","operationId":"unlink_provider","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"unlink_provider_api_v1_auth_account_providers__provider__delete"}},"/api/v1/auth/oauth/refresh-provider/{provider}":{"post":{"tags":["auth"],"summary":"Refresh Provider Token","description":"Retired. Sign-in provider tokens are no longer kept, so there is nothing to refresh.","operationId":"refresh_provider_token","deprecated":true,"security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"refresh_provider_token_api_v1_auth_oauth_refresh_provider__provider__post"}},"/api/v1/auth/send-phone-verification":{"post":{"tags":["auth"],"summary":"Send Phone Verification","description":"Send OTP verification code to phone number using Twilio Programmable SMS","operationId":"send_phone_verification","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PhoneVerificationRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PhoneVerificationResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"security":[{"OAuth2PasswordBearer":[]}],"x-original-operation-id":"send_phone_verification_api_v1_auth_send_phone_verification_post"}},"/api/v1/auth/verify-phone":{"post":{"tags":["auth"],"summary":"Verify Phone","description":"Verify phone number with OTP code","operationId":"verify_phone","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OTPVerificationRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OTPVerificationResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"security":[{"OAuth2PasswordBearer":[]}],"x-original-operation-id":"verify_phone_api_v1_auth_verify_phone_post"}},"/api/v1/auth/save-phone":{"post":{"tags":["auth"],"summary":"Save Phone Number","description":"Save phone number without OTP verification.\n\nThis endpoint allows users to save their phone number for account recovery\npurposes without requiring SMS verification. The phone is marked as\nunverified but stored for future use.","operationId":"save_phone_number","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SavePhoneRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SavePhoneResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"security":[{"OAuth2PasswordBearer":[]}],"x-original-operation-id":"save_phone_number_api_v1_auth_save_phone_post"}},"/api/v1/auth/check-email":{"post":{"tags":["auth"],"summary":"Check Email Availability","description":"Check email availability and provide alias information for better UX.\n\nThis endpoint helps frontend show real-time validation and warnings\nabout email aliases before users complete registration.","operationId":"check_email_availability","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailCheckRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailCheckResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"check_email_availability_api_v1_auth_check_email_post"}},"/api/v1/auth/session/health":{"get":{"tags":["auth"],"summary":"Session Health","description":"Session health diagnostic endpoint for monitoring session management.\n\nAdministrators only. Reports session storage availability and session\nextension settings.","operationId":"session_health","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"security":[{"OptionalOAuth2Scheme":[]},{"OAuth2PasswordBearer":[]}],"x-original-operation-id":"session_health_api_v1_auth_session_health_get"}},"/api/v1/voice/voice-profiles":{"post":{"tags":["voice"],"summary":"Create Voice","description":"Create a new voice profile from an audio file","operationId":"create_voice","requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_create_voice_api_v1_voice_voice_profiles_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Voice"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"create_voice_api_v1_voice_voice_profiles_post"},"get":{"tags":["voice"],"summary":"List Voices","description":"List voices with filtering - user's voices + public voices by default","operationId":"list_voices","parameters":[{"name":"provider","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/TTSProvider"},{"type":"null"}],"title":"Provider"}},{"name":"voice_type","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/app__schemas__enums__VoiceType"},{"type":"null"}],"title":"Voice Type"}},{"name":"is_public","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Public"}},{"name":"include_public","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Include Public"}},{"name":"skip","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Voice"},"title":"Response List Voices Api V1 Voice Voice Profiles Get"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"list_voices_api_v1_voice_voice_profiles_get"}},"/api/v1/voice/voice-profiles/multi-sample":{"post":{"tags":["voice"],"summary":"Create Multi Sample Voice","description":"Create a multi-sample custom voice profile with 1-5 voice samples\n\nThis endpoint creates a custom voice using multiple audio samples for\nhigher-fidelity voice cloning. Multiple samples provide:\n- Better voice quality and consistency\n- More robust speaker characteristics\n- Improved emotional range and expressiveness\n\nArgs:\n    name: Voice profile name\n    description: Optional voice description\n    is_public: Make voice publicly accessible\n    voice_files: 1-5 audio files (WAV, MP3, M4A, FLAC)\n\nReturns:\n    Voice profile with associated sample files","operationId":"create_multi_sample_voice","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_create_multi_sample_voice_api_v1_voice_voice_profiles_multi_sample_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoiceWithSamples"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"create_multi_sample_voice_api_v1_voice_voice_profiles_multi_sample_post"}},"/api/v1/voice/voice-profiles/limits":{"get":{"tags":["voice"],"summary":"Get Voice Profile Limits","description":"Custom-voice slot usage for the authenticated user.\n\nReturns ``{\"used\", \"limit\", \"unlimited\", \"plan\"}``; ``limit`` is ``-1``\n(and ``unlimited`` true) on the tiers with no cap.","operationId":"get_voice_profile_limits","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_voice_profile_limits_api_v1_voice_voice_profiles_limits_get"}},"/api/v1/voice/voice-profiles/{voice_identifier}/samples":{"get":{"tags":["voice"],"summary":"Get Voice Samples","description":"Get all samples for a voice profile","operationId":"get_voice_samples","parameters":[{"name":"voice_identifier","in":"path","required":true,"schema":{"anyOf":[{"type":"integer"},{"type":"string"}],"title":"Voice Identifier"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/VoiceSample"},"title":"Response Get Voice Samples Api V1 Voice Voice Profiles  Voice Identifier  Samples Get"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_voice_samples_api_v1_voice_voice_profiles__voice_identifier__samples_get"},"post":{"tags":["voice"],"summary":"Add Voice Sample","description":"Add an additional sample to an existing voice (up to 5 total)","operationId":"add_voice_sample","parameters":[{"name":"voice_identifier","in":"path","required":true,"schema":{"anyOf":[{"type":"integer"},{"type":"string"}],"title":"Voice Identifier"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_add_voice_sample_api_v1_voice_voice_profiles__voice_identifier__samples_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"add_voice_sample_api_v1_voice_voice_profiles__voice_identifier__samples_post"}},"/api/v1/voice/voice-samples/{sample_id}":{"delete":{"tags":["voice"],"summary":"Delete Voice Sample","description":"Delete a specific voice sample","operationId":"delete_voice_sample","parameters":[{"name":"sample_id","in":"path","required":true,"schema":{"type":"integer","title":"Sample Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"delete_voice_sample_api_v1_voice_voice_samples__sample_id__delete"}},"/api/v1/voice/voices/{voice_id}":{"patch":{"tags":["voice"],"summary":"Update Voice Settings","description":"Update voice settings (name, description, visibility, etc.)","operationId":"update_voice_settings","parameters":[{"name":"voice_id","in":"path","required":true,"schema":{"type":"integer","title":"Voice Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoiceUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Voice"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"update_voice_settings_api_v1_voice_voices__voice_id__patch"},"delete":{"tags":["voice"],"summary":"Delete Voice","description":"Delete a voice profile","operationId":"delete_voice","parameters":[{"name":"voice_id","in":"path","required":true,"schema":{"type":"integer","title":"Voice Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"delete_voice_api_v1_voice_voices__voice_id__delete"}},"/api/v1/voice/voice-clone":{"post":{"tags":["voice"],"summary":"Create Cloning Job","description":"Create a new voice cloning job","operationId":"create_cloning_job","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CloningJobCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CloningJob"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"create_cloning_job_api_v1_voice_voice_clone_post"}},"/api/v1/voice/clone/{job_id}/status":{"get":{"tags":["voice"],"summary":"Get Cloning Job Status","description":"Get detailed status of a cloning job","operationId":"get_cloning_job_status","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Cloning Job Status Api V1 Voice Clone  Job Id  Status Get"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_cloning_job_status_api_v1_voice_clone__job_id__status_get"}},"/api/v1/voice/voice-profiles/{voice_identifier}/preview":{"get":{"tags":["voice"],"summary":"Get Voice Preview","description":"Get a static voice preview sample for testing how a voice sounds\n\nThis endpoint serves pre-generated static audio samples, providing instant\npreview playback without the cost and delay of on-demand generation.\n\nArgs:\n    voice_identifier: ID or UUID of the voice to preview\n    audio_format: Audio format for the preview (mp3 or wav supported)\n    generate_if_missing: Generate preview if static file doesn't exist (admin only)\n\nReturns:\n    StreamingResponse with static audio data","operationId":"get_voice_preview","parameters":[{"name":"voice_identifier","in":"path","required":true,"schema":{"anyOf":[{"type":"integer"},{"type":"string"}],"title":"Voice Identifier"}},{"name":"audio_format","in":"query","required":false,"schema":{"$ref":"#/components/schemas/app__schemas__enums__AudioFormat","default":"mp3"}},{"name":"generate_if_missing","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Generate If Missing"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_voice_preview_api_v1_voice_voice_profiles__voice_identifier__preview_get"}},"/api/v1/voice/voice-profiles/{voice_identifier}/metadata":{"get":{"tags":["voice"],"summary":"Get Voice Metadata","description":"Voice metadata (quality + suggested use cases), computed on the fly.","operationId":"get_voice_metadata","parameters":[{"name":"voice_identifier","in":"path","required":true,"schema":{"anyOf":[{"type":"integer"},{"type":"string"}],"title":"Voice Identifier"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoiceMetadataResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_voice_metadata_api_v1_voice_voice_profiles__voice_identifier__metadata_get"}},"/api/v1/voice/voice-profiles/{voice_identifier}/descriptors":{"get":{"tags":["voice"],"summary":"Get Voice Descriptors","description":"Stored descriptor profile. 404 if none has been generated yet.","operationId":"get_voice_descriptors","parameters":[{"name":"voice_identifier","in":"path","required":true,"schema":{"anyOf":[{"type":"integer"},{"type":"string"}],"title":"Voice Identifier"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoiceDescriptorResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_voice_descriptors_api_v1_voice_voice_profiles__voice_identifier__descriptors_get"}},"/api/v1/voice/voice-profiles/{voice_identifier}/generate-descriptors":{"post":{"tags":["voice"],"summary":"Generate Voice Descriptors","description":"Generate/refresh the deterministic descriptor profile. Owner-only, free, no credits.","operationId":"generate_voice_descriptors","parameters":[{"name":"voice_identifier","in":"path","required":true,"schema":{"anyOf":[{"type":"integer"},{"type":"string"}],"title":"Voice Identifier"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoiceDescriptorResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"generate_voice_descriptors_api_v1_voice_voice_profiles__voice_identifier__generate_descriptors_post"}},"/api/v1/voice/clone/{job_id}/retry":{"post":{"tags":["voice"],"summary":"Retry Cloning Job","description":"Manually retry a failed or pending job","operationId":"retry_cloning_job","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Retry Cloning Job Api V1 Voice Clone  Job Id  Retry Post"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"retry_cloning_job_api_v1_voice_clone__job_id__retry_post"}},"/api/v1/voice/clone/retry-all":{"post":{"tags":["voice"],"summary":"Retry Failed Jobs","description":"Retry all failed or stuck jobs within the age limit","operationId":"retry_failed_jobs","parameters":[{"name":"max_age_hours","in":"query","required":false,"schema":{"type":"integer","default":24,"title":"Max Age Hours"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Retry Failed Jobs Api V1 Voice Clone Retry All Post"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"retry_failed_jobs_api_v1_voice_clone_retry_all_post"}},"/api/v1/voice/voices/{voice_id}/report":{"post":{"tags":["voice"],"summary":"Report Voice","description":"Report a community voice.\n\nFiles a complaint about a publicly shared voice clone — for example a\nrights or impersonation concern. Accepts a short ``reason`` code and\noptional free-text ``details``.\n\nRequires a signed-in user or an API key with the ``voice`` scope; the\nreport is recorded for review.","operationId":"report_voice","parameters":[{"name":"voice_id","in":"path","required":true,"schema":{"type":"integer","title":"Voice Id"}}],"requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_report_voice_api_v1_voice_voices__voice_id__report_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"report_voice_api_v1_voice_voices__voice_id__report_post"}},"/api/v1/voice/clone/{job_id}":{"delete":{"tags":["voice"],"summary":"Delete Cloning Job","description":"Delete a voice cloning job","operationId":"delete_cloning_job","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"delete_cloning_job_api_v1_voice_clone__job_id__delete"}},"/api/v1/voice/voices/{voice_id}/status":{"get":{"tags":["voice"],"summary":"Get Voice Status","description":"Get voice processing status","operationId":"get_voice_status","parameters":[{"name":"voice_id","in":"path","required":true,"schema":{"type":"integer","title":"Voice Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Voice"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_voice_status_api_v1_voice_voices__voice_id__status_get"}},"/api/v1/voice/voice-convert":{"post":{"tags":["voice"],"summary":"Create Voice Conversion","description":"Convert source audio to match target voice characteristics.\n\n**Voice Conversion Process:**\n- **Source Audio** (uploaded file): The speech content that will be converted\n- **Target Voice** (voice_uuid): Reference voice profile whose characteristics will be applied\n\n**How it works:**\n1. Upload your audio file containing the speech content you want to convert\n2. Specify voice_uuid of an existing voice profile to use as reference voice\n3. AudioPod's voice conversion engine makes the source audio sound like the target voice\n4. The original speech content and timing are preserved\n5. Only the voice characteristics (tone, timbre, accent) are changed\n\n**Example Use Cases:**\n- Convert a recording to sound like a specific person's voice\n- Change the speaker in a podcast while keeping the same words\n- Apply a consistent voice across multiple audio segments\n\n**Parameters:**\n- file: Audio file to convert (WAV, MP3, etc.)\n- upload_id: id of a completed direct upload (from `POST /uploads/presign`),\n  used INSTEAD of `file`. Recommended for large sources: the bytes go\n  straight to storage rather than through this request. Provide exactly one\n  of `file` or `upload_id`.\n- voice_uuid: UUID of the voice profile to use as reference voice\n\n**Returns:**\nVoice conversion job with status tracking and output file location when complete.","operationId":"create_voice_conversion","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_create_voice_conversion_api_v1_voice_voice_convert_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoiceConversion"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"create_voice_conversion_api_v1_voice_voice_convert_post"}},"/api/v1/voice/convert/{conversion_id}/status":{"get":{"tags":["voice"],"summary":"Get Conversion Status","description":"Get voice conversion status","operationId":"get_conversion_status","parameters":[{"name":"conversion_id","in":"path","required":true,"schema":{"type":"integer","title":"Conversion Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoiceConversion"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_conversion_status_api_v1_voice_convert__conversion_id__status_get"}},"/api/v1/voice/convert/jobs":{"get":{"tags":["voice"],"summary":"List Conversion Jobs","description":"List all voice conversion jobs with pagination and optional filtering","operationId":"list_conversion_jobs","parameters":[{"name":"skip","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":10,"title":"Limit"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/VoiceConversion"},"title":"Response List Conversion Jobs Api V1 Voice Convert Jobs Get"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"list_conversion_jobs_api_v1_voice_convert_jobs_get"}},"/api/v1/voice/convert/{conversion_id}":{"delete":{"tags":["voice"],"summary":"Delete Conversion Job","description":"Delete a voice conversion job","operationId":"delete_conversion_job","parameters":[{"name":"conversion_id","in":"path","required":true,"schema":{"type":"integer","title":"Conversion Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"delete_conversion_job_api_v1_voice_convert__conversion_id__delete"}},"/api/v1/voice/clone/jobs":{"get":{"tags":["voice"],"summary":"List Cloning Jobs","description":"List all voice cloning jobs with pagination and optional filtering","operationId":"list_cloning_jobs","parameters":[{"name":"skip","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":10,"title":"Limit"}},{"name":"status","in":"query","required":false,"schema":{"type":"string","title":"Status"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CloningJob"},"title":"Response List Cloning Jobs Api V1 Voice Clone Jobs Get"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"list_cloning_jobs_api_v1_voice_clone_jobs_get"}},"/api/v1/voice/clone/stream":{"post":{"tags":["voice"],"summary":"Stream Cloning Job","description":"Generate and stream voice cloning audio using inference_stream.","operationId":"stream_cloning_job","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_stream_cloning_job_api_v1_voice_clone_stream_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"stream_cloning_job_api_v1_voice_clone_stream_post"}},"/api/v1/voice/public/preview-voices":{"get":{"tags":["voice"],"summary":"List Public Preview Voices","description":"List curated public AudioPod voices for landing page preview (NO AUTH REQUIRED)","operationId":"list_public_preview_voices","parameters":[{"name":"language_code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicPreviewVoicesResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"list_public_preview_voices_api_v1_voice_public_preview_voices_get"}},"/api/v1/voice/public/preview-generate":{"post":{"tags":["voice"],"summary":"Generate Public Voice Preview","description":"Generate AudioPod voice preview for landing page (NO AUTH REQUIRED, STREAM ONLY)","operationId":"generate_public_voice_preview","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_generate_public_voice_preview_api_v1_voice_public_preview_generate_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"generate_public_voice_preview_api_v1_voice_public_preview_generate_post"}},"/api/v1/voice/public/preview-direct":{"post":{"tags":["voice"],"summary":"Generate Public Directed Preview","description":"Premium *directed* voice preview for the landing-page live demo.\n\nUnauthenticated, streamed audio only. Runs on the premium quality tier so\ninline directing markup (``[excited]``, ``[laugh]``, ``<break/>``,\n``/IPA/``) is actually performed.\n\n``voice`` (optional) selects one of a small fixed set of demo voices; any\nother value falls back to the default demo voice.\n\nAnonymous demo limits: **2 generations per IP per day**. Repeating text\nthat was already generated is served from a 24h cache and does not count\nagainst the limit. Returns 429 once the daily limit is reached — sign in\nfor unmetered synthesis.","operationId":"generate_public_directed_preview","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_generate_public_directed_preview_api_v1_voice_public_preview_direct_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"generate_public_directed_preview_api_v1_voice_public_preview_direct_post"}},"/api/v1/voice/blog-tts/dispatch":{"post":{"tags":["voice"],"summary":"Dispatch Blog Tts","description":"Queue a blog/page narration render and return immediately.\n\nRequires an API key with the ``voice`` scope.\n\nReturns 202 as soon as the render is accepted. A long render cannot finish\ninside the request timeout, so use this endpoint rather than the\nsynchronous sibling and poll storage for the finished artifact.","operationId":"dispatch_blog_tts","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlogTTSDispatchRequest"}}},"required":true},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"dispatch_blog_tts_api_v1_voice_blog_tts_dispatch_post"}},"/api/v1/voice/blog-tts/generate":{"post":{"tags":["voice"],"summary":"Generate Blog Tts","description":"Generate TTS audio for blog posts using AudioPod's TTS engine.\n\nThis endpoint uses our TTS engine which is optimized for long-form content\nlike blog articles. It supports automatic text chunking for very long articles.\n\nArgs:\n    text: The blog post text to convert to speech\n    voice_id: Voice ID (default: \"charon\" - Sage voice)\n    language: Language code (default: \"en-US\")\n\nReturns:\n    WAV audio file as streaming response","operationId":"generate_blog_tts","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlogTTSRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"generate_blog_tts_api_v1_voice_blog_tts_generate_post"}},"/api/v1/voice/public/multi-speaker-generate":{"post":{"tags":["voice"],"summary":"Generate Multi Speaker Public Preview","description":"Generate multi-speaker TTS for conversations (NO AUTH REQUIRED, STREAM ONLY)\n\nExpected format:\n- conversation_text: \"Joe: Hello Jane! Jane: Hi Joe, how are you? Joe: I'm great!\"\n- speaker_voices: '{\"Joe\": \"algieba\", \"Jane\": \"aoede\"}'","operationId":"generate_multi_speaker_public_preview","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_generate_multi_speaker_public_preview_api_v1_voice_public_multi_speaker_generate_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"generate_multi_speaker_public_preview_api_v1_voice_public_multi_speaker_generate_post"}},"/api/v1/voice/public-voice-profiles":{"get":{"tags":["voice"],"summary":"List Public Voices","description":"Public, unauthenticated voice catalog for marketing surfaces.\n\nReturns a narrow, display-safe projection of each voice\n(``PublicVoiceCatalogItem``): display name, slug, language, gender and\nthe derived use-case axis. Callers that need the full record, or\nfiltering beyond what this route accepts, should use the authenticated\n``/voices`` endpoint with an API key.","operationId":"list_public_voices","parameters":[{"name":"language_code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language Code"}},{"name":"skip","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PublicVoiceCatalogItem"},"title":"Response List Public Voices Api V1 Voice Public Voice Profiles Get"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"list_public_voices_api_v1_voice_public_voice_profiles_get"}},"/api/v1/voice/tts-jobs/counts":{"get":{"tags":["voice"],"summary":"Get Tts And Conversion Counts","description":"Get counts of text-to-speech (single and multi-voice) and voice conversion jobs for the current user.\n\nOptional query param:\n- status: Filter counts by job status (PENDING, PROCESSING, COMPLETED, FAILED)\n\nReturns totals for:\n- text_to_speech.single_voice (CloningJobModel)\n- text_to_speech.multi_voice (MultiVoiceTTSJobModel)\n- text_to_speech.total (single + multi)\n- voice_conversion.total (VoiceConversionModel)\n- overall_total (all combined)\n- text_to_speech.group_count: History items (a script and its versions\n  count once), single and multi-voice together\n- overall_group_total: group_count + voice_conversion.total, the number\n  of rows `GET /voice/tts-jobs/history?grouped=true` pages through","operationId":"get_tts_and_conversion_counts","parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Tts And Conversion Counts Api V1 Voice Tts Jobs Counts Get"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_tts_and_conversion_counts_api_v1_voice_tts_jobs_counts_get"}},"/api/v1/voice/standard-voices":{"post":{"tags":["voice"],"summary":"Create Standard Voice","description":"Create a new standard voice from provider catalog (Admin only)","operationId":"create_standard_voice","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoiceCreateStandard"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Voice"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"security":[{"OAuth2PasswordBearer":[]}],"x-original-operation-id":"create_standard_voice_api_v1_voice_standard_voices_post"}},"/api/v1/voice/voices/populate/{provider}":{"post":{"tags":["voice"],"summary":"Populate Provider Voices","description":"Populate database with default voices from a specific provider (Admin only)","operationId":"populate_provider_voices","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"provider","in":"path","required":true,"schema":{"$ref":"#/components/schemas/TTSProvider"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"populate_provider_voices_api_v1_voice_voices_populate__provider__post"}},"/api/v1/voice/voices/{voice_identifier}/generate-stream":{"post":{"tags":["voice"],"summary":"Stream Voice Generation","description":"Queue a voice generation job and return its job ID.\n\nCredits are reserved up front and charged when the audio is ready; failed\njobs are refunded.","operationId":"stream_voice_generation","parameters":[{"name":"voice_identifier","in":"path","required":true,"schema":{"anyOf":[{"type":"integer"},{"type":"string"}],"title":"Voice Identifier"}}],"requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_stream_voice_generation_api_v1_voice_voices__voice_identifier__generate_stream_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Stream Voice Generation Api V1 Voice Voices  Voice Identifier  Generate Stream Post"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"stream_voice_generation_api_v1_voice_voices__voice_identifier__generate_stream_post"}},"/api/v1/voice/voices/{voice_identifier}/generate":{"post":{"tags":["voice"],"summary":"Generate Voice Audio","description":"Generate audio using any voice - Creates a background job and returns job ID\n\nThis endpoint creates a job for audio generation with automatic provider detection:\n- Supports multiple built-in voice engines\n- All audio formats supported by the respective providers\n- Variable speed control (provider dependent)\n- Automatic model selection based on voice configuration\n- Credit reservation and management\n\nArgs:\n    voice_identifier: ID or UUID of the voice to use\n    input_text: Text to convert to speech\n    audio_format: Output audio format (provider dependent)\n    language: Language of the input text (optional, auto-detected if not provided)\n    speed: Speech speed (0.25 to 4.0, varies by voice)\n    generation_params: JSON object. Besides the delivery settings it may\n        carry the History fields `history_group_id` (save as a new version\n        of that History item; omit to start a new one; 404 if it is not\n        yours), `source` (the editor's script, at most 40,000 characters)\n        and `cast` (speaker name to voice id).\n\nReturns:\n    Job information with job_id for status tracking, and\n    `history_group_id`, the History item it was saved under.","operationId":"generate_voice_audio","parameters":[{"name":"voice_identifier","in":"path","required":true,"schema":{"anyOf":[{"type":"integer"},{"type":"string"}],"title":"Voice Identifier"}}],"requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_generate_voice_audio_api_v1_voice_voices__voice_identifier__generate_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Generate Voice Audio Api V1 Voice Voices  Voice Identifier  Generate Post"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"generate_voice_audio_api_v1_voice_voices__voice_identifier__generate_post"}},"/api/v1/voice/collections":{"post":{"tags":["voice"],"summary":"Create Voice Collection","description":"Create a new voice collection","operationId":"create_voice_collection","security":[{"OAuth2PasswordBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoiceCollectionCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoiceCollectionResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"create_voice_collection_api_v1_voice_collections_post"},"get":{"tags":["voice"],"summary":"List Voice Collections","description":"List user's voice collections","operationId":"list_voice_collections","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"include_voices","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Voices"}},{"name":"include_public","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Include Public"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/VoiceCollection"},"title":"Response List Voice Collections Api V1 Voice Collections Get"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"list_voice_collections_api_v1_voice_collections_get"}},"/api/v1/voice/collections/{collection_id}":{"put":{"tags":["voice"],"summary":"Update Voice Collection","description":"Update a voice collection","operationId":"update_voice_collection","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"collection_id","in":"path","required":true,"schema":{"type":"integer","title":"Collection Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoiceCollectionUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoiceCollectionResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"update_voice_collection_api_v1_voice_collections__collection_id__put"},"delete":{"tags":["voice"],"summary":"Delete Voice Collection","description":"Delete a voice collection","operationId":"delete_voice_collection","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"collection_id","in":"path","required":true,"schema":{"type":"integer","title":"Collection Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"delete_voice_collection_api_v1_voice_collections__collection_id__delete"}},"/api/v1/voice/collections/{collection_id}/voices":{"post":{"tags":["voice"],"summary":"Add Voices To Collection","description":"Add voices to a collection","operationId":"add_voices_to_collection","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"collection_id","in":"path","required":true,"schema":{"type":"integer","title":"Collection Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoiceCollectionAddVoices"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"add_voices_to_collection_api_v1_voice_collections__collection_id__voices_post"},"delete":{"tags":["voice"],"summary":"Remove Voices From Collection","description":"Remove voices from a collection","operationId":"remove_voices_from_collection","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"collection_id","in":"path","required":true,"schema":{"type":"integer","title":"Collection Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoiceCollectionRemoveVoices"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"remove_voices_from_collection_api_v1_voice_collections__collection_id__voices_delete"}},"/api/v1/voice/multi-voice-tts":{"post":{"tags":["voice"],"summary":"Create Multi Voice Tts","description":"Create a multi-voice TTS generation job with automatic provider routing and credit management\n\nThis endpoint creates jobs for multi-voice TTS with:\n- Automatic provider detection and routing per voice\n- Credit reservation and management\n- Support for multiple built-in voice engines\n- Audio mixing with multiple modes (sequential, parallel, timed)\n- Durable storage of the rendered output, returned as a download URL\n\nArgs:\n    segments: JSON string of text segments with voice assignments\n    mix_mode: How to combine voices ('sequential', 'parallel', 'timed')\n    output_format: Output audio format ('wav', 'mp3', 'ogg')\n    silence_duration: Silence between segments in sequential mode\n    normalize_volume: Normalize volume across different voices\n    generation_params: Generation settings as a JSON object. It may also\n        carry the History fields `history_group_id` (save as a new version\n        of that History item; omit to start a new one; 404 if it is not\n        yours), `source` (the editor's script, at most 40,000 characters)\n        and `cast` (speaker name to voice id; fills a segment's\n        `speaker_label` when it has none and exactly one speaker uses\n        its voice).\n    target_language: Language of the text (optional, auto-detected if not provided)\n\nReturns:\n    Job information with job_id for status tracking, and\n    `history_group_id`, the History item it was saved under.","operationId":"create_multi_voice_tts","requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_create_multi_voice_tts_api_v1_voice_multi_voice_tts_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MultiVoiceTTSResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"create_multi_voice_tts_api_v1_voice_multi_voice_tts_post"},"get":{"tags":["voice"],"summary":"List Multi Voice Tts Jobs","description":"List user's multi-voice TTS jobs with flexible authentication","operationId":"list_multi_voice_tts_jobs","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MultiVoiceTTSJob"},"title":"Response List Multi Voice Tts Jobs Api V1 Voice Multi Voice Tts Get"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"list_multi_voice_tts_jobs_api_v1_voice_multi_voice_tts_get"}},"/api/v1/voice/multi-voice-tts/{job_id}":{"get":{"tags":["voice"],"summary":"Get Multi Voice Tts Job","description":"Get specific multi-voice TTS job details with flexible authentication","operationId":"get_multi_voice_tts_job","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MultiVoiceTTSJob"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_multi_voice_tts_job_api_v1_voice_multi_voice_tts__job_id__get"},"delete":{"tags":["voice"],"summary":"Delete Multi Voice Tts Job","description":"Delete a multi-voice TTS job","operationId":"delete_multi_voice_tts_job","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"delete_multi_voice_tts_job_api_v1_voice_multi_voice_tts__job_id__delete"}},"/api/v1/voice/tts-jobs/history":{"get":{"tags":["voice"],"summary":"Get Unified Tts History","description":"Get unified TTS job history combining single, multi-voice, and voice conversion jobs\n\nThis endpoint provides a single source for all voice job history, combining:\n- Single speaker voice generation jobs (from cloning_jobs table)\n- Multi-speaker voice generation jobs (from multivoice_tts_jobs table)\n- Voice conversion jobs (from voice_conversions table)\n\nResults are sorted by creation date (newest first) and normalized to a common format.\n\nArgs:\n    limit: Maximum number of jobs to return (1-100, default: 20)\n    offset: Number of jobs to skip for pagination (default: 0)\n    status: Filter by job status (PENDING, PROCESSING, COMPLETED, FAILED)\n    job_type: Filter by job type ('single', 'multi', 'conversion', or None for all)\n    grouped: When true, return one row per History item (a script and\n        its versions) instead of one row per job. Each row is the item's\n        newest version, plus `version_count` and `first_created_at`; items\n        are ordered by their newest version (newest first) and `limit` /\n        `offset` count items. `status` and `job_type` filter versions\n        before grouping. Fetch an item's versions from\n        `GET /voice/tts-jobs/history/groups/{history_group_id}`.\n\nReturns:\n    List of normalized job objects with unified structure.\n    `timestamps_url` and `visemes_url` are short-lived download links for a\n    speech job's word timings and lip-sync data (JSON), or null when the\n    job has none. `has_master` is true when a lossless original is stored\n    for a speech job, so a WAV download is made from it rather than\n    converted from the MP3.\n\n    With `grouped=true` every row also has `history_group_id` (the History\n    item), `source` (the script as written in the editor, or null when it\n    was not saved), `cast` (speaker name to voice id, or null) and\n    `settings` (the settings it was made with), so the version can be\n    opened in the editor again.","operationId":"get_unified_tts_history","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"job_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Type"}},{"name":"grouped","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Grouped"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response Get Unified Tts History Api V1 Voice Tts Jobs History Get"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_unified_tts_history_api_v1_voice_tts_jobs_history_get"}},"/api/v1/voice/tts-jobs/history/groups/{group_id}":{"get":{"tags":["voice"],"summary":"Get Tts History Group","description":"Get every version of one History item (a script and its edits,\nregenerations and voice changes), newest first.\n\n`group_id` is a row's `history_group_id` from\n`GET /voice/tts-jobs/history`. Only your own History items are found;\nany other id returns 404.\n\nReturns `{\"history_group_id\", \"version_count\", \"first_created_at\",\n\"versions\": [...]}`. Each version has the same fields as a History row,\nincluding `source` (the script as written in the editor, or null when it\nwas not saved), `cast` (speaker name to voice id, or null) and `settings`,\nso it can be opened in the editor again. At most the newest 500 versions\nare listed; `version_count` is always the full count.","operationId":"get_tts_history_group","parameters":[{"name":"group_id","in":"path","required":true,"schema":{"type":"string","title":"Group Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Tts History Group Api V1 Voice Tts Jobs History Groups  Group Id  Get"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_tts_history_group_api_v1_voice_tts_jobs_history_groups__group_id__get"}},"/api/v1/voice/tts-jobs/{job_id}/status":{"get":{"tags":["voice"],"summary":"Get Unified Job Status","description":"Get unified job status for single, multi-voice TTS, and voice conversion jobs\n\nThis endpoint automatically detects whether the job_id belongs to:\n- Single speaker voice generation (cloning_jobs table)\n- Multi-speaker voice generation (multivoice_tts_jobs table)\n- Voice conversion (voice_conversions table)\n\nReturns a normalized status response regardless of job type.\n\nArgs:\n    job_id: The job ID to get status for\n\nReturns:\n    Unified job status with consistent format.\n    `timestamps_url` and `visemes_url` are short-lived download links for a\n    speech job's word timings and lip-sync data (JSON), or null when the\n    job has none. `has_master` is true when a lossless original is stored\n    for a speech job, so a WAV download is made from it rather than\n    converted from the MP3.","operationId":"get_unified_job_status","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Unified Job Status Api V1 Voice Tts Jobs  Job Id  Status Get"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_unified_job_status_api_v1_voice_tts_jobs__job_id__status_get"}},"/api/v1/voice/voice-profiles/{voice_identifier}/supported-languages":{"get":{"tags":["voice"],"summary":"Get Voice Supported Languages","description":"Get supported languages for a specific voice\n\nReturns a dictionary of language codes to language names that are supported\nby the TTS provider for this voice.\n\nArgs:\n    voice_identifier: ID or UUID of the voice\n\nReturns:\n    Dictionary mapping language codes to language names\n\nExample:\n    {\n        \"en\": \"English\",\n        \"es\": \"Spanish\",\n        \"fr\": \"French\",\n        ...\n    }","operationId":"get_voice_supported_languages","parameters":[{"name":"voice_identifier","in":"path","required":true,"schema":{"anyOf":[{"type":"integer"},{"type":"string"}],"title":"Voice Identifier"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"string"},"title":"Response Get Voice Supported Languages Api V1 Voice Voice Profiles  Voice Identifier  Supported Languages Get"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_voice_supported_languages_api_v1_voice_voice_profiles__voice_identifier__supported_languages_get"}},"/api/v1/voice/public/convert/limits":{"get":{"tags":["voice"],"summary":"Get Public Voice Convert Limits","description":"Get public voice conversion demo limits and current usage status.\nNo authentication required.","operationId":"get_public_voice_convert_limits","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_public_voice_convert_limits_api_v1_voice_public_convert_limits_get"}},"/api/v1/voice/public/convert/voices":{"get":{"tags":["voice"],"summary":"List Public Demo Voices","description":"List available public voices for demo voice conversion.\nNo authentication required.","operationId":"list_public_demo_voices","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/VoicePublicItem"},"type":"array","title":"Response List Public Demo Voices Api V1 Voice Public Convert Voices Get"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"list_public_demo_voices_api_v1_voice_public_convert_voices_get"}},"/api/v1/voice/public/convert/process":{"post":{"tags":["voice"],"summary":"Process Public Voice Conversion","description":"Process voice conversion for demo - PREVIEW ONLY, NO DOWNLOAD.\n\nLimitations for free public usage:\n- 3 uses per day per IP (shared with other demo tools)\n- Maximum 6 minutes audio duration\n- Preview only (streaming), no download\n- Only public voices available as targets\n- No account required\n\nCreate a free account at /auth/signup: 5,000 free credits every month.","operationId":"process_public_voice_conversion","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_process_public_voice_conversion_api_v1_voice_public_convert_process_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"process_public_voice_conversion_api_v1_voice_public_convert_process_post"}},"/api/v1/voice/agent/synthesize":{"post":{"tags":["voice"],"summary":"Voice AI Agent TTS","description":"Low-latency TTS for voice AI agents. English-only. Supports paralinguistic tags: [laugh], [sigh], [cough], [chuckle], [gasp], [groan], [yawn]. Billed per input character at the standard text-to-speech rate, the same as the other text-to-speech endpoints. The cost is reserved from your credits (or API balance) before synthesis starts. It is charged in full once the audio has been produced, whether or not your client stays connected to receive it, and released in full if production fails. Returns 402 with the usual insufficient-credits payload when the balance cannot cover the request.","operationId":"agent_synthesize","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentSynthesizeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentSynthesizeResponse"}}}},"402":{"description":"Insufficient credits or API balance for this request."},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"agent_synthesize_api_v1_voice_agent_synthesize_post"}},"/api/v1/voice/agent/synthesize/stream":{"post":{"tags":["voice"],"summary":"Voice AI Agent TTS (Streaming)","description":"Streaming TTS for voice AI agents. Returns audio/wav bytes directly to the caller — no storage round-trip. English-only. Supports paralinguistic tags: [laugh], [sigh], [cough], [chuckle], [gasp], [groan], [yawn]. Billed per input character at the standard text-to-speech rate, the same as the other text-to-speech endpoints. The cost is reserved from your credits (or API balance) before synthesis starts. It is charged in full once the audio has been produced, whether or not your client stays connected to receive it, and released in full if production fails. Returns 402 with the usual insufficient-credits payload when the balance cannot cover the request. If the audio stream fails part-way on our side, the charge is released and the connection is closed without completing the response.","operationId":"agent_synthesize_stream","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentSynthesizeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"402":{"description":"Insufficient credits or API balance for this request."},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"agent_synthesize_stream_api_v1_voice_agent_synthesize_stream_post"}},"/api/v1/voice/design":{"post":{"tags":["voice-design"],"summary":"Design Voice","description":"Generate candidate voices from a text description (paid: 250 credits per\npreview). Returns short presigned previews the user can audition, then\npublish via ``/design/publish``.","operationId":"design_voice","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoiceDesignRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoiceDesignResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"design_voice_api_v1_voice_design_post"}},"/api/v1/voice/design/publish":{"post":{"tags":["voice-design"],"summary":"Publish Designed Voice","description":"Publish a designed preview into a durable custom voice (free).","operationId":"publish_designed_voice","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoiceDesignPublishRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Voice"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"publish_designed_voice_api_v1_voice_design_publish_post"}},"/api/v1/voice/tts/stream":{"post":{"tags":["voice"],"summary":"Create Tts Stream","description":"Start live audio and return how to listen to it.\n\nCredits are reserved when the audio is created, charged when it finishes,\nand fully returned if it fails. Returns one of:\n\n- `{\"mode\": \"stream\", \"job_id\", \"stream_id\", \"take\"}`: attach to\n  `GET /voice/tts/stream/{stream_id}` to hear it as it is generated. The\n  finished audio is also saved like any other generation.\n- `{\"mode\": \"batch\", \"job_id\", \"take\"}`: this audio is being prepared the\n  regular way (some voices, or a busy moment); poll the job as usual.\n\nThe `take` field is `single` (one segment; poll\n`/voice/tts-jobs/{job_id}/status`) or `multi` (several segments; poll\n`/voice/multi-voice-tts/{job_id}`).\n\nAn account can have two live audios playing at a time; a third returns 429.\n\n**History.** Every answer also carries `history_group_id`, the History\nitem this audio belongs to. Optional body fields:\n\n- `history_group_id`: send it to save this audio as a new version of an\n  item already in History (an edit, a voice change). Omit it to start a\n  new item. An id that is not one of your History items returns 404.\n- `source`: the script exactly as written in the editor, speaker names\n  and tags included (at most 40,000 characters). Returned in History so\n  the version can be opened again.\n- `cast`: speaker name to voice id, e.g. `{\"Narrator\": \"123\"}`.\n- `segments[].speaker_label`: the speaker of a segment; when omitted it\n  is taken from `cast` if exactly one speaker uses that voice.","operationId":"create_tts_stream","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StreamCreateIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Create Tts Stream Api V1 Voice Tts Stream Post"}}}},"404":{"description":"A voice was not found, or live playback is not available."},"422":{"description":"The text is too long, or has too many or too long pauses, to play live."},"429":{"description":"You already have two audios playing live. Wait for one to finish, then try again."},"402":{"description":"Not enough credits."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"create_tts_stream_api_v1_voice_tts_stream_post"}},"/api/v1/voice/tts/takes/{job_id}/regenerate":{"post":{"tags":["voice"],"summary":"Regenerate Take Paragraph","description":"Re-record one paragraph of finished live audio.\n\nOnly the new paragraph is charged (its characters, reserved now and\ncharged when it is ready, returned in full if it fails). The result is\nNEW audio with the other paragraphs reused exactly as they were; the\noriginal audio is not changed. Listen to the new paragraph live at\n`GET /voice/tts/stream/{stream_id}`; the new audio's `job_id` is saved like\nany other.\n\nThe new audio is a new version of the same History item. Send `source`\n(the whole script as now written in the editor) to save it with that\nversion.\n\nReturns `{\"mode\": \"stream\", \"take\", \"job_id\", \"stream_id\",\n\"parent_take_id\", \"paragraph_index\", \"estimated_credits\",\n\"history_group_id\"}`.","operationId":"regenerate_take_paragraph","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegenerateIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Regenerate Take Paragraph Api V1 Voice Tts Takes  Job Id  Regenerate Post"}}}},"404":{"description":"Audio not found, or it can't be edited one paragraph at a time."},"409":{"description":"The audio is not finished yet, or the id is ambiguous."},"422":{"description":"The new text is not a single paragraph, or the voice can't do it."},"429":{"description":"You already have two audios playing live. Wait for one to finish, then try again."},"402":{"description":"Not enough credits."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"regenerate_take_paragraph_api_v1_voice_tts_takes__job_id__regenerate_post"}},"/api/v1/voice/tts/stream/{stream_id}":{"get":{"tags":["voice"],"summary":"Attach Tts Stream","description":"Listen to live audio as newline-delimited JSON.\n\nEach line is one event with an `id` and a type `t`:\n\n- `audio`: `pcm` is base64 raw audio (signed 16-bit little-endian, mono,\n  24 kHz); `seg` is the segment index.\n- `words`: `words`, `start_s`, `end_s` on the audio's timeline.\n- `visemes`: lip-sync spans, when requested.\n- `silence`: `ms` of pause between two segments (no audio is sent for it).\n- `chunk_done`: part of the audio finished.\n- `pending`: the audio has not started yet, or nothing new has arrived.\n- `done`: the audio is saved; `job_id` names it.\n- `error`: the audio failed and its credits were returned; `message` says so.\n\nIf the connection drops, reconnect with `?from=<last id>` to continue\nwhere you left off; reconnecting is free. About a minute after the audio\nfinishes the live copy is gone and this returns 410: play the saved audio.","operationId":"attach_tts_stream","parameters":[{"name":"stream_id","in":"path","required":true,"schema":{"type":"string","title":"Stream Id"}},{"name":"from","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Resume after this event id","title":"From"},"description":"Resume after this event id"}],"responses":{"200":{"description":"Successful Response","content":{"application/x-ndjson":{}}},"404":{"description":"Live audio not found."},"410":{"description":"This live audio has ended. Play it from History instead."},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"attach_tts_stream_api_v1_voice_tts_stream__stream_id__get"}},"/api/v1/voice/tts-jobs/{job_id}/export":{"get":{"tags":["voice"],"summary":"Export Tts Take","description":"Download finished single-voice audio as MP3 or WAV.\n\nThe `X-Export-Source` header says what the file was made from: `master`\n(the lossless original), `wav`, `mp3`, or the stored file's own format\n(for example `ogg`) for older audio. A WAV made from MP3-only\naudio cannot be better than that MP3.","operationId":"export_tts_take","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}},{"name":"format","in":"query","required":false,"schema":{"enum":["mp3","wav"],"type":"string","description":"mp3 or wav","default":"mp3","title":"Format"},"description":"mp3 or wav"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"302":{"description":"Redirect to the stored file when it already is the requested format."},"404":{"description":"Audio not found."},"409":{"description":"The audio is not finished yet."},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"export_tts_take_api_v1_voice_tts_jobs__job_id__export_get"}},"/api/v1/voice/multi-voice-tts/{job_id}/export":{"get":{"tags":["voice"],"summary":"Export Multi Voice Take","description":"Download finished multi-voice audio as MP3 or WAV.\n\nThe `X-Export-Source` header says what the file was made from: `master`\n(the lossless original), `wav`, `mp3`, or the stored file's own format\n(for example `ogg`) for older audio.","operationId":"export_multi_voice_take","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}},{"name":"format","in":"query","required":false,"schema":{"enum":["mp3","wav"],"type":"string","description":"mp3 or wav","default":"mp3","title":"Format"},"description":"mp3 or wav"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"302":{"description":"Redirect to the stored file when it already is the requested format."},"404":{"description":"Audio not found."},"409":{"description":"The audio is not finished yet."},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"export_multi_voice_take_api_v1_voice_multi_voice_tts__job_id__export_get"}},"/api/v1/speaker/jobs/counts":{"get":{"tags":["speaker"],"summary":"Get Speaker Job Counts","description":"Get counts of speaker jobs (diarization/extraction) for the authenticated user.\n\nOptional filters:\n- status: PENDING | PROCESSING | COMPLETED | FAILED (case-insensitive)\n- job_type: diarization | extraction (case-insensitive)","operationId":"get_speaker_job_counts","parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"job_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Type"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Speaker Job Counts Api V1 Speaker Jobs Counts Get"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_speaker_job_counts_api_v1_speaker_jobs_counts_get"}},"/api/v1/speaker/diarize":{"post":{"tags":["speaker"],"summary":"Create Diarization Job","description":"Create a speaker diarization job\n\nEither provide a file upload or a URL to an audio/video file.\nFor URLs, supports various sources including YouTube, Vimeo, etc.\n\nRepeat submissions: sending the same input with the same options while your\nearlier job is still running does not create or charge a new job. The\nresponse is HTTP 200 with that existing job and ``duplicate_of: true``; use\nits ``id`` as usual. Failed jobs never count as repeats. If an earlier job\nhas shown no progress for over 30 minutes, ``force_rerun=true`` submits a\nnew job (charged as a new job).","operationId":"create_diarization_job","parameters":[{"name":"num_speakers","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Optional: specify number of speakers","title":"Num Speakers"},"description":"Optional: specify number of speakers"},{"name":"force_rerun","in":"query","required":false,"schema":{"type":"boolean","description":"Set true to submit a new job even though an identical earlier request exists (charged as a new job). A matching job that started less than 30 minutes ago is still returned instead.","default":false,"title":"Force Rerun"},"description":"Set true to submit a new job even though an identical earlier request exists (charged as a new job). A matching job that started less than 30 minutes ago is still returned instead."}],"requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_create_diarization_job_api_v1_speaker_diarize_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpeakerJobResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"create_diarization_job_api_v1_speaker_diarize_post"}},"/api/v1/speaker/extract":{"post":{"tags":["speaker"],"summary":"Create Extraction Job","description":"Create a speaker extraction job\n\nProvide exactly one of: a file upload, a URL to an audio/video file, or an\n``upload_id`` from a presigned direct-to-R2 upload (POST /uploads/presign).\nFor URLs, supports various sources including YouTube, Vimeo, etc.\n\nSpeaker detection tuning:\n- num_speakers: If you know exactly how many speakers, set this for best accuracy\n- min_speakers/max_speakers: Set bounds if you're unsure of exact count\n- clustering_threshold: Fine-tune detection sensitivity (0.7 default works well for most audio)\n    - Higher (0.8-0.9): More lenient, fewer speakers detected (good for noisy audio)\n    - Lower (0.4-0.6): More strict, more speakers detected (good for similar voices)\n\nTranscription:\n- include_transcription: When enabled, returns speaker-labeled transcription with timestamps\n\nCrosstalk:\n- overlap_mode: separate | duplicate | exclusive (see the parameter description)\n\nRepeat submissions: sending the same input with the same options while your\nearlier job is still running does not create or charge a new job. The\nresponse is HTTP 200 with that existing job and ``duplicate_of: true``; use\nits ``id`` as usual. Failed jobs never count as repeats. If an earlier job\nhas shown no progress for over 30 minutes, ``force_rerun=true`` submits a\nnew job (charged as a new job).","operationId":"create_extraction_job","parameters":[{"name":"num_speakers","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Optional: specify exact number of speakers if known","title":"Num Speakers"},"description":"Optional: specify exact number of speakers if known"},{"name":"min_speakers","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Optional: minimum number of speakers expected","title":"Min Speakers"},"description":"Optional: minimum number of speakers expected"},{"name":"max_speakers","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Optional: maximum number of speakers expected","title":"Max Speakers"},"description":"Optional: maximum number of speakers expected"},{"name":"clustering_threshold","in":"query","required":false,"schema":{"type":"number","maximum":0.95,"minimum":0.3,"description":"Speaker clustering sensitivity (0.3-0.95). Lower values detect more speakers (better for similar voices); higher values detect fewer (better for noisy audio). Default 0.7 works well for most podcasts and meetings.","default":0.7,"title":"Clustering Threshold"},"description":"Speaker clustering sensitivity (0.3-0.95). Lower values detect more speakers (better for similar voices); higher values detect fewer (better for noisy audio). Default 0.7 works well for most podcasts and meetings."},{"name":"include_transcription","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Include speaker-labeled transcription with the separated audio","default":false,"title":"Include Transcription"},"description":"Include speaker-labeled transcription with the separated audio"},{"name":"overlap_mode","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"How crosstalk (two people talking at once) is handled: 'separate' isolates each voice so a track holds only its own speaker, 'duplicate' leaves the crosstalk in every track it belongs to, 'exclusive' keeps it only in the dominant speaker's track. Defaults to the account setting.","title":"Overlap Mode"},"description":"How crosstalk (two people talking at once) is handled: 'separate' isolates each voice so a track holds only its own speaker, 'duplicate' leaves the crosstalk in every track it belongs to, 'exclusive' keeps it only in the dominant speaker's track. Defaults to the account setting."},{"name":"force_rerun","in":"query","required":false,"schema":{"type":"boolean","description":"Set true to submit a new job even though an identical earlier request exists (charged as a new job). A matching job that started less than 30 minutes ago is still returned instead.","default":false,"title":"Force Rerun"},"description":"Set true to submit a new job even though an identical earlier request exists (charged as a new job). A matching job that started less than 30 minutes ago is still returned instead."}],"requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_create_extraction_job_api_v1_speaker_extract_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpeakerJobResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"create_extraction_job_api_v1_speaker_extract_post"}},"/api/v1/speaker/separate":{"post":{"tags":["speaker"],"summary":"Create Voice Separation Job","description":"Separate overlapping voices in audio.\n\nThis endpoint separates simultaneously speaking voices that overlap in time.\nUnlike speaker extraction (which handles turn-taking speakers), this is\ndesigned for the cocktail-party problem where voices overlap.\n\n**Use Cases:**\n- Choir recordings with multiple singers\n- Podcast/interview with crosstalk\n- Meeting recordings with simultaneous speakers\n- Duets where both vocalists sing together\n\n**Quality tiers:**\n- fast: quick processing, good quality (~2x realtime)\n- balanced: higher quality, slower (~1x realtime)\n- high-quality: best quality, slowest (~0.5x realtime)\n\n**Modes:**\n- voice_only: Direct separation on input (best for speech-only audio)\n- extract_vocals_first: Isolate vocals then separate (best for music)\n\nEither provide a file upload or a URL to an audio/video file.\nSupports YouTube, Vimeo, and other video platforms.\n\nRepeat submissions: sending the same input with the same options while your\nearlier job is still running does not create or charge a new job. The\nresponse is HTTP 200 with that existing job and ``duplicate_of: true``; use\nits ``id`` as usual. Failed jobs never count as repeats. If an earlier job\nhas shown no progress for over 30 minutes, ``force_rerun=true`` submits a\nnew job (charged as a new job).","operationId":"create_voice_separation_job","parameters":[{"name":"num_voices","in":"query","required":false,"schema":{"type":"integer","maximum":4,"minimum":2,"description":"Number of overlapping voices to separate (2-4)","default":2,"title":"Num Voices"},"description":"Number of overlapping voices to separate (2-4)"},{"name":"model","in":"query","required":false,"schema":{"type":"string","description":"Quality tier: fast, balanced (higher quality), or high-quality (best)","default":"conv_tasnet","title":"Model"},"description":"Quality tier: fast, balanced (higher quality), or high-quality (best)"},{"name":"mode","in":"query","required":false,"schema":{"type":"string","description":"Processing mode: voice_only (direct source separation), extract_vocals_first (vocal isolation then separation, best for music)","default":"extract_vocals_first","title":"Mode"},"description":"Processing mode: voice_only (direct source separation), extract_vocals_first (vocal isolation then separation, best for music)"},{"name":"include_transcription","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Include speaker-labeled transcription with the separated audio","default":false,"title":"Include Transcription"},"description":"Include speaker-labeled transcription with the separated audio"},{"name":"force_rerun","in":"query","required":false,"schema":{"type":"boolean","description":"Set true to submit a new job even though an identical earlier request exists (charged as a new job). A matching job that started less than 30 minutes ago is still returned instead.","default":false,"title":"Force Rerun"},"description":"Set true to submit a new job even though an identical earlier request exists (charged as a new job). A matching job that started less than 30 minutes ago is still returned instead."}],"requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_create_voice_separation_job_api_v1_speaker_separate_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpeakerJobResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"create_voice_separation_job_api_v1_speaker_separate_post"}},"/api/v1/speaker/jobs/{job_id}":{"get":{"tags":["speaker"],"summary":"Get Speaker Job Status","description":"Get status and results of a speaker analysis job.\n\nWhile a job is active the response also reports its progress, current step\n(`stage`, `stage_index` of `stage_count`), `queue_position` while waiting\nand an `eta_seconds` upper-bound estimate with an `eta_basis` (\"estimate\"\nuntil the work for the file is known, then \"planned\"); each is null when\nunknown.","operationId":"get_speaker_job_status","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"anyOf":[{"type":"integer"},{"type":"string"}],"title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpeakerJobResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_speaker_job_status_api_v1_speaker_jobs__job_id__get"},"delete":{"tags":["speaker"],"summary":"Delete Speaker Job","description":"Delete a speaker analysis job and its associated files","operationId":"delete_speaker_job","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"anyOf":[{"type":"integer"},{"type":"string"}],"title":"Job Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"delete_speaker_job_api_v1_speaker_jobs__job_id__delete"}},"/api/v1/speaker/jobs":{"get":{"tags":["speaker"],"summary":"List Speaker Jobs","description":"List speaker analysis jobs with optional filtering and pagination\n\nArgs:\n    job_type: Optional filter by job type (diarization/extraction)\n    status: Optional filter by job status\n    skip: Number of records to skip (for pagination)\n    limit: Number of records to return (max 100)\n\nReturns:\n    PaginatedSpeakerJobResponse containing:\n    - items: List of speaker jobs\n    - hasMore: Boolean indicating if there are more records\n    - total: Total number of records matching the filters","operationId":"list_speaker_jobs","parameters":[{"name":"job_type","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/SpeakerJobType"},{"type":"null"}],"title":"Job Type"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/ProcessingStatus"},{"type":"null"}],"title":"Status"}},{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Number of records to skip","default":0,"title":"Skip"},"description":"Number of records to skip"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Number of records to return","default":50,"title":"Limit"},"description":"Number of records to return"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedSpeakerJobResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"list_speaker_jobs_api_v1_speaker_jobs_get"}},"/api/v1/speaker/jobs/{job_id}/retry":{"post":{"tags":["speaker"],"summary":"Retry Speaker Job","description":"Retry a failed speaker analysis job","operationId":"retry_speaker_job","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"anyOf":[{"type":"integer"},{"type":"string"}],"title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpeakerJobResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"retry_speaker_job_api_v1_speaker_jobs__job_id__retry_post"}},"/api/v1/speaker/jobs/{job_id}/edit":{"get":{"tags":["speaker"],"summary":"Get Editable Speaker Transcript","description":"Return the speaker-labeled transcription in an editable shape.\n\nPowers a transcript editor over a completed speaker-separation job:\nrename speakers, merge or split segments, correct text.","operationId":"get_editable_speaker_transcript","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"anyOf":[{"type":"integer"},{"type":"string"}],"title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpeakerEditableTranscript"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_editable_speaker_transcript_api_v1_speaker_jobs__job_id__edit_get"},"put":{"tags":["speaker"],"summary":"Update Speaker Transcript","description":"Persist edits (rename / merge / split / text) to a speaker job's\ntranscription.\n\nSend the full replacement segment list. The server rebuilds\n`formatted_text`, keeps a one-time backup of the original segments, and\nappends an edit-history entry.","operationId":"update_speaker_transcript","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"anyOf":[{"type":"integer"},{"type":"string"}],"title":"Job Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpeakerTranscriptEditRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpeakerTranscriptEditResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"update_speaker_transcript_api_v1_speaker_jobs__job_id__edit_put"}},"/api/v1/speaker/public/limits":{"get":{"tags":["speaker"],"summary":"Get Public Speaker Limits","description":"Get public speaker separation demo limits and current usage status.\nNo authentication required.","operationId":"get_public_speaker_limits","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_public_speaker_limits_api_v1_speaker_public_limits_get"}},"/api/v1/speaker/public/start":{"post":{"tags":["speaker"],"summary":"Start Public Speaker Separation","description":"Start async speaker separation for public demo.\nReturns job_id immediately, poll /public/status/{job_id} for progress.\nResults are cached for 24 hours.\n\nCrosstalk handling is fixed to the mixed (\"duplicate\") behaviour on the\ndemo and is not exposed as a parameter. Sign in to choose it.","operationId":"start_public_speaker_separation","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_start_public_speaker_separation_api_v1_speaker_public_start_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"start_public_speaker_separation_api_v1_speaker_public_start_post"}},"/api/v1/speaker/public/status/{job_id}":{"get":{"tags":["speaker"],"summary":"Get Public Speaker Status","description":"Get status of a public speaker separation job.\nReturns progress, status, and results when complete.\nResults are cached for 24 hours.","operationId":"get_public_speaker_status","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_public_speaker_status_api_v1_speaker_public_status__job_id__get"}},"/api/v1/speaker/public/cached":{"get":{"tags":["speaker"],"summary":"Get Cached Public Results","description":"Get list of cached results for this client (by IP/fingerprint).\nUseful for restoring previous sessions.","operationId":"get_cached_public_results","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_cached_public_results_api_v1_speaker_public_cached_get"}},"/api/v1/speaker/public/separate":{"post":{"tags":["speaker"],"summary":"Process Public Speaker Separation","description":"Process speaker separation for demo - PREVIEW ONLY, NO DOWNLOAD.\n\nLimitations for free public usage:\n- 3 uses per day per IP (shared with other demo tools)\n- Maximum 6 minutes audio duration\n- Preview only (streaming), no download of separated tracks\n- No transcription included\n- No account required\n\nCreate a free account at /auth/signup: 5,000 free credits every month.","operationId":"process_public_speaker_separation","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_process_public_speaker_separation_api_v1_speaker_public_separate_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"process_public_speaker_separation_api_v1_speaker_public_separate_post"}},"/api/v1/speaker/quote":{"post":{"tags":["speaker"],"summary":"Get Speaker Quote","description":"Credit cost of a Speaker Separation job, before you start it.\n\nReturns `credits_required` (what starting a job of this length and type\nreserves on your plan), your `available_credits`, and\n`credits_per_minute`. A length over your plan's per-job limit is refused\nwith the same response that starting the job would return.","operationId":"get_speaker_quote","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpeakerQuoteRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_speaker_quote_api_v1_speaker_quote_post"}},"/api/v1/denoiser/denoise":{"post":{"tags":["denoiser"],"summary":"Create Denoise Job","description":"Create a Noise Reduction job from a file upload or a URL.\n\nAudioPod's noise reduction engine removes background noise and improves\nspeech clarity in every quality mode. Choose one with `quality_mode`:\n\n- `balanced`: the fastest mode, with clean results. 330 credits per minute.\n- `studio` (default): broadcast and podcast quality. 660 credits per minute.\n- `ultra`: the highest fidelity, restoring lost high frequencies.\n  1,320 credits per minute.\n\nCredit rates apply to signed-in accounts, with a 10-credit minimum per\njob. API keys pay the API price of the chosen mode. Call\n`POST /api/v1/denoiser/quote` to see the exact cost before you start.","operationId":"create_denoise_job","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_create_denoise_job_api_v1_denoiser_denoise_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DenoiseJob"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"create_denoise_job_api_v1_denoiser_denoise_post"}},"/api/v1/denoiser/jobs/counts":{"get":{"tags":["denoiser"],"summary":"Get Denoise Job Counts","description":"Get counts of denoiser jobs for the authenticated user.\n\nOptional filters:\n- status: Filter by job status (PENDING, PROCESSING, COMPLETED, FAILED)\n\nReturns total count and breakdown by status.","operationId":"get_denoise_job_counts","parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Denoise Job Counts Api V1 Denoiser Jobs Counts Get"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_denoise_job_counts_api_v1_denoiser_jobs_counts_get"}},"/api/v1/denoiser/jobs/{job_id}":{"get":{"tags":["denoiser"],"summary":"Get Denoise Job","description":"Get status of a denoising job","operationId":"get_denoise_job","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DenoiseJob"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_denoise_job_api_v1_denoiser_jobs__job_id__get"},"delete":{"tags":["denoiser"],"summary":"Delete Denoise Job","description":"Delete a denoising job and its associated files","operationId":"delete_denoise_job","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"delete_denoise_job_api_v1_denoiser_jobs__job_id__delete"}},"/api/v1/denoiser/jobs":{"get":{"tags":["denoiser"],"summary":"List Denoise Jobs","description":"List all denoising jobs","operationId":"list_denoise_jobs","parameters":[{"name":"skip","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"description":"Number of records to return","default":50,"title":"Limit"},"description":"Number of records to return"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/DenoiseJob"},"title":"Response List Denoise Jobs Api V1 Denoiser Jobs Get"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"list_denoise_jobs_api_v1_denoiser_jobs_get"}},"/api/v1/denoiser/health":{"get":{"tags":["denoiser"],"summary":"Check Denoiser Health","description":"Check whether Noise Reduction is available.\n\nReturns `{\"status\": \"available\"}` or `{\"status\": \"unavailable\"}`.","operationId":"check_denoiser_health","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"check_denoiser_health_api_v1_denoiser_health_get"}},"/api/v1/denoiser/spectral/denoise":{"post":{"tags":["denoiser"],"summary":"Create Spectral Denoise Job","description":"Create a Noise Reduction job tuned to one kind of background noise\n(white noise, street noise, background chatter, room noise, air\nconditioning, machine hum, wind, or general).","operationId":"create_spectral_denoise_job","parameters":[{"name":"noise_type","in":"query","required":false,"schema":{"$ref":"#/components/schemas/NoiseType","default":"general"}},{"name":"prop_decrease","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Prop Decrease"}},{"name":"time_constant_s","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Time Constant S"}},{"name":"freq_mask_smooth_hz","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Freq Mask Smooth Hz"}},{"name":"time_mask_smooth_ms","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Time Mask Smooth Ms"}},{"name":"stationary","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Stationary"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_create_spectral_denoise_job_api_v1_denoiser_spectral_denoise_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DenoiseJob"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"create_spectral_denoise_job_api_v1_denoiser_spectral_denoise_post"}},"/api/v1/denoiser/jobs/{job_id}/retry":{"post":{"tags":["denoiser"],"summary":"Retry Denoise Job","description":"Retry a failed denoising job","operationId":"retry_denoise_job","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DenoiseJob"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"retry_denoise_job_api_v1_denoiser_jobs__job_id__retry_post"}},"/api/v1/denoiser/jobs/{job_id}/cancel":{"post":{"tags":["denoiser"],"summary":"Cancel Denoise Job","description":"Cancel a denoising job","operationId":"cancel_denoise_job","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DenoiseJob"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"cancel_denoise_job_api_v1_denoiser_jobs__job_id__cancel_post"}},"/api/v1/denoiser/public/limits":{"get":{"tags":["denoiser"],"summary":"Get Public Denoise Limits","description":"Get public demo limits and current usage status.\nNo authentication required.","operationId":"get_public_denoise_limits","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_public_denoise_limits_api_v1_denoiser_public_limits_get"}},"/api/v1/denoiser/public/process":{"post":{"tags":["denoiser"],"summary":"Process Public Denoise","description":"Process audio for noise reduction demo - PREVIEW ONLY, NO DOWNLOAD.\n\nLimitations for free public usage:\n- 3 uses per day per IP\n- Maximum 6 minutes audio duration\n- Preview only (streaming), no download\n- No account required\n\nCreate a free account at /auth/signup: 5,000 free credits every month.","operationId":"process_public_denoise","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_process_public_denoise_api_v1_denoiser_public_process_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"process_public_denoise_api_v1_denoiser_public_process_post"}},"/api/v1/denoiser/quote":{"post":{"tags":["denoiser"],"summary":"Get Denoise Quote","description":"Credit cost of a Noise Reduction job, before you start it.\n\nReturns `credits_required` (what starting a job of this length and\nquality mode reserves on your plan), your `available_credits`, and\n`credits_per_minute`. A length over your plan's per-job limit is refused\nwith the same response that starting the job would return.","operationId":"get_denoise_quote","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DenoiseQuoteRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_denoise_quote_api_v1_denoiser_quote_post"}},"/api/v1/stem-extraction/extract":{"post":{"tags":["stem-extraction"],"summary":"Create Stem Extraction Job","description":"Create a new stem extraction job","operationId":"create_stem_extraction_job","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_create_stem_extraction_job_api_v1_stem_extraction_extract_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StemExtractionJobResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"create_stem_extraction_job_api_v1_stem_extraction_extract_post"}},"/api/v1/stem-extraction/status/{job_id}":{"get":{"tags":["stem-extraction"],"summary":"Get Stem Extraction Status","description":"Get status of a stem extraction job","operationId":"get_stem_extraction_status","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"anyOf":[{"type":"integer"},{"type":"string"}],"title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StemExtractionJobResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_stem_extraction_status_api_v1_stem_extraction_status__job_id__get"}},"/api/v1/stem-extraction/jobs/counts":{"get":{"tags":["stem-extraction"],"summary":"Get Stem Extraction Job Counts","description":"Get counts of stem extraction jobs for the authenticated user.\n\nOptional filters:\n- status: Filter by job status (pending, processing, completed, failed)\n\nReturns total count and breakdown by status.","operationId":"get_stem_extraction_job_counts","parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Stem Extraction Job Counts Api V1 Stem Extraction Jobs Counts Get"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_stem_extraction_job_counts_api_v1_stem_extraction_jobs_counts_get"}},"/api/v1/stem-extraction/jobs":{"get":{"tags":["stem-extraction"],"summary":"List Stem Extraction Jobs","description":"List all stem extraction jobs","operationId":"list_stem_extraction_jobs","parameters":[{"name":"skip","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/StemExtractionJobResponse"},"title":"Response List Stem Extraction Jobs Api V1 Stem Extraction Jobs Get"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"list_stem_extraction_jobs_api_v1_stem_extraction_jobs_get"}},"/api/v1/stem-extraction/jobs/{job_id}/download-url":{"get":{"tags":["stem-extraction"],"summary":"Get Stem Download Url","description":"Get a download link for one stem of a completed job, in the format you choose.\n\n- stem: the stem's name as it appears in the job's `stem_paths` (for example\n  `vocals`, `trombone` or `no_trombone`)\n- format: `mp3`, `wav` or `flac`. WAV and FLAC are delivered as 24-bit files.\n\nChoosing a format here is free: no credits are charged, however many formats\nyou download. The first request for a format may take a few seconds while the\nfile is prepared; repeat requests return immediately.\n\nReturns `{\"url\", \"filename\", \"format\", \"expires_at\", \"source\"}`. The link is\nvalid for one hour and downloads the file as `filename`. `source` is\n`lossless` when the file was cut from a lossless master, and `lossy` for\nMP3 downloads and for a WAV/FLAC that could only be made from a compressed\nor 16-bit original (a 24-bit file cannot add detail the original lacks).\n\nErrors: 400 unknown stem or format · 404 job not found · 409 job not\ncompleted yet · 410 the job's files have expired or were deleted ·\n429 / 503 with `Retry-After` while a file is being prepared or the\nservice is busy; retry after the given number of seconds.","operationId":"get_stem_download_url","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"anyOf":[{"type":"integer"},{"type":"string"}],"title":"Job Id"}},{"name":"stem","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stem"}},{"name":"format","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_stem_download_url_api_v1_stem_extraction_jobs__job_id__download_url_get"}},"/api/v1/stem-extraction/jobs/{job_id}":{"delete":{"tags":["stem-extraction"],"summary":"Delete Stem Extraction Job","description":"Delete a stem extraction job you own and all of its audio files.\n\nWorks for completed, failed and cancelled jobs. A job that is still queued or\nprocessing returns 409; wait for it to finish first. Deleting\nagain is safe and returns 204. The job no longer appears in your job list.\n\nIf some files cannot be removed right away, the job is already hidden and\nthe response is 503 with `detail.code = \"DELETE_FINISHING\"`: removal is\nfinished in the background and nothing more is needed. Any other 503 means\nthe request was not processed; retry it after `Retry-After`.","operationId":"delete_stem_extraction_job","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"anyOf":[{"type":"integer"},{"type":"string"}],"title":"Job Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"delete_stem_extraction_job_api_v1_stem_extraction_jobs__job_id__delete"}},"/api/v1/stem-extraction/jobs/{job_id}/retry":{"post":{"tags":["stem-extraction"],"summary":"Retry Stem Extraction Job","description":"Retry a failed stem extraction job","operationId":"retry_stem_extraction_job","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"anyOf":[{"type":"integer"},{"type":"string"}],"title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StemExtractionJobResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"retry_stem_extraction_job_api_v1_stem_extraction_jobs__job_id__retry_post"}},"/api/v1/stem-extraction/extract/advanced":{"post":{"tags":["stem-extraction"],"summary":"Create Advanced Stem Extraction Job","description":"Create an advanced stem extraction job with up to 17 stems per preset.\n\nQuality and format:\n- quality: \"standard\" or \"high_fidelity\" (Creator plan and above) for the\n  vocals / backing track\n- output_format: \"mp3\", \"wav\" or \"flac\"; bit_depth 16 or 24 for WAV/FLAC.\n  Optional: once the job completes, any stem can be downloaded as MP3, WAV\n  or FLAC with GET /jobs/{job_id}/download-url, whatever was chosen here.\n\nSelecting the \"mastered\" stem requires a reference_file upload.\n\nRECOMMENDED: Use the 'package' parameter for optimal results.\n\nPackages (unique stem counts - no duplicates; a stem a track does not\ncontain is not returned, so these are upper bounds):\n- essential: 6 stems - Fast, reliable primary separation\n- producer: up to 8 stems - Drum detail for production (Creator plan and above)\n- studio: up to 12 stems - Full production toolkit (Pro plan and above)\n- mastering: up to 17 stems - Maximum detail, all stems decomposed (Pro plan and above)\n\nPlan-gated packages return 402 with `error: PLAN_UPGRADE_REQUIRED` when the\ncaller's plan is below the requirement. See GET /packages/available.\n\nExclusion Mode (NEW):\n- exclude_stems: JSON array of stems to exclude from output\n- Returns a SINGLE combined output containing everything except excluded stems\n- Example: exclude_stems=[\"vocals\"] returns instrumental\n- Example: exclude_stems=[\"saxophone\"] returns track without saxophone\n- Valid stems: vocals, drums, bass, guitar, piano, other, plus every\n  single instrument in GET /catalog marked `excludable` (e.g. trombone)\n- Removing an instrument needs the same plan as isolating it (402\n  `PLAN_UPGRADE_REQUIRED` otherwise) and costs the same credits\n\nLegacy Methods (still supported; prefer `package`):\n- hierarchical (default): multi-level separation, driven by `package`\n  or by the number of `target_stems`\n- the standard 6-stem method: use `package=essential` instead\n- spleeter: Fast 5-stem alternative\n- uss: Universal separation (coming soon)\n- ensemble: Best quality using multiple models (coming soon)","operationId":"create_advanced_stem_extraction_job","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_create_advanced_stem_extraction_job_api_v1_stem_extraction_extract_advanced_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StemExtractionJobResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"create_advanced_stem_extraction_job_api_v1_stem_extraction_extract_advanced_post"}},"/api/v1/stem-extraction/methods/available":{"get":{"tags":["stem-extraction"],"summary":"Get Available Methods","description":"Get available separation methods and their capabilities","operationId":"get_available_methods","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_available_methods_api_v1_stem_extraction_methods_available_get"}},"/api/v1/stem-extraction/packages/available":{"get":{"tags":["stem-extraction"],"summary":"Get Available Packages","description":"Get available stem separation packages.\n\nPackages provide predefined, quality-optimized stem configurations\nthat ensure no duplicate parent/child stems are returned.","operationId":"get_available_packages","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_available_packages_api_v1_stem_extraction_packages_available_get"}},"/api/v1/stem-extraction/pricing":{"get":{"tags":["stem-extraction"],"summary":"Get Stem Pricing","description":"Public output-group rates for Studio credits and the separate API wallet.","operationId":"get_stem_pricing","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_stem_pricing_api_v1_stem_extraction_pricing_get"}},"/api/v1/stem-extraction/quote":{"post":{"tags":["stem-extraction"],"summary":"Get Stem Quote","operationId":"get_stem_quote","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StemQuoteRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_stem_quote_api_v1_stem_extraction_quote_post","description":"Get Stem Quote"}},"/api/v1/stem-extraction/catalog":{"get":{"tags":["stem-extraction"],"summary":"Get Stem Catalog","description":"Single source of truth for the Single Stem / Multi Stem picker.\n\nReturns the stem catalog (processing class, group, tier requirements, description)\nplus the user's current tier so the frontend can render lock badges\nwithout redeploying when the matrix changes.\n\nUnauthenticated callers get tier=basic so they see the free-tier view.","operationId":"get_stem_catalog","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_stem_catalog_api_v1_stem_extraction_catalog_get"}},"/api/v1/stem-extraction/stems/available":{"get":{"tags":["stem-extraction"],"summary":"Get Available Stems","description":"Get list of stems available for a specific separation method or package.\n\nQuery Parameters:\n- method: Legacy separation method (default: hierarchical). Prefer `package`.\n- package: Package name (essential, producer, studio, mastering) - RECOMMENDED\n\nWhen package is specified, returns ONLY the unique stems for that package\n(no duplicate parent/child stems).","operationId":"get_available_stems","parameters":[{"name":"method","in":"query","required":false,"schema":{"type":"string","default":"hierarchical","title":"Method"}},{"name":"package","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Package"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_available_stems_api_v1_stem_extraction_stems_available_get"}},"/api/v1/stem-extraction/public/extract":{"post":{"tags":["stem-extraction"],"summary":"Create Public Stem Extraction Job","description":"Create a FREE public stem extraction job.\n\nLimitations for free public usage:\n- 1 SUCCESSFUL extraction per day (resets at midnight UTC)\n- Maximum 5 minutes audio duration\n- 6-stem separation only (vocals, drums, bass, other, piano, guitar)\n- No account required\n- Failed jobs don't count towards the limit\n\nA free account at /signup includes 5,000 credits every month, tracks up to\n30 minutes and downloadable stems. Paid plans allow longer tracks and unlock\nthe 45-instrument catalog (Creator and above). Usage is metered from\ncredits on every plan.","operationId":"create_public_stem_extraction_job","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_create_public_stem_extraction_job_api_v1_stem_extraction_public_extract_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Create Public Stem Extraction Job Api V1 Stem Extraction Public Extract Post"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"create_public_stem_extraction_job_api_v1_stem_extraction_public_extract_post"}},"/api/v1/stem-extraction/public/status/{access_token}":{"get":{"tags":["stem-extraction"],"summary":"Get Public Stem Extraction Status","description":"Get status of a public stem extraction job using access token.\nNo authentication required.","operationId":"get_public_stem_extraction_status","parameters":[{"name":"access_token","in":"path","required":true,"schema":{"type":"string","title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Public Stem Extraction Status Api V1 Stem Extraction Public Status  Access Token  Get"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_public_stem_extraction_status_api_v1_stem_extraction_public_status__access_token__get"}},"/api/v1/stem-extraction/public/limits":{"get":{"tags":["stem-extraction"],"summary":"Get Public Stem Limits","description":"Get public stem extraction limits and current usage status.\n\nResponse is cached at edge for 24 hours (static configuration data).","operationId":"get_public_stem_limits","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Public Stem Limits Api V1 Stem Extraction Public Limits Get"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_public_stem_limits_api_v1_stem_extraction_public_limits_get"}},"/api/v1/stem-extraction/modes":{"get":{"tags":["stem-extraction"],"summary":"Get Available Modes","description":"Get available stem separation modes for the Developer API.\n\nUse these mode names with the /api/extract endpoint instead of\ninternal model names.","operationId":"get_available_modes","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_available_modes_api_v1_stem_extraction_modes_get"}},"/api/v1/stem-extraction/api/extract":{"post":{"tags":["stem-extraction"],"summary":"Create Developer Stem Job","description":"Developer API - Create stem extraction job using simple mode names.\n\n## Modes\n\n| Mode | Output Stems | Description |\n|------|-------------|-------------|\n| `single` | 1 | Extract only one stem (specify `stem` param) |\n| `two` | 2 | Vocals + Instrumental |\n| `four` | 4 | Vocals, Drums, Bass, Other |\n| `six` | 6 | Vocals, Drums, Bass, Guitar, Piano, Other |\n| `producer` | 8 | Drums decomposed (kick, snare, hihat) — Creator plan and above |\n| `studio` | 12 | Full production toolkit — Pro plan and above |\n| `mastering` | 16 | Maximum detail extraction — Pro plan and above |\n\n## Plan requirements\n\n`producer`, `studio` and `mastering` are plan-gated (see the table above and\n`GET /modes`, which returns `required_plan`). Requesting one on a plan below\nthe requirement returns **402** with `error: PLAN_UPGRADE_REQUIRED`.\n\n## Pricing\n\nAll modes: **$0.10 per minute** of audio processed\n\n## Example\n\n```bash\ncurl -X POST https://api.audiopod.ai/api/v1/stem-extraction/api/extract \\\n  -H \"X-API-Key: YOUR_API_KEY\" \\\n  -F \"url=https://youtube.com/watch?v=VIDEO_ID\" \\\n  -F \"mode=four\"\n```","operationId":"create_developer_stem_job","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_create_developer_stem_job_api_v1_stem_extraction_api_extract_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StemExtractionJobResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"create_developer_stem_job_api_v1_stem_extraction_api_extract_post"}},"/api/v1/stem-extraction/jobs/{job_id}/retry-quote":{"get":{"tags":["stem-extraction"],"summary":"Quote Missing Stems","operationId":"quote_missing_stems","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"quote_missing_stems_api_v1_stem_extraction_jobs__job_id__retry_quote_get","description":"Quote Missing Stems"}},"/api/v1/stem-extraction/jobs/{job_id}/retry-missing":{"post":{"tags":["stem-extraction"],"summary":"Retry Missing Stems","operationId":"retry_missing_stems","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}}],"requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_retry_missing_stems_api_v1_stem_extraction_jobs__job_id__retry_missing_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"retry_missing_stems_api_v1_stem_extraction_jobs__job_id__retry_missing_post","description":"Retry Missing Stems"}},"/api/v1/midi/convert":{"post":{"tags":["midi"],"summary":"Create Midi Conversion","description":"Standalone audio-to-MIDI: upload a file or pass a URL; we split it into\nstems and transcribe each pitched stem, returning per-stem + multitrack MIDI\n(and the separated stem audio).","operationId":"create_midi_conversion","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_create_midi_conversion_api_v1_midi_convert_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MidiConversionJobResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"create_midi_conversion_api_v1_midi_convert_post"}},"/api/v1/midi/convert/from-stems/{stem_job_id}":{"post":{"tags":["midi"],"summary":"Create Midi From Stems","description":"Add-on: transcribe the already-separated stems of a completed stem-extraction\njob. Bills the add-on rate only (no re-split).","operationId":"create_midi_from_stems","parameters":[{"name":"stem_job_id","in":"path","required":true,"schema":{"type":"integer","title":"Stem Job Id"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MidiFromStemsRequest","default":{}}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MidiConversionJobResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"create_midi_from_stems_api_v1_midi_convert_from_stems__stem_job_id__post"}},"/api/v1/midi/status/{job_id}":{"get":{"tags":["midi"],"summary":"Get Midi Status","operationId":"get_midi_status","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"anyOf":[{"type":"integer"},{"type":"string"}],"title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MidiConversionJobResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_midi_status_api_v1_midi_status__job_id__get","description":"Get Midi Status"}},"/api/v1/midi/jobs":{"get":{"tags":["midi"],"summary":"List Midi Jobs","operationId":"list_midi_jobs","parameters":[{"name":"skip","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MidiConversionJobResponse"},"title":"Response List Midi Jobs Api V1 Midi Jobs Get"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"list_midi_jobs_api_v1_midi_jobs_get","description":"List Midi Jobs"}},"/api/v1/midi/jobs/{job_id}":{"delete":{"tags":["midi"],"summary":"Delete Midi Job","operationId":"delete_midi_job","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"anyOf":[{"type":"integer"},{"type":"string"}],"title":"Job Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"delete_midi_job_api_v1_midi_jobs__job_id__delete","description":"Delete Midi Job"}},"/api/v1/music/text2music":{"post":{"tags":["music"],"summary":"Create Text2Music","description":"Generate music from text prompt and lyrics","operationId":"create_text2music","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Text2MusicRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MusicGenerationResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"create_text2music_api_v1_music_text2music_post"}},"/api/v1/music/prompt2instrumental":{"post":{"tags":["music"],"summary":"Create Prompt2Instrumental","description":"Generate instrumental music from prompt","operationId":"create_prompt2instrumental","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Prompt2InstrumentalRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MusicGenerationResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"create_prompt2instrumental_api_v1_music_prompt2instrumental_post"}},"/api/v1/music/lyric2vocals":{"post":{"tags":["music"],"summary":"Create Lyric2Vocals","description":"Generate vocal music from lyrics","operationId":"create_lyric2vocals","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Lyric2VocalsRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MusicGenerationResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"create_lyric2vocals_api_v1_music_lyric2vocals_post"}},"/api/v1/music/text2rap":{"post":{"tags":["music"],"summary":"Create Text2Rap","description":"Generate rap music from prompt and lyrics","operationId":"create_text2rap","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Text2RapRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MusicGenerationResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"create_text2rap_api_v1_music_text2rap_post"}},"/api/v1/music/text2samples":{"post":{"tags":["music"],"summary":"Create Text2Samples","description":"Generate audio samples/loops","operationId":"create_text2samples","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Text2SamplesRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MusicGenerationResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"create_text2samples_api_v1_music_text2samples_post"}},"/api/v1/music/cover":{"post":{"tags":["music"],"summary":"Create Cover","description":"Generate a cover/style transfer of existing audio with our music engine.\n\nTransform existing audio while maintaining structure but changing style/timbre.\n\nExample use cases:\n- Transform a pop song into a jazz piano version\n- Change instrumentation while keeping melody\n- Genre transformation\n\nRequires `src_audio_url` pointing to the source audio file.","operationId":"create_cover","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CoverRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MusicGenerationResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"create_cover_api_v1_music_cover_post"}},"/api/v1/music/simple":{"post":{"tags":["music"],"summary":"Create Simple Generate","description":"Generate music from a simple natural language query using Simple Mode.\n\n\nThe language model will automatically generate:\n- Detailed caption/tags\n- Lyrics (if not instrumental)\n- BPM, key, time signature\n- Duration based on the query\n\nExample queries:\n- \"a soft Bengali love song for a quiet evening\"\n- \"energetic K-pop dance track with catchy hooks\"\n- \"epic cinematic trailer music with orchestral elements\"","operationId":"create_simple_generate","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleGenerateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MusicGenerationResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"create_simple_generate_api_v1_music_simple_post"}},"/api/v1/music/reference":{"post":{"tags":["music"],"summary":"Create With Reference Audio","description":"Generate music with reference audio for style guidance.\n\nReference audio provides global acoustic feature control:\n- Timbre texture (vocal/instrument timbre)\n- Mixing style (spatial sense, dynamic range)\n- Performance style (techniques, expression)\n- Overall atmosphere\n\nThe reference audio is encoded and averaged over time to provide\nconsistent style guidance throughout the generation.","operationId":"create_with_reference_audio","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReferenceAudioRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MusicGenerationResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"create_with_reference_audio_api_v1_music_reference_post"}},"/api/v1/music/analyze":{"post":{"tags":["music"],"summary":"Analyze Audio","description":"Analyze audio to extract metadata using our music engine.\n\nExtracts:\n- Caption/description of the audio\n- Lyrics (if vocals present)\n- BPM (tempo)\n- Key/scale\n- Time signature\n- Duration\n- Vocal language\n- Audio semantic codes (for advanced use)\n\nThis is useful for:\n- Understanding uploaded audio before creating covers\n- Extracting metadata for music library organization\n- Getting audio codes for remix/variation generation","operationId":"analyze_audio","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AudioAnalyzeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AudioAnalyzeResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"analyze_audio_api_v1_music_analyze_post"}},"/api/v1/music/extract-stem":{"post":{"tags":["music"],"summary":"Extract Stem","description":"Extract a specific stem/track from audio using our music engine.\n\nAvailable tracks:\n- vocals, drums, bass, guitar, keyboard, strings, synth\n- percussion, brass, woodwinds, backing_vocals, fx","operationId":"extract_stem","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExtractStemRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MusicGenerationResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"extract_stem_api_v1_music_extract_stem_post"}},"/api/v1/music/{job_id}/lrc":{"post":{"tags":["music"],"summary":"Generate Lrc","description":"Generate LRC (lyric timestamps) for a completed music job.\n\nNOTE: LRC generation relies on internal data produced during the\ngeneration step and cannot be done after the fact. This endpoint\nreturns an error directing users to enable LRC generation during\nmusic creation.\n\nFuture: LRC will be generated during music generation when enabled.","operationId":"generate_lrc","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/LRCGenerateRequest"},{"type":"null"}],"title":"Lrc Request"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LRCGenerateResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"generate_lrc_api_v1_music__job_id__lrc_post"}},"/api/v1/music/jobs/counts":{"get":{"tags":["music"],"summary":"Get Music Job Counts","description":"Get counts of music generation jobs for the authenticated user.\n\nOptional filters:\n- status: Filter by job status (pending, processing, completed, failed)\n- song_type: Filter by library category (song, instrumental, edits, scores;\n  legacy rap, vocals, samples)\n\nReturns total count, breakdown by task, and by library category.","operationId":"get_music_job_counts","parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"song_type","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/SongTypeFilter"},{"type":"null"}],"title":"Song Type"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Music Job Counts Api V1 Music Jobs Counts Get"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_music_job_counts_api_v1_music_jobs_counts_get"}},"/api/v1/music/retake":{"post":{"tags":["music"],"summary":"Create Retake","description":"Create variations of existing music","operationId":"create_retake","parameters":[{"name":"display_name","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"}},{"name":"thumbnail_url","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail Url"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RetakeRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MusicGenerationResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"create_retake_api_v1_music_retake_post"}},"/api/v1/music/repaint":{"post":{"tags":["music"],"summary":"Create Repaint","description":"Repaint specific sections of audio using our music engine.\n\nRegenerates a time segment while keeping the rest intact.\nUseful for:\n- Fixing problematic sections\n- Changing lyrics in a segment\n- Extending songs by repainting the end","operationId":"create_repaint","parameters":[{"name":"display_name","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"}},{"name":"thumbnail_url","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail Url"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RepaintRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MusicGenerationResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"create_repaint_api_v1_music_repaint_post"}},"/api/v1/music/extend":{"post":{"tags":["music"],"summary":"Create Extend","description":"Extend audio at beginning or end","operationId":"create_extend","parameters":[{"name":"display_name","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"}},{"name":"thumbnail_url","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail Url"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExtendRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MusicGenerationResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"create_extend_api_v1_music_extend_post"}},"/api/v1/music/edit":{"post":{"tags":["music"],"summary":"Create Edit","description":"Edit existing audio with new prompts/lyrics","operationId":"create_edit","parameters":[{"name":"display_name","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"}},{"name":"thumbnail_url","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail Url"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EditRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MusicGenerationResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"create_edit_api_v1_music_edit_post"}},"/api/v1/music/jobs/{job_id}/status":{"get":{"tags":["music"],"summary":"Get Job Status","description":"Get the status of a music generation job","operationId":"get_job_status","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MusicGenerationJob"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_job_status_api_v1_music_jobs__job_id__status_get"}},"/api/v1/music/jobs":{"get":{"tags":["music"],"summary":"List Jobs","description":"List music generation jobs for the authenticated user with enhanced filtering","operationId":"list_jobs","parameters":[{"name":"skip","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"task","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Task"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"song_type","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/SongTypeFilter"},{"type":"null"}],"title":"Song Type"}},{"name":"liked","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Liked"}},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search"}},{"name":"language","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language"}},{"name":"genre","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Genre"}},{"name":"emotion","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Emotion"}},{"name":"occasion","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Occasion"}},{"name":"sort_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"default":"created_at","title":"Sort By"}},{"name":"sort_order","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"default":"desc","title":"Sort Order"}},{"name":"include_interactions","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":false,"title":"Include Interactions"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MusicGenerationJob"},"title":"Response List Jobs Api V1 Music Jobs Get"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"list_jobs_api_v1_music_jobs_get"}},"/api/v1/music/liked":{"get":{"tags":["music"],"summary":"Get Liked Tracks","description":"Get all tracks liked by the current user","operationId":"get_liked_tracks","parameters":[{"name":"skip","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"song_type","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/SongTypeFilter"},{"type":"null"}],"title":"Song Type"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MusicGenerationJob"},"title":"Response Get Liked Tracks Api V1 Music Liked Get"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_liked_tracks_api_v1_music_liked_get"}},"/api/v1/music/filters/stats":{"get":{"tags":["music"],"summary":"Get Filter Statistics","description":"Get statistics for building filter UI","operationId":"get_filter_statistics","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_filter_statistics_api_v1_music_filters_stats_get"}},"/api/v1/music/jobs/{job_id}":{"delete":{"tags":["music"],"summary":"Delete Job","description":"Delete a music generation job","operationId":"delete_job","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"delete_job_api_v1_music_jobs__job_id__delete"},"patch":{"tags":["music"],"summary":"Update Job Metadata","description":"Update music job metadata (display_name, thumbnail_url)","operationId":"update_job_metadata","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MusicJobUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MusicGenerationJob"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"update_job_metadata_api_v1_music_jobs__job_id__patch"}},"/api/v1/music/sample-data":{"get":{"tags":["music"],"summary":"Get Sample Data","description":"Get sample data for testing","operationId":"get_sample_data","parameters":[{"name":"lora_name_or_path","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lora Name Or Path"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SampleDataResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_sample_data_api_v1_music_sample_data_get"}},"/api/v1/music/presets":{"get":{"tags":["music"],"summary":"Get Presets","description":"Get available genre presets","operationId":"get_presets","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PresetsResponse"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_presets_api_v1_music_presets_get"}},"/api/v1/music/model/status":{"get":{"tags":["music"],"summary":"Get Model Status","description":"Get model status and health information","operationId":"get_model_status","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModelStatusResponse"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_model_status_api_v1_music_model_status_get"}},"/api/v1/music/jobs/{job_id}/like":{"post":{"tags":["music"],"summary":"Like Music Track","description":"Like a music track","operationId":"like_music_track","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MusicInteractionResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"like_music_track_api_v1_music_jobs__job_id__like_post"},"delete":{"tags":["music"],"summary":"Unlike Music Track","description":"Unlike a music track (same as like endpoint, handles toggle)","operationId":"unlike_music_track","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MusicInteractionResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"unlike_music_track_api_v1_music_jobs__job_id__like_delete"}},"/api/v1/music/jobs/{job_id}/dislike":{"post":{"tags":["music"],"summary":"Dislike Music Track","description":"Dislike a music track","operationId":"dislike_music_track","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MusicInteractionResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"dislike_music_track_api_v1_music_jobs__job_id__dislike_post"},"delete":{"tags":["music"],"summary":"Undislike Music Track","description":"Remove dislike from a music track (same as dislike endpoint, handles toggle)","operationId":"undislike_music_track","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MusicInteractionResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"undislike_music_track_api_v1_music_jobs__job_id__dislike_delete"}},"/api/v1/music/jobs/{job_id}/share":{"post":{"tags":["music"],"summary":"Share Music Track","description":"Share a music track and generate shareable URL (authenticated or anonymous)","operationId":"share_music_track","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MusicShareRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MusicShareResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"share_music_track_api_v1_music_jobs__job_id__share_post"}},"/api/v1/music/jobs/{job_id}/stats":{"get":{"tags":["music"],"summary":"Get Music Track Stats","description":"Get public statistics for a music track","operationId":"get_music_track_stats","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MusicStatsResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_music_track_stats_api_v1_music_jobs__job_id__stats_get"}},"/api/v1/music/jobs/{job_id}/interaction-status":{"get":{"tags":["music"],"summary":"Get User Interaction Status","description":"Get user's interaction status with a music track","operationId":"get_user_interaction_status","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserMusicInteractionStatus"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_user_interaction_status_api_v1_music_jobs__job_id__interaction_status_get"}},"/api/v1/music/share/{share_token}":{"get":{"tags":["music"],"summary":"Get Shared Music Track","description":"Get shared details for a music track by share token.\n\nPublic endpoint. Rate-limited to 10/min/IP to neutralize token enumeration.\nReturns 404 uniformly for malformed tokens, unknown tokens, and non-public\njobs (no side-channel signal). The ``user_email`` field is masked\n(e.g. ``\"r***@audiopod.ai\"``) to preserve creator-trust UX without leaking\nPII to anonymous callers.","operationId":"get_shared_music_track","parameters":[{"name":"share_token","in":"path","required":true,"schema":{"type":"string","title":"Share Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MusicPublicJobResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_shared_music_track_api_v1_music_share__share_token__get"}},"/api/v1/music/share/{share_token}/stats":{"get":{"tags":["music"],"summary":"Get Shared Music Track Stats","description":"Get shared statistics for a music track by share token.\n\nPublic endpoint. Rate-limited to 10/min/IP to neutralize enumeration. Returns 404\nuniformly for malformed/unknown/non-public tokens.","operationId":"get_shared_music_track_stats","parameters":[{"name":"share_token","in":"path","required":true,"schema":{"type":"string","title":"Share Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MusicStatsResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_shared_music_track_stats_api_v1_music_share__share_token__stats_get"}},"/api/v1/music/shared/{share_token}":{"get":{"tags":["music"],"summary":"Get Shared Track","description":"Get shared track details by share token (public access)","operationId":"get_shared_track","parameters":[{"name":"share_token","in":"path","required":true,"schema":{"type":"string","title":"Share Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SharedTrackResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_shared_track_api_v1_music_shared__share_token__get"}},"/api/v1/music/shared/{share_token}/download":{"get":{"tags":["music"],"summary":"Get Shared Track Download","description":"Get download URL for shared track in specified format (public access)","operationId":"get_shared_track_download","parameters":[{"name":"share_token","in":"path","required":true,"schema":{"type":"string","title":"Share Token"}},{"name":"format","in":"query","required":false,"schema":{"type":"string","default":"wav","title":"Format"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SharedTrackDownloadResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_shared_track_download_api_v1_music_shared__share_token__download_get"}},"/api/v1/music/shared/{share_token}/like":{"post":{"tags":["music"],"summary":"Like Shared Track","description":"Like a shared track (anonymous or authenticated)","operationId":"like_shared_track","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"share_token","in":"path","required":true,"schema":{"type":"string","title":"Share Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MusicInteractionResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"like_shared_track_api_v1_music_shared__share_token__like_post"}},"/api/v1/music/shared/{share_token}/dislike":{"post":{"tags":["music"],"summary":"Dislike Shared Track","description":"Dislike a shared track (anonymous or authenticated)","operationId":"dislike_shared_track","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"share_token","in":"path","required":true,"schema":{"type":"string","title":"Share Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MusicInteractionResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"dislike_shared_track_api_v1_music_shared__share_token__dislike_post"}},"/api/v1/music/shared/{share_token}/comments":{"post":{"tags":["music"],"summary":"Add Comment To Shared Track","description":"Add a comment to a shared track (anonymous or authenticated)","operationId":"add_comment_to_shared_track","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"share_token","in":"path","required":true,"schema":{"type":"string","title":"Share Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MusicCommentRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MusicCommentResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"add_comment_to_shared_track_api_v1_music_shared__share_token__comments_post"},"get":{"tags":["music"],"summary":"Get Shared Track Comments","description":"Get comments for a shared track (public access)","operationId":"get_shared_track_comments","parameters":[{"name":"share_token","in":"path","required":true,"schema":{"type":"string","title":"Share Token"}},{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MusicCommentsResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_shared_track_comments_api_v1_music_shared__share_token__comments_get"}},"/api/v1/music/jobs/{job_id}/comments":{"post":{"tags":["music"],"summary":"Add Comment To Track","description":"Add a comment to a track (authenticated users only)","operationId":"add_comment_to_track","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MusicCommentRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MusicCommentResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"add_comment_to_track_api_v1_music_jobs__job_id__comments_post"},"get":{"tags":["music"],"summary":"Get Track Comments","description":"Get comments for a track (authenticated users only)","operationId":"get_track_comments","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}},{"name":"skip","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MusicCommentsResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_track_comments_api_v1_music_jobs__job_id__comments_get"}},"/api/v1/music/jobs/{job_id}/retry":{"post":{"tags":["music"],"summary":"Retry Music Job","description":"Retry a failed music generation job.\n\nBilling: a retry is charged exactly once. If the original job's charge is\nstill held it is reused; if the failure already refunded it, the retry is\nauthorized afresh at the current price for the job's parameters, so a\nretry needs the same credits the first attempt did.\n\nArgs:\n    job_id: ID of the failed music generation job\n\nReturns:\n    MusicGenerationResponse with updated job status\n\nRaises:\n    HTTPException: 404 if job not found, 403 if unauthorized, 400 if job cannot be retried","operationId":"retry_music_job","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MusicGenerationResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"retry_music_job_api_v1_music_jobs__job_id__retry_post"}},"/api/v1/music/public/limits":{"get":{"tags":["music"],"summary":"Get Public Music Limits","description":"Get public music demo limits and current usage status.\nNo authentication required.","operationId":"get_public_music_limits","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_public_music_limits_api_v1_music_public_limits_get"}},"/api/v1/music/public/generate":{"post":{"tags":["music"],"summary":"Process Public Music Generation","description":"Generate AI music for demo - PREVIEW ONLY, NO DOWNLOAD.\n\nLimitations for free public usage:\n- 3 uses per day per IP (shared with other demo tools)\n- Maximum 30 seconds duration\n- Basic tasks only (text2music, text2rap, prompt2instrumental)\n- Preview only (streaming), no download\n- No account required\n\nCreate a free account at /auth/signup: 5,000 free credits every month.","operationId":"process_public_music_generation","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_process_public_music_generation_api_v1_music_public_generate_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"process_public_music_generation_api_v1_music_public_generate_post"}},"/api/v1/music/public/generate-shareable":{"post":{"tags":["music"],"summary":"Process Public Music Generation Shareable","description":"Generate AI music for public demo WITH shareable link.\n\nThis endpoint creates a permanent shareable track with proper metadata\nfor social sharing (OG tags, thumbnail, etc.) to enable virality.\n\nLimitations:\n- 5 uses per minute per IP\n- Maximum 30 seconds duration\n- Basic tasks only (text2music, text2rap, prompt2instrumental)","operationId":"process_public_music_generation_shareable","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_process_public_music_generation_shareable_api_v1_music_public_generate_shareable_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicMusicShareableResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"process_public_music_generation_shareable_api_v1_music_public_generate_shareable_post"}},"/api/v1/music/featured":{"get":{"tags":["music"],"summary":"Get Featured Tracks","description":"Get featured/showcase tracks for Music Radio and marketing pages.\nPublic endpoint - no authentication required.\nReturns streaming audio URLs only (no download URLs).","operationId":"get_featured_tracks","parameters":[{"name":"language","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language"}},{"name":"genre","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Genre"}},{"name":"emotion","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Emotion"}},{"name":"occasion","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Occasion"}},{"name":"task_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Task Type"}},{"name":"sort_by","in":"query","required":false,"schema":{"type":"string","default":"quality_score","title":"Sort By"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","default":20,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeaturedTracksListResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_featured_tracks_api_v1_music_featured_get"}},"/api/v1/music/radio/random":{"get":{"tags":["music"],"summary":"Get Random Featured Tracks","description":"Get random featured tracks for Music Radio shuffle.\nPublic endpoint - no authentication required.","operationId":"get_random_featured_tracks","parameters":[{"name":"count","in":"query","required":false,"schema":{"type":"integer","default":10,"title":"Count"}},{"name":"exclude_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Exclude Ids"}},{"name":"language","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language"}},{"name":"genre","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Genre"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_random_featured_tracks_api_v1_music_radio_random_get"}},"/api/v1/music/radio/generate":{"post":{"tags":["music"],"summary":"Radio Generate","description":"On-the-fly turbo music generation for Music Radio.\nPublic endpoint - rate limited. Uses turbo-8 model for fast generation.\nGeneration is free; downloads are gated behind auth + credits.","operationId":"radio_generate","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RadioGenerateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MusicGenerationResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"radio_generate_api_v1_music_radio_generate_post"}},"/api/v1/music/jobs/{job_id}/stream":{"get":{"tags":["music"],"summary":"Stream Music Job Status","description":"Stream live status events for a music job. Auth required (owner-only).\n\nHeaders used:\n  - ``Cache-Control: no-cache, no-transform`` — prevent caching layers from\n    buffering or rewriting the stream.\n  - ``X-Accel-Buffering: no`` — tells nginx / CF to flush each event.\n  - ``Connection: keep-alive``.","operationId":"stream_music_job_status","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"stream_music_job_status_api_v1_music_jobs__job_id__stream_get"}},"/api/v1/transcription/jobs/{job_id}/summarize":{"post":{"tags":["transcription"],"summary":"Summarize Transcript","description":"Stream an AI summary + action items of a completed transcript.\n\nPaid-tier only (Creator and above): free/Basic accounts get HTTP 402\n``CREATOR_TIER_REQUIRED``. Server-Sent Events, same contract as\n``/agent/chat``: ``{type: message_delta | message | done | error}``.","operationId":"summarize_transcript","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"summarize_transcript_api_v1_transcription_jobs__job_id__summarize_post"}},"/api/v1/transcription/jobs/counts":{"get":{"tags":["transcription"],"summary":"Get Transcription Job Counts","description":"Get counts of transcription jobs for the authenticated user.\n\nOptional filters:\n- status: Filter by status (PENDING, PROCESSING, COMPLETED, FAILED)\n\nReturns total and breakdown by status.","operationId":"get_transcription_job_counts","parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Transcription Job Counts Api V1 Transcription Jobs Counts Get"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_transcription_job_counts_api_v1_transcription_jobs_counts_get"}},"/api/v1/transcription/transcribe":{"post":{"tags":["transcription"],"summary":"Create Transcription Job","description":"Create a new transcription job for URLs with optional speaker diarization.\n\nThis endpoint creates a job to transcribe audio from URLs (YouTube,\ndirect audio links, etc.) with optional speaker diarization and\ntimestamped output.\n\n## Accuracy tiers (`model_type`)\n\n- **Standard** — the default; omit `model_type` to get it. The fastest\n  tier, with word-level timestamps.\n- **Premium** (`premium`) — highest accuracy, with punctuation, per-word\n  confidence scores and automatic language detection.\n- **Premium with speaker labels** (`premium-diarized`) — the premium tier\n  plus speaker labels, recommended for multi-speaker audio.\n\nBoth premium tiers require a paid plan. A free or Basic caller that asks\nfor one is refused with `402` and the code `PREMIUM_TIER_REQUIRED`; the\nstandard tier is available on every plan.\n\nTwo further values are accepted for backwards compatibility with older\nintegrations; they are not recommended for new ones.\n\n## Speaker labels\n\nSet `enable_speaker_diarization: true`. Any request that asks for speaker\nlabels is served by a speaker-aware tier automatically, so you do not have\nto choose a `model_type` to get them. The response carries a\nspeaker-labeled transcript with word-level timestamps — best for\ninterviews, podcasts, meetings and other multi-speaker content.\n\nLeave it `false` for single-speaker audio: transcription is faster and\nstill returns word-level timestamps.\n\n## Performance tips\n\n- For known languages, always specify `language` for better results\n- Use `chunk_duration=600` (10min) for very long content (>2 hours)\n- Set `min_speakers` / `max_speakers` when the speaker count is known —\n  it improves speaker-labeling accuracy\n- Disable `enable_word_timestamps` if you only need sentence-level timestamps (faster)","operationId":"create_transcription_job","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TranscriptionRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TranscriptionResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"create_transcription_job_api_v1_transcription_transcribe_post"}},"/api/v1/transcription/transcribe-upload":{"post":{"tags":["transcription"],"summary":"Create Transcription Job Upload","description":"Create a new transcription job for uploaded files with speaker diarization\n\nThis endpoint creates a job to transcribe audio from uploaded files\nwith optional speaker diarization and timestamped output.","operationId":"create_transcription_job_upload","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_create_transcription_job_upload_api_v1_transcription_transcribe_upload_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TranscriptionResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"create_transcription_job_upload_api_v1_transcription_transcribe_upload_post"}},"/api/v1/transcription/status/{job_id}":{"get":{"tags":["transcription"],"summary":"Get Transcription Status","description":"Get transcription job status - backward compatibility endpoint","operationId":"get_transcription_status","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TranscriptionJobResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_transcription_status_api_v1_transcription_status__job_id__get"}},"/api/v1/transcription/result/{job_id}":{"get":{"tags":["transcription"],"summary":"Get Transcription Result","description":"Get transcription result - backward compatibility endpoint","operationId":"get_transcription_result","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}},{"name":"format","in":"query","required":false,"schema":{"type":"string","default":"json","title":"Format"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_transcription_result_api_v1_transcription_result__job_id__get"}},"/api/v1/transcription/transcript/{job_id}":{"get":{"tags":["transcription"],"summary":"Get Transcript By Id","description":"Get transcript by job ID - backward compatibility endpoint","operationId":"get_transcript_by_id","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}},{"name":"format","in":"query","required":false,"schema":{"type":"string","default":"json","title":"Format"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_transcript_by_id_api_v1_transcription_transcript__job_id__get"}},"/api/v1/transcription/jobs/{job_id}":{"get":{"tags":["transcription"],"summary":"Get Transcription Job","description":"Get transcription job status and details","operationId":"get_transcription_job","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TranscriptionJobResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_transcription_job_api_v1_transcription_jobs__job_id__get"},"delete":{"tags":["transcription"],"summary":"Delete Transcription Job","description":"Delete a transcription job or cancel if still running","operationId":"delete_transcription_job","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"delete_transcription_job_api_v1_transcription_jobs__job_id__delete"}},"/api/v1/transcription/jobs/{job_id}/transcript":{"get":{"tags":["transcription"],"summary":"Download Transcript","description":"Download the transcript file for a completed job in specified format","operationId":"download_transcript","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}},{"name":"format","in":"query","required":false,"schema":{"type":"string","default":"json","title":"Format"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"download_transcript_api_v1_transcription_jobs__job_id__transcript_get"}},"/api/v1/transcription/jobs":{"get":{"tags":["transcription"],"summary":"List Transcription Jobs","description":"List user's transcription jobs","operationId":"list_transcription_jobs","parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TranscriptionJobResponse"},"title":"Response List Transcription Jobs Api V1 Transcription Jobs Get"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"list_transcription_jobs_api_v1_transcription_jobs_get"}},"/api/v1/transcription/jobs/{job_id}/edit":{"get":{"tags":["transcription"],"summary":"Get Editable Transcript","description":"Get transcript in editable format for frontend editor","operationId":"get_editable_transcript","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_editable_transcript_api_v1_transcription_jobs__job_id__edit_get"},"put":{"tags":["transcription"],"summary":"Update Transcript","description":"Update transcript with user edits\n\nAccepts both formats:\n1. Standard: {\"segments\": [...], \"edit_notes\": \"...\"}\n2. Frontend nested: {\"transcript\": {\"segments\": [...], ...}, \"edit_notes\": \"...\"}","operationId":"update_transcript","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/TranscriptEditRequest"},{"type":"object","additionalProperties":true}],"title":"Edit Request"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TranscriptEditResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"update_transcript_api_v1_transcription_jobs__job_id__edit_put"}},"/api/v1/transcription/jobs/{job_id}/audio/{audio_index}":{"get":{"tags":["transcription"],"summary":"Download Extracted Audio","description":"Download extracted audio file by index","operationId":"download_extracted_audio","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}},{"name":"audio_index","in":"path","required":true,"schema":{"type":"integer","title":"Audio Index"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"download_extracted_audio_api_v1_transcription_jobs__job_id__audio__audio_index__get"}},"/api/v1/transcription/jobs/{job_id}/versions":{"get":{"tags":["transcription"],"summary":"Get Transcript Versions","description":"Get version history of transcript edits","operationId":"get_transcript_versions","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_transcript_versions_api_v1_transcription_jobs__job_id__versions_get"}},"/api/v1/transcription/public/limits":{"get":{"tags":["transcription"],"summary":"Get Public Stt Limits","description":"Get public STT demo limits and current usage status.\nNo authentication required.","operationId":"get_public_stt_limits","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_public_stt_limits_api_v1_transcription_public_limits_get"}},"/api/v1/transcription/demo/claim":{"post":{"tags":["transcription"],"summary":"Claim Live Demo Transcript","description":"Save a transcript from the anonymous live preview into the caller's account.\n\nRequires authentication: the preview is anonymous, the claim is not, and a\npreview token is bound to the first account that presents it.\n\nCharges nothing — the preview was free when it was generated and stays\nfree. `estimated_credits` is 0.\n\nIdempotent: a token yields exactly one job per account, so a double-click\nor a retry returns the same job rather than creating a second one. Once\nthe job exists, `GET /jobs/{id}/transcript?format=...` exports it.","operationId":"claim_live_demo_transcript","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DemoClaimRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DemoClaimResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"claim_live_demo_transcript_api_v1_transcription_demo_claim_post"}},"/api/v1/transcription/public/transcribe":{"post":{"tags":["transcription"],"summary":"Process Public Transcription","description":"Process audio transcription for demo - TEXT ONLY, NO FILE DOWNLOAD.\n\nLimitations for free public usage:\n- 3 uses per day per IP (shared with other demo tools)\n- Maximum 6 minutes audio duration\n- Returns transcript text only (no file export)\n- No speaker diarization\n- No account required\n\nCreate a free account at /auth/signup: 5,000 free credits every month.","operationId":"process_public_transcription","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_process_public_transcription_api_v1_transcription_public_transcribe_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"process_public_transcription_api_v1_transcription_public_transcribe_post"}},"/api/v1/transcription/quote":{"post":{"tags":["transcription"],"summary":"Get Transcription Quote","description":"Credit cost of a Speech to Text job, before you start it.\n\nReturns `credits_required` (what starting a job of this length reserves\non your plan), your `available_credits`, and `credits_per_minute`. The\naccuracy tier and speaker labels do not change the price. For several\nfiles or links, send each one's length in `durations_seconds`: every\nsource is billed in whole seconds, rounded up. A length over your plan's\nper-job limit is refused with the same response that starting the job\nwould return.","operationId":"get_transcription_quote","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TranscriptionQuoteRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_transcription_quote_api_v1_transcription_quote_post"}},"/api/v1/media-converter/public/convert":{"post":{"tags":["media-converter","Media Converter"],"summary":"Create Public Conversion","description":"Create a media conversion job (PUBLIC ACCESS)\n\nConvert media files with limitations:\n- Maximum 10 minutes duration\n- Limited formats: MP4, MP3, WAV\n- No advanced features (normalization, etc.)\n- No credit deduction\n\nNo authentication required. Rate limited to 5 conversions per minute AND to\nthe shared anonymous-demo allowance of 3 conversions per IP per day.","operationId":"create_public_conversion","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_create_public_conversion_api_v1_media_converter_public_convert_post"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MediaConverterJob"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"create_public_conversion_api_v1_media_converter_public_convert_post"}},"/api/v1/media-converter/public/jobs/{job_id}":{"get":{"tags":["media-converter","Media Converter"],"summary":"Get Public Conversion Job","description":"Get public conversion job status (PUBLIC ACCESS)\n\nCheck the status of a public conversion job.\nNo authentication required. Returns presigned download URLs for completed jobs.","operationId":"get_public_conversion_job","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","description":"Job ID","title":"Job Id"},"description":"Job ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MediaConverterJob"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_public_conversion_job_api_v1_media_converter_public_jobs__job_id__get"}},"/api/v1/media-converter/convert":{"post":{"tags":["media-converter","Media Converter"],"summary":"Create Conversion","description":"Unified media conversion endpoint (AUTHENTICATED ACCESS)\n\nConvert media files with full features using either:\n- File upload: Provide 'file' parameter with actual file\n- URL conversion: Provide 'input_url' with media URL\n\nFeatures:\n- All supported formats\n- No duration limits\n- Advanced processing options\n- Quality customization\n- Trimming and effects\n\nAuthentication required. Credits are reserved upfront and charged only on successful completion.","operationId":"create_conversion","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_create_conversion_api_v1_media_converter_convert_post"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MediaConverterJob"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"create_conversion_api_v1_media_converter_convert_post"}},"/api/v1/media-converter/upload":{"post":{"tags":["media-converter","Media Converter"],"summary":"Create Conversion With Upload","description":"Upload and convert a media file (DEPRECATED - Use /convert instead)\n\n⚠️ DEPRECATED: This endpoint is deprecated. Please use the unified /convert endpoint \nwhich supports both file uploads and URL conversions in a single endpoint.\n\nThis endpoint redirects to the unified /convert endpoint for backward compatibility.\n\nMigration: Replace /upload calls with /convert using the same parameters.\n\nUpload a media file directly and convert it to the specified format.\nSupports all the same conversion options as the regular convert endpoint.\n\nCredits are estimated based on file duration and complexity.","operationId":"create_conversion_with_upload","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_create_conversion_with_upload_api_v1_media_converter_upload_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MediaConverterJob"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"deprecated":true,"x-original-operation-id":"create_conversion_with_upload_api_v1_media_converter_upload_post"}},"/api/v1/media-converter/bulk-convert":{"post":{"tags":["media-converter","Media Converter"],"summary":"Create Bulk Conversion","description":"Create multiple media conversion jobs\n\nConvert multiple media files with the same settings.\nMaximum 20 URLs per request to prevent abuse.\n\nReturns individual job status for each URL.","operationId":"create_bulk_conversion","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkMediaConverterRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkMediaConverterResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"create_bulk_conversion_api_v1_media_converter_bulk_convert_post"}},"/api/v1/media-converter/jobs":{"get":{"tags":["media-converter","Media Converter"],"summary":"List Conversion Jobs","description":"List user's media conversion jobs\n\nReturns paginated list with optional filtering by:\n- Status (PENDING, PROCESSING, COMPLETED, FAILED)\n- Output format (mp4, mp3, wav, etc.)\n\nIncludes job progress and download URLs for completed jobs.","operationId":"list_conversion_jobs_jobs","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page number","default":1,"title":"Page"},"description":"Page number"},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Items per page","default":20,"title":"Per Page"},"description":"Items per page"},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/ProcessingStatus"},{"type":"null"}],"description":"Filter by status","title":"Status"},"description":"Filter by status"},{"name":"output_format","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by output format","title":"Output Format"},"description":"Filter by output format"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MediaConverterListResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"list_conversion_jobs_api_v1_media_converter_jobs_get"}},"/api/v1/media-converter/jobs/{job_id}":{"get":{"tags":["media-converter","Media Converter"],"summary":"Get Conversion Job","description":"Get specific conversion job details\n\nReturns complete job information including:\n- Current status and progress\n- Download URLs for completed jobs\n- Error details for failed jobs\n- Processing metadata","operationId":"get_conversion_job","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","description":"Job ID","title":"Job Id"},"description":"Job ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MediaConverterJob"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_conversion_job_api_v1_media_converter_jobs__job_id__get"},"delete":{"tags":["media-converter","Media Converter"],"summary":"Delete Conversion Job","description":"Delete conversion job\n\nRemoves the job record and associated files from storage.\nCannot delete jobs that are currently processing.","operationId":"delete_conversion_job_job_id","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","description":"Job ID","title":"Job Id"},"description":"Job ID"}],"responses":{"204":{"description":"Successful Response"},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"delete_conversion_job_api_v1_media_converter_jobs__job_id__delete"}},"/api/v1/media-converter/jobs/{job_id}/cancel":{"post":{"tags":["media-converter","Media Converter"],"summary":"Cancel Conversion Job","description":"Cancel a queued or in-progress media conversion job.\n\nStops the conversion (best-effort) and marks the job CANCELLED. Only the\njob owner may cancel; already-finished jobs return 400.\n\nCredits held for the job at creation are released back to the account.","operationId":"cancel_conversion_job","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","description":"Job ID","title":"Job Id"},"description":"Job ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MediaConverterJob"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"cancel_conversion_job_api_v1_media_converter_jobs__job_id__cancel_post"}},"/api/v1/media-converter/public/formats":{"get":{"tags":["media-converter","Media Converter"],"summary":"Get Public Supported Formats","description":"Get supported formats for public conversions\n\nReturns limited formats available for public access.","operationId":"get_public_supported_formats","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SupportedFormatsResponse"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_public_supported_formats_api_v1_media_converter_public_formats_get"}},"/api/v1/media-converter/formats":{"get":{"tags":["media-converter","Media Converter"],"summary":"Get Supported Formats","description":"Get supported formats and capabilities (AUTHENTICATED ACCESS)\n\nReturns complete list of supported formats and features.","operationId":"get_supported_formats","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SupportedFormatsResponse"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"security":[{"OAuth2PasswordBearer":[]}],"x-original-operation-id":"get_supported_formats_api_v1_media_converter_formats_get"}},"/api/v1/media-converter/presets":{"get":{"tags":["media-converter","Media Converter"],"summary":"Get Conversion Presets","description":"Get predefined conversion presets\n\nReturns optimized settings for common use cases.","operationId":"get_conversion_presets","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConversionPresetsResponse"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"security":[{"OAuth2PasswordBearer":[]}],"x-original-operation-id":"get_conversion_presets_api_v1_media_converter_presets_get"}},"/api/v1/agent/session":{"post":{"tags":["audio-agent","Audio Agent"],"summary":"Create Session","description":"Create a new agent chat session","operationId":"create_session","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentSessionResponse"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"security":[{"OAuth2PasswordBearer":[]}],"x-original-operation-id":"create_session_api_v1_agent_session_post"}},"/api/v1/agent/chat":{"post":{"tags":["audio-agent","Audio Agent"],"summary":"Chat","description":"Send a message to the audio agent. Returns Server-Sent Events (SSE) stream.\n\nThe agent will:\n1. Understand your intent from natural language\n2. Select the appropriate audio tool(s)\n3. Execute and return results\n\nEvent types in the stream:\n- thinking: Agent is processing\n- message_delta: Incremental text token (for real-time display)\n- message: Complete text response from the agent (for persistence)\n- plan: Multi-step workflow plan (requires confirmation)\n- executing: Tool execution started\n- tool_start: Individual tool execution began\n- tool_complete: Tool finished with results (includes job_id for polling)\n- tool_error: Tool failed\n- insufficient_credits: Not enough credits\n- error: System error\n- done: Stream complete","operationId":"chat","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentChatRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"security":[{"OAuth2PasswordBearer":[]}],"x-original-operation-id":"chat_api_v1_agent_chat_post"}},"/api/v1/agent/sessions":{"get":{"tags":["audio-agent","Audio Agent"],"summary":"List Sessions","description":"List all agent sessions for the current user","operationId":"list_sessions","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"security":[{"OAuth2PasswordBearer":[]}],"x-original-operation-id":"list_sessions_api_v1_agent_sessions_get"}},"/api/v1/agent/capabilities":{"get":{"tags":["audio-agent","Audio Agent"],"summary":"Agent Capabilities","operationId":"agent_capabilities","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"security":[{"OAuth2PasswordBearer":[]}],"x-original-operation-id":"agent_capabilities_api_v1_agent_capabilities_get","description":"Agent Capabilities"}},"/api/v1/agent/memories":{"get":{"tags":["audio-agent","Audio Agent"],"summary":"List Memories","operationId":"list_memories","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"security":[{"OAuth2PasswordBearer":[]}],"x-original-operation-id":"list_memories_api_v1_agent_memories_get","description":"List Memories"},"post":{"tags":["audio-agent","Audio Agent"],"summary":"Create Memory","operationId":"create_memory","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentMemoryRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"security":[{"OAuth2PasswordBearer":[]}],"x-original-operation-id":"create_memory_api_v1_agent_memories_post","description":"Create Memory"}},"/api/v1/agent/memories/settings":{"patch":{"tags":["audio-agent","Audio Agent"],"summary":"Memory Settings","operationId":"memory_settings","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentMemorySettings"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"security":[{"OAuth2PasswordBearer":[]}],"x-original-operation-id":"memory_settings_api_v1_agent_memories_settings_patch","description":"Memory Settings"}},"/api/v1/agent/memories/{memory_id}":{"patch":{"tags":["audio-agent","Audio Agent"],"summary":"Edit Memory","operationId":"edit_memory","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"memory_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Memory Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentMemoryRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"edit_memory_api_v1_agent_memories__memory_id__patch","description":"Edit Memory"},"delete":{"tags":["audio-agent","Audio Agent"],"summary":"Forget Memory","operationId":"forget_memory","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"memory_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Memory Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"forget_memory_api_v1_agent_memories__memory_id__delete","description":"Forget Memory"}},"/api/v1/agent/sessions/{session_id}/turns":{"post":{"tags":["audio-agent","Audio Agent"],"summary":"Submit Turn","operationId":"submit_turn","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentTurnRequest"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"submit_turn_api_v1_agent_sessions__session_id__turns_post","description":"Submit Turn"}},"/api/v1/agent/runs/{run_id}/events":{"get":{"tags":["audio-agent","Audio Agent"],"summary":"Run Events","operationId":"run_events","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Run Id"}},{"name":"after","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"After"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"run_events_api_v1_agent_runs__run_id__events_get","description":"Run Events"}},"/api/v1/agent/sessions/{session_id}/state":{"get":{"tags":["audio-agent","Audio Agent"],"summary":"Session State","operationId":"session_state","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"session_state_api_v1_agent_sessions__session_id__state_get","description":"Session State"}},"/api/v1/agent/runs/{run_id}/cancel":{"post":{"tags":["audio-agent","Audio Agent"],"summary":"Cancel Run","operationId":"cancel_run","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Run Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"cancel_run_api_v1_agent_runs__run_id__cancel_post","description":"Cancel Run"}},"/api/v1/agent/attachments/{attachment_id}":{"get":{"tags":["audio-agent","Audio Agent"],"summary":"Attachment Preview","operationId":"attachment_preview","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"attachment_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Attachment Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"attachment_preview_api_v1_agent_attachments__attachment_id__get","description":"Attachment Preview"}},"/api/v1/agent/upload":{"post":{"tags":["audio-agent","Audio Agent"],"summary":"Upload File","description":"Upload an audio/video file for the agent to process.\nReturns a URL that can be referenced in subsequent chat messages.\n\nSupported formats: MP3, WAV, FLAC, OGG, M4A, MP4, MOV, WebM, PDF, EPUB, DOCX\nMax size: your plan's upload limit — call `GET /api/v1/uploads/limits` for\nthe exact figure on your plan, or see /pricing.","operationId":"upload_file","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_file_api_v1_agent_upload_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentUploadResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"security":[{"OAuth2PasswordBearer":[]}],"x-original-operation-id":"upload_file_api_v1_agent_upload_post"}},"/api/v1/agent/upload/register":{"post":{"tags":["audio-agent","Audio Agent"],"summary":"Register Direct Upload","description":"Attach a file that was uploaded directly with a presigned URL.\n\nFor large files: call `POST /api/v1/uploads/presign` with\n`service: \"agent_upload\"`, PUT the file to the returned URL, then send the\n`upload_id` here. The response matches `POST /agent/upload`. Registering the\nsame `upload_id` again returns the same attachment.","operationId":"register_direct_upload","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentUploadRegisterRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentUploadResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"security":[{"OAuth2PasswordBearer":[]}],"x-original-operation-id":"register_direct_upload_api_v1_agent_upload_register_post"}},"/api/v1/agent/sessions/{session_id}/history":{"get":{"tags":["audio-agent","Audio Agent"],"summary":"Get Session History","description":"Get conversation history for a session, including the structured\nmetadata needed to re-render tool_result players, plan/confirm cards,\nand insufficient_credits CTAs on the frontend.","operationId":"get_session_history","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_session_history_api_v1_agent_sessions__session_id__history_get"}},"/api/v1/agent/sessions/{session_id}":{"patch":{"tags":["audio-agent","Audio Agent"],"summary":"Rename Session","description":"Rename a chat session","operationId":"rename_session","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RenameSessionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"rename_session_api_v1_agent_sessions__session_id__patch"},"delete":{"tags":["audio-agent","Audio Agent"],"summary":"Delete Session","description":"Delete a chat session","operationId":"delete_session","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"delete_session_api_v1_agent_sessions__session_id__delete"}},"/api/v1/agent/jobs/status":{"post":{"tags":["audio-agent","Audio Agent"],"summary":"Batch Job Status","description":"Look up status + output for many jobs in a single round-trip.\n\nReturns: {ok: [{job_id, tool, status, audio_url, ...}], errors: [{job_id, tool, error}]}\n\nPartial-failure shape: a 404 on one job does not poison the rest.\nEach per-tool _exec_check_job_status call enforces ownership via\nthe underlying status endpoint, so cross-account leakage is blocked\nat the same layer the in-chat tool uses.","operationId":"batch_job_status","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentBatchStatusRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"security":[{"OAuth2PasswordBearer":[]}],"x-original-operation-id":"batch_job_status_api_v1_agent_jobs_status_post"}},"/api/v1/mcp":{"get":{"tags":["mcp","MCP"],"summary":"Mcp Handshake","description":"Capability handshake for clients that probe with GET first.\n\nReturns a small descriptor pointing at the JSON-RPC entrypoint,\nthe server-card, and the OAuth Protected Resource document. This\nis intentionally unauthenticated so discovery scanners can walk it\nwithout minting a token.","operationId":"mcp_handshake","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Mcp Handshake Api V1 Mcp Get"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"mcp_handshake_api_v1_mcp_get"},"post":{"tags":["mcp","MCP"],"summary":"Mcp Jsonrpc","description":"JSON-RPC 2.0 entrypoint for MCP Streamable HTTP transport.\n\nAccepts a single JSON-RPC request or a batch (array). Returns the\nmatching response shape. Notifications (no ``id``) are accepted with\nHTTP 202 and produce no response body.","operationId":"mcp_jsonrpc","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"security":[{"OAuth2PasswordBearer":[]}],"x-original-operation-id":"mcp_jsonrpc_api_v1_mcp_post"}},"/api/v1/mcp/core":{"get":{"tags":["mcp","MCP"],"summary":"Mcp Core Handshake","description":"Capability handshake for the AudioPod core MCP toolset.\n\nSame descriptor as the main endpoint, listing only the core audio\nprocessing tools.","operationId":"mcp_core_handshake","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Mcp Core Handshake Api V1 Mcp Core Get"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"mcp_core_handshake_api_v1_mcp_core_get"},"post":{"tags":["mcp","MCP"],"summary":"Mcp Core Jsonrpc","description":"JSON-RPC 2.0 entrypoint for the AudioPod core MCP toolset.\n\nSame transport and authentication as the main MCP endpoint, limited to\nthe audio processing tools: transcribe, convert, stem separation,\nspeaker separation, denoise and job-status polling.","operationId":"mcp_core_jsonrpc","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"security":[{"OAuth2PasswordBearer":[]}],"x-original-operation-id":"mcp_core_jsonrpc_api_v1_mcp_core_post"}},"/api/v1/audio/speech":{"post":{"tags":["openai-compat","OpenAI-Compatible"],"summary":"Create Speech","description":"OpenAI ``/v1/audio/speech`` — synthesize ``input`` with ``voice`` and\nreturn the audio bytes. Billed to the API wallet per 1,000 characters of\n``input`` ($0.05 / 1K chars); speaking-style directions in brackets and\npause tags are not counted.","operationId":"create_speech","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpeechRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"security":[{"OAuth2PasswordBearer":[]}],"x-original-operation-id":"create_speech_api_v1_audio_speech_post"}},"/api/v1/audio/transcriptions":{"post":{"tags":["openai-compat","OpenAI-Compatible"],"summary":"Create Transcription","description":"OpenAI ``/v1/audio/transcriptions`` — speech → text in the source language.","operationId":"create_transcription","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_create_transcription_api_v1_audio_transcriptions_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"security":[{"OAuth2PasswordBearer":[]}],"x-original-operation-id":"create_transcription_api_v1_audio_transcriptions_post"}},"/api/v1/audio/translations":{"post":{"tags":["openai-compat","OpenAI-Compatible"],"summary":"Create Translation","description":"OpenAI ``/v1/audio/translations`` — speech → English text.\n\nMatches OpenAI semantics (transcribe + translate to English), NOT the\npremium speech-to-speech product; billed at the transcription rate.","operationId":"create_translation","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_create_translation_api_v1_audio_translations_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"security":[{"OAuth2PasswordBearer":[]}],"x-original-operation-id":"create_translation_api_v1_audio_translations_post"}},"/api/v1/downloads/downloads/workflow/{workflow_id}/{filename}":{"get":{"tags":["downloads","File Downloads"],"summary":"Download Workflow File","description":"Download a file generated by a workflow\n\nArgs:\n    workflow_id: The workflow that generated the file\n    filename: The name of the file to download\n    user: Authenticated user (must own the workflow)\n    \nReturns:\n    File download response","operationId":"download_workflow_file","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"workflow_id","in":"path","required":true,"schema":{"type":"string","title":"Workflow Id"}},{"name":"filename","in":"path","required":true,"schema":{"type":"string","title":"Filename"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"download_workflow_file_api_v1_downloads_downloads_workflow__workflow_id___filename__get"}},"/api/v1/downloads/downloads/workflow/{workflow_id}":{"get":{"tags":["downloads","File Downloads"],"summary":"List Workflow Files","description":"List all downloadable files for a workflow\n\nArgs:\n    workflow_id: The workflow ID\n    user: Authenticated user (must own the workflow)\n    \nReturns:\n    List of available files with download links","operationId":"list_workflow_files","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"workflow_id","in":"path","required":true,"schema":{"type":"string","title":"Workflow Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"list_workflow_files_api_v1_downloads_downloads_workflow__workflow_id__get"},"delete":{"tags":["downloads","File Downloads"],"summary":"Cleanup Workflow Files","description":"Clean up all files for a completed workflow\n\nArgs:\n    workflow_id: The workflow ID\n    user: Authenticated user (must own the workflow)\n    \nReturns:\n    Cleanup status","operationId":"cleanup_workflow_files","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"workflow_id","in":"path","required":true,"schema":{"type":"string","title":"Workflow Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"cleanup_workflow_files_api_v1_downloads_downloads_workflow__workflow_id__delete"}},"/api/v1/credits/trial-counts":{"get":{"tags":["credits"],"summary":"Get Trial Counts","description":"Get the count of deferred (trial) jobs per service type for the current user.\n\nThis endpoint is used by the frontend to determine if a user has reached their\nfree trial limit (2 per tool type) and should be shown an upgrade modal.\n\nOnly counts COMPLETED jobs with billing_status = 'DEFERRED'.\nFailed jobs don't count toward the trial limit.","operationId":"get_trial_counts","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrialCountsResponse"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"security":[{"OAuth2PasswordBearer":[]}],"x-original-operation-id":"get_trial_counts_api_v1_credits_trial_counts_get"}},"/api/v1/credits":{"get":{"tags":["credits"],"summary":"Get Credits","description":"Get user's credit information","operationId":"get_credits","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreditInfo"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"security":[{"OAuth2PasswordBearer":[]}],"x-original-operation-id":"get_credits_api_v1_credits_get"}},"/api/v1/credits/":{"get":{"tags":["credits"],"summary":"Get Credits","description":"Get user's credit information","operationId":"get_credits_credits","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreditInfo"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"security":[{"OAuth2PasswordBearer":[]}],"x-original-operation-id":"get_credits_api_v1_credits__get"}},"/api/v1/credits/first-purchase-offer":{"get":{"tags":["credits"],"summary":"Get First Purchase Offer","description":"The FIRST30 first-purchase offer for this user, or `{\"offer\": null}`.\n\nThe same offer block a 402 `INSUFFICIENT_CREDITS` payload carries as\n`first_paywall_offer`, available without a 402 in hand.\n\nRead-only and side-effect free: it creates nothing and charges nothing.\nAny internal failure resolves to `offer: null` rather than an error. The\nanswer is per-user, so the response is marked `private, no-store` — do not\ncache it in a shared cache.","operationId":"get_first_purchase_offer","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FirstPurchaseOfferResponse"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"security":[{"OAuth2PasswordBearer":[]}],"x-original-operation-id":"get_first_purchase_offer_api_v1_credits_first_purchase_offer_get"}},"/api/v1/credits/usage":{"get":{"tags":["credits"],"summary":"Get Credit Usage","description":"Get user's credit usage history","operationId":"get_credit_usage","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/CreditUsageLog"},"type":"array","title":"Response Get Credit Usage Api V1 Credits Usage Get"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"security":[{"OAuth2PasswordBearer":[]}],"x-original-operation-id":"get_credit_usage_api_v1_credits_usage_get"}},"/api/v1/credits/usage-summary":{"get":{"tags":["credits"],"summary":"Get Credit Usage Summary","description":"Aggregate usage stats for the current account, computed server-side.\n\nReturns the totals and per-service breakdown a usage page needs in one\ncall, instead of paging the full credit history.\n\nMonth boundaries are computed in the CALLER'S timezone (`tz`), not UTC, so\npass the viewer's timezone to get the months they expect. An unknown\ntimezone falls back to UTC and the response says which was used.","operationId":"get_credit_usage_summary","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"tz","in":"query","required":false,"schema":{"type":"string","description":"IANA timezone for month boundaries, e.g. Asia/Kolkata. Must match the viewer's local timezone or month totals shift at the edges.","default":"UTC","title":"Tz"},"description":"IANA timezone for month boundaries, e.g. Asia/Kolkata. Must match the viewer's local timezone or month totals shift at the edges."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UsageSummary"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_credit_usage_summary_api_v1_credits_usage_summary_get"}},"/api/v1/credits/usage-logs":{"get":{"tags":["credits"],"summary":"Get Credit Usage Logs","description":"Get user's credit usage history with pagination","operationId":"get_credit_usage_logs","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page number starting from 1","default":1,"title":"Page"},"description":"Page number starting from 1"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"description":"Number of items per page","default":100,"title":"Limit"},"description":"Number of items per page"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CreditUsageLog"},"title":"Response Get Credit Usage Logs Api V1 Credits Usage Logs Get"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_credit_usage_logs_api_v1_credits_usage_logs_get"}},"/api/v1/credits/multipliers":{"get":{"tags":["credits"],"summary":"Get Credit Multipliers","description":"Get credit multipliers for different services","operationId":"get_credit_multipliers","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_credit_multipliers_api_v1_credits_multipliers_get"}},"/api/v1/credits/migrate-reservations":{"post":{"tags":["credits"],"summary":"Migrate Completed Reservations","description":"Migrate any reservations for completed jobs into usage logs.\nThis helps recover from situations where jobs completed successfully\nbut credits weren't properly applied.","operationId":"migrate_completed_reservations","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Migrate Completed Reservations Api V1 Credits Migrate Reservations Post"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"security":[{"OAuth2PasswordBearer":[]}],"x-original-operation-id":"migrate_completed_reservations_api_v1_credits_migrate_reservations_post"}},"/api/v1/credits/payg/info/":{"get":{"tags":["credits"],"summary":"Get Payg Info","description":"Get pay-as-you-go pricing information (legacy endpoint)","operationId":"get_payg_info","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayAsYouGoInfo"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_payg_info_api_v1_credits_payg_info__get"}},"/api/v1/credits/payg/info":{"get":{"tags":["credits"],"summary":"Get Payg Info","description":"Get pay-as-you-go pricing information (legacy endpoint)","operationId":"get_payg_info_info","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayAsYouGoInfo"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_payg_info_api_v1_credits_payg_info_get"}},"/api/v1/credits/payg/regional-info/":{"get":{"tags":["credits"],"summary":"Get Payg Regional Info","description":"Get localized pay-as-you-go pricing information based on user location","operationId":"get_payg_regional_info","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayAsYouGoInfoLocalized"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_payg_regional_info_api_v1_credits_payg_regional_info__get"}},"/api/v1/credits/payg/regional-info":{"get":{"tags":["credits"],"summary":"Get Payg Regional Info","description":"Get localized pay-as-you-go pricing information based on user location","operationId":"get_payg_regional_info_regional-info","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayAsYouGoInfoLocalized"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_payg_regional_info_api_v1_credits_payg_regional_info_get"}},"/api/v1/credits/payg/create-checkout-session":{"post":{"tags":["credits"],"summary":"Create Payg Checkout Session","description":"Create Stripe Checkout Session for pay-as-you-go credit purchase","operationId":"create_payg_checkout_session","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayAsYouGoCheckoutRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayAsYouGoCheckoutResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"security":[{"OAuth2PasswordBearer":[]}],"x-original-operation-id":"create_payg_checkout_session_api_v1_credits_payg_create_checkout_session_post"}},"/api/v1/credits/payg/create-payment-intent":{"post":{"tags":["credits"],"summary":"Create Payg Payment Intent","description":"Create Stripe Payment Intent for pay-as-you-go credit purchase.\n\nThis endpoint is used for the embedded checkout flow where payment\nis collected directly on the Audiopod site using Stripe Payment Element.\nReturns a client_secret for the frontend to confirm the payment.","operationId":"create_payg_payment_intent","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayAsYouGoPaymentIntentRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayAsYouGoPaymentIntentResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"security":[{"OAuth2PasswordBearer":[]}],"x-original-operation-id":"create_payg_payment_intent_api_v1_credits_payg_create_payment_intent_post"}},"/api/v1/credits/payg/verify-session/":{"post":{"tags":["credits"],"summary":"Verify Payg Session","description":"Verify and fulfil a pay-as-you-go Checkout session after the redirect.\n\nSafe to call more than once: a purchase is credited exactly once no matter\nhow this call interleaves with the payment provider's webhook.","operationId":"verify_payg_session","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayAsYouGoVerifyRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayAsYouGoVerifyResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"security":[{"OAuth2PasswordBearer":[]}],"x-original-operation-id":"verify_payg_session_api_v1_credits_payg_verify_session__post"}},"/api/v1/credits/payg/verify-session":{"post":{"tags":["credits"],"summary":"Verify Payg Session","description":"Verify and fulfil a pay-as-you-go Checkout session after the redirect.\n\nSafe to call more than once: a purchase is credited exactly once no matter\nhow this call interleaves with the payment provider's webhook.","operationId":"verify_payg_session_verify-session","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayAsYouGoVerifyRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayAsYouGoVerifyResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"security":[{"OAuth2PasswordBearer":[]}],"x-original-operation-id":"verify_payg_session_api_v1_credits_payg_verify_session_post"}},"/api/v1/audiobook/projects":{"post":{"tags":["audiobook"],"summary":"Create Audiobook Project","description":"Create a new audiobook project.\n\n`narration_review_policy` decides what happens to a passage our narration\ncheck cannot confirm. When omitted, a call authenticated with an API key\ncreates the book with 'auto_accept' (recommended for automated pipelines:\nthe book never waits on a person), and the Studio uses 'manual'.","operationId":"create_audiobook_project","security":[{"OAuth2PasswordBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AudiobookProjectCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AudiobookProjectResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"create_audiobook_project_api_v1_audiobook_projects_post"},"get":{"tags":["audiobook"],"summary":"List Audiobook Projects","description":"List user's audiobook projects with pagination","operationId":"list_audiobook_projects","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"sort_by","in":"query","required":false,"schema":{"enum":["created_at","updated_at","title","author","last_downloaded_at"],"type":"string","default":"created_at","title":"Sort By"}},{"name":"sort_order","in":"query","required":false,"schema":{"enum":["asc","desc"],"type":"string","default":"desc","title":"Sort Order"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Per Page"}},{"name":"status_filter","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by project status","title":"Status Filter"},"description":"Filter by project status"},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search by title or author","title":"Search"},"description":"Search by title or author"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedProjectsResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"list_audiobook_projects_api_v1_audiobook_projects_get"}},"/api/v1/audiobook/settings":{"get":{"tags":["audiobook"],"summary":"Get Audiobook Settings","description":"Read this account's audiobook settings.\n\n`auto_direction_default` is whether manuscripts parsed in the web studio\nshould be given reading direction automatically, and `source` says whether\nthe account chose that or is inheriting the unset default. `active` is\nwhether automatic direction on parse is switched on for web studio accounts\nat all — while it is false the preference is stored and returned but no\nparse acts on it.\n\nA parse made with an API key is never affected by this setting: it adds\ndirection only when the request asks for it.","operationId":"get_audiobook_settings","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AudiobookSettingsResponse"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"security":[{"OAuth2PasswordBearer":[]}],"x-original-operation-id":"get_audiobook_settings_api_v1_audiobook_settings_get"},"patch":{"tags":["audiobook"],"summary":"Update Audiobook Settings","description":"Choose whether web studio parses are given reading direction.\n\nThe response is the account's settings after the change, so a control can\nbind to what it gets back. A single parse can still override the account\nsetting with the `auto_direction` parameter, and a parse made with an API\nkey is never affected by it.","operationId":"update_audiobook_settings","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AudiobookSettingsUpdate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AudiobookSettingsResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"security":[{"OAuth2PasswordBearer":[]}],"x-original-operation-id":"update_audiobook_settings_api_v1_audiobook_settings_patch"}},"/api/v1/audiobook/projects/trash":{"get":{"tags":["audiobook"],"summary":"List Trashed Audiobook Projects","description":"Recently deleted projects, newest deletion first.\n\nWhere a deleted project can be found and restored from. Each entry carries\nwhen it was deleted. No expiry is promised — do not show a countdown.","operationId":"list_trashed_audiobook_projects","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Per Page"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedProjectsResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"list_trashed_audiobook_projects_api_v1_audiobook_projects_trash_get"}},"/api/v1/audiobook/book-metadata/defaults":{"get":{"tags":["audiobook"],"summary":"Get Book Metadata Defaults","description":"Publishing metadata to pre-fill on a NEW book, from this user's last ones.\n\nCarries over the fields that repeat across a catalogue (publisher,\nnarrator, rights line and similar). ISBN and series number never carry\nover — they are per-title, and a reused ISBN would attach one book to\nanother's retail record. Each field is taken from the most recent project\nthat has it.","operationId":"get_book_metadata_defaults","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exclude_project_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Project being edited — its own values are not suggestions","title":"Exclude Project Id"},"description":"Project being edited — its own values are not suggestions"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookMetadataResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_book_metadata_defaults_api_v1_audiobook_book_metadata_defaults_get"}},"/api/v1/audiobook/projects/{project_id}/book-metadata":{"put":{"tags":["audiobook"],"summary":"Save Book Metadata","description":"Save the book's publishing metadata without starting an export.\n\nPersists ISBN, genre, publisher, narrator, rights, series and keywords so\nthey survive leaving the export screen.\n\nSame semantics as the export path: an omitted field is left alone, a field\nsent empty is cleared.","operationId":"save_book_metadata","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookMetadataInput"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookMetadataResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"save_book_metadata_api_v1_audiobook_projects__project_id__book_metadata_put"}},"/api/v1/audiobook/projects/{project_id}":{"get":{"tags":["audiobook"],"summary":"Get Audiobook Project","description":"Get a specific audiobook project, optionally with its chapters inline.","operationId":"get_audiobook_project","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}},{"name":"include_chapters","in":"query","required":false,"schema":{"type":"boolean","description":"Include the project's chapters inline, saving a second round-trip. Omitted/false returns `chapters: null` (the legacy shape).","default":false,"title":"Include Chapters"},"description":"Include the project's chapters inline, saving a second round-trip. Omitted/false returns `chapters: null` (the legacy shape)."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AudiobookProjectWithChaptersResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_audiobook_project_api_v1_audiobook_projects__project_id__get"},"put":{"tags":["audiobook"],"summary":"Update Audiobook Project","description":"Update an audiobook project","operationId":"update_audiobook_project","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AudiobookProjectUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AudiobookProjectResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"update_audiobook_project_api_v1_audiobook_projects__project_id__put"},"delete":{"tags":["audiobook"],"summary":"Delete Audiobook Project","description":"Delete an audiobook project.\n\nRefused with 409 while narration, a manuscript parse, or production\n(mixing / export) is live for this project. There is no force bypass —\ncancel the running work first, then delete.","operationId":"delete_audiobook_project","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"delete_audiobook_project_api_v1_audiobook_projects__project_id__delete"}},"/api/v1/audiobook/projects/{project_id}/rights-attestation":{"post":{"tags":["audiobook"],"summary":"Attest Project Rights","description":"Record the user's affirmative rights attestation.\n\nThe caller asserts they hold the audio rights to this manuscript. The\nattestation is stamped with a timestamp and the originating IP, and is\nrequired before narration start and before ACX export.","operationId":"attest_project_rights","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Attest Project Rights Api V1 Audiobook Projects  Project Id  Rights Attestation Post"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"attest_project_rights_api_v1_audiobook_projects__project_id__rights_attestation_post"}},"/api/v1/audiobook/projects/{project_id}/lock":{"get":{"tags":["audiobook"],"summary":"Get Project Edit Lock","description":"What this book is locked for right now.\n\n`state` is 'open' when every edit is allowed. Otherwise it says why\nediting is paused: 'finalizing' (the book is being finalized for\nproduction), 'exporting' (a download package is being built) or\n'restructuring' (the manuscript is being split into chapters and\nparagraphs). `blocks` lists the kinds of change refused until it ends\n('text', 'voices', 'narration', 'structure'); a refused change answers\n409 with `code` 'book_locked' and this same object under `lock`.\n`stop.available` is true when the work can be stopped, and `stop.effect`\nsays what stopping does. The same object is returned as `edit_lock` on the\nproject.\n\nThis read never waits on other work in progress. A write that is briefly\ncontended answers 409 with `code` 'book_busy' and a `Retry-After` header.","operationId":"get_project_edit_lock","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookLockState"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_project_edit_lock_api_v1_audiobook_projects__project_id__lock_get"}},"/api/v1/audiobook/projects/{project_id}/restore":{"post":{"tags":["audiobook"],"summary":"Restore Audiobook Project","description":"Undo a delete: put a deleted project back.\n\n404 when the project is not this user's, does not exist, or was never\ndeleted — restoring something already live is not a real request, and a\n200 would hide a client bug.\n\nRestore brings back the project, not expired audio. Where retention has\nalready expired a chapter's output, the project returns with that output\nmarked expired and the usual \"re-render\" path applies.","operationId":"restore_audiobook_project","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AudiobookProjectResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"restore_audiobook_project_api_v1_audiobook_projects__project_id__restore_post"}},"/api/v1/audiobook/projects/{project_id}/manuscript/upload":{"post":{"tags":["audiobook"],"summary":"Upload Manuscript","description":"Upload a manuscript file directly to storage and attach it to the project.\n\nOptional form field ``multi_voice`` (true/false): give each character\ntheir own voice, saved on the book as with ``PUT /projects/{id}``. The\nparse that follows then attributes the dialogue to speakers and gives each\ncharacter a free library voice. Omit it to leave the book as it is.\nSpeaker detection itself is chosen on the parse request\n(``detect_speakers``), since uploading does not read the text.","operationId":"upload_manuscript","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_manuscript_api_v1_audiobook_projects__project_id__manuscript_upload_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ManuscriptUploadResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"upload_manuscript_api_v1_audiobook_projects__project_id__manuscript_upload_post"}},"/api/v1/audiobook/projects/{project_id}/manuscript/parse":{"post":{"tags":["audiobook"],"summary":"Parse Manuscript","description":"Start a manuscript parsing job.\n\nBody: `file_key` (from the upload response) and `filename`. Accepts a JSON\nbody, form-encoded fields (urlencoded or multipart), or query params.\n\nOptional: `force` (re-parse a project that already has chapters) and\n`auto_direction` (give the book reading direction after parsing). Omitted,\n`auto_direction` is always off for API-key callers, and for web studio\ncallers follows the account's audiobook settings.","operationId":"parse_manuscript","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ManuscriptParseResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["file_key","filename"],"properties":{"file_key":{"type":"string","description":"Storage key returned by the manuscript upload response."},"filename":{"type":"string","description":"Original filename, including extension."},"force":{"type":"boolean","default":false,"description":"Re-parse a project that already has chapters. Destructive: existing chapters and paragraphs are replaced."},"auto_direction":{"type":"boolean","description":"Write contextual reading direction onto every paragraph once parsing finishes, so narration is expressive. Omit to accept the caller default. For API-key callers that default is ALWAYS off, so an integration's output never changes without asking; pass true to opt in. Web studio callers follow their account setting. Can also be run later via POST /projects/{project_id}/direction/auto."},"detect_speakers":{"type":"boolean","description":"Attribute dialogue to named speakers while parsing (each paragraph's character_name). Free. Omit to accept the caller default: off for API-key callers, on in the web studio."},"multi_voice":{"type":"boolean","description":"Give each character their own voice. Implies detect_speakers; every detected character gets a voice from the library at no cost, which you can change on the cast. Default off: every passage uses the narrator."}}}}}},"x-original-operation-id":"parse_manuscript_api_v1_audiobook_projects__project_id__manuscript_parse_post"}},"/api/v1/audiobook/projects/{project_id}/manuscript/paste":{"post":{"tags":["audiobook"],"summary":"Paste Manuscript","description":"Parse editable chapters; optional voice direction follows account settings.\n\nAPI-key callers default to no direction unless auto_direction is true.","operationId":"paste_manuscript","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RawTextIntakeRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ManuscriptIntakeResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"paste_manuscript_api_v1_audiobook_projects__project_id__manuscript_paste_post"}},"/api/v1/audiobook/projects/{project_id}/manuscript/generate":{"post":{"tags":["audiobook"],"summary":"Generate Manuscript","description":"Create an editable draft; voice direction follows the account setting.\n\nAPI-key callers must opt into direction. Narration remains explicit.","operationId":"generate_manuscript","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GeneratedBookRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ManuscriptIntakeResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"generate_manuscript_api_v1_audiobook_projects__project_id__manuscript_generate_post"}},"/api/v1/audiobook/projects/{project_id}/chapters":{"get":{"tags":["audiobook"],"summary":"List Chapters","description":"List chapters for a project","operationId":"list_chapters","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":50,"title":"Per Page"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedChaptersResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"list_chapters_api_v1_audiobook_projects__project_id__chapters_get"},"post":{"tags":["audiobook"],"summary":"Create Chapter","description":"Create a new chapter directly (paste-text mode).\n\nUse cases:\n  - Author adds a \"Preface\" before existing chapter 1\n  - Author appends a new chapter after generation has already started\n  - Author drops in an \"Author's Note\" between two existing chapters\n\nAuto-splits content into paragraphs and slots into the chapter ordering.","operationId":"create_chapter","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}},{"name":"insert_at","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}],"description":"Optional 1-based position; existing chapters at or after this position shift down. Omit to append at the end.","title":"Insert At"},"description":"Optional 1-based position; existing chapters at or after this position shift down. Omit to append at the end."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AudiobookChapterCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AudiobookChapterResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"create_chapter_api_v1_audiobook_projects__project_id__chapters_post"}},"/api/v1/audiobook/projects/{project_id}/chapters/{chapter_id}":{"get":{"tags":["audiobook"],"summary":"Get Chapter","description":"Get a specific chapter","operationId":"get_chapter","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}},{"name":"chapter_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Chapter Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AudiobookChapterResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_chapter_api_v1_audiobook_projects__project_id__chapters__chapter_id__get"},"put":{"tags":["audiobook"],"summary":"Update Chapter","description":"Edit chapter title or content before export.\n\nWhen `content` is updated, only the paragraphs whose text changed need\nnarrating again: a paragraph whose text is unchanged keeps its audio (even\nif it moved), an edited paragraph keeps its history but its audio is\ncleared, removed paragraphs are deleted and new ones are added pending.\nSending the same content changes nothing.","operationId":"update_chapter","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}},{"name":"chapter_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Chapter Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AudiobookChapterUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AudiobookChapterResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"update_chapter_api_v1_audiobook_projects__project_id__chapters__chapter_id__put"},"delete":{"tags":["audiobook"],"summary":"Delete Chapter","description":"Delete a chapter (and its paragraphs). Renumbers remaining chapters.","operationId":"delete_chapter","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}},{"name":"chapter_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Chapter Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"delete_chapter_api_v1_audiobook_projects__project_id__chapters__chapter_id__delete"}},"/api/v1/audiobook/projects/{project_id}/narration/start":{"post":{"tags":["audiobook"],"summary":"Start Project Narration","description":"DEPRECATED: use POST .../narration/batch instead.\n\n/narration/batch narrates the whole project when no chapter_ids or\nparagraph_ids are supplied. This endpoint returns 410.","operationId":"start_project_narration","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NarrationRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Start Project Narration Api V1 Audiobook Projects  Project Id  Narration Start Post"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"start_project_narration_api_v1_audiobook_projects__project_id__narration_start_post"}},"/api/v1/audiobook/projects/{project_id}/narration/batch":{"post":{"tags":["audiobook"],"summary":"Start Batch Narration","description":"Narrate the selected paragraphs.\n\nThe request body is optional: omit it (or send ``{}``) to narrate the\nwhole book with the defaults.\n\n`voice_id`, when sent, is the narrator for this run in place of the\nbook's. With character voices off it voices every selected paragraph.\nWith character voices on (`multi_voice`) it voices only the narrator's\nlines: a character with a cast voice, and a paragraph given its own voice,\nkeep theirs. It is a narrator override for this run: it is recorded on\nthe lines it narrates, but not as the author's per-line choice, so with\ncharacter voices on, cast voices still apply. `multi_voice`, when sent,\nis saved on the book before this run reads its voices.\n\n`narration_review_policy`, when sent, is saved on the book. When omitted on\na call authenticated with an API key and the book has no policy yet,\n'auto_accept' is saved, so an automated pipeline never waits on a person.\n\nOn an 'auto_accept' book bought per finished hour, a passage held because\nthe book's narration hours were used up (review `reason_code`\n`allowance_exhausted`) is completed by this call, at no extra charge, once\nhours have been added; until then it stays held.\n\nQueues one run for the whole selection and returns immediately. Some\nselections are served by the durable production engine instead; the\nresponse keeps its shape either way — ``engine`` says which path took it,\nand a durable run carries ``run_id`` with ``job_id`` null.\n\nIf automatic voice direction is still being written for this book (for\nexample, just after a parse that asked for it), this call still returns\nat once. Passages wait, reported as ``queued``, until direction has\nfinished, and are then narrated with it, so no chapter is narrated half\ndirected. If direction fails or stops making progress, the waiting\npassages are narrated without waiting further.\n\nOmit ``chapter_ids`` and ``paragraph_ids`` to narrate the whole book. An\nempty list in either is refused with 400 and code ``empty_selection``\n(nothing is queued, charged or saved), so a filter that matched nothing\nnever widens to the whole book.\n\nWhere sentence-level narration is available, ``mode`` ('auto', the\ndefault, or 'passage') applies to each edited, previously narrated\npassage as it does on the single-passage narrate call; 'sentence' is not\naccepted here (422).","operationId":"start_batch_narration","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/BatchNarrationRequest"},{"type":"null"}],"title":"Batch Request"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchNarrationResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"start_batch_narration_api_v1_audiobook_projects__project_id__narration_batch_post"}},"/api/v1/audiobook/projects/{project_id}/narration/cancel":{"post":{"tags":["audiobook"],"summary":"Cancel Batch Narration","description":"Stop the narration batch running for this project.\n\nStops the run (best-effort), marks it CANCELLED, releases the credits held\nfor paragraphs that produced no audio, and returns every un-narrated\nparagraph of the batch to a runnable state.\n\nCancel is resume-not-restart: a paragraph that already holds narration\naudio is never touched, so you keep every paragraph you paid for and\nre-POSTing ``/narration/batch`` narrates only what is left.\n\nIdempotent by way of the 404: only the first call finds a live batch. A\nsecond call returns 404 ``no_narration_running`` — not an error state,\njust \"there is nothing left to stop\" — so a retrying client can never\ndouble-release billing.","operationId":"cancel_batch_narration","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NarrationCancelResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"cancel_batch_narration_api_v1_audiobook_projects__project_id__narration_cancel_post"}},"/api/v1/audiobook/projects/{project_id}/narration/progress":{"get":{"tags":["audiobook"],"summary":"Get Narration Progress","description":"Get narration progress for a project.\n\nEach `chapter_status` entry reports `status` (pending, narrating, failed,\ncompleted or awaiting_approval). `awaiting_approval` means passages wait\nfor your decision: `review_required` counts them, `review_message` says\nwhat to do, and GET /projects/{project_id}/review lists them with the\ncalls that resolve each one. Books using 'auto_accept' never wait; flagged\npassages they published are counted under `quality_notes` for your\ninformation only.","operationId":"get_narration_progress","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NarrationProgress"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_narration_progress_api_v1_audiobook_projects__project_id__narration_progress_get"}},"/api/v1/audiobook/projects/{project_id}/timeline/mix":{"post":{"tags":["audiobook"],"summary":"Mix Project Timeline","description":"Retired. Set intro/outro music and narrated credits with PUT\n/projects/{project_id}/production-settings; they are applied during the\nACX export. This endpoint returns 410.","operationId":"mix_project_timeline","deprecated":true,"security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"mix_project_timeline_api_v1_audiobook_projects__project_id__timeline_mix_post"}},"/api/v1/audiobook/projects/{project_id}/chapters/{chapter_id}/regenerate":{"post":{"tags":["audiobook"],"summary":"Regenerate Chapter Narration","description":"DEPRECATED: use POST .../narration/batch instead.\n\n`narration/batch` takes `chapter_ids` and `include_completed`, so it\nexpresses this endpoint's semantics exactly. This endpoint returns 410.","operationId":"regenerate_chapter_narration","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}},{"name":"chapter_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Chapter Id"}},{"name":"voice_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Voice Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"type":"object","additionalProperties":true},{"type":"null"}],"title":"Narration Settings"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Regenerate Chapter Narration Api V1 Audiobook Projects  Project Id  Chapters  Chapter Id  Regenerate Post"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"regenerate_chapter_narration_api_v1_audiobook_projects__project_id__chapters__chapter_id__regenerate_post"}},"/api/v1/audiobook/voices/languages":{"get":{"tags":["audiobook"],"summary":"Get Voice Languages","description":"List languages spoken by any STANDARD voice, with per-language counts.\n\nUsed by the audiobook voice picker to render the language filter chips.\nReturns ``[{code, display_name, voice_count}]`` ordered by voice_count\ndesc (English typically first, then by catalog size). Falls back to the\nlegacy ``language_code`` column when ``voice_data->supported_languages``\nis missing on a row.","operationId":"get_voice_languages","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"security":[{"OAuth2PasswordBearer":[]}],"x-original-operation-id":"get_voice_languages_api_v1_audiobook_voices_languages_get"}},"/api/v1/audiobook/voices/available":{"get":{"tags":["audiobook"],"summary":"Get Available Voices","description":"Get available voices for audiobook narration.\n\nFilters by ``voice_data->supported_languages`` (preferred) with a\nlegacy fallback to the ``language_code`` column for rows that have\nnot yet been backfilled.","operationId":"get_available_voices","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"language","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional language code (BCP 47, e.g. 'th-TH'). When provided, only voices that support this language are returned. When omitted or empty, all voices are returned.","title":"Language"},"description":"Optional language code (BCP 47, e.g. 'th-TH'). When provided, only voices that support this language are returned. When omitted or empty, all voices are returned."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoiceSelectionResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_available_voices_api_v1_audiobook_voices_available_get"}},"/api/v1/audiobook/dashboard":{"get":{"tags":["audiobook"],"summary":"Get Dashboard Stats","description":"Get dashboard statistics for user's audiobook projects","operationId":"get_dashboard_stats","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardStats"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"security":[{"OAuth2PasswordBearer":[]}],"x-original-operation-id":"get_dashboard_stats_api_v1_audiobook_dashboard_get"}},"/api/v1/audiobook/projects/{project_id}/chapters/{chapter_id}/download":{"get":{"tags":["audiobook"],"summary":"Download Chapter Audio","description":"Get a presigned download URL for a single chapter's audio file.\n\n``audio_format=mp3`` (default) returns the stored playback proxy. ``wav``\nre-stitches the lossless paragraph WAVs on demand (the true master) — the\nstored chapter file is only an MP3 proxy for light browser playback.","operationId":"download_chapter_audio","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}},{"name":"chapter_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Chapter Id"}},{"name":"audio_format","in":"query","required":false,"schema":{"type":"string","default":"mp3","title":"Audio Format"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"download_chapter_audio_api_v1_audiobook_projects__project_id__chapters__chapter_id__download_get"}},"/api/v1/audiobook/projects/{project_id}/preview-excerpt":{"get":{"tags":["audiobook"],"summary":"Get Preview Excerpt","operationId":"get_preview_excerpt","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_preview_excerpt_api_v1_audiobook_projects__project_id__preview_excerpt_get","description":"Get Preview Excerpt"}},"/api/v1/audiobook/projects/{project_id}/chapters/{chapter_id}/review-timeline":{"get":{"tags":["audiobook"],"summary":"Get Chapter Review Timeline","description":"Owner-scoped measured ranges for the exact chapter download artifact.","operationId":"get_chapter_review_timeline","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}},{"name":"chapter_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Chapter Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_chapter_review_timeline_api_v1_audiobook_projects__project_id__chapters__chapter_id__review_timeline_get"}},"/api/v1/audiobook/projects/{project_id}/chapters/{chapter_id}/timings":{"get":{"tags":["audiobook"],"summary":"Get Chapter Timings","description":"A presigned URL for this chapter's read-along word timings.\n\nReturns ``{\"timings_url\": <url|null>}``. A null URL is an ORDINARY answer,\nnot an error: a chapter narrated before read-along existed, narrated in a\nlanguage the engine does not align, or narrated without alignment\nrequested simply has no timings. Fall back to the plain transcript — this\nendpoint does not 404 for that case.\n\nThe timings describe the currently served chapter audio: they are withheld\nwhenever that audio is being rebuilt, so timings and audio cannot\ndisagree.","operationId":"get_chapter_timings","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}},{"name":"chapter_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Chapter Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_chapter_timings_api_v1_audiobook_projects__project_id__chapters__chapter_id__timings_get"}},"/api/v1/audiobook/projects/{project_id}/chapters/{chapter_id}/audio":{"get":{"tags":["audiobook"],"summary":"Stream Chapter Audio","description":"Redirect to a presigned URL for chapter audio playback.\n\nFreshness is decided by the same read-time guard the download endpoint\nuses, so playback and download can never disagree about whether a proxy is\nservable. A chapter mid-rebuild answers 409 `chapter_reassembling` with\n`Retry-After`, not 404 — only a chapter with no narrated paragraph audio\nat all is a genuine 404.","operationId":"stream_chapter_audio","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}},{"name":"chapter_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Chapter Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"stream_chapter_audio_api_v1_audiobook_projects__project_id__chapters__chapter_id__audio_get"}},"/api/v1/audiobook/projects/{project_id}/media/upload":{"post":{"tags":["audiobook"],"summary":"Upload Project Media","description":"Upload a production media asset (intro/outro music, or cover art).\n\nAudio files are decode-probed with pydub so corrupt uploads fail HERE with\na readable message instead of inside an export job. Cover art is validated\nagainst the ACX spec (square, 2400–3000 px, JPEG/PNG).","operationId":"upload_project_media","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_project_media_api_v1_audiobook_projects__project_id__media_upload_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AudiobookMediaResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"upload_project_media_api_v1_audiobook_projects__project_id__media_upload_post"}},"/api/v1/audiobook/projects/{project_id}/media/{media_id}/audio":{"get":{"tags":["audiobook"],"summary":"Stream Project Media","description":"Redirect to a presigned URL for a production media asset (preview playback).","operationId":"stream_project_media","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}},{"name":"media_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Media Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"stream_project_media_api_v1_audiobook_projects__project_id__media__media_id__audio_get"}},"/api/v1/audiobook/projects/{project_id}/production-settings":{"get":{"tags":["audiobook"],"summary":"Get Music Settings","description":"Read the project's production config (intro/outro music, credits, cover).","operationId":"get_music_settings","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductionMusicSettings"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_music_settings_api_v1_audiobook_projects__project_id__production_settings_get"},"put":{"tags":["audiobook"],"summary":"Update Music Settings","description":"Update production config. Tri-state per field: omitted = unchanged,\nnull = clear, object = set. Music Studio picks are COPIED into the\naudiobook media prefix so they survive the music job's R2 lifecycle.\nApplied during ACX export — no separate mix job.","operationId":"update_music_settings","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductionMusicUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductionMusicSettings"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"update_music_settings_api_v1_audiobook_projects__project_id__production_settings_put"}},"/api/v1/audiobook/projects/{project_id}/pacing":{"get":{"tags":["audiobook"],"summary":"Get Pacing","description":"Read the book's pacing: the silence between passages, when the speaker\nchanges, and at scene breaks. A book that never set pacing returns the\ndefaults (500 ms, 500 ms, 1500 ms).","operationId":"get_pacing","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PacingSettings"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_pacing_api_v1_audiobook_projects__project_id__pacing_get"},"patch":{"tags":["audiobook"],"summary":"Update Pacing","description":"Change the book's pacing. Send only the fields you want to change; each\nis in milliseconds, 0–10000.\n\nPacing applies when chapters are assembled, so no passage is narrated again\nand nothing is charged. Assembled chapter audio is refreshed the next time\nit is played or downloaded, and every export uses the new pacing.\nA passage's own `pause_after_ms` still wins for the gap after it.\n\nSaving also marks any divider-only paragraph (`* * *`, `#`, `⁂`) in the\nbook as a scene break, so books imported earlier pick up scene breaks\nwithout being imported again.","operationId":"update_pacing","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PacingUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PacingSettings"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"update_pacing_api_v1_audiobook_projects__project_id__pacing_patch"}},"/api/v1/audiobook/projects/{project_id}/export":{"post":{"tags":["audiobook"],"summary":"Start Export","description":"Start an ACX export job for the audiobook project.\n\nOmit ``include_chapters`` to package the whole book; an empty list is\nrefused with 400 and code ``empty_selection``.","operationId":"start_export","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ACXExportRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ACXExportResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"start_export_api_v1_audiobook_projects__project_id__export_post"}},"/api/v1/audiobook/projects/{project_id}/exports/latest":{"get":{"tags":["audiobook"],"summary":"Get Latest Export","description":"Recover export state across devices without browser-local job IDs.","operationId":"get_latest_export","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_latest_export_api_v1_audiobook_projects__project_id__exports_latest_get"}},"/api/v1/audiobook/projects/{project_id}/export/{job_id}/download":{"get":{"tags":["audiobook"],"summary":"Download Export","description":"Get a presigned download URL for a completed export package","operationId":"download_export","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}},{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}},{"name":"require_current","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Require Current"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"download_export_api_v1_audiobook_projects__project_id__export__job_id__download_get"}},"/api/v1/audiobook/projects/{project_id}/export/{job_id}/status":{"get":{"tags":["audiobook"],"summary":"Get Export Status","description":"Check the status of an export job","operationId":"get_export_status","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}},{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_export_status_api_v1_audiobook_projects__project_id__export__job_id__status_get"}},"/api/v1/audiobook/projects/{project_id}/chapters/{chapter_id}/paragraphs":{"get":{"tags":["audiobook"],"summary":"List Paragraphs","description":"List paragraphs in a chapter, ordered by position.\n\nPagination is opt-in: with neither `page` nor `per_page` supplied this\nreturns the chapter's FULL paragraph list. Supplying either param switches\non paging. `total` is the full chapter count in both modes.","operationId":"list_paragraphs","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}},{"name":"chapter_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Chapter Id"}},{"name":"page","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}],"description":"1-based page number. Omit BOTH page and per_page to get every paragraph in one response (the default, legacy behaviour).","title":"Page"},"description":"1-based page number. Omit BOTH page and per_page to get every paragraph in one response (the default, legacy behaviour)."},{"name":"per_page","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":200,"minimum":1},{"type":"null"}],"description":"Paragraphs per page (max 200). Defaults to 50 when only `page` is given.","title":"Per Page"},"description":"Paragraphs per page (max 200). Defaults to 50 when only `page` is given."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedParagraphsResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"list_paragraphs_api_v1_audiobook_projects__project_id__chapters__chapter_id__paragraphs_get"}},"/api/v1/audiobook/projects/{project_id}/paragraphs/{paragraph_id}":{"put":{"tags":["audiobook"],"summary":"Update Paragraph","description":"Edit paragraph fields (text, voice override, lock state, skip flag).","operationId":"update_paragraph","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}},{"name":"paragraph_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Paragraph Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AudiobookParagraphUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AudiobookParagraphResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"update_paragraph_api_v1_audiobook_projects__project_id__paragraphs__paragraph_id__put"},"delete":{"tags":["audiobook"],"summary":"Delete Paragraph","description":"Remove one paragraph from its chapter, including the last paragraph.\n\nThe paragraph is archived, not destroyed: its audio and every take are\nkept (listed by `GET /projects/{project_id}/archived-passages`) and it can\nbe put back with `POST /projects/{project_id}/paragraphs/{paragraph_id}/restore`.","operationId":"delete_paragraph","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}},{"name":"paragraph_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Paragraph Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"delete_paragraph_api_v1_audiobook_projects__project_id__paragraphs__paragraph_id__delete"},"get":{"tags":["audiobook"],"summary":"Get Paragraph","description":"Read a single paragraph (used for status polling).","operationId":"get_paragraph","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}},{"name":"paragraph_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Paragraph Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AudiobookParagraphResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_paragraph_api_v1_audiobook_projects__project_id__paragraphs__paragraph_id__get"}},"/api/v1/audiobook/projects/{project_id}/paragraphs/{paragraph_id}/restore":{"post":{"tags":["audiobook"],"summary":"Restore Paragraph","description":"Put a removed (archived) paragraph back into its chapter, with its audio\nand takes, at the place it was removed from.","operationId":"restore_paragraph","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}},{"name":"paragraph_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Paragraph Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AudiobookParagraphResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"restore_paragraph_api_v1_audiobook_projects__project_id__paragraphs__paragraph_id__restore_post"}},"/api/v1/audiobook/projects/{project_id}/cast":{"get":{"tags":["audiobook"],"summary":"Get Cast","description":"Cast list: speakers assigned/detected across the book, with line counts\nand the voice each currently uses.\n\nNames that look like stray words rather than characters (a single line,\na word written in lowercase in the text, a name with a word such as\n\"when\" in front of it, or a word that is never a name) are hidden: they\nare listed under ``hidden_members`` instead of ``members`` (both, with\n``include_hidden=true``) and are never given a voice automatically. A\nname you set a voice on, or chose to show, is never hidden.\n``suggested_merges`` proposes folding such a name into the character it\nbelongs to (``POST /projects/{project_id}/cast/merge``). ``detection``\nreports the latest background speaker detection.","operationId":"get_cast","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}},{"name":"include_hidden","in":"query","required":false,"schema":{"type":"boolean","description":"Also list hidden characters under members.","default":false,"title":"Include Hidden"},"description":"Also list hidden characters under members."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CastResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_cast_api_v1_audiobook_projects__project_id__cast_get"}},"/api/v1/audiobook/projects/{project_id}/cast/detect":{"post":{"tags":["audiobook"],"summary":"Detect Cast","description":"Attribute dialogue to named speakers (each paragraph's character_name).\nFree. Non-destructive: only fills paragraphs that have no character_name\nand aren't locked, and never one whose speaker you cleared, so a manual\nassignment is never overwritten.\n\n``method=heuristic`` (default) answers at once with the paragraphs it\nfilled. ``method=llm`` starts a job and returns ``job_id``: poll\n``GET /projects/{project_id}/cast/detect/{job_id}/status``, or subscribe a\nwebhook endpoint to ``audiobook.cast.detected``. It accepts a speaker only\nwhen it is confident, leaves narration and unnamed speakers to the\nnarrator, and records names that belong to one character as aliases\n(an alias you set is never changed). While it runs, narration of a passage\nthat has not started waits for it. With character voices on\n(``multi_voice``), each character it finds gets a free library voice.\n409 while another llm detection runs; 400 over the same word limit as\nannotation.","operationId":"detect_cast","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}},{"name":"method","in":"query","required":false,"schema":{"enum":["heuristic","llm"],"type":"string","description":"heuristic: instant, reads speaker tags and turn-taking in the text. llm: a free background job that reads each dialogue paragraph in context and also finds names that belong to the same character; returns job_id.","default":"heuristic","title":"Method"},"description":"heuristic: instant, reads speaker tags and turn-taking in the text. llm: a free background job that reads each dialogue paragraph in context and also finds names that belong to the same character; returns job_id."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CastDetectResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"detect_cast_api_v1_audiobook_projects__project_id__cast_detect_post"}},"/api/v1/audiobook/projects/{project_id}/cast/detect/{job_id}/status":{"get":{"tags":["audiobook"],"summary":"Get Cast Detect Status","description":"Poll a speaker detection job started with ``POST /cast/detect?method=llm``.\nWhen COMPLETED, ``result`` says how many paragraphs were given a speaker,\nwhich characters, how many alias names were folded and how many free\nlibrary voices were picked; ``GET /cast`` shows the cast. A FAILED job\nkeeps the speakers it had already written.","operationId":"get_cast_detect_status","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}},{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CastDetectStatusResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_cast_detect_status_api_v1_audiobook_projects__project_id__cast_detect__job_id__status_get"}},"/api/v1/audiobook/projects/{project_id}/voices/preview":{"post":{"tags":["audiobook"],"summary":"Preview Voices Change","description":"Show what a change to the book's voices would do. Nothing is saved.\n\nSend any of ``narration_style`` ('single': one narrator reads every\nline; 'characters': each character gets their own voice),\n``narrator_voice_id`` and ``reset_line_voices``. The body is optional:\nomit it (or send ``{}``) to preview the book's voices unchanged.\n\nA new narrator is heard on every unlocked line that has no voice of its\nown; ``reset_line_voices`` also hands lines given their own voice back to\nthe narrator or their character. Turning character voices on gives each\nvisible character without a voice a library voice (``cast_preview``).\nLocked lines always keep the voice they have.\n\n``drift_lines`` counts narrated lines whose audio would then be in a\ndifferent voice from the one they are read in; ``paragraph_ids`` lists\nthem and ``renarrate`` prices re-narrating exactly those lines (the same\nquote as ``GET /cost-estimate``), with your ``balance``. On a book bought\nper finished hour, re-narrating after a narrator change is ``included``\nwhile its whole-book voice swap is unused.\n\nPass ``preview_hash`` to ``POST /voices/apply`` to make the change.","operationId":"preview_voices_change","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/VoicesChangeRequest"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoicesPreviewResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"preview_voices_change_api_v1_audiobook_projects__project_id__voices_preview_post"}},"/api/v1/audiobook/projects/{project_id}/voices/apply":{"post":{"tags":["audiobook"],"summary":"Apply Voices Change","description":"Make a change previewed with ``POST /voices/preview``.\n\nSend the same fields as the preview plus its ``preview_hash``. If the\nbook changed since the preview so that the change would do something\ndifferent (other lines, another price), nothing is saved and the answer\nis 409 with ``code`` 'preview_stale': preview again.\n\nWith ``renarrate`` true the lines the preview listed in\n``paragraph_ids`` are re-narrated in the same step, at the quoted price\n(or with the included voice swap); the run is returned as\n``renarration``. If narration cannot start (for example 402 for credits),\nthe voice change is not saved either. Without ``renarrate`` existing\naudio is kept and the new voices are heard on the next take.\n\n409 ``book_locked`` while the book is being finalized or exported.","operationId":"apply_voices_change","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoicesApplyRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoicesApplyResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"apply_voices_change_api_v1_audiobook_projects__project_id__voices_apply_post"}},"/api/v1/audiobook/projects/{project_id}/cast/assign":{"post":{"tags":["audiobook"],"summary":"Assign Cast Voice","description":"Assign a voice to every unlocked line a character speaks. Assigning to the\nnarrator sets the project's default voice instead. Existing audio isn't\nre-narrated automatically — the new voice applies on the next take.\n\nThe voice is saved on the book's cast, so lines attributed to this\ncharacter later take it too. It is heard only while character voices are\non (``multi_voice``); this call never turns them on and never picks\nvoices for other characters. With character voices off the voice is\nsaved for when they are turned on, the lines keep the narrator, and the\nresponse says ``character_voices_on: false``. Turn them on with\n``multi_voice: true`` on ``PUT /projects/{id}``. A voice chosen for a\nsingle line, and every locked line, keeps its own voice. If character\nvoices are turned off later, every line without a voice of its own goes\nback to the narrator (the cast is kept for when they are turned on).","operationId":"assign_cast_voice","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CastAssignRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CastAssignResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"assign_cast_voice_api_v1_audiobook_projects__project_id__cast_assign_post"}},"/api/v1/audiobook/projects/{project_id}/cast/alias":{"post":{"tags":["audiobook"],"summary":"Set Cast Alias","description":"Fold an alternate speaker name onto a canonical one (or clear it).\n\nOn set, the canonical's current voice is copied to the alias's unlocked\nlines so they immediately narrate with the same voice.","operationId":"set_cast_alias","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CastAliasRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CastAliasResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"set_cast_alias_api_v1_audiobook_projects__project_id__cast_alias_post"}},"/api/v1/audiobook/projects/{project_id}/cast/{key}":{"put":{"tags":["audiobook"],"summary":"Update Cast Member","description":"Set one character's voice, or hide or show the character.\n\n``key`` is the character's ``key`` from ``GET /projects/{project_id}/cast``.\n``voice``: ``{\"voice_id\": N}`` (one of your voices or a library voice),\n``\"narrator\"`` (the character reads in the narrator's voice, and follows\nit when the narrator changes) or ``\"auto\"`` (clears your choice; with\ncharacter voices on a free library voice is picked). ``hidden``: hide or\nshow the character; a hidden character is never given a voice\nautomatically.\n\nLike ``POST /cast/assign``, this never turns character voices on and\nnever re-narrates: the voice is heard on the next take while character\nvoices are on. A voice chosen for a single line, and every locked line,\nkeeps its own voice. Returns the cast as ``GET /cast`` does, hidden\ncharacters included. 404 when the book has no such character.","operationId":"update_cast_member","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}},{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CastMemberUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CastResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"update_cast_member_api_v1_audiobook_projects__project_id__cast__key__put"}},"/api/v1/audiobook/projects/{project_id}/cast/merge":{"post":{"tags":["audiobook"],"summary":"Merge Cast Members","description":"Fold characters into another one: their lines are read as\n``into_key``'s from then on, and their names are kept as aliases of it\n(see ``POST /cast/alias``). Keys are the ``key`` values from\n``GET /projects/{project_id}/cast``; its ``suggested_merges`` proposes\nlikely ones. Locked lines keep the voice they have. Nothing is\nre-narrated. Returns the cast as ``GET /cast`` does, hidden characters\nincluded. 404 when a key is not a character of the book; 400 when\n``into_key`` is also in ``from_keys``.","operationId":"merge_cast_members","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CastMergeRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CastResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"merge_cast_members_api_v1_audiobook_projects__project_id__cast_merge_post"}},"/api/v1/audiobook/projects/{project_id}/screenplay/annotate":{"post":{"tags":["audiobook"],"summary":"Start Screenplay Annotate","description":"Kick off screenplay annotation over the project (or a chapter subset).\n\nOmit ``chapter_ids`` to annotate the whole book; an empty list is refused\nwith 400 and code ``empty_selection``.","operationId":"start_screenplay_annotate","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScreenplayAnnotateRequest","default":{}}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScreenplayAnnotateResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"start_screenplay_annotate_api_v1_audiobook_projects__project_id__screenplay_annotate_post"}},"/api/v1/audiobook/projects/{project_id}/screenplay/annotate/{job_id}/status":{"get":{"tags":["audiobook"],"summary":"Get Screenplay Annotate Status","description":"Poll a screenplay annotation job.","operationId":"get_screenplay_annotate_status","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}},{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScreenplayAnnotateStatusResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_screenplay_annotate_status_api_v1_audiobook_projects__project_id__screenplay_annotate__job_id__status_get"}},"/api/v1/audiobook/projects/{project_id}/direction/auto":{"post":{"tags":["audiobook"],"summary":"Start Auto Direction","description":"Write contextual reading direction onto this project's paragraphs.\n\nFREE on every tier, deliberately — this is the same class of feature as\nscreenplay annotation (bounded gateway LLM cost, no GPU), and a book that\nonly sounds good on a paid plan is a worse product for everyone. If free\nvolume ever becomes a problem, the switch-point is gating manual RE-runs,\nnot the post-parse run.\n\nUnlike annotation this NEVER deletes or re-splits anything: it writes\n`direction`/`emotion` onto existing rows. So there is no EXPORTING 409 here\n— an export in flight is composing audio this job cannot touch.\n\nOmit ``chapter_ids`` to direct the whole book; an empty list is refused\nwith 400 and code ``empty_selection``.","operationId":"start_auto_direction","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutoDirectionRequest","default":{}}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutoDirectionResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"start_auto_direction_api_v1_audiobook_projects__project_id__direction_auto_post"}},"/api/v1/audiobook/projects/{project_id}/direction/auto/latest":{"get":{"tags":["audiobook"],"summary":"Get Latest Auto Direction","description":"The project's most recent auto-direction job.\n\nNeeded because a run can be started by the SERVER (the post-parse trigger),\nnot only by the studio button — so there is no client-held job id to resume\nfrom, and a workspace mounting fresh would otherwise show no progress at all\nfor a job that is actively rewriting the rows on screen.\n\nDeclared BEFORE the `{job_id}/status` route: `latest` would otherwise be\nmatched as a job id.","operationId":"get_latest_auto_direction","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutoDirectionStatusResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_latest_auto_direction_api_v1_audiobook_projects__project_id__direction_auto_latest_get"}},"/api/v1/audiobook/projects/{project_id}/direction/auto/{job_id}/status":{"get":{"tags":["audiobook"],"summary":"Get Auto Direction Status","description":"Poll an auto-direction job.","operationId":"get_auto_direction_status","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}},{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutoDirectionStatusResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_auto_direction_status_api_v1_audiobook_projects__project_id__direction_auto__job_id__status_get"}},"/api/v1/audiobook/projects/{project_id}/direction/auto/{job_id}/cancel":{"post":{"tags":["audiobook"],"summary":"Cancel Auto Direction","operationId":"cancel_auto_direction","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}},{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutoDirectionStatusResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"cancel_auto_direction_api_v1_audiobook_projects__project_id__direction_auto__job_id__cancel_post","description":"Cancel Auto Direction"}},"/api/v1/audiobook/projects/{project_id}/cast/auto":{"post":{"tags":["audiobook"],"summary":"Start Auto Cast","description":"Design + assign a distinct voice for each named character (paid).\n\nOmit ``character_names`` to cast the top uncast speakers by line count; an\nempty list is refused with 400 and code ``empty_selection``.\n\nNeeds character voices on (``multi_voice``). With them off the request is\nrefused with 409 and code ``character_voices_off`` before anything is\ncharged, unless it sends ``multi_voice: true``, which turns them on (and,\nas ``PUT /projects/{id}`` with ``multi_voice: true`` does, gives every\ncharacter without a voice a free library voice first).","operationId":"start_auto_cast","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CastAutoRequest","default":{"max_characters":6}}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CastAutoResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"start_auto_cast_api_v1_audiobook_projects__project_id__cast_auto_post"}},"/api/v1/audiobook/projects/{project_id}/cast/auto/{job_id}/status":{"get":{"tags":["audiobook"],"summary":"Get Auto Cast Status","description":"Poll an auto-cast job.","operationId":"get_auto_cast_status","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}},{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CastAutoStatusResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_auto_cast_status_api_v1_audiobook_projects__project_id__cast_auto__job_id__status_get"}},"/api/v1/audiobook/projects/{project_id}/paragraphs/{paragraph_id}/narrate":{"post":{"tags":["audiobook"],"summary":"Narrate Paragraph","description":"Generate (or regenerate) audio for a single paragraph. Records a take.\n\nBilling pre-flight: returns HTTP 402 if the account can't afford this run.\nFree-regen rule: the first take is billed, the first regeneration is free,\nsubsequent regenerations are billed.\n\nSome takes are served by the durable production engine instead. The\nresponse keeps its shape either way; ``engine`` says which path took it.\n\nWhere sentence-level narration is available, ``mode`` chooses how an\nedited, previously narrated passage is narrated: ``auto`` (the default)\nnarrates only the changed sentences when the edit is small enough and\nbills only their characters, otherwise the whole passage; ``sentence``\nrequires that and returns 409 with code ``sentence_mode_unavailable`` and\na ``reason`` when it is not possible; ``passage`` always narrates the\nwhole passage. ``billing`` then also carries ``mode``, ``billed_chars``\n(equal to ``estimated_chars``), ``passage_chars``, ``changed_sentences``\nand, when the whole passage is narrated, ``reason``.","operationId":"narrate_paragraph","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}},{"name":"paragraph_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Paragraph Id"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AudiobookParagraphNarrateRequest","default":{"mode":"auto"}}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Narrate Paragraph Api V1 Audiobook Projects  Project Id  Paragraphs  Paragraph Id  Narrate Post"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"narrate_paragraph_api_v1_audiobook_projects__project_id__paragraphs__paragraph_id__narrate_post"}},"/api/v1/audiobook/projects/{project_id}/paragraphs/{paragraph_id}/audio":{"get":{"tags":["audiobook"],"summary":"Get Paragraph Audio Url","description":"Return a presigned URL for the paragraph's current audio.","operationId":"get_paragraph_audio_url","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}},{"name":"paragraph_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Paragraph Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_paragraph_audio_url_api_v1_audiobook_projects__project_id__paragraphs__paragraph_id__audio_get"}},"/api/v1/audiobook/projects/{project_id}/review":{"get":{"tags":["audiobook"],"summary":"List Narration Review","description":"List passages our narration check could not confirm.\n\nAfter one retry, a passage whose narration our check cannot match to the\ntext keeps its best render and waits here instead of failing (only on\nbooks whose `narration_review_policy` is 'manual'; automated pipelines\nshould use 'auto_accept', which publishes the best render and never\nwaits). Each item carries:\n\n- `reason_code`: `possible_mismatch`, `audio_check_failed`,\n  `replacement_pending` or `allowance_exhausted` (a book bought per\n  finished hour ran out of hours; it has no `actions`, and is completed\n  automatically the next time narration starts once hours are added),\n  with a plain-language `message` you can show.\n- `actions`: the calls that resolve it, in recommended order. `approve`\n  publishes the candidate at no charge; `edit_text` updates the passage\n  text so you can narrate it again; `regenerate` discards the candidate\n  and narrates again, billed like any narration.\n- the expected text, what our check heard, a coverage score, and a link\n  to the candidate audio that stops working at `expires_at`.\n\nApprove or reject each passage, or approve them all at once.","operationId":"list_narration_review","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}},{"name":"status","in":"query","required":false,"schema":{"enum":["needs_review","all_flagged"],"type":"string","description":"`needs_review` (default): passages waiting for a decision. `all_flagged`: also passages accepted automatically or already approved.","default":"needs_review","title":"Status"},"description":"`needs_review` (default): passages waiting for a decision. `all_flagged`: also passages accepted automatically or already approved."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NarrationReviewList"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"list_narration_review_api_v1_audiobook_projects__project_id__review_get"}},"/api/v1/audiobook/projects/{project_id}/paragraphs/{paragraph_id}/review/approve":{"post":{"tags":["audiobook"],"summary":"Approve Narration Review","description":"Approve the candidate narration of a passage waiting for review.\n\nThe candidate becomes the passage's audio as a new take, at no charge, and\nthe chapter is rebuilt once nothing else in it is outstanding. Approving a\npassage that is already approved returns it unchanged.\n\nReturns 409 with `detail.code`: `review_not_pending` (nothing waits for\nreview), `review_stale` (the passage has newer narration than the\ncandidate), `review_candidate_unavailable`, or, for books bought per\nfinished hour, `narration_allowance_exhausted` /\n`narration_allowance_changed` (approved audio counts toward the book's\nhours).\n\nAn item with `reason_code` `allowance_exhausted` offers no approve action:\nit is refused until hours are added. Once they are, this call succeeds,\nand on an 'auto_accept' book the next narration start completes it on its\nown.","operationId":"approve_narration_review","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}},{"name":"paragraph_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Paragraph Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AudiobookParagraphResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"approve_narration_review_api_v1_audiobook_projects__project_id__paragraphs__paragraph_id__review_approve_post"}},"/api/v1/audiobook/projects/{project_id}/review/approve-all":{"post":{"tags":["audiobook"],"summary":"Approve All Narration Review","description":"Approve every passage waiting for review, optionally in one chapter.\n\nEach candidate becomes its passage's audio at no charge. A passage that\ncannot be approved is left waiting and reported; the call still succeeds\nwith a partial result. Response fields:\n\n- `approved`: passages approved by this call.\n- `refused`: passages that could not be approved.\n- `remaining`: passages still waiting for review in the selection.\n- `refused_reasons`: `{paragraph_id: reason_code}` for each refusal, e.g.\n  `narration_allowance_exhausted` (a book bought per finished hour has no\n  hours left for this audio), `review_stale` (the passage has newer\n  narration) or `review_candidate_unavailable`.","operationId":"approve_all_narration_review","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/NarrationReviewApproveAll"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Approve All Narration Review Api V1 Audiobook Projects  Project Id  Review Approve All Post"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"approve_all_narration_review_api_v1_audiobook_projects__project_id__review_approve_all_post"}},"/api/v1/audiobook/projects/{project_id}/paragraphs/{paragraph_id}/review/reject":{"post":{"tags":["audiobook"],"summary":"Reject Narration Review","description":"Reject the candidate narration of a passage waiting for review.\n\nThe candidate is discarded and the passage returns to pending (a passage\nthat already had approved audio keeps it). With `regenerate: true` the\npassage is narrated again right away, billed like any narration; the\nresponse then also carries that narration's job under `regenerate`.\nAdd `voice_id` (with `regenerate: true`) to narrate it in another voice:\nthe passage keeps that voice from then on. Returns 409 when the passage\nhas nothing waiting for review, 404 when the voice is not available to\nyou, and 422 for a `voice_id` without `regenerate`.","operationId":"reject_narration_review","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}},{"name":"paragraph_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Paragraph Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/NarrationReviewReject"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Reject Narration Review Api V1 Audiobook Projects  Project Id  Paragraphs  Paragraph Id  Review Reject Post"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"reject_narration_review_api_v1_audiobook_projects__project_id__paragraphs__paragraph_id__review_reject_post"}},"/api/v1/audiobook/projects/{project_id}/paragraphs/{paragraph_id}/review/skip":{"post":{"tags":["audiobook"],"summary":"Skip Narration Review","description":"Leave a passage waiting for review out of the book.\n\nUse this when a passage keeps failing our narration check and you would\nrather finish the book without it. Nothing is narrated and nothing is\ncharged. The passage is marked to skip narration (set `skip_narration`\nback to false on the paragraph to narrate it again later), its waiting\ncandidate is discarded, and its chapter can then be completed and\nexported without it. Exports list the passages left out this way.\n\nReturns `status` (the passage's new status) and `skip_narration: true`.\n409 with `detail.code` `review_not_pending` when nothing waits for review.","operationId":"skip_narration_review","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}},{"name":"paragraph_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Paragraph Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Skip Narration Review Api V1 Audiobook Projects  Project Id  Paragraphs  Paragraph Id  Review Skip Post"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"skip_narration_review_api_v1_audiobook_projects__project_id__paragraphs__paragraph_id__review_skip_post"}},"/api/v1/audiobook/projects/{project_id}/paragraphs/{paragraph_id}/takes":{"get":{"tags":["audiobook"],"summary":"List Paragraph Takes","description":"List take history for a paragraph (most recent first).","operationId":"list_paragraph_takes","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}},{"name":"paragraph_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Paragraph Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AudiobookParagraphTakeResponse"},"title":"Response List Paragraph Takes Api V1 Audiobook Projects  Project Id  Paragraphs  Paragraph Id  Takes Get"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"list_paragraph_takes_api_v1_audiobook_projects__project_id__paragraphs__paragraph_id__takes_get"}},"/api/v1/audiobook/projects/{project_id}/archived-passages":{"get":{"tags":["audiobook"],"summary":"List Archived Passages","description":"List the passages kept aside when a chapter's passages were re-split.\n\nWhen a chapter is re-split, passages whose wording moved to new passage\nboundaries are archived rather than deleted. They are no longer part of\nthe chapter, but their audio and every take are kept, and can be played\nor downloaded from the links returned here (valid for one hour). The\nchapter's earlier full-chapter audio, if it had any, is listed too.","operationId":"list_archived_passages","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"list_archived_passages_api_v1_audiobook_projects__project_id__archived_passages_get"}},"/api/v1/audiobook/projects/{project_id}/paragraphs/{paragraph_id}/takes/{take_id}/restore":{"post":{"tags":["audiobook"],"summary":"Restore Paragraph Take","description":"Switch the paragraph back to a previous take. Does not delete other takes.","operationId":"restore_paragraph_take","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}},{"name":"paragraph_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Paragraph Id"}},{"name":"take_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Take Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AudiobookParagraphResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"restore_paragraph_take_api_v1_audiobook_projects__project_id__paragraphs__paragraph_id__takes__take_id__restore_post"}},"/api/v1/audiobook/projects/{project_id}/pronunciations":{"get":{"tags":["audiobook"],"summary":"List Pronunciations","operationId":"list_pronunciations","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PronunciationResponse"},"title":"Response List Pronunciations Api V1 Audiobook Projects  Project Id  Pronunciations Get"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"list_pronunciations_api_v1_audiobook_projects__project_id__pronunciations_get","description":"List Pronunciations"},"post":{"tags":["audiobook"],"summary":"Create Pronunciation","operationId":"create_pronunciation","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PronunciationCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PronunciationResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"create_pronunciation_api_v1_audiobook_projects__project_id__pronunciations_post","description":"Create Pronunciation"}},"/api/v1/audiobook/projects/{project_id}/pronunciations/{pron_id}":{"put":{"tags":["audiobook"],"summary":"Update Pronunciation","operationId":"update_pronunciation","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}},{"name":"pron_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Pron Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PronunciationUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PronunciationResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"update_pronunciation_api_v1_audiobook_projects__project_id__pronunciations__pron_id__put","description":"Update Pronunciation"},"delete":{"tags":["audiobook"],"summary":"Delete Pronunciation","operationId":"delete_pronunciation","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}},{"name":"pron_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Pron Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"delete_pronunciation_api_v1_audiobook_projects__project_id__pronunciations__pron_id__delete","description":"Delete Pronunciation"}},"/api/v1/audiobook/projects/{project_id}/pronunciations/matches":{"get":{"tags":["audiobook"],"summary":"Get Pronunciation Matches","description":"Which paragraphs the dictionary would change, and which entries hit them.\n\nAfter editing the pronunciation dictionary, use this to find exactly which\nparagraphs need re-narrating, then POST ``.../narration/batch`` with those\n`paragraph_ids` and `include_completed`. Completed paragraphs are included\non purpose: a completed paragraph is exactly the one carrying the wrong\naudio.\n\nThe set of paragraphs is exact. Per-entry `sources` attribution is\napproximate when entries overlap, because substitution runs\nlongest-match-first and a shorter entry can be left with nothing to\nreplace. Use this to answer \"which paragraphs do I re-narrate\"; do not\nuse it to predict output text.","operationId":"get_pronunciation_matches","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PronunciationMatchesResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_pronunciation_matches_api_v1_audiobook_projects__project_id__pronunciations_matches_get"}},"/api/v1/audiobook/voices/{voice_id}/preview":{"post":{"tags":["audiobook"],"summary":"Voice Preview","description":"Free bounded sample with shared per-user concurrency, budget and cache.","operationId":"voice_preview","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"voice_id","in":"path","required":true,"schema":{"type":"integer","title":"Voice Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoicePreviewRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Voice Preview Api V1 Audiobook Voices  Voice Id  Preview Post"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"voice_preview_api_v1_audiobook_voices__voice_id__preview_post"}},"/api/v1/audiobook/projects/{project_id}/pronunciations/preview":{"post":{"tags":["audiobook"],"summary":"Preview Pronunciation","description":"Hear an unsaved pronunciation in its selected narrator and book context.","operationId":"preview_pronunciation","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PronunciationPreviewRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Preview Pronunciation Api V1 Audiobook Projects  Project Id  Pronunciations Preview Post"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"preview_pronunciation_api_v1_audiobook_projects__project_id__pronunciations_preview_post"}},"/api/v1/audiobook/projects/{project_id}/chapters/{chapter_id}/retry-failed-paragraphs":{"post":{"tags":["audiobook"],"summary":"Retry Failed Paragraphs","description":"Re-queue every paragraph in a chapter whose status is `failed`.\n\nUseful after a transient TTS provider hiccup — without this the user has\nto scroll the chapter and click each failed row.","operationId":"retry_failed_paragraphs","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}},{"name":"chapter_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Chapter Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Retry Failed Paragraphs Api V1 Audiobook Projects  Project Id  Chapters  Chapter Id  Retry Failed Paragraphs Post"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"retry_failed_paragraphs_api_v1_audiobook_projects__project_id__chapters__chapter_id__retry_failed_paragraphs_post"}},"/api/v1/audiobook/projects/{project_id}/cost":{"get":{"tags":["audiobook"],"summary":"Get Project Cost","description":"Return what narrating this book has actually cost so far.\n\nRead from your billing records, not estimated: every charge taken for a\npassage of this book, including regenerations. Narration is prepaid, so a\ncharge is taken when a passage is queued and returned if that passage\nfails or is cancelled.\n\nResponse fields:\n\n- `project_id`: the book.\n- `currency`: `\"USD\"`. Every `*_cents` value is in US cents.\n- `billing_lane`: `\"api_wallet\"` (paid from the API wallet), `\"credits\"`\n  (paid from account credits) or `\"mixed\"` (both).\n- `totals`:\n  - `charged_cents` / `charged_credits`: every charge taken for the book,\n    including ones later returned.\n  - `refunded_cents` / `refunded_credits`: charges returned for passages\n    that failed or were cancelled.\n  - `net_cents` / `net_credits`: `charged - refunded`, what the book cost.\n    `net_cents` equals the sum of the API wallet debits for this book.\n  - `characters_billed`: billable characters of the narration kept.\n- `breakdown`:\n  - `first_narration`: `{characters, cents, credits}` for each passage's\n    first narration.\n  - `regenerations`: `{characters, cents, credits, count}` for paid\n    regenerations (every take after a passage's first).\n  - `free_regenerations`: count of regenerations that cost nothing (a\n    passage's first regeneration is free).\n  - `review_approvals`: count of flagged narrations approved from review,\n    which cost nothing.\n  - `sentence_edits`: `{count, characters, cents, credits, free_count}`\n    for edits where only the changed sentences were narrated. These are\n    also counted under `regenerations` (or `free_regenerations`);\n    `characters` is the changed characters billed, not the whole\n    passage. `free_count` is how many cost nothing.\n- `chapters`: per chapter, `{chapter_id, chapter_number, title,\n  characters, cents, credits}` (net). Passages deleted since they were\n  narrated stay counted under their chapter.\n- `partial`: `true` when older charges made while this book was being\n  narrated can no longer be tied to one of its passages; they are left\n  out and `notes` says how many.\n- `notes`: explanations, empty when there is nothing to add.\n- `as_of`: when these figures were read (UTC, ISO 8601).\n\nReturns 404 if the book does not exist or is not yours.","operationId":"get_project_cost","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_project_cost_api_v1_audiobook_projects__project_id__cost_get"}},"/api/v1/audiobook/projects/{project_id}/cost-estimate":{"get":{"tags":["audiobook"],"summary":"Estimate Project Cost","description":"Return cost estimates for narrating a paragraph/chapter/project.\n\nHonors the first-regen-free rule per paragraph and the 24h re-parse rule.\nOutput is per-paragraph credits + totals plus the user's current balance,\nso the UI can show \"this regen is free / will cost N credits / you have M\".\n\nWhere sentence-level narration is available, each paragraph also carries\n``mode`` ('sentence' or 'passage'), ``billed_chars``, ``passage_chars`` and\n``reason`` (why the whole passage would be narrated), and\n``credits_to_charge`` prices what that mode would bill.","operationId":"estimate_project_cost","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}},{"name":"chapter_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Limit estimate to one chapter","title":"Chapter Id"},"description":"Limit estimate to one chapter"},{"name":"paragraph_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Limit estimate to one paragraph","title":"Paragraph Id"},"description":"Limit estimate to one paragraph"},{"name":"mode","in":"query","required":false,"schema":{"enum":["auto","passage"],"type":"string","description":"Where sentence-level narration is available: 'auto' prices an edited passage by its changed sentences when it would be narrated that way; 'passage' prices the whole passage.","default":"auto","title":"Mode"},"description":"Where sentence-level narration is available: 'auto' prices an edited passage by its changed sentences when it would be narrated that way; 'passage' prices the whole passage."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"estimate_project_cost_api_v1_audiobook_projects__project_id__cost_estimate_get"}},"/api/v1/audiobook/projects/{project_id}/chapters/narration-selection":{"post":{"tags":["audiobook"],"summary":"Update Chapter Selection","description":"Include or leave out several chapters in one request.\n\nBody: `{\"changes\": [{\"chapter_id\": <uuid>, \"skip_narration\": true}, ...]}`.\nEvery listed chapter must belong to the book and appear once. All changes\nare saved together or none are. Returns the listed chapters as saved, in\nbook order.","operationId":"update_chapter_selection","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AudiobookChapterSelectionUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AudiobookChapterResponse"},"title":"Response Update Chapter Selection Api V1 Audiobook Projects  Project Id  Chapters Narration Selection Post"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"update_chapter_selection_api_v1_audiobook_projects__project_id__chapters_narration_selection_post"}},"/api/v1/audiobook/projects/{project_id}/chapters/reorder":{"post":{"tags":["audiobook"],"summary":"Reorder Chapters","description":"Reorder chapters. Body: `{\"chapter_ids\": [<uuid in desired order>, ...]}`.\n\nEvery chapter in the project MUST appear in the list — partial reorders\naren't accepted to avoid ambiguous renumbering.","operationId":"reorder_chapters","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"array","items":{"type":"string","format":"uuid"}},"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Reorder Chapters Api V1 Audiobook Projects  Project Id  Chapters Reorder Post"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"reorder_chapters_api_v1_audiobook_projects__project_id__chapters_reorder_post"}},"/api/v1/audiobook/projects/{project_id}/chapters/upload-file":{"post":{"tags":["audiobook"],"summary":"Upload Single Chapter File","description":"One file = one chapter. For users who write chapter-by-chapter.\n\nTreats the entire file's content as a single chapter (no internal chapter\nsplitting). Uses the `paste`-style synchronous parse path so the chapter\nis ready immediately — no background job to wait on.","operationId":"upload_single_chapter_file","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_single_chapter_file_api_v1_audiobook_projects__project_id__chapters_upload_file_post"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AudiobookChapterResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"upload_single_chapter_file_api_v1_audiobook_projects__project_id__chapters_upload_file_post"}},"/api/v1/audiobook/projects/{project_id}/manuscript/append":{"post":{"tags":["audiobook"],"summary":"Append Manuscript File","description":"Upload an additional manuscript file. Its chapters are appended AFTER\nthe existing ones (chapter numbering continues sequentially).\n\nFor users who deliver Volume 2 of a multi-part book, or who write the\nback-matter (appendix, acknowledgments) as a separate file after Volume 1\nhas already been parsed.","operationId":"append_manuscript_file","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_append_manuscript_file_api_v1_audiobook_projects__project_id__manuscript_append_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ManuscriptParseResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"append_manuscript_file_api_v1_audiobook_projects__project_id__manuscript_append_post"}},"/api/v1/audiobook/projects/{project_id}/production/capabilities":{"get":{"tags":["audiobook"],"summary":"Capabilities","description":"Whether Studio should offer the guided production flow for this book.\n\n``reason`` is a stable key (``disabled`` / ``scope`` / ``human_qc`` /\n``voice``) with its customer-safe message, so the client can explain a\nclassic-only book without inventing copy.","operationId":"capabilities","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"capabilities_api_v1_audiobook_projects__project_id__production_capabilities_get"}},"/api/v1/audiobook/projects/{project_id}/production/quote":{"post":{"tags":["audiobook"],"summary":"Quote","description":"Prepare a narrator sample and quote for this book.\n\nNarrates a short opening passage with the book's actual narrator, speed,\nlanguage and pronunciations, and prices the whole book. Preparing the\nsample is free. Poll ``GET .../quotes/{approval_id}`` until\n``sample_status`` is ``completed``.\n\nThe request body is optional: omit it (or send ``{}``) to use the\ndefaults. Send an ``Idempotency-Key`` header to make retries safe: the\nsame key returns the same sample instead of preparing another.\n\nAPI-key callers: the response is priced for the API wallet\n(``billing_lane: \"api_wallet\"``, ``estimated_cost_cents``) instead of\ncredits, and includes ``sample_audio_url`` (a signed link, valid one hour)\nonce the sample is ready. The sample is a preview: approving the quote and\nstarting guided production are available in Audiobook Studio only; narrate\nthe book with the audiobook narration endpoints, which bill the API wallet.","operationId":"quote","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}},{"name":"idempotency-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":128},{"type":"null"}],"title":"Idempotency-Key"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/QuoteRequest"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"quote_api_v1_audiobook_projects__project_id__production_quote_post"}},"/api/v1/audiobook/projects/{project_id}/production/quotes/latest":{"get":{"tags":["audiobook"],"summary":"Latest Quote","description":"The most recent narrator sample and quote for this book, or ``null``.\n\nSame shape as ``GET .../quotes/{approval_id}``.","operationId":"latest_quote","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"latest_quote_api_v1_audiobook_projects__project_id__production_quotes_latest_get"}},"/api/v1/audiobook/projects/{project_id}/production/pronunciation-auditions":{"post":{"tags":["audiobook"],"summary":"Audition","operationId":"audition","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PronunciationAuditionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"audition_api_v1_audiobook_projects__project_id__production_pronunciation_auditions_post","description":"Audition"}},"/api/v1/audiobook/projects/{project_id}/production/pronunciation-auditions/{run_id}":{"get":{"tags":["audiobook"],"summary":"Audition State","operationId":"audition_state","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}},{"name":"run_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Run Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"audition_state_api_v1_audiobook_projects__project_id__production_pronunciation_auditions__run_id__get","description":"Audition State"}},"/api/v1/audiobook/projects/{project_id}/production/quotes/{approval_id}":{"get":{"tags":["audiobook"],"summary":"Quote State","description":"A narrator sample and its quote.\n\n``sample_status`` is ``running`` while the sample is prepared,\n``completed`` when it can be heard, or ``needs_attention`` with a\n``sample_failure`` reason. API-key callers receive the quote in API-wallet\ncents (``billing_lane: \"api_wallet\"``, ``estimated_cost_cents``,\n``estimated_cost_usd``, ``billable_chars``, ``sample_cost_cents``) and\n``sample_audio_url``, a signed link valid for one hour once the sample is\nready (request this endpoint again for a fresh link).","operationId":"quote_state","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}},{"name":"approval_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Approval Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"quote_state_api_v1_audiobook_projects__project_id__production_quotes__approval_id__get"}},"/api/v1/audiobook/projects/{project_id}/production/quotes/{approval_id}/approve":{"post":{"tags":["audiobook"],"summary":"Approve","description":"Approve a finished narrator sample and its quote (Audiobook Studio).\n\nNot available with an API key: the sample is a preview for API callers,\nwho narrate through the audiobook narration endpoints instead.","operationId":"approve","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}},{"name":"approval_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Approval Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"approve_api_v1_audiobook_projects__project_id__production_quotes__approval_id__approve_post"}},"/api/v1/audiobook/projects/{project_id}/production/quotes/{approval_id}/purchase-options":{"get":{"tags":["audiobook"],"summary":"Purchase Options For Quote","description":"Ways to cover the credits this audiobook quote needs.\n\nReturns ``required`` (credits the quote costs), ``available`` (credits you\ncan spend now), ``shortfall`` and ``options``: each option is a way to buy\nwhat is missing, priced for ``currency`` — ``payg`` (a one-time credit\npack; credits never expire), ``plan`` (a monthly plan, or a plan change for\ncurrent subscribers) or ``sku`` (this book at a fixed price per finished\nhour). Every option reports ``cash_due_today`` in minor units, whether it\ncovers the whole book and any credits left over. Options are ordered by\nwhat you pay today; the cheapest is marked ``recommended``. ``options`` is\nempty when your balance already covers the quote.","operationId":"purchase_options_for_quote","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}},{"name":"approval_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Approval Id"}},{"name":"currency","in":"query","required":false,"schema":{"type":"string","minLength":3,"maxLength":3,"description":"Billing currency for prices (ISO 4217, lower case).","default":"usd","title":"Currency"},"description":"Billing currency for prices (ISO 4217, lower case)."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"purchase_options_for_quote_api_v1_audiobook_projects__project_id__production_quotes__approval_id__purchase_options_get"}},"/api/v1/audiobook/projects/{project_id}/production/start":{"post":{"tags":["audiobook"],"summary":"Start","description":"Start guided production of this book from an approved quote.\n\nSend the ``approval_id`` of a quote whose narrator sample you approved,\nand an ``Idempotency-Key`` header: a retry with the same key returns the\nrun already started instead of starting another. The book is narrated at\nthe price on that quote, paid from your credits. The response is the\nrun's status, as from ``GET .../production/runs/{run_id}``.\n\nRefused with 404 when guided production is not available for this book,\nwith 409 when the sample is not approved, the quote has expired,\nor the manuscript or narrator settings changed since the quote (prepare\nan updated sample), and with 402 when your credits do not cover the\nquote; that response lists the ways to add credits or buy the book.\n\nAPI-key callers: refused with 400 (``API_KEY_PREVIEW_ONLY``). With an API\nkey the narrator sample is a preview; starting guided production is\navailable in Audiobook Studio only. Narrate the book with the audiobook\nnarration endpoints, which bill the API wallet.","operationId":"start","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}},{"name":"idempotency-key","in":"header","required":true,"schema":{"type":"string","minLength":1,"maxLength":128,"title":"Idempotency-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StartRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"start_api_v1_audiobook_projects__project_id__production_start_post"}},"/api/v1/audiobook/projects/{project_id}/production/quotes/{approval_id}/pending-start":{"post":{"tags":["audiobook"],"summary":"Create Pending Start","description":"Start this approved book automatically once your balance covers it.\n\nNothing is charged or reserved here. The book starts, at the quoted price,\nas soon as credits land (a payment, a plan change or credits added\nelsewhere); until then it waits. Expires after 24 hours; cancel any time.","operationId":"create_pending_start","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}},{"name":"approval_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Approval Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PendingStartRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"create_pending_start_api_v1_audiobook_projects__project_id__production_quotes__approval_id__pending_start_post"}},"/api/v1/audiobook/projects/{project_id}/production/pending-start/{pending_id}":{"get":{"tags":["audiobook"],"summary":"Pending Start State","description":"The pending start's state. Polling it also starts the book when the\nbalance already covers it, so a delayed payment notification never\nleaves a funded book waiting. With an API key it only reads the state:\nstarting production is not available to API keys.","operationId":"pending_start_state","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}},{"name":"pending_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Pending Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"pending_start_state_api_v1_audiobook_projects__project_id__production_pending_start__pending_id__get"},"delete":{"tags":["audiobook"],"summary":"Cancel Pending Start","description":"Stop waiting: the book will not start automatically. A book that\nalready started is unaffected.","operationId":"cancel_pending_start","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}},{"name":"pending_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Pending Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"cancel_pending_start_api_v1_audiobook_projects__project_id__production_pending_start__pending_id__delete"}},"/api/v1/audiobook/projects/{project_id}/production/latest":{"get":{"tags":["audiobook"],"summary":"Latest","description":"The book's latest production, or ``null`` when it has none yet. 404 when\nthe book does not exist or is not yours.","operationId":"latest","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"latest_api_v1_audiobook_projects__project_id__production_latest_get"}},"/api/v1/audiobook/projects/{project_id}/production/runs/{run_id}":{"get":{"tags":["audiobook"],"summary":"Status","operationId":"status","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}},{"name":"run_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Run Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"status_api_v1_audiobook_projects__project_id__production_runs__run_id__get","description":"Status"}},"/api/v1/audiobook/projects/{project_id}/production/runs/{run_id}/events":{"get":{"tags":["audiobook"],"summary":"Events","operationId":"events","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}},{"name":"run_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Run Id"}},{"name":"after","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"After"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"events_api_v1_audiobook_projects__project_id__production_runs__run_id__events_get","description":"Events"}},"/api/v1/audiobook/projects/{project_id}/production/runs/{run_id}/stream":{"get":{"tags":["audiobook"],"summary":"Stream","operationId":"stream","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}},{"name":"run_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Run Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"stream_api_v1_audiobook_projects__project_id__production_runs__run_id__stream_get","description":"Stream"}},"/api/v1/audiobook/projects/{project_id}/production/runs/{run_id}/cancel":{"post":{"tags":["audiobook"],"summary":"Cancel","description":"Stop a production. Finished passages and chapters are kept; every\ncredit held for work that was not finished is refunded, exactly once.\n\nThe stop takes effect immediately: the book unlocks for editing and no\nfurther work starts. Refunds are then settled and the run's ``status``\nmoves from ``cancelling`` to ``cancelled``; the response normally already\nshows ``cancelled``. Calling it again is harmless.","operationId":"cancel","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}},{"name":"run_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Run Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"cancel_api_v1_audiobook_projects__project_id__production_runs__run_id__cancel_post"}},"/api/v1/audiobook/projects/{project_id}/production/runs/{run_id}/operations/{operation_id}/retry":{"post":{"tags":["audiobook"],"summary":"Retry","description":"Retry a failed step under its original prepaid hold.\n\nA step whose narration our check rejected (``failure.code``\n``invalid_audio``) can be retried twice; ``retries_left`` on the failure\nsays how many remain, and ``passages`` names the text it could not\nnarrate. After that this returns 409 with ``detail.code``\n``retry_limit``: stop the production, then edit the passage, choose\nanother voice, or leave it out of the book. A failed retry is refunded\nlike any failed step.\n\nNot available with an API key (400): a retry reserves credits again.","operationId":"retry","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}},{"name":"run_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Run Id"}},{"name":"operation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Operation Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"retry_api_v1_audiobook_projects__project_id__production_runs__run_id__operations__operation_id__retry_post"}},"/api/v1/audiobook/projects/{project_id}/production/runs/{run_id}/continue":{"post":{"tags":["audiobook"],"summary":"Continue Reviewed","description":"Continue finishing a production that waited for review.\n\nOnce every passage it held is approved, its chapter and book steps run\nagain under their original prepaid holds. 409 with ``detail.code``:\n``review_pending``, ``needs_new_edition`` (a passage was rejected or\nedited; start a new edition), ``not_awaiting_review`` or ``superseded``.\n402 with ``purchase_options`` when the credits no longer cover it.\nNot available with an API key (400): continuing reserves credits again.","operationId":"continue_reviewed","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}},{"name":"run_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Run Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"continue_reviewed_api_v1_audiobook_projects__project_id__production_runs__run_id__continue_post"}},"/api/v1/audiobook/projects/{project_id}/production/editions":{"get":{"tags":["audiobook"],"summary":"Editions","operationId":"editions","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"editions_api_v1_audiobook_projects__project_id__production_editions_get","description":"Editions"}},"/api/v1/audiobook/projects/{project_id}/production/artifacts/{artifact_id}/review-timeline":{"get":{"tags":["audiobook"],"summary":"Artifact Review Timeline","operationId":"artifact_review_timeline","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}},{"name":"artifact_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Artifact Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"artifact_review_timeline_api_v1_audiobook_projects__project_id__production_artifacts__artifact_id__review_timeline_get","description":"Artifact Review Timeline"}},"/api/v1/audiobook/projects/{project_id}/production/artifacts/{artifact_id}/download":{"get":{"tags":["audiobook"],"summary":"Download","operationId":"download","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}},{"name":"artifact_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Artifact Id"}},{"name":"attachment","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Attachment"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"download_api_v1_audiobook_projects__project_id__production_artifacts__artifact_id__download_get","description":"Download"}},"/api/v1/audiobook/projects/{project_id}/events":{"get":{"tags":["audiobook"],"summary":"Project Events","description":"Live changes to one audiobook project, as Server-Sent Events.\n\nEach event names what changed and carries its new `state_version` as the\nevent `id`:\n\n- `paragraph.updated`, `chapter.updated`, `book.updated`, `job.updated`,\n  `export.updated`, `production.updated` -- `data` is\n  `{id, type, entity_id, chapter_id, fields}`, where `fields` holds small\n  values such as `status`, `has_audio`, `held_for_review` and\n  `text_changed`. Refetch the record for anything else.\n- `resync` -- `{scope: \"all\"}` or `{scope: \"chapters\", chapter_ids: [...]}`:\n  too much changed at once, or the stream could not catch up from\n  `Last-Event-ID`; refetch that scope.\n- `ping` every 15 seconds while nothing else is sent.\n\nReconnect with the `Last-Event-ID` header to receive what you missed. The\nstream closes after 5 minutes; reconnect to continue.\n\nLimits: an account can keep up to 10 streams open at once (20 per\naddress), and may open up to 30 per minute; beyond that the request\nreturns 429. While live updates are temporarily unavailable the request\nreturns 503 -- poll the project instead and try the stream again later.","operationId":"project_events","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}},{"name":"Last-Event-ID","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last-Event-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"text/event-stream":{}}},"404":{"description":"Audiobook project not found"},"429":{"description":"Too many streams open for this account or address. Too many open live views. Close another tab and try again."},"503":{"description":"Live updates are temporarily unavailable. Poll the project instead and reconnect later."},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/InternalError"}},"x-original-operation-id":"project_events_api_v1_audiobook_projects__project_id__events_get"}},"/api/v1/audiobook/store-presets":{"get":{"tags":["audiobook"],"summary":"List Store Presets","description":"What each store needs: package shape, cover, metadata, AI disclosure.\n\n``export_settings`` is what to send as ``custom_settings`` to\n``POST /projects/{id}/export`` for that store.","operationId":"list_store_presets","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/StorePresetResponse"},"type":"array","title":"Response List Store Presets Api V1 Audiobook Store Presets Get"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"security":[{"OAuth2PasswordBearer":[]}],"x-original-operation-id":"list_store_presets_api_v1_audiobook_store_presets_get"}},"/api/v1/audiobook/projects/{project_id}/store-preflight":{"get":{"tags":["audiobook"],"summary":"Store Preflight","description":"Pass/fail per store, with the reason for each failing check.\n\n``passed`` means no blocking check failed. ``ready`` additionally requires\nthe store to be known to accept AI narration — false for ACX (it does not)\nand for a store whose pages do not say.","operationId":"store_preflight","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}},{"name":"store","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"One preset key; omit to check every store","title":"Store"},"description":"One preset key; omit to check every store"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StorePreflightListResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"store_preflight_api_v1_audiobook_projects__project_id__store_preflight_get"}},"/api/v1/audiobook/projects/{project_id}/publications":{"get":{"tags":["audiobook"],"summary":"List Publications","description":"Every store this book has been submitted to, and where it stands.","operationId":"list_publications","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicationListResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"list_publications_api_v1_audiobook_projects__project_id__publications_get"},"post":{"tags":["audiobook"],"summary":"Create Publication","description":"Record a submission to a store.\n\nOne record per book per listed store: a second POST for the same store is a\n409 carrying the existing record's id — update that one instead.","operationId":"create_publication","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicationCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicationResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"create_publication_api_v1_audiobook_projects__project_id__publications_post"}},"/api/v1/audiobook/projects/{project_id}/publications/{publication_id}":{"patch":{"tags":["audiobook"],"summary":"Update Publication","description":"Move a record along (submitted → live / rejected) or correct it.\n\nOmitted fields are left alone; null clears. Changing the status dates the\nnew status today unless that date is sent too.","operationId":"update_publication","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}},{"name":"publication_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Publication Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicationUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicationResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"update_publication_api_v1_audiobook_projects__project_id__publications__publication_id__patch"},"delete":{"tags":["audiobook"],"summary":"Delete Publication","description":"Remove a record entered by mistake.","operationId":"delete_publication","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}},{"name":"publication_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Publication Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"delete_publication_api_v1_audiobook_projects__project_id__publications__publication_id__delete"}},"/api/v1/podcast/projects":{"post":{"tags":["podcast"],"summary":"Create Project","description":"Create a new podcast project.","operationId":"create_project","security":[{"OAuth2PasswordBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PodcastProjectCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PodcastProject"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"create_project_api_v1_podcast_projects_post"},"get":{"tags":["podcast"],"summary":"List Projects","description":"List user's podcast projects with pagination.\n\n`sort` may be `created_at`, `updated_at` or `title`, and `order` may be\n`asc` or `desc` (default `desc`). Without `sort`, the newest projects come\nfirst.","operationId":"list_projects","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","default":1,"title":"Page"}},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","default":20,"title":"Per Page"}},{"name":"status_filter","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status Filter"}},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search"}},{"name":"sort","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sort"}},{"name":"order","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Order"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PodcastListResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"list_projects_api_v1_podcast_projects_get"}},"/api/v1/podcast/cast/suggest":{"post":{"tags":["podcast"],"summary":"Suggest Cast","description":"Suggest a voice for every speaker who does not have one yet.\n\nA speaker that already has a voice you can use keeps it. Every other\nspeaker gets a voice chosen for their role, the episode's tone and topic,\nand to sound distinct from the rest of the cast. Free: no credits are used,\nand nothing is saved.","operationId":"suggest_cast","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CastSuggestRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CastSuggestResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"security":[{"OAuth2PasswordBearer":[]}],"x-original-operation-id":"suggest_cast_api_v1_podcast_cast_suggest_post"}},"/api/v1/podcast/projects/{project_id}":{"get":{"tags":["podcast"],"summary":"Get Project","description":"Get a specific podcast project.","operationId":"get_project","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PodcastProject"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_project_api_v1_podcast_projects__project_id__get"},"put":{"tags":["podcast"],"summary":"Update Project","description":"Update a podcast project.","operationId":"update_project","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PodcastProjectUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PodcastProject"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"update_project_api_v1_podcast_projects__project_id__put"},"delete":{"tags":["podcast"],"summary":"Delete Project","description":"Delete a podcast project and its stored audio.","operationId":"delete_project","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"delete_project_api_v1_podcast_projects__project_id__delete"}},"/api/v1/podcast/projects/{project_id}/speakers/{speaker_id}":{"put":{"tags":["podcast"],"summary":"Update Speaker","description":"Update a speaker — re-assign voice, role or persona.\n\nRefine an auto-picked voice before spending credits on synthesis. Only\nmutates speaker fields; never touches generated dialogue or audio.","operationId":"update_speaker","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"speaker_id","in":"path","required":true,"schema":{"type":"string","title":"Speaker Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpeakerUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Speaker"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"update_speaker_api_v1_podcast_projects__project_id__speakers__speaker_id__put"}},"/api/v1/podcast/episode-profiles":{"get":{"tags":["podcast"],"summary":"List Episode Profiles","operationId":"list_episode_profiles","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/EpisodeProfileOut"},"type":"array","title":"Response List Episode Profiles Api V1 Podcast Episode Profiles Get"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"security":[{"OAuth2PasswordBearer":[]}],"x-original-operation-id":"list_episode_profiles_api_v1_podcast_episode_profiles_get","description":"List Episode Profiles"},"post":{"tags":["podcast"],"summary":"Create Episode Profile","operationId":"create_episode_profile","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EpisodeProfileCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EpisodeProfileOut"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"security":[{"OAuth2PasswordBearer":[]}],"x-original-operation-id":"create_episode_profile_api_v1_podcast_episode_profiles_post","description":"Create Episode Profile"}},"/api/v1/podcast/episode-profiles/{profile_id}":{"put":{"tags":["podcast"],"summary":"Update Episode Profile","operationId":"update_episode_profile","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"profile_id","in":"path","required":true,"schema":{"type":"string","title":"Profile Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EpisodeProfileUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EpisodeProfileOut"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"update_episode_profile_api_v1_podcast_episode_profiles__profile_id__put","description":"Update Episode Profile"},"delete":{"tags":["podcast"],"summary":"Delete Episode Profile","operationId":"delete_episode_profile","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"profile_id","in":"path","required":true,"schema":{"type":"string","title":"Profile Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"delete_episode_profile_api_v1_podcast_episode_profiles__profile_id__delete","description":"Delete Episode Profile"}},"/api/v1/podcast/speaker-profiles":{"get":{"tags":["podcast"],"summary":"List Speaker Profiles","operationId":"list_speaker_profiles","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/SpeakerProfileOut"},"type":"array","title":"Response List Speaker Profiles Api V1 Podcast Speaker Profiles Get"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"security":[{"OAuth2PasswordBearer":[]}],"x-original-operation-id":"list_speaker_profiles_api_v1_podcast_speaker_profiles_get","description":"List Speaker Profiles"},"post":{"tags":["podcast"],"summary":"Create Speaker Profile","operationId":"create_speaker_profile","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpeakerProfileCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpeakerProfileOut"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"security":[{"OAuth2PasswordBearer":[]}],"x-original-operation-id":"create_speaker_profile_api_v1_podcast_speaker_profiles_post","description":"Create Speaker Profile"}},"/api/v1/podcast/speaker-profiles/{profile_id}":{"put":{"tags":["podcast"],"summary":"Update Speaker Profile","operationId":"update_speaker_profile","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"profile_id","in":"path","required":true,"schema":{"type":"string","title":"Profile Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpeakerProfileUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpeakerProfileOut"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"update_speaker_profile_api_v1_podcast_speaker_profiles__profile_id__put","description":"Update Speaker Profile"},"delete":{"tags":["podcast"],"summary":"Delete Speaker Profile","operationId":"delete_speaker_profile","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"profile_id","in":"path","required":true,"schema":{"type":"string","title":"Profile Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"delete_speaker_profile_api_v1_podcast_speaker_profiles__profile_id__delete","description":"Delete Speaker Profile"}},"/api/v1/podcast/projects/{project_id}/sources":{"post":{"tags":["podcast"],"summary":"Add Source","description":"Attach a grounding source (file / pasted text / web URL / YouTube).\n\nTEXT is extracted inline; FILE, URL and YOUTUBE sources are processed in\nthe background.\n\nA FILE source arrives one of two ways:\n\n- ``upload_id`` — PREFERRED. Upload the document with a presigned URL\n  first and send the resulting id here. The bytes never traverse the API,\n  so a slow or flaky link cannot truncate them mid-stream.\n- ``file`` — the legacy multipart body. Kept for older clients and small\n  documents; large uploads on a slow link can fail here with a bare 400.","operationId":"add_source","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_add_source_api_v1_podcast_projects__project_id__sources_post"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"add_source_api_v1_podcast_projects__project_id__sources_post"},"get":{"tags":["podcast"],"summary":"List Sources","operationId":"list_sources","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"list_sources_api_v1_podcast_projects__project_id__sources_get","description":"List Sources"}},"/api/v1/podcast/projects/{project_id}/sources/{source_id}":{"delete":{"tags":["podcast"],"summary":"Delete Source","operationId":"delete_source","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"source_id","in":"path","required":true,"schema":{"type":"string","title":"Source Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"delete_source_api_v1_podcast_projects__project_id__sources__source_id__delete","description":"Delete Source"}},"/api/v1/podcast/projects/{project_id}/outline/generate":{"post":{"tags":["podcast"],"summary":"Generate Outline","description":"AI-generate an outline for the podcast.","operationId":"generate_outline","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OutlineGenerateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OutlineGenerateResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"generate_outline_api_v1_podcast_projects__project_id__outline_generate_post"}},"/api/v1/podcast/projects/{project_id}/outline":{"put":{"tags":["podcast"],"summary":"Update Outline","description":"Manually update/set the podcast outline.","operationId":"update_outline","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OutlineCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"update_outline_api_v1_podcast_projects__project_id__outline_put"}},"/api/v1/podcast/projects/{project_id}/transcript/generate":{"post":{"tags":["podcast"],"summary":"Generate Transcript","description":"AI-generate a transcript from the outline.","operationId":"generate_transcript","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TranscriptGenerateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TranscriptGenerateResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"generate_transcript_api_v1_podcast_projects__project_id__transcript_generate_post"}},"/api/v1/podcast/projects/{project_id}/transcript":{"put":{"tags":["podcast"],"summary":"Update Transcript","description":"Manually update/set the podcast transcript.","operationId":"update_transcript_transcript","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TranscriptCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"update_transcript_api_v1_podcast_projects__project_id__transcript_put"}},"/api/v1/podcast/projects/{project_id}/audio/estimate":{"get":{"tags":["podcast"],"summary":"Estimate Audio","description":"Estimated credit cost + duration for synthesizing the current transcript.\n\nServer-authoritative: uses the SAME per-character rate as the audio reservation\n(CreditMultipliers.TTS_PER_CHAR), so the UI can show an exact cost before the user\ncommits to audio generation — never duplicate the rate on the client.","operationId":"estimate_audio","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"estimate_audio_api_v1_podcast_projects__project_id__audio_estimate_get"}},"/api/v1/podcast/projects/{project_id}/audio/generate":{"post":{"tags":["podcast"],"summary":"Generate Audio","description":"Start audio generation for all dialogues.","operationId":"generate_audio","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AudioGenerateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AudioGenerateResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"generate_audio_api_v1_podcast_projects__project_id__audio_generate_post"}},"/api/v1/podcast/projects/{project_id}/dialogue/regenerate":{"post":{"tags":["podcast"],"summary":"Regenerate Dialogue","description":"Regenerate a specific dialogue clip.","operationId":"regenerate_dialogue","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegenerateDialogueRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"regenerate_dialogue_api_v1_podcast_projects__project_id__dialogue_regenerate_post"}},"/api/v1/podcast/projects/{project_id}/progress":{"get":{"tags":["podcast"],"summary":"Get Progress","description":"Get real-time generation progress.","operationId":"get_progress","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerationProgress"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_progress_api_v1_podcast_projects__project_id__progress_get"}},"/api/v1/podcast/voices/presets":{"get":{"tags":["podcast"],"summary":"List Preset Voices","description":"List available podcast preset voices.","operationId":"list_preset_voices","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PresetVoiceListResponse"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"list_preset_voices_api_v1_podcast_voices_presets_get"}},"/api/v1/podcast/dashboard":{"get":{"tags":["podcast"],"summary":"Get Dashboard","description":"Get podcast studio dashboard statistics.","operationId":"get_dashboard","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PodcastDashboardStats"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"security":[{"OAuth2PasswordBearer":[]}],"x-original-operation-id":"get_dashboard_api_v1_podcast_dashboard_get"}},"/api/v1/podcast/feed":{"post":{"tags":["podcast"],"summary":"Enable Podcast Feed","description":"Return the user's public podcast RSS feed URL.\n\nLists the user's completed episodes; submit the URL to Apple Podcasts /\nSpotify. The token is a signed, feed-scoped JWT, so no DB migration is\nneeded and a leaked access token can't open someone's feed.","operationId":"enable_podcast_feed","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"security":[{"OAuth2PasswordBearer":[]}],"x-original-operation-id":"enable_podcast_feed_api_v1_podcast_feed_post"}},"/api/v1/podcast/feed/{token}.xml":{"get":{"tags":["podcast"],"summary":"Get Podcast Feed","description":"Public podcast RSS feed (no auth — podcast players fetch anonymously).","operationId":"get_podcast_feed","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"The podcast RSS feed for this token.","content":{"application/rss+xml":{"schema":{"type":"string"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"security":[],"x-original-operation-id":"get_podcast_feed_api_v1_podcast_feed__token__xml_get"}},"/api/v1/music/v3/availability":{"get":{"tags":["music"],"summary":"V3 Availability","description":"Whether AudioMusic v3 is offered here. Hide the surface when false.","operationId":"v3_availability","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MusicV3AvailabilityResponse"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"v3_availability_api_v1_music_v3_availability_get"}},"/api/v1/music/v3/generate":{"post":{"tags":["music"],"summary":"V3 Generate","description":"Generate a song and, unless `cot` is 'off', an editable score with it.\n\nThere is no `duration`: song length follows the amount of lyric text. Your\ncredits are held against a generous estimate and settled against the track\nyou actually get — see `billing` on the job.","operationId":"v3_generate","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MusicV3GenerateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MusicV3JobResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"v3_generate_api_v1_music_v3_generate_post"}},"/api/v1/music/v3/plan":{"post":{"tags":["music"],"summary":"V3 Plan","description":"Write the score only — no audio.\n\nReview or hand-edit it, then send it to `/music/v3/edit` to render.\n\nSend `description` instead of `lyrics` and we write the lyrics first,\nwithin the same charge. If they cannot be written you get **422** with\n`detail.code` `LYRICS_FAILED`, and nothing is charged.","operationId":"v3_plan","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MusicV3PlanRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MusicV3JobResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"v3_plan_api_v1_music_v3_plan_post"}},"/api/v1/music/v3/edit":{"post":{"tags":["music"],"summary":"V3 Edit","description":"Re-render a track from an edited score.\n\nThis REGENERATES the recording. Sections you did not touch will still be\nperformed afresh — an edit is a new take, not a patch to the old one.\n\n**One identical recording at a time.** If the same request for the same\nsource track is still waiting to start or in progress, it is refused with\n**409 Conflict** and nothing is charged. The response's `detail` is\n`{\"code\": \"SCORE_ALREADY_RECORDING\", \"message\": \"...\", \"job_id\": <id>}`,\nwhere `job_id` is the recording already in progress — poll that job\ninstead of submitting again. `job_id` is `null` only when the other\nrequest is still being set up; retry shortly.\n\n\"The same request\" means the same score, `style`, `lyrics`, `seed`, `cot`\nand `cfg_scale` (style and lyrics after falling back to the source's).\nChanging any of them is a different take and is accepted. In the score,\nwhitespace that does not change the music is ignored: trailing spaces,\nrepeated spaces or tabs within a line, extra blank lines (one blank line\nstill separates tunes) and Windows line endings. `allow_tempo_change` and\n`display_name` do not make a request different. A source whose earlier\nrecording has finished or failed is accepted as normal.\n\nIf the recording cannot be started after it was created, the response is\n**503** with `detail.code` `\"MUSIC_JOB_NOT_STARTED\"`; that job is marked\nfailed, nothing is charged, and the same request can be retried at once.\nIn the rare case we cannot tell whether it started, the 503 has\n`detail.code` `\"MUSIC_JOB_START_UNCONFIRMED\"` and the `job_id`: check that\njob before retrying.","operationId":"v3_edit","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MusicV3EditRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MusicV3JobResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"v3_edit_api_v1_music_v3_edit_post"}},"/api/v1/music/v3/revise":{"post":{"tags":["music"],"summary":"V3 Revise","description":"Change a score in plain English and get the revised score back.\n\nDescribe the change in `instruction` — \"make the chorus higher\", \"add a\nbridge after the second chorus\", \"simpler chords in the verse\". Narrow it\nwith `section` (\"chorus\" for every chorus, \"chorus 2\" for the second) or\n`bars` (numbered from 1). Parts of the score you did not ask about are\nkept exactly as they were, and the tempo only changes when\n`allow_tempo_change` is true.\n\nThe result is a NEW score (no recording) linked to the one you revised\nthrough `source_job_id`; the original is kept. `note` says in one sentence\nwhat changed, and `score_comparison.changed_bars` says where. Revise again\nfrom the new score, or record it with `/music/v3/edit`.\n\n**Price:** a small fixed charge per revision, taken when you submit and\nkept only if a revised score is delivered.\n\n**Errors** — nothing is charged for any of these:\n\n* **404** — the source is not yours, or has no score to revise.\n* **409** `REVISE_IN_FLIGHT` — the same change to the same score is\n  already being made; it will appear in your library shortly.\n* **402** — not enough credits.\n* **422** `REVISE_TARGET_NOT_FOUND` — the score has no such section or\n  bars; the message lists what it has.\n* **422** `REVISE_FAILED` — the change could not be made as a valid score.\n  Try describing it differently, or narrow it to a section or bars.\n* **422** `INVALID_SCORE` — the source score itself cannot be read.\n* **429** `REVISE_RATE_LIMITED` — too many revisions (20 a minute, 300 a\n  day) or several failed in a row; wait for `Retry-After` seconds.\n* **503** `REVISE_UNAVAILABLE` — briefly unavailable; retry shortly.\n\nSend an `Idempotency-Key` header (up to 200 characters) to make a retry\nsafe: the same key from you within 10 minutes returns the first result\nand is not charged again.","operationId":"v3_revise","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MusicV3ReviseRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MusicV3JobResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"v3_revise_api_v1_music_v3_revise_post"}},"/api/v1/music/v3/jobs":{"get":{"tags":["music"],"summary":"V3 Jobs","description":"Your v3 tracks, newest first.\n\nThis is how a track's other versions are found after the tab closes: pass\n`source_job_id` to pull one lineage chain, or `workflow` to separate\nplan-only scores from rendered takes. The unpaged total comes back in the\n`X-Total-Count` header.","operationId":"v3_jobs","parameters":[{"name":"skip","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"workflow","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/MusicV3Workflow"},{"type":"null"}],"title":"Workflow"}},{"name":"source_job_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":2147483647,"exclusiveMinimum":0},{"type":"null"}],"title":"Source Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MusicV3JobResponse"},"title":"Response V3 Jobs Api V1 Music V3 Jobs Get"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"v3_jobs_api_v1_music_v3_jobs_get"}},"/api/v1/music/v3/jobs/{job_id}":{"get":{"tags":["music"],"summary":"V3 Job","description":"One v3 job: status, audio, score, diagnostics and what it cost.","operationId":"v3_job","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","maximum":2147483647,"exclusiveMinimum":0,"title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MusicV3JobResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"v3_job_api_v1_music_v3_jobs__job_id__get"}},"/api/v1/music/v3/jobs/{job_id}/score":{"get":{"tags":["music"],"summary":"V3 Job Score","description":"Just the score, ready to edit and send back to `/music/v3/edit`.","operationId":"v3_job_score","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","maximum":2147483647,"exclusiveMinimum":0,"title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MusicV3Score"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"v3_job_score_api_v1_music_v3_jobs__job_id__score_get"}},"/api/v1/api-wallet/balance":{"get":{"tags":["api-wallet"],"summary":"Get Wallet Balance","description":"Get current API wallet balance.\n\nReturns the user's API wallet balance, total top-ups, total spent,\nand low balance warning status.","operationId":"get_wallet_balance","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WalletBalanceResponse"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"security":[{"OAuth2PasswordBearer":[]}],"x-original-operation-id":"get_wallet_balance_api_v1_api_wallet_balance_get"}},"/api/v1/api-wallet/pricing":{"get":{"tags":["api-wallet"],"summary":"Get Api Pricing","description":"Get the complete API pricing table.\n\nReturns pricing for all services and wallet configuration.\nThis endpoint does not require authentication.\n\nEach service has a `unit`. Audio services are priced per minute of audio\n(`cents_per_minute`). Text-to-speech and voice cloning are priced at\n$0.05 per 1,000 characters, and audiobook narration at $0.09 per 1,000\ncharacters (`cents_per_1k_characters`); their per-minute fields are null.\nCharacters are counted after removing bracketed speaking-style directions\nand pause tags; sound tags such as `[laugh]` are counted.","operationId":"get_api_pricing","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PricingResponse"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_api_pricing_api_v1_api_wallet_pricing_get"}},"/api/v1/api-wallet/estimate":{"post":{"tags":["api-wallet"],"summary":"Estimate Cost","description":"Estimate cost for an API operation.\n\nCalculate the cost without actually deducting from wallet.\nThis endpoint does not require authentication.\n\nFor services priced per 1,000 characters, send `text_length` for an exact\nquote. With only `duration_seconds` the quote is approximate (about 900\ncharacters per minute of speech, `estimate_basis: \"duration\"`); the actual\ncharge is always on the text sent. A request with neither returns 400.","operationId":"estimate_cost","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CostEstimateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CostEstimateResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"estimate_cost_api_v1_api_wallet_estimate_post"}},"/api/v1/api-wallet/topup/payment-intent":{"post":{"tags":["api-wallet"],"summary":"Create Topup Payment Intent","description":"Create a Stripe PaymentIntent for API wallet top-up.\n\nUse this for custom payment forms. The payment intent ID is stored\nwith the user's metadata for webhook processing.","operationId":"create_topup_payment_intent","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TopupRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TopupPaymentIntentResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"security":[{"OAuth2PasswordBearer":[]}],"x-original-operation-id":"create_topup_payment_intent_api_v1_api_wallet_topup_payment_intent_post"}},"/api/v1/api-wallet/topup/checkout":{"post":{"tags":["api-wallet"],"summary":"Create Topup Checkout Session","description":"Create a Stripe Checkout session for API wallet top-up.\n\nThis redirects the user to Stripe's hosted checkout page.","operationId":"create_topup_checkout_session","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TopupRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TopupCheckoutResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"security":[{"OAuth2PasswordBearer":[]}],"x-original-operation-id":"create_topup_checkout_session_api_v1_api_wallet_topup_checkout_post"}},"/api/v1/api-wallet/usage":{"get":{"tags":["api-wallet"],"summary":"Get Usage History","description":"Get API usage history.\n\nReturns paginated list of API calls with cost and duration details, and\nthe billed `characters` for services priced per 1,000 characters.\nOptionally filter by specific API key.","operationId":"get_usage_history","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"api_key_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by API key","title":"Api Key Id"},"description":"Filter by API key"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UsageHistoryResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_usage_history_api_v1_api_wallet_usage_get"}},"/api/v1/api-wallet/topups":{"get":{"tags":["api-wallet"],"summary":"Get Topup History","description":"Get API wallet top-up history.\n\nReturns paginated list of all wallet top-up transactions.","operationId":"get_topup_history","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TopupHistoryResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_topup_history_api_v1_api_wallet_topups_get"}},"/api/v1/api-wallet/check-balance":{"post":{"tags":["api-wallet"],"summary":"Check Balance For Operation","description":"Check if user has sufficient balance for an operation.\n\nReturns whether the operation can proceed and cost details.\nRaises 402 Payment Required if balance is insufficient. For services\npriced per 1,000 characters send `text_length`; with only\n`duration_seconds` the check uses an approximate character count (about\n900 per minute, `estimate_basis: \"duration\"`). Neither returns 400.","operationId":"check_balance_for_operation","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CostEstimateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"security":[{"OAuth2PasswordBearer":[]}],"x-original-operation-id":"check_balance_for_operation_api_v1_api_wallet_check_balance_post"}},"/api/v1/api-wallet/auto-topup":{"get":{"tags":["api-wallet"],"summary":"Get Auto Topup Config","description":"Get automatic top-up settings.\n\nReturns the current rule (threshold and amount), the daily and monthly\nguardrails, the saved card, and this period's usage counters. Readable with\neither a dashboard session or an API key.","operationId":"get_auto_topup_config","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutoTopupConfig"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"security":[{"OAuth2PasswordBearer":[]}],"x-original-operation-id":"get_auto_topup_config_api_v1_api_wallet_auto_topup_get"},"put":{"tags":["api-wallet"],"summary":"Update Auto Topup Config","description":"Update automatic top-up settings.\n\nEvery field is optional; omitted fields keep their current value. An API key\nmay turn automatic top-up off or lower any limit, but turning it on or\nraising a limit requires a signed-in dashboard session.","operationId":"update_auto_topup_config","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutoTopupUpdateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutoTopupConfig"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"security":[{"OAuth2PasswordBearer":[]}],"x-original-operation-id":"update_auto_topup_config_api_v1_api_wallet_auto_topup_put"},"delete":{"tags":["api-wallet"],"summary":"Disable Auto Topup","description":"Turn off automatic top-up and remove the saved card.\n\nRequires a signed-in dashboard session, because removing the card is\nDESTRUCTIVE: the only way to put one back is the hosted browser setup flow,\nwhich an API-only integration cannot drive. Use `PUT` with `enabled: false`\nto switch automatic top-up off — that needs no dashboard session, stops\nevery charge just as completely, and keeps the saved card so turning it back\non is one click.","operationId":"disable_auto_topup","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutoTopupConfig"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"security":[{"OAuth2PasswordBearer":[]}],"x-original-operation-id":"disable_auto_topup_api_v1_api_wallet_auto_topup_delete"}},"/api/v1/api-wallet/auto-topup/payment-method-session":{"post":{"tags":["api-wallet"],"summary":"Create Auto Topup Payment Method Session","description":"Start the one-time card setup for automatic top-up.\n\nReturns a hosted URL where the card is saved securely. Card details never\nreach our servers, so this browser step is required once even for API-only\nintegrations. Requires a signed-in dashboard session.","operationId":"create_auto_topup_payment_method_session","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutoTopupSetupSessionResponse"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"security":[{"OAuth2PasswordBearer":[]}],"x-original-operation-id":"create_auto_topup_payment_method_session_api_v1_api_wallet_auto_topup_payment_method_session_post"}},"/api/v1/api-wallet/service-types":{"get":{"tags":["api-wallet"],"summary":"List Service Types","description":"Get list of available API service types.\n\nReturns all valid service type identifiers for API calls.","operationId":"list_service_types","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"list_service_types_api_v1_api_wallet_service_types_get"}},"/api/v1/webhooks/endpoints":{"get":{"tags":["webhooks"],"summary":"List Endpoints","operationId":"list_endpoints","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/WebhookEndpointResponse"},"type":"array","title":"Response List Endpoints Api V1 Webhooks Endpoints Get"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"security":[{"OAuth2PasswordBearer":[]}],"x-original-operation-id":"list_endpoints_api_v1_webhooks_endpoints_get","description":"List Endpoints"},"post":{"tags":["webhooks"],"summary":"Create Endpoint","description":"Register a webhook endpoint. Returns the signing secret exactly once.","operationId":"create_endpoint","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEndpointCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEndpointCreateResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"security":[{"OAuth2PasswordBearer":[]}],"x-original-operation-id":"create_endpoint_api_v1_webhooks_endpoints_post"}},"/api/v1/webhooks/endpoints/{endpoint_id}":{"get":{"tags":["webhooks"],"summary":"Get Endpoint","operationId":"get_endpoint","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"endpoint_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Endpoint Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEndpointResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_endpoint_api_v1_webhooks_endpoints__endpoint_id__get","description":"Get Endpoint"},"patch":{"tags":["webhooks"],"summary":"Update Endpoint","operationId":"update_endpoint","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"endpoint_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Endpoint Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEndpointUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEndpointResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"update_endpoint_api_v1_webhooks_endpoints__endpoint_id__patch","description":"Update Endpoint"},"delete":{"tags":["webhooks"],"summary":"Delete Endpoint","operationId":"delete_endpoint","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"endpoint_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Endpoint Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"delete_endpoint_api_v1_webhooks_endpoints__endpoint_id__delete","description":"Delete Endpoint"}},"/api/v1/webhooks/endpoints/{endpoint_id}/deliveries":{"get":{"tags":["webhooks"],"summary":"List Deliveries","operationId":"list_deliveries","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"endpoint_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Endpoint Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WebhookDeliveryResponse"},"title":"Response List Deliveries Api V1 Webhooks Endpoints  Endpoint Id  Deliveries Get"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"list_deliveries_api_v1_webhooks_endpoints__endpoint_id__deliveries_get","description":"List Deliveries"}},"/api/v1/webhooks/endpoints/{endpoint_id}/test":{"post":{"tags":["webhooks"],"summary":"Send Test Event","description":"Deliver a synthetic signed event so the developer can confirm the loop.","operationId":"send_test_event","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"endpoint_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Endpoint Id"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"send_test_event_api_v1_webhooks_endpoints__endpoint_id__test_post"}},"/api/v1/webhooks/deliveries/{delivery_id}/redeliver":{"post":{"tags":["webhooks"],"summary":"Redeliver","description":"Re-dispatch a failed/dead delivery (ownership checked via its endpoint).","operationId":"redeliver","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"delivery_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Delivery Id"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"redeliver_api_v1_webhooks_deliveries__delivery_id__redeliver_post"}},"/api/v1/reader/generate":{"post":{"tags":["reader"],"summary":"Create Reader Job","description":"Create a new reader job for article-to-audio conversion","operationId":"create_reader_job","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReaderGenerateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReaderJobResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"create_reader_job_api_v1_reader_generate_post"}},"/api/v1/reader/estimate":{"post":{"tags":["reader"],"summary":"Estimate Reader Job","description":"Estimate the credit cost of a reader job before generating it.\n\nFree voices cost nothing. For premium or custom voices the article is\nfetched up front — the same path generation uses — so the number returned\nhere matches what is reserved and billed. If the article cannot be\nfetched, a baseline estimate is returned with `measured=false` rather than\nan error.","operationId":"estimate_reader_job","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReaderEstimateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReaderEstimateResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"estimate_reader_job_api_v1_reader_estimate_post"}},"/api/v1/reader/public/{job_id}":{"get":{"tags":["reader"],"summary":"Get Public Reader Job","description":"Public, unauthenticated reader job for the hosted share/embed page.\n\nOnly completed, public jobs are returned.","operationId":"get_public_reader_job","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReaderPublicResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_public_reader_job_api_v1_reader_public__job_id__get"}},"/api/v1/reader/{job_id}":{"get":{"tags":["reader"],"summary":"Get Reader Job","description":"Get reader job status","operationId":"get_reader_job","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReaderJobResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_reader_job_api_v1_reader__job_id__get"},"delete":{"tags":["reader"],"summary":"Delete Reader Job","description":"Delete a reader job","operationId":"delete_reader_job","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"delete_reader_job_api_v1_reader__job_id__delete"}},"/api/v1/reader/":{"get":{"tags":["reader"],"summary":"List Reader Jobs","description":"List user's reader jobs","operationId":"list_reader_jobs","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReaderJobsResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"list_reader_jobs_api_v1_reader__get"}},"/api/v1/sandbox/key":{"post":{"tags":["sandbox"],"summary":"Issue a developer sandbox key","description":"Issues a short-lived, opaque sandbox key for the public developer playground. Keys carry a small credit balance and expire after one hour. Rate-limited per IP to deter abuse.","operationId":"issue_sandbox_key","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SandboxKeyResponse"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"issue_sandbox_key_api_v1_sandbox_key_post"}},"/api/v1/sandbox/tts":{"post":{"tags":["sandbox"],"summary":"Sandbox text-to-speech","description":"Synthesize a short snippet of speech using a sandbox key. Limited to 200 characters per call and 10 calls per minute per key. Returns raw audio bytes.","operationId":"sandbox_tts","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SandboxTTSRequest"}}},"required":true},"responses":{"200":{"description":"Generated audio bytes.","content":{"application/json":{"schema":{}},"audio/mpeg":{},"audio/wav":{}}},"400":{"description":"Input text exceeded the sandbox length limit."},"401":{"description":"Sandbox key is missing, invalid, or expired."},"402":{"description":"Sandbox credits exhausted on this key."},"429":{"description":"Per-key rate limit exceeded."},"503":{"description":"Sandbox temporarily unavailable."},"422":{"$ref":"#/components/responses/ValidationFailed"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/InternalError"}},"x-original-operation-id":"sandbox_tts_api_v1_sandbox_tts_post"}},"/api/v1/video/video-download/public/info":{"post":{"tags":["media-extraction"],"summary":"Get Video Info Public","description":"Get video information without downloading (PUBLIC ACCESS)\n\nExtract basic metadata including:\n- Title, description, uploader\n- Duration, view count, upload date\n- Available format information (MP4/MP3/WAV/M4A)\n\nNo authentication required. Rate limited to 20 requests per minute per IP.\nSupported: YouTube only (youtube.com, youtu.be, youtube-nocookie.com).\n\n**Flow:**\n- Cached results return **200** instantly (<100ms)\n- Otherwise the extraction is queued and this returns **202** with a\n  `job_id` and `poll_url`; poll `GET /public/info/status/{job_id}` every\n  1-2 seconds — it answers 202 while extracting and 200 with the metadata\n  when done (typically 5-15 seconds, 45 seconds max)","operationId":"get_video_info_public","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoInfoRequest"}}},"required":true},"responses":{"200":{"description":"Cached metadata, returned immediately","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoInfoResponse"}}}},"202":{"description":"Extraction queued; poll `poll_url` every 1-2 s until it answers 200"},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_video_info_public_api_v1_video_video_download_public_info_post"}},"/api/v1/video/video-download/public/info/status/{info_job_id}":{"get":{"tags":["media-extraction"],"summary":"Get Video Info Status","description":"Poll for video info extraction status (PUBLIC ACCESS)\n\nReturns:\n- **202** with `status` PENDING or PROCESSING while extraction is in progress\n- **200** with the `VideoInfoResponse` when COMPLETED\n- **400** with the error message when FAILED\n\nPoll every 1-2 seconds until you get 200 or 400.","operationId":"get_video_info_status","parameters":[{"name":"info_job_id","in":"path","required":true,"schema":{"type":"string","description":"Info job ID from /public/info","title":"Info Job Id"},"description":"Info job ID from /public/info"}],"responses":{"200":{"description":"Extraction finished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoInfoResponse"}}}},"202":{"description":"Still extracting; poll again in 1-2 s"},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_video_info_status_api_v1_video_video_download_public_info_status__info_job_id__get"}},"/api/v1/video/video-download/public/download":{"post":{"tags":["media-extraction"],"summary":"Create Download Job Public","description":"Create a video download job (PUBLIC ACCESS)\n\nDownload videos with limitations:\n- Maximum 5 minutes duration\n- Maximum 100MB file size\n- Limited formats: MP4, MP3, WAV, M4A\n- Maximum 5 downloads per day (friendly error message when exceeded)\n- No premium features\n- No credit deduction\n\nA free account raises this to 10 downloads a day and videos up to 10\nminutes. Past that, downloads are metered at 100 credits per minute.\n\n🔒 **Advanced Multi-Layer Protection:**\n- IP-based rate limiting (5/min, 5/day per IP)\n- Device fingerprinting (5/day per device)\n- Composite tracking (IP + device combination)\n- Automated abuse detection (VPN/proxy rotation)\n- Bot detection via User-Agent analysis\n\nBypassing these limits will result in temporary blocks.\n\n⚡ **Performance Note:**\nThis endpoint returns immediately; the job is recorded asynchronously.","operationId":"create_download_job_public","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoDownloadRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoDownloadResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"create_download_job_public_api_v1_video_video_download_public_download_post"}},"/api/v1/video/video-download/public/jobs/redis/{redis_job_id}":{"get":{"tags":["media-extraction"],"summary":"Get public download job (fast poll)","description":"Get public download job status on the fast-poll path (PUBLIC ACCESS)\n\n⚡ **Performance Optimized Polling Endpoint**\n\nPoll this as often as you need: it answers from a cache, so it is cheap to\ncall at a high rate. Use it for public download jobs created with the\nnon-blocking endpoint.\n\nThe response carries the authoritative job status as soon as that is\navailable, including presigned download URLs.\n\nReturns:\n    - Job status, available instantly after job creation\n    - Presigned download URLs for completed jobs","operationId":"get_public_download_job_redis","parameters":[{"name":"redis_job_id","in":"path","required":true,"schema":{"type":"string","title":"Fast-poll job id","description":"Fast-poll job id (e.g., pub_abc123...)"},"description":"Fast-poll job id (e.g., pub_abc123...)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoDownloadJob"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_public_download_job_redis_api_v1_video_video_download_public_jobs_redis__redis_job_id__get"}},"/api/v1/video/video-download/public/jobs/{job_id}":{"get":{"tags":["media-extraction"],"summary":"Get Public Download Job","description":"Get public download job status (PUBLIC ACCESS)\n\nCheck the status of a public download job.\nNo authentication required. Returns presigned download URLs for completed jobs.\n\n⚠️ **Note:** For higher throughput polling, use the fast-poll variant of\nthis endpoint — \"Get public download job (fast poll)\" — with the fast-poll\njob id returned when the job was created.","operationId":"get_public_download_job","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","description":"Job ID","title":"Job Id"},"description":"Job ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoDownloadJob"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_public_download_job_api_v1_video_video_download_public_jobs__job_id__get"}},"/api/v1/video/video-download/info":{"post":{"tags":["media-extraction"],"summary":"Get Video Info","description":"Get video information without downloading (AUTHENTICATED ACCESS)\n\nExtract comprehensive metadata including:\n- Title, description, uploader\n- Duration, view count, upload date\n- Complete available formats and qualities\n- Estimated download credits\n\nAuthentication required. Full feature access.\nSupported: YouTube only (youtube.com, youtu.be, youtube-nocookie.com).","operationId":"get_video_info","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoInfoRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoInfoResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"security":[{"OAuth2PasswordBearer":[]}],"x-original-operation-id":"get_video_info_api_v1_video_video_download_info_post"}},"/api/v1/video/video-download/download":{"post":{"tags":["media-extraction"],"summary":"Create Download Job","description":"Create a video download job (AUTHENTICATED ACCESS)\n\nDownloads video in specified format and quality:\n- Supports all video formats (MP4, WebM, MKV, etc.)\n- Supports all audio formats (MP3, WAV, AAC, etc.)\n- Quality options from 144p to 4K\n- Automatic thumbnail download\n- Duration limit: depending on the caller's plan a single download can be\n  capped at 60 minutes. Exceeding it returns 402 with error_code\n  `DURATION_LIMIT_EXCEEDED`, and the body carries `current_limit_minutes`\n  — read the limit from there rather than hard-coding it. Authoritative\n  rates and allowances: `GET /api/v1/api-wallet/pricing`.\n\nAuthentication required. Credits are reserved upfront and charged only on successful completion.","operationId":"create_download_job","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoDownloadRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoDownloadResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"security":[{"OAuth2PasswordBearer":[]}],"x-original-operation-id":"create_download_job_api_v1_video_video_download_download_post"}},"/api/v1/video/video-download/bulk-download":{"post":{"tags":["media-extraction"],"summary":"Create Bulk Download Jobs","description":"Create multiple video download jobs\n\nDownload multiple videos with the same format and quality settings.\nMaximum 10 URLs per request to prevent abuse.\n\nReturns individual job status for each URL.","operationId":"create_bulk_download_jobs","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkVideoDownloadRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkVideoDownloadResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"create_bulk_download_jobs_api_v1_video_video_download_bulk_download_post"}},"/api/v1/video/video-download/jobs":{"get":{"tags":["media-extraction"],"summary":"List Download Jobs","description":"List user's video download jobs\n\nReturns paginated list with optional filtering by:\n- Status (PENDING, PROCESSING, COMPLETED, FAILED)\n- Platform (youtube, tiktok, instagram, etc.)\n\nIncludes job progress and download URLs for completed jobs.","operationId":"list_download_jobs","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page number","default":1,"title":"Page"},"description":"Page number"},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Items per page","default":20,"title":"Per Page"},"description":"Items per page"},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/ProcessingStatus"},{"type":"null"}],"description":"Filter by status","title":"Status"},"description":"Filter by status"},{"name":"platform","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/VideoPlatform"},{"type":"null"}],"description":"Filter by platform","title":"Platform"},"description":"Filter by platform"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoDownloadListResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"list_download_jobs_api_v1_video_video_download_jobs_get"}},"/api/v1/video/video-download/jobs/{job_id}":{"get":{"tags":["media-extraction"],"summary":"Get Download Job","description":"Get specific download job details\n\nReturns complete job information including:\n- Current status and progress\n- Download URLs for completed jobs\n- Error details for failed jobs\n- Processing metadata","operationId":"get_download_job","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","description":"Job ID","title":"Job Id"},"description":"Job ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoDownloadJob"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_download_job_api_v1_video_video_download_jobs__job_id__get"},"put":{"tags":["media-extraction"],"summary":"Update Download Job","description":"Update download job metadata\n\nAllows updating:\n- Custom title for the downloaded content\n\nOnly the job owner can update their jobs.","operationId":"update_download_job","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","description":"Job ID","title":"Job Id"},"description":"Job ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoDownloadJobUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoDownloadJob"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"update_download_job_api_v1_video_video_download_jobs__job_id__put"},"delete":{"tags":["media-extraction"],"summary":"Delete Download Job","description":"Delete download job\n\nRemoves the job record and associated files from storage.\nCannot delete jobs that are currently processing.","operationId":"delete_download_job","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","description":"Job ID","title":"Job Id"},"description":"Job ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"delete_download_job_api_v1_video_video_download_jobs__job_id__delete"}},"/api/v1/video/video-download/jobs/{job_id}/record-download":{"post":{"tags":["media-extraction"],"summary":"Record Video Download","description":"Record that you downloaded this job's file.\n\nCall this after a successful download. A file downloaded within the last 30\ndays is kept beyond its normal retention window, so calling this keeps an\nartifact you still use from expiring on schedule. Calling it more than once\nis fine.","operationId":"record_video_download","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","description":"Job ID","title":"Job Id"},"description":"Job ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"record_video_download_api_v1_video_video_download_jobs__job_id__record_download_post"}},"/api/v1/video/video-download/stats":{"get":{"tags":["media-extraction"],"summary":"Get Download Stats","description":"Get user's download statistics\n\nReturns comprehensive statistics including:\n- Total downloads and duration\n- Credits used\n- Downloads by platform and format\n- Recent download history","operationId":"get_download_stats","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoDownloadStatsResponse"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_download_stats_api_v1_video_video_download_stats_get"}},"/api/v1/video/video-download/public/formats":{"get":{"tags":["media-extraction"],"summary":"Get Public Supported Formats","description":"Get supported formats for public downloads\n\nReturns limited formats available for public access:\n- Basic video formats (MP4)\n- Basic audio formats (MP3, WAV, M4A)\n- All quality options\n\nResponse is cached at edge for 24 hours (static data).","operationId":"get_public_supported_formats_formats","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"items":{"type":"string"},"type":"array"},"type":"object","title":"Response Get Public Supported Formats Api V1 Video Video Download Public Formats Get"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_public_supported_formats_api_v1_video_video_download_public_formats_get"}},"/api/v1/video/video-download/public/stats":{"get":{"tags":["media-extraction"],"summary":"Get Public Download Stats","description":"Get public download statistics (PUBLIC ACCESS)\n\nReturns:\n- total_downloads: Number of downloads completed to date\n- last_updated: When that count was last recomputed\n- estimated: Present and true when the count is an approximation rather\n  than a fresh count\n\nNo authentication required. The count is refreshed at most every 5 minutes,\nso it can lag the true total by up to that long.","operationId":"get_public_download_stats","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Public Download Stats Api V1 Video Video Download Public Stats Get"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_public_download_stats_api_v1_video_video_download_public_stats_get"}},"/api/v1/video/video-download/public/queue-status":{"get":{"tags":["media-extraction"],"summary":"Get Public Queue Status","description":"Get current queue status for free users (PUBLIC ACCESS)\n\nReturns:\n- queue_length: Number of jobs waiting in the free user queue\n- priority_queue_length: Number of jobs in priority queue (for comparison)\n- estimated_wait_minutes: Rough estimate of wait time\n- message: Human-readable status message\n- priority_available: Whether the priority queue is accepting work\n\nNo authentication required.","operationId":"get_public_queue_status","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Public Queue Status Api V1 Video Video Download Public Queue Status Get"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"get_public_queue_status_api_v1_video_video_download_public_queue_status_get"}},"/api/v1/video/video-download/formats":{"get":{"tags":["media-extraction"],"summary":"Get Supported Formats","description":"Get supported video and audio formats (AUTHENTICATED ACCESS)\n\nReturns lists of all supported:\n- Video formats (MP4, WebM, MKV, etc.)\n- Audio formats (MP3, WAV, AAC, etc.)\n- Quality options (144p to 4K, best, worst)\n\nAuthentication required for full format list.","operationId":"get_supported_formats_formats","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"items":{"type":"string"},"type":"array"},"type":"object","title":"Response Get Supported Formats Api V1 Video Video Download Formats Get"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"security":[{"OAuth2PasswordBearer":[]}],"x-original-operation-id":"get_supported_formats_api_v1_video_video_download_formats_get"}},"/api/v1/video/video-download/discover-media":{"post":{"tags":["media-extraction"],"summary":"Discover Media Files","description":"Discover audio and video files from HTML pages\n\nParse HTML pages to find direct links to audio/video files:\n- Extracts direct media file URLs from HTML content\n- Supports common audio formats (MP3, WAV, AAC, etc.)\n- Supports common video formats (MP4, WebM, MKV, etc.)\n- Returns structured list of discovered media files\n- Validates file accessibility\n\nWorks with any HTML page containing media file links.\nNo authentication required for discovery, but required for downloading.","operationId":"discover_media_files","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTMLMediaDiscoveryRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTMLMediaDiscoveryResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"security":[{"OAuth2PasswordBearer":[]}],"x-original-operation-id":"discover_media_files_api_v1_video_video_download_discover_media_post"}},"/api/v1/video/video-download/public/discover-media":{"post":{"tags":["media-extraction"],"summary":"Discover Media Files Public","description":"Discover audio and video files from HTML pages (PUBLIC ACCESS)\n\nParse HTML pages to find direct links to audio/video files:\n- Limited to 25 files per request for public access\n- Rate limited to 10 requests per minute\n- No authentication required\n\nPerfect for testing the media discovery functionality before signing up.","operationId":"discover_media_files_public","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTMLMediaDiscoveryRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTMLMediaDiscoveryResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"discover_media_files_public_api_v1_video_video_download_public_discover_media_post"}},"/api/v1/video/video-download/bulk-media-download":{"post":{"tags":["media-extraction"],"summary":"Bulk Download Media Files","description":"Download multiple media files from discovered list (AUTHENTICATED ACCESS)\n\nDownload multiple audio/video files that were discovered from HTML pages:\n- Supports up to 20 files per request\n- Individual file processing and download\n- Optional format conversion\n- Credit-based billing per file\n- Progress tracking for each file\n\nAuthentication required. Credits charged per file downloaded.","operationId":"bulk_download_media_files","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkMediaDownloadRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkVideoDownloadResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"security":[{"OAuth2PasswordBearer":[]}],"x-original-operation-id":"bulk_download_media_files_api_v1_video_video_download_bulk_media_download_post"}},"/api/v1/video/video-download/claim":{"post":{"tags":["media-extraction"],"summary":"Claim Anonymous Download","description":"Re-parent an anonymous download to the authenticated caller.\n\nIdempotent: claiming a job this user already owns returns success, because\nthe frontend retries across the signup/OAuth round-trip and a retry must\nnot read as an error.\n\nReturns 404 for an unknown, expired, or someone-else's token — deliberately\nindistinguishable, so the endpoint cannot be used to probe for jobs.","operationId":"claim_anonymous_download","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"security":[{"OAuth2PasswordBearer":[]}],"x-original-operation-id":"claim_anonymous_download_api_v1_video_video_download_claim_post"}},"/api/v1/video/info":{"post":{"tags":["media-extraction"],"summary":"Legacy Get Video Info","description":"Get video information without downloading (AUTHENTICATED ACCESS)\n\nExtract comprehensive metadata including:\n- Title, description, uploader\n- Duration, view count, upload date\n- Complete available formats and qualities\n- Estimated download credits\n\nAuthentication required. Full feature access.\nSupported: YouTube only (youtube.com, youtu.be, youtube-nocookie.com).","operationId":"legacy_get_video_info","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoInfoRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoInfoResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"security":[{"OAuth2PasswordBearer":[]}],"x-original-operation-id":"legacy_get_video_info_api_v1_video_info_post"}},"/api/v1/video/download":{"post":{"tags":["media-extraction"],"summary":"Legacy Create Download Job","description":"Create a video download job (AUTHENTICATED ACCESS)\n\nDownloads video in specified format and quality:\n- Supports all video formats (MP4, WebM, MKV, etc.)\n- Supports all audio formats (MP3, WAV, AAC, etc.)\n- Quality options from 144p to 4K\n- Automatic thumbnail download\n- Duration limit: depending on the caller's plan a single download can be\n  capped at 60 minutes. Exceeding it returns 402 with error_code\n  `DURATION_LIMIT_EXCEEDED`, and the body carries `current_limit_minutes`\n  — read the limit from there rather than hard-coding it. Authoritative\n  rates and allowances: `GET /api/v1/api-wallet/pricing`.\n\nAuthentication required. Credits are reserved upfront and charged only on successful completion.","operationId":"legacy_create_download_job","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoDownloadRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoDownloadResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"security":[{"OAuth2PasswordBearer":[]}],"x-original-operation-id":"legacy_create_download_job_api_v1_video_download_post"}},"/api/v1/video/public/info":{"post":{"tags":["media-extraction"],"summary":"Legacy Get Video Info Public","description":"Get video information without downloading (PUBLIC ACCESS)\n\nExtract basic metadata including:\n- Title, description, uploader\n- Duration, view count, upload date\n- Available format information (MP4/MP3/WAV/M4A)\n\nNo authentication required. Rate limited to 20 requests per minute per IP.\nSupported: YouTube only (youtube.com, youtu.be, youtube-nocookie.com).\n\n**Flow:**\n- Cached results return **200** instantly (<100ms)\n- Otherwise the extraction is queued and this returns **202** with a\n  `job_id` and `poll_url`; poll `GET /public/info/status/{job_id}` every\n  1-2 seconds — it answers 202 while extracting and 200 with the metadata\n  when done (typically 5-15 seconds, 45 seconds max)","operationId":"legacy_get_video_info_public","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoInfoRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"legacy_get_video_info_public_api_v1_video_public_info_post"}},"/api/v1/video/public/download":{"post":{"tags":["media-extraction"],"summary":"Legacy Create Download Job Public","description":"Create a video download job (PUBLIC ACCESS)\n\nDownload videos with limitations:\n- Maximum 5 minutes duration\n- Maximum 100MB file size\n- Limited formats: MP4, MP3, WAV, M4A\n- Maximum 5 downloads per day (friendly error message when exceeded)\n- No premium features\n- No credit deduction\n\nA free account raises this to 10 downloads a day and videos up to 10\nminutes. Past that, downloads are metered at 100 credits per minute.\n\n🔒 **Advanced Multi-Layer Protection:**\n- IP-based rate limiting (5/min, 5/day per IP)\n- Device fingerprinting (5/day per device)\n- Composite tracking (IP + device combination)\n- Automated abuse detection (VPN/proxy rotation)\n- Bot detection via User-Agent analysis\n\nBypassing these limits will result in temporary blocks.\n\n⚡ **Performance Note:**\nThis endpoint returns immediately; the job is recorded asynchronously.","operationId":"legacy_create_download_job_public","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoDownloadRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoDownloadResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"legacy_create_download_job_public_api_v1_video_public_download_post"}},"/api/v1/video/jobs/{job_id}":{"get":{"tags":["media-extraction"],"summary":"Legacy Get Download Job","description":"Get specific download job details\n\nReturns complete job information including:\n- Current status and progress\n- Download URLs for completed jobs\n- Error details for failed jobs\n- Processing metadata","operationId":"legacy_get_download_job","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","description":"Job ID","title":"Job Id"},"description":"Job ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoDownloadJob"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"legacy_get_download_job_api_v1_video_jobs__job_id__get"}},"/api/v1/video/jobs":{"get":{"tags":["media-extraction"],"summary":"Legacy List Download Jobs","description":"List user's video download jobs\n\nReturns paginated list with optional filtering by:\n- Status (PENDING, PROCESSING, COMPLETED, FAILED)\n- Platform (youtube, tiktok, instagram, etc.)\n\nIncludes job progress and download URLs for completed jobs.","operationId":"legacy_list_download_jobs","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page number","default":1,"title":"Page"},"description":"Page number"},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Items per page","default":20,"title":"Per Page"},"description":"Items per page"},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/ProcessingStatus"},{"type":"null"}],"description":"Filter by status","title":"Status"},"description":"Filter by status"},{"name":"platform","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/VideoPlatform"},{"type":"null"}],"description":"Filter by platform","title":"Platform"},"description":"Filter by platform"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoDownloadListResponse"}}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"x-original-operation-id":"legacy_list_download_jobs_api_v1_video_jobs_get"}}},"components":{"schemas":{"ACXComplianceCheck":{"properties":{"is_compliant":{"type":"boolean","title":"Is Compliant"},"issues":{"items":{"type":"string"},"type":"array","title":"Issues"},"warnings":{"items":{"type":"string"},"type":"array","title":"Warnings"},"file_format_ok":{"type":"boolean","title":"File Format Ok"},"audio_levels_ok":{"type":"boolean","title":"Audio Levels Ok"},"silence_requirements_ok":{"type":"boolean","title":"Silence Requirements Ok"},"file_naming_ok":{"type":"boolean","title":"File Naming Ok"},"duration_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Duration Seconds"}},"type":"object","required":["is_compliant","issues","warnings","file_format_ok","audio_levels_ok","silence_requirements_ok","file_naming_ok"],"title":"ACXComplianceCheck"},"ACXExportRequest":{"properties":{"include_chapters":{"anyOf":[{"items":{"type":"string","format":"uuid"},"type":"array"},{"type":"null"}],"title":"Include Chapters","description":"Specific chapters to include. Omit to package the whole book; an empty list is refused with 400 (code empty_selection)."},"custom_settings":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Custom Settings","description":"Custom export settings"},"acknowledge_narration_gaps":{"type":"boolean","title":"Acknowledge Narration Gaps","description":"Export even though some paragraphs are flagged as possibly missing words in their narration.","default":false},"metadata":{"anyOf":[{"$ref":"#/components/schemas/BookMetadataInput"},{"type":"null"}],"description":"Book metadata to save and write into the package (ISBN, genre, publisher, narrator, rights, series, keywords)."}},"type":"object","title":"ACXExportRequest"},"ACXExportResponse":{"properties":{"job_id":{"type":"integer","title":"Job Id"},"reused":{"type":"boolean","title":"Reused","default":false},"estimated_completion_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Estimated Completion Time"},"compliance_check":{"$ref":"#/components/schemas/ACXComplianceCheck"},"credits_tts_cost":{"type":"integer","title":"Credits Tts Cost","default":0}},"type":"object","required":["job_id","estimated_completion_time","compliance_check"],"title":"ACXExportResponse"},"APIKeyCreate":{"properties":{"name":{"type":"string","title":"Name"},"scopes":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Scopes"},"expires_in_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Expires In Days"}},"type":"object","required":["name"],"title":"APIKeyCreate"},"APIKeyResponse":{"properties":{"id":{"type":"string","format":"uuid4","title":"Id"},"name":{"type":"string","title":"Name"},"api_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"},"scopes":{"items":{"type":"string"},"type":"array","title":"Scopes"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"last_used_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used At"},"revoked_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Revoked At"},"suspended_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Suspended At"},"suspension_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Suspension Reason"}},"type":"object","required":["id","name","scopes","created_at"],"title":"APIKeyResponse"},"AddTracksRequest":{"properties":{"tracks":{"items":{"$ref":"#/components/schemas/TrackDescriptor"},"type":"array","title":"Tracks"}},"type":"object","title":"AddTracksRequest"},"AffiliateAdminResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"user_id":{"type":"string","format":"uuid","title":"User Id"},"affiliate_code":{"type":"string","title":"Affiliate Code"},"status":{"$ref":"#/components/schemas/AffiliateStatusEnum"},"company_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Name"},"website_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website Url"},"marketing_channels":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Marketing Channels"},"expected_monthly_referrals":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Expected Monthly Referrals"},"twitter_handle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Twitter Handle"},"youtube_handle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Youtube Handle"},"instagram_handle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Instagram Handle"},"linkedin_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Linkedin Url"},"tiktok_handle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tiktok Handle"},"audience_size":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Audience Size"},"commission_rate":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Commission Rate"},"commission_duration_months":{"type":"integer","title":"Commission Duration Months"},"total_clicks":{"type":"integer","title":"Total Clicks","default":0},"total_signups":{"type":"integer","title":"Total Signups","default":0},"total_conversions":{"type":"integer","title":"Total Conversions","default":0},"total_commission_earned":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Total Commission Earned","default":"0.00"},"total_commission_paid":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Total Commission Paid","default":"0.00"},"conversion_rate":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Conversion Rate","default":"0.0000"},"approved_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Approved At"},"rejection_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rejection Reason"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"last_activity_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Activity At"},"paypal_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Paypal Email"},"stripe_account_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stripe Account Id"},"tax_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tax Id"},"address_line1":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address Line1"},"address_line2":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address Line2"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"state":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"},"postal_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Postal Code"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"},"application_notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Application Notes"},"approved_by":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Approved By"}},"type":"object","required":["id","user_id","affiliate_code","status","commission_rate","commission_duration_months","created_at","updated_at"],"title":"AffiliateAdminResponse","description":"Extended affiliate response for admin users"},"AffiliateAnalytics":{"properties":{"affiliate_id":{"type":"string","format":"uuid","title":"Affiliate Id"},"affiliate_code":{"type":"string","title":"Affiliate Code"},"total_metrics":{"$ref":"#/components/schemas/PerformanceMetrics"},"monthly_metrics":{"items":{"$ref":"#/components/schemas/PerformanceMetrics"},"type":"array","title":"Monthly Metrics"},"top_campaigns":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Top Campaigns"},"recent_events":{"items":{"$ref":"#/components/schemas/TrackingEventResponse"},"type":"array","title":"Recent Events"},"recent_commissions":{"items":{"$ref":"#/components/schemas/CommissionResponse"},"type":"array","title":"Recent Commissions"}},"type":"object","required":["affiliate_id","affiliate_code","total_metrics","monthly_metrics","top_campaigns","recent_events","recent_commissions"],"title":"AffiliateAnalytics","description":"Comprehensive analytics for an affiliate"},"AffiliateApproval":{"properties":{"action":{"type":"string","pattern":"^(approve|reject)$","title":"Action"},"commission_rate":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Commission Rate"},"commission_duration_months":{"anyOf":[{"type":"integer","maximum":60.0,"minimum":1.0},{"type":"null"}],"title":"Commission Duration Months"},"rejection_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rejection Reason"},"admin_notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Admin Notes"}},"type":"object","required":["action"],"title":"AffiliateApproval","description":"Schema for affiliate approval/rejection"},"AffiliateCreate":{"properties":{"company_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Name"},"website_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website Url"},"marketing_channels":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Marketing Channels"},"expected_monthly_referrals":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Expected Monthly Referrals"},"application_notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Application Notes"},"twitter_handle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Twitter Handle"},"youtube_handle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Youtube Handle"},"instagram_handle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Instagram Handle"},"linkedin_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Linkedin Url"},"tiktok_handle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tiktok Handle"},"audience_size":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Audience Size"},"terms_accepted":{"type":"boolean","title":"Terms Accepted","description":"Must accept terms and conditions"}},"type":"object","required":["terms_accepted"],"title":"AffiliateCreate","description":"Schema for creating affiliate applications"},"AffiliateResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"user_id":{"type":"string","format":"uuid","title":"User Id"},"affiliate_code":{"type":"string","title":"Affiliate Code"},"status":{"$ref":"#/components/schemas/AffiliateStatusEnum"},"company_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Name"},"website_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website Url"},"marketing_channels":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Marketing Channels"},"expected_monthly_referrals":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Expected Monthly Referrals"},"twitter_handle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Twitter Handle"},"youtube_handle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Youtube Handle"},"instagram_handle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Instagram Handle"},"linkedin_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Linkedin Url"},"tiktok_handle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tiktok Handle"},"audience_size":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Audience Size"},"commission_rate":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Commission Rate"},"commission_duration_months":{"type":"integer","title":"Commission Duration Months"},"total_clicks":{"type":"integer","title":"Total Clicks","default":0},"total_signups":{"type":"integer","title":"Total Signups","default":0},"total_conversions":{"type":"integer","title":"Total Conversions","default":0},"total_commission_earned":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Total Commission Earned","default":"0.00"},"total_commission_paid":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Total Commission Paid","default":"0.00"},"conversion_rate":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Conversion Rate","default":"0.0000"},"approved_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Approved At"},"rejection_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rejection Reason"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"last_activity_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Activity At"}},"type":"object","required":["id","user_id","affiliate_code","status","commission_rate","commission_duration_months","created_at","updated_at"],"title":"AffiliateResponse","description":"Schema for affiliate responses"},"AffiliateSettingsResponse":{"properties":{"is_program_active":{"type":"boolean","title":"Is Program Active"},"auto_approve_affiliates":{"type":"boolean","title":"Auto Approve Affiliates"},"default_commission_rate":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Default Commission Rate"},"default_commission_duration_months":{"type":"integer","title":"Default Commission Duration Months"},"minimum_payout_amount":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Minimum Payout Amount"},"cookie_duration_days":{"type":"integer","title":"Cookie Duration Days"},"commission_hold_days":{"type":"integer","title":"Commission Hold Days"},"attribution_model":{"type":"string","title":"Attribution Model"},"allow_self_referrals":{"type":"boolean","title":"Allow Self Referrals"},"program_name":{"type":"string","title":"Program Name"},"current_terms_version":{"type":"string","title":"Current Terms Version"}},"type":"object","required":["is_program_active","auto_approve_affiliates","default_commission_rate","default_commission_duration_months","minimum_payout_amount","cookie_duration_days","commission_hold_days","attribution_model","allow_self_referrals","program_name","current_terms_version"],"title":"AffiliateSettingsResponse","description":"Schema for affiliate program settings"},"AffiliateSettingsUpdate":{"properties":{"is_program_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Program Active"},"auto_approve_affiliates":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Auto Approve Affiliates"},"default_commission_rate":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Default Commission Rate"},"default_commission_duration_months":{"anyOf":[{"type":"integer","maximum":60.0,"minimum":1.0},{"type":"null"}],"title":"Default Commission Duration Months"},"minimum_payout_amount":{"anyOf":[{"type":"number","minimum":0.0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Minimum Payout Amount"},"cookie_duration_days":{"anyOf":[{"type":"integer","maximum":365.0,"minimum":1.0},{"type":"null"}],"title":"Cookie Duration Days"},"commission_hold_days":{"anyOf":[{"type":"integer","maximum":90.0,"minimum":0.0},{"type":"null"}],"title":"Commission Hold Days"},"allow_self_referrals":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Allow Self Referrals"},"program_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Program Name"}},"type":"object","title":"AffiliateSettingsUpdate","description":"Schema for updating affiliate program settings"},"AffiliateStatus":{"type":"string","enum":["pending","active","suspended","terminated","rejected"],"title":"AffiliateStatus","description":"Affiliate account status"},"AffiliateStatusEnum":{"type":"string","enum":["pending","active","suspended","terminated","rejected"],"title":"AffiliateStatusEnum"},"AffiliateUpdate":{"properties":{"company_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Name"},"website_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website Url"},"marketing_channels":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Marketing Channels"},"twitter_handle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Twitter Handle"},"youtube_handle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Youtube Handle"},"instagram_handle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Instagram Handle"},"linkedin_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Linkedin Url"},"tiktok_handle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tiktok Handle"},"audience_size":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Audience Size"},"paypal_email":{"anyOf":[{"type":"string","format":"email"},{"type":"null"}],"title":"Paypal Email"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"}},"type":"object","title":"AffiliateUpdate","description":"Schema for updating affiliate information"},"AgentBatchStatusRequest":{"properties":{"jobs":{"items":{"$ref":"#/components/schemas/_BatchStatusItem"},"type":"array","title":"Jobs"}},"type":"object","required":["jobs"],"title":"AgentBatchStatusRequest"},"AgentChatRequest":{"properties":{"session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id"},"message":{"type":"string","maxLength":20000,"title":"Message"},"attachments":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array","maxItems":10},{"type":"null"}],"title":"Attachments"},"request_id":{"anyOf":[{"type":"string","maxLength":80,"minLength":16,"pattern":"^[A-Za-z0-9_-]+$"},{"type":"null"}],"title":"Request Id"}},"type":"object","required":["message"],"title":"AgentChatRequest","description":"Chat request to the audio agent"},"AgentMemoryRequest":{"properties":{"category":{"type":"string","title":"Category"},"value":{"type":"string","maxLength":1000,"minLength":1,"title":"Value"},"revision":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Revision"}},"type":"object","required":["category","value"],"title":"AgentMemoryRequest"},"AgentMemorySettings":{"properties":{"enabled":{"type":"boolean","title":"Enabled"}},"type":"object","required":["enabled"],"title":"AgentMemorySettings"},"AgentSessionResponse":{"properties":{"session_id":{"type":"string","title":"Session Id"},"message":{"type":"string","title":"Message"}},"type":"object","required":["session_id","message"],"title":"AgentSessionResponse","description":"Response when creating a new session"},"AgentSynthesizeRequest":{"properties":{"text":{"type":"string","maxLength":1000,"minLength":1,"title":"Text","description":"Text to synthesize. Supports paralinguistic tags like [laugh], [sigh]."},"voice_id":{"anyOf":[{"type":"integer"},{"type":"string"}],"title":"Voice Id","description":"Voice ID (integer), UUID, or name of a stored voice."}},"type":"object","required":["text","voice_id"],"title":"AgentSynthesizeRequest","description":"Request for Voice AI Agent TTS using our fast English voice engine.\n\nSupports paralinguistic tags: [laugh], [sigh], [cough], [chuckle], [gasp], [groan], [yawn].","example":{"text":"Hello! [laugh] How can I help you today?","voice_id":"my-agent-voice"}},"AgentSynthesizeResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"output_url":{"type":"string","title":"Output Url","description":"URL to the generated audio file"},"processing_time_ms":{"type":"integer","title":"Processing Time Ms","description":"Server-side processing time in milliseconds"},"job_id":{"type":"string","title":"Job Id","description":"Ephemeral job ID for this request (not persisted)"}},"type":"object","required":["success","output_url","processing_time_ms","job_id"],"title":"AgentSynthesizeResponse","description":"Response from Voice AI Agent TTS synthesis."},"AgentTurnRequest":{"properties":{"request_id":{"type":"string","maxLength":80,"minLength":16,"pattern":"^[A-Za-z0-9_-]+$","title":"Request Id"},"message":{"type":"string","maxLength":20000,"title":"Message"},"attachment_ids":{"items":{"type":"string","format":"uuid"},"type":"array","maxItems":10,"title":"Attachment Ids"}},"type":"object","required":["request_id","message"],"title":"AgentTurnRequest"},"AgentUploadRegisterRequest":{"properties":{"upload_id":{"type":"string","title":"Upload Id","description":"The upload_id returned by POST /api/v1/uploads/presign"},"session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id"}},"type":"object","required":["upload_id"],"title":"AgentUploadRegisterRequest"},"AgentUploadResponse":{"properties":{"file_id":{"type":"string","title":"File Id"},"filename":{"type":"string","title":"Filename"},"url":{"type":"string","title":"Url"},"content_type":{"type":"string","title":"Content Type"}},"type":"object","required":["file_id","filename","url","content_type"],"title":"AgentUploadResponse","description":"Response after uploading a file"},"AnalysisRequest":{"properties":{"upload_id":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Upload Id","description":"Identifier returned when your upload completed."},"source_url":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Source Url","description":"Link to a video to clip, instead of uploading a file."},"original_filename":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Original Filename"},"analysis_start_s":{"type":"number","minimum":0.0,"title":"Analysis Start S","description":"Start of the span to analyse, in seconds.","default":0.0},"analysis_end_s":{"anyOf":[{"type":"number","exclusiveMinimum":0.0},{"type":"null"}],"title":"Analysis End S","description":"End of the span to analyse. Defaults to the full source."},"content_type_hint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Type Hint","description":"Content preference for selecting moments, such as educational explanations or complete interview exchanges. Leave unset for automatic selection."},"source_language":{"anyOf":[{"type":"string","maxLength":8},{"type":"null"}],"title":"Source Language","description":"Spoken language of the source, as an ISO code. Leave unset to detect it automatically."},"length_preset":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Length Preset","description":"Target clip length band."},"clips_requested":{"anyOf":[{"type":"integer","maximum":20.0,"minimum":1.0},{"type":"null"}],"title":"Clips Requested","description":"How many clips to return. Capped by your plan."},"captions_enabled":{"type":"boolean","title":"Captions Enabled","default":true},"template_slug":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Template Slug"},"rights_attested":{"type":"boolean","title":"Rights Attested","description":"You confirm you own this content or have the right to clip it.","default":false},"idempotencyKey":{"type":"string","maxLength":128,"minLength":1,"pattern":"^[A-Za-z0-9_-]+$","title":"Idempotencykey"},"quotedCredits":{"type":"integer","minimum":0.0,"title":"Quotedcredits"},"quoteIsCeiling":{"type":"boolean","title":"Quoteisceiling","default":false}},"additionalProperties":false,"type":"object","required":["idempotencyKey","quotedCredits"],"title":"AnalysisRequest"},"AnalyzeResponse":{"properties":{"tracks":{"items":{"$ref":"#/components/schemas/AnalyzeTrackResult"},"type":"array","title":"Tracks"}},"type":"object","title":"AnalyzeResponse"},"AnalyzeTrackResult":{"properties":{"queue_index":{"type":"integer","title":"Queue Index"},"track_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Track Id"},"status":{"type":"string","title":"Status"},"bpm":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Bpm"},"camelot":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Camelot"}},"type":"object","required":["queue_index","status"],"title":"AnalyzeTrackResult"},"AttributeSourceRequest":{"properties":{"referral_source":{"type":"string","maxLength":100,"minLength":1,"title":"Referral Source","description":"The stored first-touch referral source (host + optional UTM)."}},"type":"object","required":["referral_source"],"title":"AttributeSourceRequest"},"AudioAnalyzeRequest":{"properties":{"audio_url":{"type":"string","maxLength":2048,"minLength":1,"title":"Audio Url","description":"URL to audio file to analyze"},"audio_codes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Audio Codes","description":"Pre-extracted audio semantic codes (advanced)"},"temperature":{"type":"number","maximum":2.0,"minimum":0.0,"title":"Temperature","description":"LM sampling temperature","default":0.85}},"type":"object","required":["audio_url"],"title":"AudioAnalyzeRequest","description":"Request for audio analysis - extract metadata from existing audio.\n\nAnalyzes audio codes and extracts:\n- Caption/description\n- Lyrics (transcribed)\n- BPM\n- Key/scale\n- Duration\n- Language"},"AudioAnalyzeResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"caption":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Caption","description":"Generated description of the audio"},"lyrics":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lyrics","description":"Transcribed/detected lyrics"},"bpm":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Bpm","description":"Detected BPM"},"keyscale":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Keyscale","description":"Detected musical key"},"timesignature":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Timesignature","description":"Detected time signature"},"duration":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Duration","description":"Audio duration in seconds"},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language","description":"Detected vocal language"},"audio_codes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Audio Codes","description":"Extracted audio semantic codes"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"Error message if failed"}},"type":"object","required":["success"],"title":"AudioAnalyzeResponse","description":"Response for audio analysis"},"AudioFormat-Output":{"type":"string","enum":["mp3","wav","aac","flac","ogg","opus","m4a","wma","aiff"],"title":"AudioFormat","description":"Supported audio output formats"},"AudioGenerateRequest":{"properties":{"regenerate_all":{"type":"boolean","title":"Regenerate All","description":"Regenerate all clips even if some exist","default":false}},"type":"object","title":"AudioGenerateRequest","description":"Request to start audio generation."},"AudioGenerateResponse":{"properties":{"job_id":{"type":"string","title":"Job Id","description":"Background job ID"},"dialogues_to_generate":{"type":"integer","title":"Dialogues To Generate","description":"Number of dialogues to generate"}},"type":"object","required":["job_id","dialogues_to_generate"],"title":"AudioGenerateResponse","description":"Response from audio generation start."},"AudioQuality":{"type":"string","enum":["low","medium","high","very_high","lossless"],"title":"AudioQuality","description":"Audio quality presets"},"AudioSource":{"type":"string","enum":["FILE","URL"],"title":"AudioSource"},"AudioUsage":{"type":"string","enum":["personal","creator","business","voice_actor","education","engineer","marketer","other","content_creator","audiobook","music_producer","transcription","voice_work","developer","exploring"],"title":"AudioUsage"},"AudiobookChapterCreate":{"properties":{"chapter_number":{"type":"integer","maximum":100.0,"minimum":1.0,"title":"Chapter Number"},"title":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Title"},"subtitle":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Subtitle"},"content":{"type":"string","minLength":1,"title":"Content","description":"Chapter text content"},"skip_narration":{"type":"boolean","title":"Skip Narration","description":"Skip this chapter in narration","default":false},"voice_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Voice Id","description":"Override voice for this chapter"},"narration_notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Narration Notes","description":"Special narration instructions"}},"type":"object","required":["chapter_number","content"],"title":"AudiobookChapterCreate"},"AudiobookChapterResponse":{"properties":{"chapter_number":{"type":"integer","maximum":100.0,"minimum":1.0,"title":"Chapter Number"},"title":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Title"},"subtitle":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Subtitle"},"content":{"type":"string","minLength":1,"title":"Content","description":"Chapter text content"},"section_kind":{"type":"string","title":"Section Kind","default":"chapter"},"exclusion_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Exclusion Reason"},"id":{"type":"string","format":"uuid","title":"Id"},"project_id":{"type":"string","format":"uuid","title":"Project Id"},"word_count":{"type":"integer","title":"Word Count"},"character_count":{"type":"integer","title":"Character Count"},"estimated_duration_minutes":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Estimated Duration Minutes"},"audio_file_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Audio File Path"},"duration_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Duration Seconds"},"status":{"type":"string","title":"Status"},"state_version":{"type":"integer","title":"State Version","description":"Monotonic version of this record. It increases whenever the record's status, audio, review state or text changes, and equals the id of the matching event on the project's event stream. Keep the higher one.","default":0},"processing_started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Processing Started At"},"processing_completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Processing Completed At"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"retry_count":{"type":"integer","title":"Retry Count"},"audio_levels":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Audio Levels"},"acx_compliance":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Acx Compliance"},"skip_narration":{"type":"boolean","title":"Skip Narration"},"voice_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Voice Id"},"narration_notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Narration Notes"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"r2_purged_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"R2 Purged At"}},"type":"object","required":["chapter_number","content","id","project_id","word_count","character_count","estimated_duration_minutes","audio_file_path","duration_seconds","status","processing_started_at","processing_completed_at","error_message","retry_count","audio_levels","acx_compliance","skip_narration","voice_id","narration_notes","created_at","updated_at"],"title":"AudiobookChapterResponse"},"AudiobookChapterSelectionChange":{"properties":{"chapter_id":{"type":"string","format":"uuid","title":"Chapter Id"},"skip_narration":{"type":"boolean","title":"Skip Narration","description":"True leaves the chapter out of narration; false includes it."}},"type":"object","required":["chapter_id","skip_narration"],"title":"AudiobookChapterSelectionChange"},"AudiobookChapterSelectionUpdate":{"properties":{"changes":{"items":{"$ref":"#/components/schemas/AudiobookChapterSelectionChange"},"type":"array","maxItems":1000,"minItems":1,"title":"Changes"}},"type":"object","required":["changes"],"title":"AudiobookChapterSelectionUpdate","description":"Include or leave out several chapters at once (WEB-1099)."},"AudiobookChapterUpdate":{"properties":{"title":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Title"},"replace_content":{"type":"boolean","title":"Replace Content","description":"Re-split paragraphs from the supplied content, including when the text is unchanged. Paragraphs whose text is unchanged keep their audio.","default":false},"subtitle":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Subtitle"},"content":{"anyOf":[{"type":"string","minLength":1},{"type":"null"}],"title":"Content"},"skip_narration":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Skip Narration"},"voice_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Voice Id"},"narration_notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Narration Notes"}},"type":"object","title":"AudiobookChapterUpdate"},"AudiobookCheckoutContext":{"properties":{"project_id":{"type":"string","format":"uuid","title":"Project Id"},"approval_id":{"type":"string","format":"uuid","title":"Approval Id"},"pending_start_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Pending Start Id"}},"type":"object","required":["project_id","approval_id"],"title":"AudiobookCheckoutContext","description":"Optional: the audiobook a checkout is funding. Copied into the\npayment's metadata as a routing and analytics hint -- never authority.\nThe book starts because the balance covers it, not because of this."},"AudiobookMediaResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"project_id":{"type":"string","format":"uuid","title":"Project Id"},"filename":{"type":"string","title":"Filename"},"original_filename":{"type":"string","title":"Original Filename"},"file_path":{"type":"string","title":"File Path"},"file_type":{"type":"string","title":"File Type"},"file_size_bytes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"File Size Bytes"},"duration_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Duration Seconds"},"sample_rate":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sample Rate"},"bit_rate":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Bit Rate"},"channels":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Channels"},"media_type":{"type":"string","title":"Media Type"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags"},"usage_count":{"type":"integer","title":"Usage Count"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","project_id","filename","original_filename","file_path","file_type","file_size_bytes","duration_seconds","sample_rate","bit_rate","channels","media_type","tags","usage_count","created_at","updated_at"],"title":"AudiobookMediaResponse"},"AudiobookParagraphNarrateRequest":{"properties":{"voice_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Voice Id"},"text_override":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Text Override"},"narration_speed":{"anyOf":[{"type":"number","maximum":2.0,"minimum":0.5},{"type":"null"}],"title":"Narration Speed"},"narration_style":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Narration Style"},"emotion":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Emotion"},"character_name":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Character Name"},"direction":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Direction"},"language":{"anyOf":[{"type":"string","maxLength":16},{"type":"null"}],"title":"Language","description":"ISO 639-1 override; defaults to the project language"},"mode":{"type":"string","enum":["auto","sentence","passage"],"title":"Mode","description":"How an edited, previously narrated passage is narrated, where available. 'auto' narrates only the changed sentences when the edit is small enough, and bills only those characters; otherwise the whole passage. 'sentence' requires that, and returns 409 (code sentence_mode_unavailable, with a reason) when it is not possible. 'passage' always narrates the whole passage.","default":"auto"}},"type":"object","title":"AudiobookParagraphNarrateRequest"},"AudiobookParagraphResponse":{"properties":{"narration_execution":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Narration Execution"},"id":{"type":"string","format":"uuid","title":"Id"},"chapter_id":{"type":"string","format":"uuid","title":"Chapter Id"},"project_id":{"type":"string","format":"uuid","title":"Project Id"},"position":{"type":"integer","title":"Position"},"text":{"type":"string","title":"Text"},"word_count":{"type":"integer","title":"Word Count"},"character_count":{"type":"integer","title":"Character Count"},"voice_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Voice Id"},"narration_speed":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Narration Speed"},"narration_style":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Narration Style"},"emotion":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Emotion"},"character_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Character Name"},"direction":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Direction"},"pause_after_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Pause After Ms"},"review_flags":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Review Flags"},"audio_file_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Audio File Path"},"duration_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Duration Seconds"},"edit_base_take_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Edit Base Take Id"},"status":{"type":"string","title":"Status"},"locked":{"type":"boolean","title":"Locked"},"skip_narration":{"type":"boolean","title":"Skip Narration"},"state_version":{"type":"integer","title":"State Version","description":"Monotonic version of this record. It increases whenever the record's status, audio, review state or text changes, and equals the id of the matching event on the project's event stream. Keep the higher one.","default":0},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"retry_count":{"type":"integer","title":"Retry Count"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"warnings":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Warnings"}},"type":"object","required":["id","chapter_id","project_id","position","text","word_count","character_count","voice_id","narration_speed","narration_style","audio_file_path","duration_seconds","status","locked","skip_narration","error_message","retry_count","created_at","updated_at"],"title":"AudiobookParagraphResponse"},"AudiobookParagraphTakeResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"paragraph_id":{"type":"string","format":"uuid","title":"Paragraph Id"},"take_number":{"type":"integer","title":"Take Number"},"text":{"type":"string","title":"Text"},"voice_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Voice Id"},"narration_speed":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Narration Speed"},"narration_style":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Narration Style"},"audio_file_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Audio File Path"},"duration_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Duration Seconds"},"processing_metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Processing Metadata"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"kind":{"type":"string","enum":["full","spliced","splice_fallback"],"title":"Kind","description":"How this take was made: 'full' narrated the whole passage; 'spliced' narrated only the changed sentences of an edit into base_take_id; 'splice_fallback' was an edit narrated as the whole passage so the change blends in.","default":"full"},"base_take_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Base Take Id","description":"The take an edit was made on (spliced and splice_fallback takes)."},"changed_ranges":{"anyOf":[{"items":{"items":{"type":"integer"},"type":"array"},"type":"array"},{"type":"null"}],"title":"Changed Ranges","description":"Character ranges [start, end) of this take's text that were newly narrated (spliced takes only)."}},"type":"object","required":["id","paragraph_id","take_number","text","voice_id","narration_speed","narration_style","audio_file_path","duration_seconds","created_at"],"title":"AudiobookParagraphTakeResponse"},"AudiobookParagraphUpdate":{"properties":{"text":{"anyOf":[{"type":"string","minLength":1},{"type":"null"}],"title":"Text"},"voice_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Voice Id"},"narration_speed":{"anyOf":[{"type":"number","maximum":2.0,"minimum":0.5},{"type":"null"}],"title":"Narration Speed"},"narration_style":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Narration Style"},"emotion":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Emotion"},"character_name":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Character Name"},"direction":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Direction"},"pause_after_ms":{"anyOf":[{"type":"integer","maximum":10000.0,"minimum":0.0},{"type":"null"}],"title":"Pause After Ms"},"review_flags":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Review Flags"},"locked":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Locked"},"skip_narration":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Skip Narration"}},"type":"object","title":"AudiobookParagraphUpdate"},"AudiobookProjectCreate":{"properties":{"title":{"type":"string","maxLength":200,"minLength":1,"title":"Title","description":"Audiobook title"},"description":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Description","description":"Project description"},"author":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Author","description":"Author name"},"isbn":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Isbn","description":"ISBN if available"},"genre":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Genre","description":"Book genre"},"selected_voice_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Selected Voice Id","description":"Voice ID for narration"},"language":{"anyOf":[{"type":"string","maxLength":16},{"type":"null"}],"title":"Language","description":"Spoken language of the book as an ISO 639-1 code ('en', 'it'); a region suffix ('it-IT') is accepted and normalized. Every narration and regeneration for this project inherits it. Omit or send 'auto' to have it detected from the manuscript."},"narration_speed":{"type":"number","maximum":2.0,"minimum":0.5,"title":"Narration Speed","description":"Speech speed multiplier","default":1.0},"narration_style":{"type":"string","title":"Narration Style","description":"Narration style","default":"narrative"},"export_format":{"type":"string","title":"Export Format","description":"Export format","default":"acx"},"target_platform":{"type":"string","title":"Target Platform","description":"Target platform","default":"audible"},"source_type":{"type":"string","title":"Source Type","description":"Project source: upload, paste, or generated","default":"upload"},"auto_regenerate_on_edit":{"type":"boolean","title":"Auto Regenerate On Edit","description":"Descript-style: auto-regenerate paragraph audio after a debounced text edit","default":false},"narration_review_policy":{"anyOf":[{"type":"string","enum":["manual","auto_accept"]},{"type":"null"}],"title":"Narration Review Policy","description":"What happens to a passage our narration check cannot confirm after its retry: 'manual' holds it for your approval (the chapter waits on it), 'auto_accept' keeps the best render and counts it under `quality_notes`, so the book never blocks. Omitted: 'auto_accept' when you authenticate with an API key, 'manual' in the Studio. Automated pipelines should use 'auto_accept'."}},"type":"object","required":["title"],"title":"AudiobookProjectCreate"},"AudiobookProjectResponse":{"properties":{"title":{"type":"string","maxLength":200,"minLength":1,"title":"Title","description":"Audiobook title"},"description":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Description","description":"Project description"},"author":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Author","description":"Author name"},"isbn":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Isbn","description":"ISBN if available"},"genre":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Genre","description":"Book genre"},"id":{"type":"string","format":"uuid","title":"Id"},"user_id":{"type":"string","format":"uuid","title":"User Id"},"status":{"type":"string","title":"Status"},"export_input_revision":{"type":"integer","title":"Export Input Revision","default":0},"state_version":{"type":"integer","title":"State Version","description":"Monotonic version of this record. It increases whenever the record's status, audio, review state or text changes, and equals the id of the matching event on the project's event stream. Keep the higher one.","default":0},"total_chapters":{"type":"integer","title":"Total Chapters"},"estimated_duration_minutes":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Estimated Duration Minutes"},"manuscript_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Manuscript Filename"},"manuscript_format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Manuscript Format"},"manuscript_word_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Manuscript Word Count"},"rights_attested_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Rights Attested At"},"source_type":{"type":"string","title":"Source Type","default":"upload"},"selected_voice_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Selected Voice Id"},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language"},"narration_speed":{"type":"number","title":"Narration Speed"},"narration_style":{"type":"string","title":"Narration Style"},"narration_brief":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Narration Brief"},"export_format":{"type":"string","title":"Export Format"},"target_platform":{"type":"string","title":"Target Platform"},"auto_regenerate_on_edit":{"type":"boolean","title":"Auto Regenerate On Edit","default":false},"multi_voice":{"type":"boolean","title":"Multi Voice","default":false},"narration_review_policy":{"type":"string","enum":["manual","auto_accept"],"title":"Narration Review Policy","default":"manual"},"book_metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Book Metadata"},"generation_metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Generation Metadata"},"parsing_completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Parsing Completed At"},"narration_started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Narration Started At"},"narration_completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Narration Completed At"},"production_completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Production Completed At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"deleted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Deleted At"},"r2_purged_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"R2 Purged At"},"last_downloaded_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Downloaded At"},"download_count":{"type":"integer","title":"Download Count","default":0},"selected_voice_display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Selected Voice Display Name"},"lifecycle":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Lifecycle"},"edit_lock":{"anyOf":[{"$ref":"#/components/schemas/BookLockState"},{"type":"null"}]},"voice_auto_selected":{"type":"boolean","title":"Voice Auto Selected","default":false},"pending_notices":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Pending Notices"},"cover_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cover Url"},"cover_thumb_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cover Thumb Url"},"cover_source":{"anyOf":[{"type":"string","enum":["upload","file","isbn_lookup","generated"]},{"type":"null"}],"title":"Cover Source"},"metadata_sources":{"additionalProperties":{"type":"string","enum":["file","isbn_lookup"]},"type":"object","title":"Metadata Sources"}},"type":"object","required":["title","id","user_id","status","total_chapters","estimated_duration_minutes","manuscript_filename","manuscript_format","manuscript_word_count","selected_voice_id","narration_speed","narration_style","export_format","target_platform","parsing_completed_at","narration_started_at","narration_completed_at","production_completed_at","created_at","updated_at"],"title":"AudiobookProjectResponse"},"AudiobookProjectUpdate":{"properties":{"title":{"anyOf":[{"type":"string","maxLength":200,"minLength":1},{"type":"null"}],"title":"Title"},"description":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Description"},"author":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Author"},"isbn":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Isbn"},"genre":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Genre"},"selected_voice_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Selected Voice Id"},"language":{"anyOf":[{"type":"string","maxLength":16},{"type":"null"}],"title":"Language","description":"Spoken language (ISO 639-1, e.g. 'it'); applies to future narration"},"narration_speed":{"anyOf":[{"type":"number","maximum":2.0,"minimum":0.5},{"type":"null"}],"title":"Narration Speed"},"narration_style":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Narration Style"},"narration_brief":{"anyOf":[{"type":"string","maxLength":600},{"type":"null"}],"title":"Narration Brief"},"export_format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Export Format"},"target_platform":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Platform"},"source_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Type"},"auto_regenerate_on_edit":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Auto Regenerate On Edit"},"multi_voice":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Multi Voice","description":"Give each character their own voice: a character's lines take the voice on the book's cast instead of the narrator's. Turning it on gives every known character a library voice at no cost. Omit to leave it as it is; new books start with it off."},"narration_review_policy":{"anyOf":[{"type":"string","enum":["manual","auto_accept"]},{"type":"null"}],"title":"Narration Review Policy","description":"What happens to a passage our narration check cannot confirm after its retry: 'manual' holds it for your review (the book waits on it), 'auto_accept' keeps the best render and flags it, so the book never blocks."}},"type":"object","title":"AudiobookProjectUpdate"},"AudiobookProjectWithChaptersResponse":{"properties":{"title":{"type":"string","maxLength":200,"minLength":1,"title":"Title","description":"Audiobook title"},"description":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Description","description":"Project description"},"author":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Author","description":"Author name"},"isbn":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Isbn","description":"ISBN if available"},"genre":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Genre","description":"Book genre"},"id":{"type":"string","format":"uuid","title":"Id"},"user_id":{"type":"string","format":"uuid","title":"User Id"},"status":{"type":"string","title":"Status"},"export_input_revision":{"type":"integer","title":"Export Input Revision","default":0},"state_version":{"type":"integer","title":"State Version","description":"Monotonic version of this record. It increases whenever the record's status, audio, review state or text changes, and equals the id of the matching event on the project's event stream. Keep the higher one.","default":0},"total_chapters":{"type":"integer","title":"Total Chapters"},"estimated_duration_minutes":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Estimated Duration Minutes"},"manuscript_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Manuscript Filename"},"manuscript_format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Manuscript Format"},"manuscript_word_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Manuscript Word Count"},"rights_attested_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Rights Attested At"},"source_type":{"type":"string","title":"Source Type","default":"upload"},"selected_voice_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Selected Voice Id"},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language"},"narration_speed":{"type":"number","title":"Narration Speed"},"narration_style":{"type":"string","title":"Narration Style"},"narration_brief":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Narration Brief"},"export_format":{"type":"string","title":"Export Format"},"target_platform":{"type":"string","title":"Target Platform"},"auto_regenerate_on_edit":{"type":"boolean","title":"Auto Regenerate On Edit","default":false},"multi_voice":{"type":"boolean","title":"Multi Voice","default":false},"narration_review_policy":{"type":"string","enum":["manual","auto_accept"],"title":"Narration Review Policy","default":"manual"},"book_metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Book Metadata"},"generation_metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Generation Metadata"},"parsing_completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Parsing Completed At"},"narration_started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Narration Started At"},"narration_completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Narration Completed At"},"production_completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Production Completed At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"deleted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Deleted At"},"r2_purged_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"R2 Purged At"},"last_downloaded_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Downloaded At"},"download_count":{"type":"integer","title":"Download Count","default":0},"selected_voice_display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Selected Voice Display Name"},"lifecycle":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Lifecycle"},"edit_lock":{"anyOf":[{"$ref":"#/components/schemas/BookLockState"},{"type":"null"}]},"voice_auto_selected":{"type":"boolean","title":"Voice Auto Selected","default":false},"pending_notices":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Pending Notices"},"cover_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cover Url"},"cover_thumb_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cover Thumb Url"},"cover_source":{"anyOf":[{"type":"string","enum":["upload","file","isbn_lookup","generated"]},{"type":"null"}],"title":"Cover Source"},"metadata_sources":{"additionalProperties":{"type":"string","enum":["file","isbn_lookup"]},"type":"object","title":"Metadata Sources"},"chapters":{"anyOf":[{"items":{"$ref":"#/components/schemas/AudiobookChapterResponse"},"type":"array"},{"type":"null"}],"title":"Chapters"}},"type":"object","required":["title","id","user_id","status","total_chapters","estimated_duration_minutes","manuscript_filename","manuscript_format","manuscript_word_count","selected_voice_id","narration_speed","narration_style","export_format","target_platform","parsing_completed_at","narration_started_at","narration_completed_at","production_completed_at","created_at","updated_at"],"title":"AudiobookProjectWithChaptersResponse","description":"Single-project response that can carry its chapters inline.\n\n`chapters` is null when the caller omitted `include_chapters` — distinct\nfrom an empty list, which means the project genuinely has no chapters."},"AudiobookSettingsResponse":{"properties":{"auto_direction_default":{"type":"boolean","title":"Auto Direction Default","description":"Whether this account wants manuscripts parsed in the web studio to be given reading direction automatically. True when the account has never chosen, because expressive narration is the intended default."},"source":{"type":"string","enum":["account","default"],"title":"Source","description":"'account' when this account has chosen explicitly, 'default' when it is inheriting the unset default."},"active":{"type":"boolean","title":"Active","description":"Whether automatic direction on parse is currently switched on for web studio accounts. While this is false the preference is stored and returned but no parse acts on it."},"applies_to_api_key_parses":{"type":"boolean","title":"Applies To Api Key Parses","description":"Always false. A parse made with an API key never adds direction unless that request asks for it, whatever this account's preference is.","default":false}},"type":"object","required":["auto_direction_default","source","active"],"title":"AudiobookSettingsResponse","description":"This account's audiobook settings."},"AudiobookSettingsUpdate":{"properties":{"auto_direction_default":{"type":"boolean","title":"Auto Direction Default","description":"Choose whether manuscripts parsed in the web studio are given reading direction automatically. A single parse can still override it with the `auto_direction` parameter."}},"type":"object","required":["auto_direction_default"],"title":"AudiobookSettingsUpdate"},"AuthorSkuTierQuote":{"properties":{"tier":{"type":"string","title":"Tier"},"label":{"type":"string","title":"Label"},"human_qc":{"type":"boolean","title":"Human Qc"},"price_per_hour_cents":{"type":"integer","title":"Price Per Hour Cents"},"amount_cents":{"type":"integer","title":"Amount Cents"}},"type":"object","required":["tier","label","human_qc","price_per_hour_cents","amount_cents"],"title":"AuthorSkuTierQuote"},"AuthorsProgramApplicationCreate":{"properties":{"name":{"type":"string","maxLength":200,"minLength":1,"title":"Name"},"email":{"type":"string","format":"email","title":"Email"},"book_title":{"type":"string","maxLength":300,"minLength":1,"title":"Book Title"},"genre":{"type":"string","maxLength":100,"minLength":1,"title":"Genre"},"word_count":{"type":"integer","maximum":10000000.0,"minimum":0.0,"title":"Word Count"},"manuscript_status":{"$ref":"#/components/schemas/ManuscriptStatus"},"publishing_plan":{"$ref":"#/components/schemas/PublishingPlan"},"link":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Link"},"source":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Source"}},"type":"object","required":["name","email","book_title","genre","word_count","manuscript_status","publishing_plan"],"title":"AuthorsProgramApplicationCreate","description":"Public, unauthenticated apply payload.\n\nPersonal email domains are explicitly ALLOWED here (unlike the startups\ngrant) — independent authors overwhelmingly apply from gmail/outlook. Only\ndisposable/throwaway domains are blocked."},"AuthorsProgramApplicationResponse":{"properties":{"message":{"type":"string","title":"Message"},"application_id":{"type":"string","format":"uuid","title":"Application Id"}},"type":"object","required":["message","application_id"],"title":"AuthorsProgramApplicationResponse","description":"Public apply acknowledgement."},"AuthorsProgramApproveRequest":{"properties":{"tier":{"$ref":"#/components/schemas/AuthorsProgramTier"},"notes":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Notes"}},"type":"object","required":["tier"],"title":"AuthorsProgramApproveRequest"},"AuthorsProgramDetail":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"email":{"type":"string","format":"email","title":"Email"},"book_title":{"type":"string","title":"Book Title"},"genre":{"type":"string","title":"Genre"},"word_count":{"type":"integer","title":"Word Count"},"manuscript_status":{"type":"string","title":"Manuscript Status"},"publishing_plan":{"type":"string","title":"Publishing Plan"},"status":{"type":"string","title":"Status"},"granted_tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Granted Tier"},"granted_credits":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Granted Credits"},"pending_grant":{"type":"boolean","title":"Pending Grant","default":false},"created_at":{"type":"string","format":"date-time","title":"Created At"},"email_domain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email Domain"},"link":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Link"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"},"reviewed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Reviewed At"},"reviewed_by":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Reviewed By"},"user_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"User Id"},"granted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Granted At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","name","email","book_title","genre","word_count","manuscript_status","publishing_plan","status","created_at","updated_at"],"title":"AuthorsProgramDetail"},"AuthorsProgramRejectRequest":{"properties":{"reason":{"type":"string","maxLength":2000,"minLength":1,"title":"Reason"}},"type":"object","required":["reason"],"title":"AuthorsProgramRejectRequest"},"AuthorsProgramTier":{"type":"string","enum":["chapter","cohort"],"title":"AuthorsProgramTier","description":"Approval tier → PAYG credit grant size."},"AutoDirectionRequest":{"properties":{"chapter_ids":{"anyOf":[{"items":{"type":"string","format":"uuid"},"type":"array"},{"type":"null"}],"title":"Chapter Ids","description":"Chapters to direct. Omit for the whole book; an empty list is refused with 400 (code empty_selection)."}},"type":"object","title":"AutoDirectionRequest"},"AutoDirectionResponse":{"properties":{"job_id":{"type":"string","title":"Job Id"},"total_chapters":{"type":"integer","title":"Total Chapters"}},"type":"object","required":["job_id","total_chapters"],"title":"AutoDirectionResponse"},"AutoDirectionResult":{"properties":{"shards_failed":{"type":"integer","title":"Shards Failed","default":0},"directed_count":{"type":"integer","title":"Directed Count","default":0},"skipped_user_edited":{"type":"integer","title":"Skipped User Edited","default":0},"skipped_stale":{"type":"integer","title":"Skipped Stale","default":0},"chapters_processed":{"type":"integer","title":"Chapters Processed","default":0},"total_chapters":{"type":"integer","title":"Total Chapters","default":0},"failed_batches":{"type":"integer","title":"Failed Batches","default":0},"skipped_llm_failure":{"type":"integer","title":"Skipped Llm Failure","default":0},"skipped_already_directed":{"type":"integer","title":"Skipped Already Directed","default":0},"tagged_count":{"type":"integer","title":"Tagged Count","default":0},"untagged_count":{"type":"integer","title":"Untagged Count","default":0}},"type":"object","title":"AutoDirectionResult"},"AutoDirectionStatusResponse":{"properties":{"job_id":{"type":"string","title":"Job Id"},"status":{"type":"string","title":"Status"},"progress":{"type":"number","title":"Progress","default":0},"current_step":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Step"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"result":{"anyOf":[{"$ref":"#/components/schemas/AutoDirectionResult"},{"type":"null"}]},"execution":{"anyOf":[{"$ref":"#/components/schemas/DirectionExecutionStatus"},{"type":"null"}]}},"type":"object","required":["job_id","status"],"title":"AutoDirectionStatusResponse"},"AutoRefillState":{"properties":{"enabled":{"type":"boolean","title":"Enabled","default":false},"target":{"type":"string","const":"payg","title":"Target","default":"payg"},"threshold_credits":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Threshold Credits"},"last_attempt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Attempt"}},"type":"object","title":"AutoRefillState","description":"Status of automatic credit top-up for this account."},"AutoReplenishRequest":{"properties":{"enabled":{"type":"boolean","title":"Enabled"}},"type":"object","required":["enabled"],"title":"AutoReplenishRequest"},"AutoReplenishResponse":{"properties":{"enabled":{"type":"boolean","title":"Enabled"},"allowed":{"type":"boolean","title":"Allowed","default":false}},"type":"object","required":["enabled"],"title":"AutoReplenishResponse"},"AutoTopupConfig":{"properties":{"enabled":{"type":"boolean","title":"Enabled"},"threshold_cents":{"type":"integer","title":"Threshold Cents"},"threshold_usd":{"type":"string","title":"Threshold Usd"},"topup_amount_cents":{"type":"integer","title":"Topup Amount Cents"},"topup_amount_usd":{"type":"string","title":"Topup Amount Usd"},"max_topups_per_day":{"type":"integer","title":"Max Topups Per Day"},"monthly_cap_cents":{"type":"integer","title":"Monthly Cap Cents"},"monthly_cap_usd":{"type":"string","title":"Monthly Cap Usd"},"has_payment_method":{"type":"boolean","title":"Has Payment Method"},"card_brand":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Card Brand"},"card_last4":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Card Last4"},"day_charge_count":{"type":"integer","title":"Day Charge Count"},"month_charged_cents":{"type":"integer","title":"Month Charged Cents"},"last_charged_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Charged At"},"next_attempt_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Attempt At"},"consecutive_failures":{"type":"integer","title":"Consecutive Failures"},"disabled_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Disabled Reason"},"disabled_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Disabled At"},"limits":{"$ref":"#/components/schemas/AutoTopupLimits"}},"type":"object","required":["enabled","threshold_cents","threshold_usd","topup_amount_cents","topup_amount_usd","max_topups_per_day","monthly_cap_cents","monthly_cap_usd","has_payment_method","day_charge_count","month_charged_cents","consecutive_failures","limits"],"title":"AutoTopupConfig","description":"Current automatic top-up settings, saved card and usage counters"},"AutoTopupLimits":{"properties":{"min_threshold_cents":{"type":"integer","title":"Min Threshold Cents"},"max_threshold_cents":{"type":"integer","title":"Max Threshold Cents"},"min_amount_cents":{"type":"integer","title":"Min Amount Cents"},"max_amount_cents":{"type":"integer","title":"Max Amount Cents"},"max_per_day":{"type":"integer","title":"Max Per Day"},"min_monthly_cap_cents":{"type":"integer","title":"Min Monthly Cap Cents"},"max_monthly_cap_cents":{"type":"integer","title":"Max Monthly Cap Cents"}},"type":"object","required":["min_threshold_cents","max_threshold_cents","min_amount_cents","max_amount_cents","max_per_day","min_monthly_cap_cents","max_monthly_cap_cents"],"title":"AutoTopupLimits","description":"Server-enforced bounds for the auto top-up settings"},"AutoTopupSetupSessionResponse":{"properties":{"url":{"type":"string","title":"Url"},"expires_at":{"type":"integer","title":"Expires At"}},"type":"object","required":["url","expires_at"],"title":"AutoTopupSetupSessionResponse","description":"Hosted card-setup session for saving a card"},"AutoTopupUpdateRequest":{"properties":{"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"},"threshold_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Threshold Cents"},"topup_amount_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Topup Amount Cents"},"max_topups_per_day":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Topups Per Day"},"monthly_cap_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Monthly Cap Cents"}},"type":"object","title":"AutoTopupUpdateRequest","description":"Partial update — every field is optional; omitted fields are untouched"},"BatchNarrationRequest":{"properties":{"voice_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Voice Id","description":"Optional narrator for this run, in place of the book's narrator. With character voices off it voices every selected paragraph. With character voices on (multi_voice) it voices only the narrator's lines: a character with a cast voice, and a paragraph given its own voice, keep theirs. It is a narrator override for this run: it is recorded on the lines it narrates, but not as the author's per-line choice, so with character voices on, cast voices still apply."},"chapter_ids":{"anyOf":[{"items":{"type":"string","format":"uuid"},"type":"array"},{"type":"null"}],"title":"Chapter Ids","description":"Specific chapters to narrate. Omit to narrate the whole book; an empty list is refused with 400 (code empty_selection)."},"paragraph_ids":{"anyOf":[{"items":{"type":"string","format":"uuid"},"type":"array"},{"type":"null"}],"title":"Paragraph Ids","description":"Specific paragraphs to narrate. Omit to narrate the whole book; an empty list is refused with 400 (code empty_selection)."},"include_completed":{"type":"boolean","title":"Include Completed","default":false},"include_locked":{"type":"boolean","title":"Include Locked","default":false},"include_skipped":{"type":"boolean","title":"Include Skipped","default":false},"narration_settings":{"additionalProperties":true,"type":"object","title":"Narration Settings"},"multi_voice":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Multi Voice","description":"Give each character their own voice for this and later narration (saved on the book). Omit to leave the book's setting as it is."},"mode":{"type":"string","enum":["auto","passage"],"title":"Mode","description":"How an edited, previously narrated passage is narrated, where available. 'auto' narrates only the changed sentences when the edit is small enough, and bills only those characters; 'passage' always narrates the whole passage.","default":"auto"},"narration_review_policy":{"anyOf":[{"type":"string","enum":["manual","auto_accept"]},{"type":"null"}],"title":"Narration Review Policy","description":"What happens to a passage our narration check cannot confirm after its retry: 'manual' holds it for your approval (the chapter waits on it), 'auto_accept' keeps the best render and counts it under `quality_notes`, so the book never blocks. When sent, it is saved on the book. When omitted on an API-key call and the book has no policy yet, 'auto_accept' is saved; a policy you chose earlier is kept. Automated pipelines should use 'auto_accept'."}},"type":"object","title":"BatchNarrationRequest"},"BatchNarrationResponse":{"properties":{"job_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Job Id"},"total_paragraphs":{"type":"integer","title":"Total Paragraphs"},"skipped_paragraphs":{"type":"integer","title":"Skipped Paragraphs"},"estimated_completion_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Estimated Completion Time"},"engine":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Engine"},"run_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Run Id"},"skipped_needs_review":{"type":"integer","title":"Skipped Needs Review","default":0},"skipped_no_audible_change":{"type":"integer","title":"Skipped No Audible Change","description":"Of skipped_paragraphs, edited passages whose change is not heard (for example quote marks or spacing). They keep their current audio and are not charged; send mode 'passage' to re-narrate them.","default":0},"warning":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Warning","description":"Advisory, never blocks the start. `code` is `most_chapters_excluded` when chapters excluded from narration leave less than 25% of the book's words; `excluded_chapters` and `excluded_words_pct` say how much."}},"type":"object","required":["total_paragraphs","skipped_paragraphs","estimated_completion_time"],"title":"BatchNarrationResponse"},"BlogTTSDispatchRequest":{"properties":{"surface":{"type":"string","title":"Surface"},"slug":{"type":"string","title":"Slug"},"text":{"type":"string","title":"Text"},"voice_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Voice Id","default":"charon"},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language","default":"en-US"},"content_hash":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Hash","default":""}},"type":"object","required":["surface","slug","text"],"title":"BlogTTSDispatchRequest","description":"Request body for dispatching a blog/page narration render.\n\nThe render target is addressed as `surface` + `slug`, never as a storage\nkey. `content_hash` is the 8-char SHA-256 prefix of the narration text; it\nis part of the artifact's address, so edited text yields a new URL."},"BlogTTSRequest":{"properties":{"text":{"type":"string","title":"Text"},"voice_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Voice Id","default":"charon"},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language","default":"en-US"}},"type":"object","required":["text"],"title":"BlogTTSRequest","description":"Request model for blog TTS generation"},"Body_add_source_api_v1_podcast_projects__project_id__sources_post":{"properties":{"source_type":{"type":"string","title":"Source Type"},"text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Text"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"file":{"anyOf":[{"type":"string","format":"binary"},{"type":"null"}],"title":"File"},"upload_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Upload Id"}},"type":"object","required":["source_type"],"title":"Body_add_source_api_v1_podcast_projects__project_id__sources_post"},"Body_add_voice_sample_api_v1_voice_voice_profiles__voice_identifier__samples_post":{"properties":{"voice_file":{"type":"string","format":"binary","title":"Voice File"}},"type":"object","required":["voice_file"],"title":"Body_add_voice_sample_api_v1_voice_voice_profiles__voice_identifier__samples_post"},"Body_append_manuscript_file_api_v1_audiobook_projects__project_id__manuscript_append_post":{"properties":{"file":{"type":"string","format":"binary","title":"File","description":"Additional manuscript file to APPEND as new chapters"}},"type":"object","required":["file"],"title":"Body_append_manuscript_file_api_v1_audiobook_projects__project_id__manuscript_append_post"},"Body_check_provenance_api_v1_voices_provenance_check_post":{"properties":{"audio":{"type":"string","format":"binary","title":"Audio"},"passphrase":{"type":"string","title":"Passphrase"},"session_token":{"type":"string","title":"Session Token"}},"type":"object","required":["audio","passphrase","session_token"],"title":"Body_check_provenance_api_v1_voices_provenance_check_post"},"Body_create_advanced_stem_extraction_job_api_v1_stem_extraction_extract_advanced_post":{"properties":{"file":{"anyOf":[{"type":"string","format":"binary"},{"type":"null"}],"title":"File"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"method":{"type":"string","title":"Method","default":"hierarchical"},"package":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Package"},"target_stems":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Stems"},"exclude_stems":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Exclude Stems"},"two_stems_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Two Stems Mode"},"target_instrument":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Instrument"},"single_stem":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Single Stem"},"multi_stem_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Multi Stem Count"},"custom_stems":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Stems"},"max_credits":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Max Credits"},"daw_project_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Daw Project Id"},"template_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Template Slug"},"quality":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Quality"},"output_format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Output Format"},"bit_depth":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Bit Depth"},"reference_file":{"anyOf":[{"type":"string","format":"binary"},{"type":"null"}],"title":"Reference File"}},"type":"object","title":"Body_create_advanced_stem_extraction_job_api_v1_stem_extraction_extract_advanced_post"},"Body_create_conversion_api_v1_media_converter_convert_post":{"properties":{"file":{"anyOf":[{"type":"string","format":"binary"},{"type":"null"}],"title":"File","description":"Media file to convert (alternative to input_url)"},"input_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Input Url","description":"URL of media file to convert (alternative to file)"},"output_format":{"type":"string","title":"Output Format","description":"Target output format (mp3, wav, flac, etc.)"},"audio_only":{"type":"boolean","title":"Audio Only","description":"Extract audio only from video","default":false},"audio_quality":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Audio Quality","description":"Audio quality preset (low, medium, high)"},"video_quality":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Video Quality","description":"Video quality preset"},"audio_bitrate":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Audio Bitrate","description":"Audio bitrate in kbps"},"video_bitrate":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Video Bitrate","description":"Video bitrate in kbps"},"sample_rate":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sample Rate","description":"Audio sample rate (Hz)"},"channels":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Channels","description":"Audio channels (1=mono, 2=stereo)"},"width":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Width","description":"Output width in pixels"},"height":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Height","description":"Output height in pixels"},"framerate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Framerate","description":"Output framerate (fps)"},"start_time":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Start Time","description":"Start time in seconds"},"end_time":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"End Time","description":"End time in seconds"},"duration":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Duration","description":"Duration in seconds"},"normalize_audio":{"type":"boolean","title":"Normalize Audio","description":"Normalize audio levels","default":false},"remove_metadata":{"type":"boolean","title":"Remove Metadata","description":"Strip metadata from output","default":false},"fast_mode":{"type":"boolean","title":"Fast Mode","description":"Use faster encoding","default":false}},"type":"object","required":["output_format"],"title":"Body_create_conversion_api_v1_media_converter_convert_post"},"Body_create_conversion_with_upload_api_v1_media_converter_upload_post":{"properties":{"file":{"type":"string","format":"binary","title":"File","description":"Media file to convert"},"output_format":{"type":"string","title":"Output Format","description":"Target output format (mp3, wav, flac, etc.)"},"audio_only":{"type":"boolean","title":"Audio Only","description":"Extract audio only from video","default":false},"audio_quality":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Audio Quality","description":"Audio quality preset"},"video_quality":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Video Quality","description":"Video quality preset"},"audio_bitrate":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Audio Bitrate","description":"Audio bitrate in kbps"},"video_bitrate":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Video Bitrate","description":"Video bitrate in kbps"},"sample_rate":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sample Rate","description":"Audio sample rate (Hz)"},"channels":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Channels","description":"Audio channels (1=mono, 2=stereo)"},"width":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Width","description":"Output width in pixels"},"height":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Height","description":"Output height in pixels"},"framerate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Framerate","description":"Output framerate (fps)"},"start_time":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Start Time","description":"Start time in seconds"},"end_time":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"End Time","description":"End time in seconds"},"duration":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Duration","description":"Duration in seconds"},"normalize_audio":{"type":"boolean","title":"Normalize Audio","description":"Normalize audio levels","default":false},"remove_metadata":{"type":"boolean","title":"Remove Metadata","description":"Strip metadata from output","default":false},"fast_mode":{"type":"boolean","title":"Fast Mode","description":"Use faster encoding","default":false}},"type":"object","required":["file","output_format"],"title":"Body_create_conversion_with_upload_api_v1_media_converter_upload_post"},"Body_create_denoise_job_api_v1_denoiser_denoise_post":{"properties":{"file":{"anyOf":[{"type":"string","format":"binary"},{"type":"null"}],"title":"File"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"quality_mode":{"type":"string","title":"Quality Mode","description":"Noise Reduction quality mode: 'balanced' (fastest, 330 credits per minute), 'studio' (broadcast and podcast quality, 660 credits per minute, the default) or 'ultra' (highest fidelity, 1,320 credits per minute). Credit rates apply to signed-in accounts, with a 10-credit minimum per job; API keys pay the chosen mode's API price. Every mode removes background noise and improves speech clarity. Case-insensitive; any other value is rejected with a 422.","default":"studio"},"daw_project_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Daw Project Id"},"template_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Template Slug"}},"type":"object","title":"Body_create_denoise_job_api_v1_denoiser_denoise_post"},"Body_create_developer_stem_job_api_v1_stem_extraction_api_extract_post":{"properties":{"file":{"anyOf":[{"type":"string","format":"binary"},{"type":"null"}],"title":"File"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"mode":{"type":"string","title":"Mode","description":"Separation mode: single, two, four, six, producer, studio, mastering","default":"four"},"stem":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stem","description":"For mode=single, which stem to extract: vocals, drums, bass, guitar, piano, other, instrumental"}},"type":"object","title":"Body_create_developer_stem_job_api_v1_stem_extraction_api_extract_post"},"Body_create_diarization_job_api_v1_speaker_diarize_post":{"properties":{"file":{"anyOf":[{"type":"string","format":"binary"},{"type":"null"}],"title":"File"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url","description":"URL of the audio/video file to process"}},"type":"object","title":"Body_create_diarization_job_api_v1_speaker_diarize_post"},"Body_create_extraction_job_api_v1_speaker_extract_post":{"properties":{"file":{"anyOf":[{"type":"string","format":"binary"},{"type":"null"}],"title":"File"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url","description":"URL of the audio/video file to process"},"upload_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Upload Id","description":"ID of a presigned direct-to-R2 upload (from POST /uploads/presign) to use as the input instead of a multipart file or URL."},"template_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Template Slug"}},"type":"object","title":"Body_create_extraction_job_api_v1_speaker_extract_post"},"Body_create_midi_conversion_api_v1_midi_convert_post":{"properties":{"file":{"anyOf":[{"type":"string","format":"binary"},{"type":"null"}],"title":"File"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"stems":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stems"},"options":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Options"}},"type":"object","title":"Body_create_midi_conversion_api_v1_midi_convert_post"},"Body_create_multi_sample_voice_api_v1_voice_voice_profiles_multi_sample_post":{"properties":{"name":{"type":"string","maxLength":100,"minLength":1,"title":"Name"},"description":{"type":"string","title":"Description"},"is_public":{"type":"boolean","title":"Is Public","default":false},"transcription":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transcription"},"gender":{"anyOf":[{"type":"string","maxLength":10},{"type":"null"}],"title":"Gender"},"age_group":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Age Group"},"language_code":{"anyOf":[{"type":"string","maxLength":10},{"type":"null"}],"title":"Language Code"},"language_name":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Language Name"},"accent":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Accent"},"use_case":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"Use Case"},"tags":{"anyOf":[{"type":"string","maxLength":400},{"type":"null"}],"title":"Tags"},"consent":{"type":"boolean","title":"Consent","default":false},"voice_files":{"items":{"type":"string","format":"binary"},"type":"array","maxItems":5,"minItems":1,"title":"Voice Files"}},"type":"object","required":["name","voice_files"],"title":"Body_create_multi_sample_voice_api_v1_voice_voice_profiles_multi_sample_post"},"Body_create_multi_voice_tts_api_v1_voice_multi_voice_tts_post":{"properties":{"segments":{"type":"string","title":"Segments"},"mix_mode":{"type":"string","title":"Mix Mode","default":"sequential"},"output_format":{"type":"string","title":"Output Format","default":"wav"},"silence_duration":{"type":"number","title":"Silence Duration","default":0.5},"normalize_volume":{"type":"boolean","title":"Normalize Volume","default":true},"generation_params":{"type":"string","title":"Generation Params","default":"{}"},"target_language":{"anyOf":[{"$ref":"#/components/schemas/SupportedLanguage"},{"type":"null"}]}},"type":"object","required":["segments"],"title":"Body_create_multi_voice_tts_api_v1_voice_multi_voice_tts_post"},"Body_create_public_conversion_api_v1_media_converter_public_convert_post":{"properties":{"file":{"anyOf":[{"type":"string","format":"binary"},{"type":"null"}],"title":"File","description":"Media file to convert (alternative to input_url)"},"input_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Input Url","description":"URL of media file to convert (alternative to file)"},"output_format":{"type":"string","title":"Output Format","description":"Target output format (mp3, wav, mp4 only for public)"},"audio_only":{"type":"boolean","title":"Audio Only","description":"Extract audio only from video","default":false},"audio_quality":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Audio Quality","description":"Audio quality preset (low, medium, high)"},"video_quality":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Video Quality","description":"Video quality preset (240p, 360p, 480p, 720p)"},"audio_bitrate":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Audio Bitrate","description":"Audio bitrate in kbps"},"video_bitrate":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Video Bitrate","description":"Video bitrate in kbps"},"start_time":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Start Time","description":"Start time in seconds"},"end_time":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"End Time","description":"End time in seconds"},"duration":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Duration","description":"Duration in seconds"},"fast_mode":{"type":"boolean","title":"Fast Mode","description":"Use faster encoding","default":false}},"type":"object","required":["output_format"],"title":"Body_create_public_conversion_api_v1_media_converter_public_convert_post"},"Body_create_public_stem_extraction_job_api_v1_stem_extraction_public_extract_post":{"properties":{"file":{"anyOf":[{"type":"string","format":"binary"},{"type":"null"}],"title":"File"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"}},"type":"object","title":"Body_create_public_stem_extraction_job_api_v1_stem_extraction_public_extract_post"},"Body_create_spectral_denoise_job_api_v1_denoiser_spectral_denoise_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_create_spectral_denoise_job_api_v1_denoiser_spectral_denoise_post"},"Body_create_stem_extraction_job_api_v1_stem_extraction_extract_post":{"properties":{"file":{"anyOf":[{"type":"string","format":"binary"},{"type":"null"}],"title":"File"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"stem_types":{"type":"string","title":"Stem Types","default":"['vocals', 'drums', 'bass', 'other']"},"model_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model Name"},"two_stems_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Two Stems Mode"},"daw_project_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Daw Project Id"}},"type":"object","title":"Body_create_stem_extraction_job_api_v1_stem_extraction_extract_post"},"Body_create_transcription_api_v1_audio_transcriptions_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"model":{"type":"string","title":"Model","default":"whisper-1"},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language"},"prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prompt"},"response_format":{"type":"string","title":"Response Format","default":"json"},"temperature":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Temperature"}},"type":"object","required":["file"],"title":"Body_create_transcription_api_v1_audio_transcriptions_post"},"Body_create_transcription_job_upload_api_v1_transcription_transcribe_upload_post":{"properties":{"files":{"items":{"type":"string","format":"binary"},"type":"array","title":"Files","description":"Audio/video files to transcribe"},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language","description":"Language code (ISO 639-1)"},"model_type":{"$ref":"#/components/schemas/TranscriptionModelType","default":"cloudflare-whisper"},"chunk_duration":{"type":"integer","title":"Chunk Duration","description":"Chunk duration in seconds","default":1800},"enable_speaker_diarization":{"type":"boolean","title":"Enable Speaker Diarization","description":"Enable speaker diarization","default":false},"min_speakers":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Min Speakers","description":"Minimum number of speakers (auto-detect if not specified)"},"max_speakers":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Speakers","description":"Maximum number of speakers (auto-detect if not specified)"},"template_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Template Slug"},"enable_word_timestamps":{"type":"boolean","title":"Enable Word Timestamps","description":"Enable word-level timestamps","default":true},"enable_confidence_scores":{"type":"boolean","title":"Enable Confidence Scores","description":"Enable confidence scores","default":true}},"type":"object","required":["files"],"title":"Body_create_transcription_job_upload_api_v1_transcription_transcribe_upload_post"},"Body_create_translation_api_v1_audio_translations_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"model":{"type":"string","title":"Model","default":"whisper-1"},"prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prompt"},"response_format":{"type":"string","title":"Response Format","default":"json"},"temperature":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Temperature"}},"type":"object","required":["file"],"title":"Body_create_translation_api_v1_audio_translations_post"},"Body_create_voice_api_v1_voice_voice_profiles_post":{"properties":{"name":{"type":"string","maxLength":100,"minLength":1,"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"file":{"type":"string","format":"binary","title":"File"},"denoise":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Denoise"},"transcription":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transcription"},"gender":{"anyOf":[{"type":"string","maxLength":10},{"type":"null"}],"title":"Gender"},"age_group":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Age Group"},"language_code":{"anyOf":[{"type":"string","maxLength":10},{"type":"null"}],"title":"Language Code"},"language_name":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Language Name"},"accent":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Accent"},"use_case":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"Use Case"},"tags":{"anyOf":[{"type":"string","maxLength":400},{"type":"null"}],"title":"Tags"},"is_public":{"type":"boolean","title":"Is Public","default":false},"consent":{"type":"boolean","title":"Consent","default":false}},"type":"object","required":["name","file"],"title":"Body_create_voice_api_v1_voice_voice_profiles_post"},"Body_create_voice_conversion_api_v1_voice_voice_convert_post":{"properties":{"file":{"anyOf":[{"type":"string","format":"binary"},{"type":"null"}],"title":"File"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"upload_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Upload Id"},"voice_uuid":{"type":"string","title":"Voice Uuid"},"pitch_shift":{"type":"integer","maximum":12.0,"minimum":-12.0,"title":"Pitch Shift","description":"Pitch shift in semitones (-12 to +12)","default":0}},"type":"object","required":["voice_uuid"],"title":"Body_create_voice_conversion_api_v1_voice_voice_convert_post"},"Body_create_voice_separation_job_api_v1_speaker_separate_post":{"properties":{"file":{"anyOf":[{"type":"string","format":"binary"},{"type":"null"}],"title":"File"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url","description":"URL of the audio/video file to process (YouTube, etc.)"}},"type":"object","title":"Body_create_voice_separation_job_api_v1_speaker_separate_post"},"Body_generate_multi_speaker_public_preview_api_v1_voice_public_multi_speaker_generate_post":{"properties":{"conversation_text":{"type":"string","title":"Conversation Text"},"speaker_voices":{"type":"string","title":"Speaker Voices"},"target_language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Language","default":"en-US"}},"type":"object","required":["conversation_text","speaker_voices"],"title":"Body_generate_multi_speaker_public_preview_api_v1_voice_public_multi_speaker_generate_post"},"Body_generate_public_directed_preview_api_v1_voice_public_preview_direct_post":{"properties":{"input_text":{"type":"string","title":"Input Text"},"delivery_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Delivery Mode"},"voice":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Voice"}},"type":"object","required":["input_text"],"title":"Body_generate_public_directed_preview_api_v1_voice_public_preview_direct_post"},"Body_generate_public_voice_preview_api_v1_voice_public_preview_generate_post":{"properties":{"voice_identifier":{"type":"string","title":"Voice Identifier"},"input_text":{"type":"string","title":"Input Text"},"target_language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Language","default":"en"}},"type":"object","required":["voice_identifier","input_text"],"title":"Body_generate_public_voice_preview_api_v1_voice_public_preview_generate_post"},"Body_generate_voice_audio_api_v1_voice_voices__voice_identifier__generate_post":{"properties":{"input_text":{"type":"string","title":"Input Text"},"audio_format":{"$ref":"#/components/schemas/app__schemas__enums__AudioFormat","default":"mp3"},"language":{"anyOf":[{"$ref":"#/components/schemas/SupportedLanguage"},{"type":"null"}]},"speed":{"type":"number","title":"Speed","default":1.0},"generation_params":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Generation Params"},"daw_project_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Daw Project Id"},"template_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Template Slug"}},"type":"object","required":["input_text"],"title":"Body_generate_voice_audio_api_v1_voice_voices__voice_identifier__generate_post"},"Body_login_api_v1_auth_token_post":{"properties":{"grant_type":{"anyOf":[{"type":"string","pattern":"^password$"},{"type":"null"}],"title":"Grant Type"},"username":{"type":"string","title":"Username"},"password":{"type":"string","format":"password","title":"Password"},"scope":{"type":"string","title":"Scope","default":""},"client_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"},"client_secret":{"anyOf":[{"type":"string"},{"type":"null"}],"format":"password","title":"Client Secret"}},"type":"object","required":["username","password"],"title":"Body_login_api_v1_auth_token_post"},"Body_process_public_denoise_api_v1_denoiser_public_process_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_process_public_denoise_api_v1_denoiser_public_process_post"},"Body_process_public_music_generation_api_v1_music_public_generate_post":{"properties":{"prompt":{"type":"string","title":"Prompt"},"task":{"type":"string","title":"Task","default":"text2music"},"duration":{"type":"integer","title":"Duration","default":-1}},"type":"object","required":["prompt"],"title":"Body_process_public_music_generation_api_v1_music_public_generate_post"},"Body_process_public_music_generation_shareable_api_v1_music_public_generate_shareable_post":{"properties":{"prompt":{"type":"string","title":"Prompt"},"task":{"type":"string","title":"Task","default":"text2music"},"duration":{"type":"integer","title":"Duration","default":-1},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"lyrics":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lyrics"},"gender":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gender"},"keyscale":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Keyscale"},"bpm":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Bpm"},"timesignature":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Timesignature"},"vocal_language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vocal Language"},"seed":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Seed"}},"type":"object","required":["prompt"],"title":"Body_process_public_music_generation_shareable_api_v1_music_public_generate_shareable_post"},"Body_process_public_speaker_separation_api_v1_speaker_public_separate_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_process_public_speaker_separation_api_v1_speaker_public_separate_post"},"Body_process_public_transcription_api_v1_transcription_public_transcribe_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language"}},"type":"object","required":["file"],"title":"Body_process_public_transcription_api_v1_transcription_public_transcribe_post"},"Body_process_public_voice_conversion_api_v1_voice_public_convert_process_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"target_voice_uuid":{"type":"string","title":"Target Voice Uuid"}},"type":"object","required":["file","target_voice_uuid"],"title":"Body_process_public_voice_conversion_api_v1_voice_public_convert_process_post"},"Body_report_voice_api_v1_voice_voices__voice_id__report_post":{"properties":{"reason":{"type":"string","maxLength":32,"title":"Reason"},"details":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Details"}},"type":"object","required":["reason"],"title":"Body_report_voice_api_v1_voice_voices__voice_id__report_post"},"Body_resubscribe_user_api_v1_unsubscribe_resubscribe_post":{"properties":{"user_id":{"type":"string","title":"User Id"}},"type":"object","required":["user_id"],"title":"Body_resubscribe_user_api_v1_unsubscribe_resubscribe_post"},"Body_retry_missing_stems_api_v1_stem_extraction_jobs__job_id__retry_missing_post":{"properties":{"max_credits":{"type":"integer","minimum":0.0,"title":"Max Credits"}},"type":"object","required":["max_credits"],"title":"Body_retry_missing_stems_api_v1_stem_extraction_jobs__job_id__retry_missing_post"},"Body_save_recording_api_v1_auto_dj_sessions__session_id__recording_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"duration_sec":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Duration Sec"}},"type":"object","required":["file"],"title":"Body_save_recording_api_v1_auto_dj_sessions__session_id__recording_post"},"Body_start_public_speaker_separation_api_v1_speaker_public_start_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_start_public_speaker_separation_api_v1_speaker_public_start_post"},"Body_stream_cloning_job_api_v1_voice_clone_stream_post":{"properties":{"voice_id":{"anyOf":[{"type":"integer"},{"type":"string"}],"title":"Voice Id"},"input_text":{"type":"string","title":"Input Text"},"target_language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Language"},"speed":{"type":"number","title":"Speed","default":1.0}},"type":"object","required":["voice_id","input_text"],"title":"Body_stream_cloning_job_api_v1_voice_clone_stream_post"},"Body_stream_voice_generation_api_v1_voice_voices__voice_identifier__generate_stream_post":{"properties":{"input_text":{"type":"string","title":"Input Text"},"target_language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Language"},"generation_params":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Generation Params"}},"type":"object","required":["input_text"],"title":"Body_stream_voice_generation_api_v1_voice_voices__voice_identifier__generate_stream_post"},"Body_submit_complete_survey_api_v1_feedback_survey_post":{"properties":{"user_id":{"type":"string","title":"User Id"},"user_email":{"type":"string","title":"User Email"},"use_case":{"type":"string","title":"Use Case"},"satisfaction":{"type":"string","title":"Satisfaction"},"nps":{"type":"integer","title":"Nps"},"additional_feedback":{"type":"string","title":"Additional Feedback","default":""}},"type":"object","required":["user_id","user_email","use_case","satisfaction","nps"],"title":"Body_submit_complete_survey_api_v1_feedback_survey_post"},"Body_upload_file_api_v1_agent_upload_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id"}},"type":"object","required":["file"],"title":"Body_upload_file_api_v1_agent_upload_post"},"Body_upload_manuscript_api_v1_audiobook_projects__project_id__manuscript_upload_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_manuscript_api_v1_audiobook_projects__project_id__manuscript_upload_post"},"Body_upload_project_media_api_v1_audiobook_projects__project_id__media_upload_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"media_type":{"type":"string","title":"Media Type","default":"music"}},"type":"object","required":["file"],"title":"Body_upload_project_media_api_v1_audiobook_projects__project_id__media_upload_post"},"Body_upload_single_chapter_file_api_v1_audiobook_projects__project_id__chapters_upload_file_post":{"properties":{"file":{"type":"string","format":"binary","title":"File","description":"PDF/EPUB/DOCX/TXT containing exactly ONE chapter"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title","description":"Override the chapter title"},"insert_at":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Insert At","description":"1-based insertion position"}},"type":"object","required":["file"],"title":"Body_upload_single_chapter_file_api_v1_audiobook_projects__project_id__chapters_upload_file_post"},"Body_verify_captcha_api_v1_auth_captcha_verify_post":{"properties":{"captcha_id":{"type":"string","title":"Captcha Id"},"answer":{"type":"string","title":"Answer"}},"type":"object","required":["captcha_id","answer"],"title":"Body_verify_captcha_api_v1_auth_captcha_verify_post"},"Body_verify_email_api_v1_auth_verify_email_post":{"properties":{"token":{"type":"string","title":"Token"}},"type":"object","required":["token"],"title":"Body_verify_email_api_v1_auth_verify_email_post"},"BookLockState":{"properties":{"state":{"type":"string","enum":["open","finalizing","exporting","restructuring"],"title":"State","description":"'open': every edit is allowed. 'finalizing': the book is being finalized for production. 'exporting': a download package is being built. 'restructuring': the manuscript is being parsed into chapters and paragraphs.","default":"open"},"run_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Run Id","description":"The production run finalizing the book, when state is 'finalizing'."},"started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started At","description":"When the locking work started, when known."},"blocks":{"items":{"type":"string","enum":["text","voices","narration","structure","downloads"]},"type":"array","title":"Blocks","description":"Which kinds of change are refused while the lock lasts. A refused change answers 409 with code 'book_locked'."},"stop":{"$ref":"#/components/schemas/BookLockStop"}},"type":"object","title":"BookLockState","description":"What a book is locked for right now."},"BookLockStop":{"properties":{"available":{"type":"boolean","title":"Available","description":"True when the work can be stopped from the studio (POST .../production/runs/{run_id}/cancel).","default":false},"effect":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Effect","description":"What stopping does, in a plain sentence for the confirm dialog."}},"type":"object","title":"BookLockStop"},"BookMetadataInput":{"properties":{"author":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Author"},"isbn":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"Isbn","description":"ISBN-10 or ISBN-13; hyphens optional, checksum validated"},"genre":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Genre"},"publisher":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Publisher"},"imprint":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Imprint","description":"Trade name the book is published under, if not the publisher's own"},"narrator":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Narrator"},"copyright":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Copyright","description":"Rights line, e.g. '© 2026 Example Press'"},"publication_year":{"anyOf":[{"type":"integer","maximum":2200.0,"minimum":1400.0},{"type":"null"}],"title":"Publication Year"},"series":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Series"},"series_number":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Series Number"},"keywords":{"anyOf":[{"items":{"type":"string"},"type":"array","maxItems":50},{"type":"null"}],"title":"Keywords","description":"Retail search keywords"},"bisac_codes":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Bisac Codes","description":"BISAC subject codes, e.g. ['FIC027000'] (at most 3)"}},"type":"object","title":"BookMetadataInput","description":"Retail publishing metadata, collected at the export step.\n\nEvery field is optional. A field that is OMITTED leaves the stored value\nalone; a field sent empty CLEARS it."},"BookMetadataResponse":{"properties":{"author":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Author"},"isbn":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Isbn"},"genre":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Genre"},"publisher":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Publisher"},"imprint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Imprint"},"narrator":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Narrator"},"copyright":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Copyright"},"publication_year":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Publication Year"},"series":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Series"},"series_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Series Number"},"keywords":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Keywords"},"bisac_codes":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Bisac Codes"},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language"}},"type":"object","title":"BookMetadataResponse","description":"Merged view of a project's publishing metadata (columns + JSONB)."},"Box":{"properties":{"x":{"type":"number","maximum":1.0,"minimum":0.0,"title":"X"},"y":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Y"},"w":{"type":"number","maximum":1.0,"minimum":0.0,"title":"W"},"h":{"type":"number","maximum":1.0,"minimum":0.0,"title":"H"}},"additionalProperties":false,"type":"object","required":["x","y","w","h"],"title":"Box"},"BrandSettings":{"properties":{"captionStyle":{"$ref":"#/components/schemas/Style"},"label":{"type":"string","maxLength":80,"title":"Label","default":""}},"additionalProperties":false,"type":"object","required":["captionStyle"],"title":"BrandSettings"},"BulkMediaConverterRequest":{"properties":{"input_urls":{"items":{"type":"string","maxLength":2083,"minLength":1,"format":"uri"},"type":"array","maxItems":20,"minItems":1,"title":"Input Urls"},"output_format":{"anyOf":[{"$ref":"#/components/schemas/app__schemas__media_converter__AudioFormat"},{"$ref":"#/components/schemas/VideoFormat"}],"title":"Output Format"},"audio_only":{"type":"boolean","title":"Audio Only","default":false},"audio_quality":{"anyOf":[{"$ref":"#/components/schemas/AudioQuality"},{"type":"null"}]},"video_quality":{"anyOf":[{"$ref":"#/components/schemas/VideoQuality"},{"type":"null"}]},"start_time":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Start Time"},"end_time":{"anyOf":[{"type":"number","exclusiveMinimum":0.0},{"type":"null"}],"title":"End Time"},"duration":{"anyOf":[{"type":"number","exclusiveMinimum":0.0},{"type":"null"}],"title":"Duration"}},"type":"object","required":["input_urls","output_format"],"title":"BulkMediaConverterRequest","description":"Request for bulk media conversion"},"BulkMediaConverterResponse":{"properties":{"jobs":{"items":{"$ref":"#/components/schemas/MediaConverterJob"},"type":"array","title":"Jobs"},"successful":{"type":"integer","title":"Successful"},"failed":{"type":"integer","title":"Failed"},"errors":{"items":{"type":"string"},"type":"array","title":"Errors"},"message":{"type":"string","title":"Message"}},"type":"object","required":["jobs","successful","failed","errors","message"],"title":"BulkMediaConverterResponse","description":"Response for bulk media conversion"},"BulkUnsubscribeRequest":{"properties":{"email_addresses":{"items":{"type":"string","format":"email"},"type":"array","title":"Email Addresses","description":"List of email addresses to unsubscribe"},"reason":{"type":"string","title":"Reason","description":"Reason for bulk unsubscribe","default":"Bulk unsubscribe operation"}},"type":"object","required":["email_addresses"],"title":"BulkUnsubscribeRequest","description":"Request model for bulk unsubscribe operations"},"CFGType":{"type":"string","enum":["apg","cfg","zero_star"],"title":"CFGType","description":"Classifier-free guidance types (legacy)"},"CampaignAnalyticsResponse":{"properties":{"period_days":{"type":"integer","title":"Period Days"},"overall_metrics":{"additionalProperties":true,"type":"object","title":"Overall Metrics"},"campaign_breakdown":{"additionalProperties":{"additionalProperties":true,"type":"object"},"type":"object","title":"Campaign Breakdown"}},"type":"object","required":["period_days","overall_metrics","campaign_breakdown"],"title":"CampaignAnalyticsResponse","description":"Response model for campaign analytics"},"CampaignFeedbackSubmission":{"properties":{"campaign_id":{"type":"string","title":"Campaign Id","description":"Campaign ID"},"campaign_source":{"type":"string","title":"Campaign Source","description":"Campaign source"},"primary_use_case":{"type":"string","maxLength":500,"minLength":5,"title":"Primary Use Case","description":"Primary use case"},"features_used":{"items":{"type":"string"},"type":"array","minItems":1,"title":"Features Used","description":"Features used since purchase"},"most_valuable_feature":{"type":"string","maxLength":200,"minLength":3,"title":"Most Valuable Feature","description":"Most valuable feature"},"satisfaction_score":{"type":"integer","maximum":10.0,"minimum":1.0,"title":"Satisfaction Score","description":"Overall satisfaction (1-10)"},"likes_most":{"type":"string","maxLength":500,"minLength":5,"title":"Likes Most","description":"What they like most"},"likes_least":{"type":"string","maxLength":500,"minLength":5,"title":"Likes Least","description":"What needs improvement"},"nps_score":{"type":"integer","maximum":10.0,"minimum":0.0,"title":"Nps Score","description":"Net Promoter Score (0-10)"},"top_feature_request":{"type":"string","maxLength":500,"minLength":5,"title":"Top Feature Request","description":"Top feature request"},"top_improvement":{"type":"string","maxLength":500,"minLength":5,"title":"Top Improvement","description":"Top improvement suggestion"},"beta_tester":{"type":"boolean","title":"Beta Tester","description":"Willing to beta test new features","default":false},"allow_follow_up":{"type":"boolean","title":"Allow Follow Up","description":"Allow follow-up contact","default":false},"additional_comments":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Additional Comments","description":"Additional comments"}},"type":"object","required":["campaign_id","campaign_source","primary_use_case","features_used","most_valuable_feature","satisfaction_score","likes_most","likes_least","nps_score","top_feature_request","top_improvement"],"title":"CampaignFeedbackSubmission","description":"Campaign feedback submission"},"CampaignRequest":{"properties":{"campaign_type":{"type":"string","title":"Campaign Type","description":"Type of campaign to send"},"user_limit":{"type":"integer","maximum":5000.0,"minimum":1.0,"title":"User Limit","default":1000},"test_mode":{"type":"boolean","title":"Test Mode","description":"Run in test mode (no actual emails)","default":false}},"type":"object","required":["campaign_type"],"title":"CampaignRequest","description":"Request model for manual campaign execution"},"CancelDeletionResponse":{"properties":{"cancelled":{"type":"boolean","title":"Cancelled"},"sign_in_required":{"type":"boolean","title":"Sign In Required","default":false},"user_message":{"type":"string","title":"User Message"}},"type":"object","required":["cancelled","user_message"],"title":"CancelDeletionResponse"},"CancelSubscriptionRequest":{"properties":{"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"},"feedback":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Feedback"},"skip_offer":{"type":"boolean","title":"Skip Offer","default":false}},"type":"object","title":"CancelSubscriptionRequest","description":"Cancel-flow body. All fields optional for back-compat with old client builds."},"CaptionTarget":{"properties":{"kind":{"type":"string","const":"captions","title":"Kind"}},"additionalProperties":false,"type":"object","required":["kind"],"title":"CaptionTarget"},"CastAliasRequest":{"properties":{"character_name":{"type":"string","maxLength":120,"minLength":1,"title":"Character Name"},"alias_of":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Alias Of"}},"type":"object","required":["character_name"],"title":"CastAliasRequest"},"CastAliasResponse":{"properties":{"updated_paragraphs":{"type":"integer","title":"Updated Paragraphs"},"members":{"items":{"$ref":"#/components/schemas/CastMember"},"type":"array","title":"Members"}},"type":"object","required":["updated_paragraphs","members"],"title":"CastAliasResponse"},"CastAssignRequest":{"properties":{"character_name":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Character Name"},"is_narrator":{"type":"boolean","title":"Is Narrator","default":false},"voice_id":{"type":"integer","title":"Voice Id"}},"type":"object","required":["voice_id"],"title":"CastAssignRequest"},"CastAssignResponse":{"properties":{"updated_paragraphs":{"type":"integer","title":"Updated Paragraphs","description":"Unlocked lines of the character that take the assigned voice. With character voices off (character_voices_on false) no line is changed: these lines take the voice once they are turned on."},"narrator_default_updated":{"type":"boolean","title":"Narrator Default Updated","default":false},"already_narrated":{"type":"integer","title":"Already Narrated","default":0},"character_voices_on":{"type":"boolean","title":"Character Voices On","default":true}},"type":"object","required":["updated_paragraphs"],"title":"CastAssignResponse"},"CastAutoCastEntry":{"properties":{"character_name":{"type":"string","title":"Character Name"},"voice_id":{"type":"integer","title":"Voice Id"},"display_name":{"type":"string","title":"Display Name"}},"type":"object","required":["character_name","voice_id","display_name"],"title":"CastAutoCastEntry"},"CastAutoRequest":{"properties":{"character_names":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Character Names","description":"Characters to cast. Omit to cast the top uncast speakers by line count; an empty list is refused with 400 (code empty_selection)."},"max_characters":{"type":"integer","maximum":12.0,"minimum":1.0,"title":"Max Characters","default":6},"multi_voice":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Multi Voice","description":"Send true to turn character voices on as part of this request. With character voices off and this not true, the request is refused with 409 (code character_voices_off) before any charge."}},"type":"object","title":"CastAutoRequest"},"CastAutoResponse":{"properties":{"job_id":{"type":"string","title":"Job Id"},"characters":{"items":{"type":"string"},"type":"array","title":"Characters"}},"type":"object","required":["job_id","characters"],"title":"CastAutoResponse"},"CastAutoResult":{"properties":{"cast":{"items":{"$ref":"#/components/schemas/CastAutoCastEntry"},"type":"array","title":"Cast"},"failed":{"items":{"type":"string"},"type":"array","title":"Failed"}},"type":"object","title":"CastAutoResult"},"CastAutoStatusResponse":{"properties":{"job_id":{"type":"string","title":"Job Id"},"status":{"type":"string","title":"Status"},"progress":{"type":"number","title":"Progress","default":0},"current_step":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Step"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"result":{"anyOf":[{"$ref":"#/components/schemas/CastAutoResult"},{"type":"null"}]}},"type":"object","required":["job_id","status"],"title":"CastAutoStatusResponse"},"CastDetectResponse":{"properties":{"detected_paragraphs":{"type":"integer","title":"Detected Paragraphs","description":"Paragraphs given a speaker by this call. Always 0 for method=llm, which runs as a job: poll its status for the count."},"members":{"items":{"$ref":"#/components/schemas/CastMember"},"type":"array","title":"Members"},"method":{"type":"string","title":"Method","description":"heuristic or llm.","default":"heuristic"},"job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Id","description":"method=llm only: the speaker attribution job. Poll GET /projects/{project_id}/cast/detect/{job_id}/status, or subscribe a webhook endpoint to audiobook.cast.detected."}},"type":"object","required":["detected_paragraphs","members"],"title":"CastDetectResponse"},"CastDetectResult":{"properties":{"paragraphs_attributed":{"type":"integer","title":"Paragraphs Attributed","description":"Paragraphs given a speaker.","default":0},"characters":{"items":{"type":"string"},"type":"array","title":"Characters","description":"Speakers written to at least one paragraph."},"aliases_added":{"type":"integer","title":"Aliases Added","description":"Names folded onto another name of the same character.","default":0},"voices_picked":{"type":"integer","title":"Voices Picked","description":"Characters given a free library voice (character voices on only).","default":0},"targets":{"type":"integer","title":"Targets","description":"Dialogue paragraphs the pass looked at.","default":0}},"type":"object","title":"CastDetectResult"},"CastDetectStatusResponse":{"properties":{"job_id":{"type":"string","title":"Job Id"},"status":{"type":"string","title":"Status","description":"PENDING, PROCESSING, COMPLETED or FAILED."},"progress":{"type":"number","title":"Progress","default":0},"current_step":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Step"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"result":{"anyOf":[{"$ref":"#/components/schemas/CastDetectResult"},{"type":"null"}]}},"type":"object","required":["job_id","status"],"title":"CastDetectStatusResponse"},"CastDetection":{"properties":{"state":{"type":"string","enum":["idle","running","failed","done"],"title":"State","default":"idle"},"job_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Job Id"},"finished_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Finished At"}},"type":"object","title":"CastDetection","description":"The latest background speaker detection for the book."},"CastMember":{"properties":{"character_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Character Name"},"is_narrator":{"type":"boolean","title":"Is Narrator","default":false},"paragraph_count":{"type":"integer","title":"Paragraph Count"},"voice_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Voice Id"},"sample_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sample Text"},"alias_of":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Alias Of"},"aliases":{"items":{"type":"string"},"type":"array","title":"Aliases"},"key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Key","description":"The character's cast key, used by PUT /projects/{id}/cast/{key} and POST /projects/{id}/cast/merge. Null for the narrator."},"voice_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Voice Source","description":"Where the character's voice comes from: user (you chose it), designed, auto_library (picked for you), narrator (the narrator's voice), or null (none yet)."},"cast_voice_active":{"type":"boolean","title":"Cast Voice Active","description":"True when the character's cast voice is in use. False while character voices are off: a voice you assigned is saved and shown in voice_id, and is used once they are turned on.","default":false},"hidden":{"type":"boolean","title":"Hidden","description":"Hidden from the cast: it looks like a stray word rather than a character, or you hid it. A hidden character is never given a voice automatically.","default":false},"hidden_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hidden Reason","description":"Why it is hidden: few_lines, lowercase, function_word, stopword, or user."}},"type":"object","required":["paragraph_count"],"title":"CastMember","description":"One speaker across the book. `is_narrator` marks the default-voice bucket\n(paragraphs with no character_name)."},"CastMemberUpdate":{"properties":{"voice":{"anyOf":[{"$ref":"#/components/schemas/CastVoiceRef"},{"type":"string","enum":["narrator","auto"]},{"type":"null"}],"title":"Voice","description":"{\"voice_id\": N} gives the character that voice; \"narrator\" gives it the narrator's voice; \"auto\" clears your choice so a library voice is picked when character voices are on. Omit to leave the voice as it is."},"hidden":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Hidden","description":"Hide (true) or show (false) the character."}},"type":"object","title":"CastMemberUpdate","description":"``PUT /projects/{id}/cast/{key}``."},"CastMergeRequest":{"properties":{"from_keys":{"items":{"type":"string"},"type":"array","maxItems":50,"minItems":1,"title":"From Keys"},"into_key":{"type":"string","maxLength":120,"minLength":1,"title":"Into Key"}},"type":"object","required":["from_keys","into_key"],"title":"CastMergeRequest","description":"``POST /projects/{id}/cast/merge``."},"CastMergeSuggestion":{"properties":{"from":{"type":"string","title":"From","description":"Cast key to fold in."},"into":{"type":"string","title":"Into","description":"Cast key of the character it belongs to."},"reason":{"type":"string","title":"Reason","description":"Why it is suggested, e.g. function_word."}},"type":"object","required":["from","into","reason"],"title":"CastMergeSuggestion","description":"A hidden name that probably belongs to another character."},"CastResponse":{"properties":{"members":{"items":{"$ref":"#/components/schemas/CastMember"},"type":"array","title":"Members"},"total_characters":{"type":"integer","title":"Total Characters"},"character_voices_on":{"type":"boolean","title":"Character Voices On","description":"Whether character voices (multi_voice) are on.","default":false},"hidden_members":{"items":{"$ref":"#/components/schemas/CastMember"},"type":"array","title":"Hidden Members","description":"Characters hidden from members (see CastMember.hidden). With include_hidden=true they are listed in members too."},"suggested_merges":{"items":{"$ref":"#/components/schemas/CastMergeSuggestion"},"type":"array","title":"Suggested Merges"},"detection":{"$ref":"#/components/schemas/CastDetection"}},"type":"object","required":["members","total_characters"],"title":"CastResponse"},"CastSuggestRequest":{"properties":{"language":{"type":"string","maxLength":10,"title":"Language","description":"Language code, e.g. en or hi","default":"en"},"speakers":{"items":{"$ref":"#/components/schemas/CastSuggestSpeakerIn"},"type":"array","maxItems":4,"minItems":1,"title":"Speakers"},"episode_profile_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Episode Profile Id","description":"Episode profile whose tone guides casting"},"topic":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Topic"},"briefing":{"anyOf":[{"type":"string","maxLength":4000},{"type":"null"}],"title":"Briefing"}},"type":"object","required":["speakers"],"title":"CastSuggestRequest","description":"Suggest a voice for every speaker who does not have one yet."},"CastSuggestResponse":{"properties":{"speakers":{"items":{"$ref":"#/components/schemas/CastSuggestSpeakerOut"},"type":"array","title":"Speakers"}},"type":"object","required":["speakers"],"title":"CastSuggestResponse","description":"The suggested cast, in request order."},"CastSuggestSpeakerIn":{"properties":{"name":{"type":"string","maxLength":50,"minLength":1,"title":"Name"},"role":{"type":"string","maxLength":20,"title":"Role","description":"Host, Expert, Guest or Narrator, in any case. Echoed back as sent."},"voice_ref_id":{"anyOf":[{"type":"integer","maximum":2147483647.0,"minimum":1.0},{"type":"null"}],"title":"Voice Ref Id","description":"A voice already chosen for this speaker. Kept when usable."}},"type":"object","required":["name","role"],"title":"CastSuggestSpeakerIn","description":"A speaker in the cast, with or without a chosen voice."},"CastSuggestSpeakerOut":{"properties":{"name":{"type":"string","title":"Name"},"role":{"type":"string","title":"Role"},"voice_ref_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Voice Ref Id"},"auto_picked":{"type":"boolean","title":"Auto Picked","description":"True when the voice was chosen for this speaker by the cast step.","default":false},"voice":{"anyOf":[{"$ref":"#/components/schemas/CastSuggestVoice"},{"type":"null"}]}},"type":"object","required":["name","role"],"title":"CastSuggestSpeakerOut","description":"A speaker with the voice they will be cast in."},"CastSuggestVoice":{"properties":{"id":{"type":"integer","title":"Id"},"display_name":{"type":"string","title":"Display Name"},"gender":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gender"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"sample_audio_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sample Audio Url"},"age_group":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Age Group"},"accent":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accent"}},"type":"object","required":["id","display_name"],"title":"CastSuggestVoice","description":"The voice suggested or kept for a speaker."},"CastVoiceRef":{"properties":{"voice_id":{"type":"integer","title":"Voice Id"}},"type":"object","required":["voice_id"],"title":"CastVoiceRef"},"ChapterMarker":{"properties":{"title":{"type":"string","title":"Title"},"time_ms":{"type":"integer","title":"Time Ms"}},"type":"object","required":["title","time_ms"],"title":"ChapterMarker"},"CheckoutAbandonRequest":{"properties":{"checkout_id":{"type":"string","title":"Checkout Id"},"exit_intent_shown":{"type":"boolean","title":"Exit Intent Shown","default":false},"exit_intent_stayed":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Exit Intent Stayed"}},"type":"object","required":["checkout_id"],"title":"CheckoutAbandonRequest","description":"Request body for marking a checkout as abandoned"},"CheckoutRecoverRequest":{"properties":{"checkout_id":{"type":"string","title":"Checkout Id"}},"type":"object","required":["checkout_id"],"title":"CheckoutRecoverRequest","description":"Request body for recovering a checkout"},"CheckoutRequest":{"properties":{"return_path":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Return Path","description":"Return to this book in Audiobook Studio after checkout: /dashboard/tools/audiobook-studio/<project id>. Any other value is refused."},"audiobook_context":{"anyOf":[{"$ref":"#/components/schemas/AudiobookCheckoutContext"},{"type":"null"}]}},"type":"object","title":"CheckoutRequest","description":"Optional checkout body (WEB-1165). Omit it for the original behaviour."},"CheckoutResponse":{"properties":{"quote_id":{"type":"string","format":"uuid","title":"Quote Id"},"checkout_url":{"type":"string","title":"Checkout Url"},"session_id":{"type":"string","title":"Session Id"},"amount_cents":{"type":"integer","title":"Amount Cents"},"currency":{"type":"string","title":"Currency"}},"type":"object","required":["quote_id","checkout_url","session_id","amount_cents","currency"],"title":"CheckoutResponse"},"CheckoutStartRequest":{"properties":{"checkout_type":{"type":"string","title":"Checkout Type"},"plan_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Plan Name"},"amount":{"type":"integer","title":"Amount"},"currency":{"type":"string","title":"Currency","default":"USD"},"billing_interval":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Billing Interval"},"credits_to_receive":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Credits To Receive"},"stripe_payment_intent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stripe Payment Intent Id"},"coupon_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coupon Code"},"discount_amount":{"type":"integer","title":"Discount Amount","default":0}},"type":"object","required":["checkout_type","amount"],"title":"CheckoutStartRequest","description":"Request body for starting a checkout"},"ChunkInfo":{"properties":{"index":{"type":"integer","title":"Index"},"url":{"type":"string","title":"Url"},"duration_ms":{"type":"integer","title":"Duration Ms"}},"type":"object","required":["index","url","duration_ms"],"title":"ChunkInfo"},"ClipJobCreateRequest":{"properties":{"upload_id":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Upload Id","description":"Identifier returned when your upload completed."},"source_url":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Source Url","description":"Link to a video to clip, instead of uploading a file."},"original_filename":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Original Filename"},"analysis_start_s":{"type":"number","minimum":0.0,"title":"Analysis Start S","description":"Start of the span to analyse, in seconds.","default":0.0},"analysis_end_s":{"anyOf":[{"type":"number","exclusiveMinimum":0.0},{"type":"null"}],"title":"Analysis End S","description":"End of the span to analyse. Defaults to the full source."},"content_type_hint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Type Hint","description":"Content preference for selecting moments, such as educational explanations or complete interview exchanges. Leave unset for automatic selection."},"source_language":{"anyOf":[{"type":"string","maxLength":8},{"type":"null"}],"title":"Source Language","description":"Spoken language of the source, as an ISO code. Leave unset to detect it automatically."},"length_preset":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Length Preset","description":"Target clip length band."},"clips_requested":{"anyOf":[{"type":"integer","maximum":20.0,"minimum":1.0},{"type":"null"}],"title":"Clips Requested","description":"How many clips to return. Capped by your plan."},"captions_enabled":{"type":"boolean","title":"Captions Enabled","default":true},"template_slug":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Template Slug"},"rights_attested":{"type":"boolean","title":"Rights Attested","description":"You confirm you own this content or have the right to clip it.","default":false}},"type":"object","title":"ClipJobCreateRequest","description":"Create a clip job from an already-uploaded source."},"ClipJobResponse":{"properties":{"id":{"type":"integer","title":"Id"},"status":{"type":"string","title":"Status"},"progress":{"type":"number","title":"Progress","default":0.0},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"stage":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stage","description":"Where the job is: queued, fetch, prepare, diarize, transcribe, select, render or settle. On a finished job, the last stage reached."},"error_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Code","description":"Machine-readable failure reason, e.g. clip_no_speech."},"source_kind":{"type":"string","title":"Source Kind","default":"upload"},"source_media_kind":{"anyOf":[{"type":"string","enum":["audio","video"]},{"type":"null"}],"title":"Source Media Kind"},"original_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Original Filename"},"source_duration_s":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Source Duration S"},"analysis_start_s":{"type":"number","title":"Analysis Start S","default":0.0},"analysis_end_s":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Analysis End S"},"content_type_hint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Type Hint"},"clips_requested":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Clips Requested"},"clips_delivered":{"type":"integer","title":"Clips Delivered","default":0},"pending_variants":{"type":"integer","title":"Pending Variants","default":0},"workflow":{"type":"string","enum":["auto_render","edit_then_export"],"title":"Workflow","default":"auto_render"},"editor_available":{"type":"boolean","title":"Editor Available","default":false},"moments_found":{"type":"integer","title":"Moments Found","default":0},"pending_exports":{"type":"integer","title":"Pending Exports","default":0},"unavailable_features":{"items":{"type":"string","enum":["speaker_labels","framing"]},"type":"array","title":"Unavailable Features"},"clips":{"items":{"$ref":"#/components/schemas/ClipResponse"},"type":"array","title":"Clips"},"expired":{"type":"boolean","title":"Expired","description":"The job's files have been deleted, so its clips can no longer be played or downloaded.","default":false},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"}},"type":"object","required":["id","status"],"title":"ClipJobResponse"},"ClipQuoteRequest":{"properties":{"duration_s":{"type":"number","exclusiveMinimum":0.0,"title":"Duration S","description":"Length of the span to analyse."},"clips_requested":{"anyOf":[{"type":"integer","maximum":20.0,"minimum":1.0},{"type":"null"}],"title":"Clips Requested"}},"type":"object","required":["duration_s"],"title":"ClipQuoteRequest","description":"Price a span BEFORE creating the job.\n\nExists because the quote must include the render cost, not just analysis.\nQuoting analysis alone is what produced a plan claiming a 1,000-credit grant\ncould buy a result that actually cost 1,590."},"ClipQuoteResponse":{"properties":{"analysis_credits":{"type":"integer","title":"Analysis Credits"},"render_credits":{"type":"integer","title":"Render Credits"},"total_credits":{"type":"integer","title":"Total Credits","description":"What this job will actually cost."},"clips":{"type":"integer","title":"Clips","description":"How many clips this quote covers."},"affordable":{"type":"boolean","title":"Affordable","description":"Whether your balance covers the total."},"balance":{"type":"integer","title":"Balance"},"max_affordable_duration_s":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max Affordable Duration S","description":"Longest span your balance covers, including rendering."}},"type":"object","required":["analysis_credits","render_credits","total_credits","clips","affordable","balance"],"title":"ClipQuoteResponse"},"ClipResponse":{"properties":{"id":{"type":"integer","title":"Id"},"rank":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rank"},"start_s":{"type":"number","title":"Start S"},"end_s":{"type":"number","title":"End S"},"duration_s":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Duration S"},"hook_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hook Text"},"hook_alternatives":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Hook Alternatives"},"hook_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hook Type"},"scores":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Scores"},"emotional_register":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Emotional Register"},"reasoning":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reasoning","description":"Why this moment was selected."},"transcript_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transcript Text"},"crop_mode":{"type":"string","title":"Crop Mode","default":"auto"},"captions_enabled":{"type":"boolean","title":"Captions Enabled","default":true},"parent_clip_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Parent Clip Id"},"variant_index":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Variant Index"},"video_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Video Url"},"thumbnail_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail Url"},"artifact_status":{"type":"string","enum":["pending","ready","failed","expired","not_exported"],"title":"Artifact Status","default":"pending"},"exports_ready":{"type":"integer","title":"Exports Ready","default":0},"exports_pending":{"type":"integer","title":"Exports Pending","default":0},"credits_charged":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Credits Charged"}},"type":"object","required":["id","start_s","end_s"],"title":"ClipResponse"},"ClipVariantRequest":{"properties":{"count":{"type":"integer","maximum":10.0,"minimum":1.0,"title":"Count","description":"How many versions of this clip to make.","default":3},"hook_texts":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Hook Texts","description":"Headlines to use, one per version. Defaults to the ones we already wrote."},"crop_modes":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Crop Modes","description":"Framing to use, one per version."}},"type":"object","title":"ClipVariantRequest","description":"Request N variants of a clip that already rendered.\n\nProduces distinct versions of the same moment — different hooks and\nopenings — so the same clip can be posted more than once. Platforms\npenalise a re-posted identical FILE, not a re-used moment."},"ClipVariantResponse":{"properties":{"clip_id":{"type":"integer","title":"Clip Id"},"requested":{"type":"integer","title":"Requested"},"delivered":{"type":"integer","title":"Delivered"},"credits_charged":{"type":"integer","title":"Credits Charged"},"variants":{"items":{"$ref":"#/components/schemas/ClipResponse"},"type":"array","title":"Variants"}},"type":"object","required":["clip_id","requested","delivered","credits_charged"],"title":"ClipVariantResponse"},"CloningJob":{"properties":{"id":{"type":"integer","title":"Id"},"voice_id":{"type":"integer","title":"Voice Id"},"status":{"$ref":"#/components/schemas/ProcessingStatus"},"progress":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Progress","description":"Progress percentage (0-100)"},"input_text":{"type":"string","title":"Input Text"},"target_language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Language"},"output_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Output Path"},"generation_params":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Generation Params"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"task_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Task Id"},"voice":{"anyOf":[{"$ref":"#/components/schemas/Voice"},{"type":"null"}]},"daw_project_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Daw Project Id","description":"DAW project this job was dispatched from"},"r2_purged_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"R2 Purged At"}},"type":"object","required":["id","voice_id","status","input_text","target_language","output_path","created_at","completed_at"],"title":"CloningJob"},"CloningJobCreate":{"properties":{"voice_id":{"anyOf":[{"type":"integer"},{"type":"string"}],"title":"Voice Id"},"input_text":{"type":"string","maxLength":10000,"minLength":1,"title":"Input Text"},"target_language":{"anyOf":[{"type":"string","maxLength":5,"minLength":2},{"type":"null"}],"title":"Target Language"},"generation_params":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Generation Params"}},"type":"object","required":["voice_id","input_text"],"title":"CloningJobCreate"},"CommissionResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"affiliate_id":{"type":"string","format":"uuid","title":"Affiliate Id"},"referral_id":{"type":"string","format":"uuid","title":"Referral Id"},"subscription_id":{"type":"string","format":"uuid","title":"Subscription Id"},"commission_period_start":{"type":"string","format":"date-time","title":"Commission Period Start"},"commission_period_end":{"type":"string","format":"date-time","title":"Commission Period End"},"billing_period_start":{"type":"string","format":"date-time","title":"Billing Period Start"},"billing_period_end":{"type":"string","format":"date-time","title":"Billing Period End"},"subscription_amount":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Subscription Amount"},"commission_rate":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Commission Rate"},"commission_amount":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Commission Amount"},"currency":{"type":"string","title":"Currency"},"status":{"$ref":"#/components/schemas/CommissionStatusEnum"},"hold_until":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Hold Until"},"eligible_for_payout_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Eligible For Payout At"},"paid_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Paid At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","affiliate_id","referral_id","subscription_id","commission_period_start","commission_period_end","billing_period_start","billing_period_end","subscription_amount","commission_rate","commission_amount","currency","status","created_at","updated_at"],"title":"CommissionResponse","description":"Schema for commission responses"},"CommissionStatus":{"type":"string","enum":["pending","eligible","paid","cancelled","held"],"title":"CommissionStatus","description":"Commission status"},"CommissionStatusEnum":{"type":"string","enum":["pending","eligible","paid","cancelled","held"],"title":"CommissionStatusEnum"},"CommissionSummary":{"properties":{"total_earned":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Total Earned"},"total_pending":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Total Pending"},"total_eligible":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Total Eligible"},"total_paid":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Total Paid"},"current_month_earned":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Current Month Earned"},"last_month_earned":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Last Month Earned"},"commission_count":{"type":"integer","title":"Commission Count"},"avg_commission":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Avg Commission"}},"type":"object","required":["total_earned","total_pending","total_eligible","total_paid","current_month_earned","last_month_earned","commission_count","avg_commission"],"title":"CommissionSummary","description":"Summary of affiliate commissions"},"ContactRequestCreate":{"properties":{"name":{"type":"string","maxLength":100,"minLength":1,"title":"Name"},"email":{"type":"string","format":"email","title":"Email"},"subject":{"type":"string","maxLength":200,"minLength":1,"title":"Subject"},"message":{"type":"string","maxLength":5000,"minLength":10,"title":"Message"}},"type":"object","required":["name","email","subject","message"],"title":"ContactRequestCreate"},"ContactResponse":{"properties":{"message":{"type":"string","title":"Message"}},"type":"object","required":["message"],"title":"ContactResponse"},"ConversionPreset":{"properties":{"name":{"type":"string","title":"Name"},"description":{"type":"string","title":"Description"},"output_format":{"anyOf":[{"$ref":"#/components/schemas/AudioFormat-Output"},{"$ref":"#/components/schemas/VideoFormat"}],"title":"Output Format"},"settings":{"additionalProperties":true,"type":"object","title":"Settings"},"use_case":{"type":"string","title":"Use Case"}},"type":"object","required":["name","description","output_format","settings","use_case"],"title":"ConversionPreset","description":"Predefined conversion preset"},"ConversionPresetsResponse":{"properties":{"audio_presets":{"items":{"$ref":"#/components/schemas/ConversionPreset"},"type":"array","title":"Audio Presets"},"video_presets":{"items":{"$ref":"#/components/schemas/ConversionPreset"},"type":"array","title":"Video Presets"}},"type":"object","required":["audio_presets","video_presets"],"title":"ConversionPresetsResponse","description":"Response with available conversion presets"},"CopilotApply":{"properties":{"receipt":{"type":"string","maxLength":131072,"minLength":1,"title":"Receipt"},"batch":{"additionalProperties":true,"type":"object","title":"Batch"},"confirmed":{"type":"boolean","title":"Confirmed","default":false}},"additionalProperties":false,"type":"object","required":["receipt","batch"],"title":"CopilotApply"},"CopilotRequest":{"properties":{"baseRev":{"type":"integer","minimum":0.0,"title":"Baserev"},"request":{"type":"string","maxLength":2000,"minLength":1,"title":"Request"},"selectedKit":{"anyOf":[{"type":"string","pattern":"^kit_[0-9a-f]{32}_[1-9][0-9]{0,8}$"},{"type":"null"}],"title":"Selectedkit"}},"additionalProperties":false,"type":"object","required":["baseRev","request"],"title":"CopilotRequest"},"CostEstimateRequest":{"properties":{"service_type":{"type":"string","title":"Service Type","description":"Service type (e.g., 'stem_extraction')"},"duration_seconds":{"anyOf":[{"type":"integer","exclusiveMinimum":0.0},{"type":"null"}],"title":"Duration Seconds","description":"Audio duration in seconds. Required for per-minute services. For services priced per 1,000 characters it gives an approximate quote when text_length is not sent."},"text_length":{"type":"integer","minimum":0.0,"title":"Text Length","description":"Billable character count. Required for services priced per 1,000 characters (text-to-speech, voice cloning, audiobook narration); the duration is then context only. Bracketed speaking-style directions and pause tags are not counted.","default":0}},"type":"object","required":["service_type"],"title":"CostEstimateRequest","description":"Request for cost estimate"},"CostEstimateResponse":{"properties":{"service_type":{"type":"string","title":"Service Type"},"unit":{"type":"string","title":"Unit","description":"What the service is metered in: 'minute' or '1k_characters'."},"duration_seconds":{"type":"integer","title":"Duration Seconds"},"duration_minutes":{"type":"number","title":"Duration Minutes"},"rate_per_minute":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rate Per Minute","description":"Per-minute rate; null for per-character services."},"cost_cents":{"type":"integer","title":"Cost Cents"},"cost_usd":{"type":"string","title":"Cost Usd"},"description":{"type":"string","title":"Description"},"billed_per_character":{"type":"boolean","title":"Billed Per Character","default":false},"text_length":{"type":"integer","title":"Text Length","default":0},"estimated_characters":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Estimated Characters","description":"Characters the quote was priced on (per-character services)."},"estimate_basis":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Estimate Basis","description":"'characters' when priced from text_length; 'duration' when a per-character service was approximated from duration_seconds (about 900 characters per minute), or for a per-minute service."},"cents_per_1k_characters":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cents Per 1K Characters","description":"Cents per 1,000 characters; null for per-minute services."},"rate_per_1k_characters":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rate Per 1K Characters","description":"Display rate, e.g. '$0.09 / 1K chars'; null for per-minute services."}},"type":"object","required":["service_type","unit","duration_seconds","duration_minutes","cost_cents","cost_usd","description"],"title":"CostEstimateResponse","description":"Response with cost estimate"},"CoverRequest":{"properties":{"duration":{"type":"number","maximum":600.0,"minimum":-1.0,"title":"Duration","description":"Audio duration in seconds (-1 for auto-detection based on lyrics, max 600s/10min)","default":-1.0},"audio_duration":{"type":"number","maximum":600.0,"minimum":-1.0,"title":"Audio Duration","description":"Alias for duration (legacy)"},"format":{"$ref":"#/components/schemas/app__schemas__music__AudioFormat","description":"Output audio format (flac recommended for quality)","default":"flac"},"model_version":{"anyOf":[{"$ref":"#/components/schemas/ModelVersion"},{"type":"null"}],"description":"Model version: audiomusic-v2 (default) or audiomusic-v1.5","default":"audiomusic-v2"},"quality":{"anyOf":[{"$ref":"#/components/schemas/MusicQuality"},{"type":"null"}],"description":"Deprecated and ignored. Every plan generates with AudioPod's highest-quality music model at the same rate; both values are accepted for compatibility and behave identically."},"bpm":{"anyOf":[{"type":"integer","maximum":300.0,"minimum":30.0},{"type":"null"}],"title":"Bpm","description":"Beats per minute (30-300). None for auto-detection via LM."},"keyscale":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Keyscale","description":"Musical key (e.g. 'C Major', 'Am', 'F# minor'). Empty for auto-detection."},"timesignature":{"anyOf":[{"type":"string","maxLength":10},{"type":"null"}],"title":"Timesignature","description":"Time signature (2='2/4', 3='3/4', 4='4/4', 6='6/8'). Empty for auto-detection."},"vocal_language":{"type":"string","maxLength":20,"title":"Vocal Language","description":"Language code for vocals (ISO 639-1: 'en', 'zh', 'ja', etc.). 'unknown' for auto-detection.","default":"unknown"},"inference_steps":{"type":"integer","maximum":200.0,"minimum":1.0,"title":"Inference Steps","description":"Diffusion steps. SFT/Base: 64 for best quality (32-100 range). Turbo: 8.","default":64},"infer_step":{"type":"integer","maximum":200.0,"minimum":1.0,"title":"Infer Step","description":"Alias for inference_steps (legacy)"},"guidance_scale":{"type":"number","maximum":15.0,"minimum":1.0,"title":"Guidance Scale","description":"CFG scale (1.0-15.0). Higher = more adherence to prompt.","default":7.0},"seed":{"type":"integer","title":"Seed","description":"Random seed (-1 for random, positive for fixed)","default":-1},"shift":{"type":"number","maximum":5.0,"minimum":1.0,"title":"Shift","description":"Timestep shift factor (1.0-5.0). 3.0 recommended for all models.","default":3.0},"infer_method":{"$ref":"#/components/schemas/InferMethod","description":"Inference method: 'ode' (Euler, fast) or 'sde' (stochastic)","default":"ode"},"use_adg":{"type":"boolean","title":"Use Adg","description":"Adaptive Dual Guidance (base model only). Improves quality at the cost of speed.","default":false},"cfg_interval_start":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Cfg Interval Start","description":"CFG application start ratio (0.0-1.0)","default":0.0},"cfg_interval_end":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Cfg Interval End","description":"CFG application end ratio (0.0-1.0)","default":1.0},"timesteps":{"anyOf":[{"items":{"type":"number"},"type":"array"},{"type":"null"}],"title":"Timesteps","description":"Custom timesteps list from 1.0 to 0.0. Overrides inference_steps and shift if provided."},"thinking":{"type":"boolean","title":"Thinking","description":"Enable LM Chain-of-Thought reasoning for semantic planning","default":true},"lm_temperature":{"type":"number","maximum":2.0,"minimum":0.0,"title":"Lm Temperature","description":"LM sampling temperature. Higher = more creative.","default":0.85},"lm_cfg_scale":{"type":"number","maximum":10.0,"minimum":0.0,"title":"Lm Cfg Scale","description":"LM classifier-free guidance scale","default":2.0},"lm_top_k":{"type":"integer","maximum":100.0,"minimum":0.0,"title":"Lm Top K","description":"LM top-k sampling. 0 disables.","default":0},"lm_top_p":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Lm Top P","description":"LM nucleus sampling. 1.0 disables.","default":0.9},"lm_negative_prompt":{"type":"string","maxLength":512,"title":"Lm Negative Prompt","description":"Negative prompt for LM classifier-free guidance","default":"NO USER INPUT"},"use_cot_metas":{"type":"boolean","title":"Use Cot Metas","description":"Generate metadata using LM CoT reasoning","default":true},"use_cot_caption":{"type":"boolean","title":"Use Cot Caption","description":"Refine caption using LM CoT reasoning","default":true},"use_cot_lyrics":{"type":"boolean","title":"Use Cot Lyrics","description":"Generate/refine lyrics using LM CoT reasoning (reserved)","default":false},"use_cot_language":{"type":"boolean","title":"Use Cot Language","description":"Detect vocal language using LM CoT reasoning","default":true},"use_constrained_decoding":{"type":"boolean","title":"Use Constrained Decoding","description":"Enable constrained decoding for structured LM output","default":true},"lora_name_or_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lora Name Or Path","description":"LoRA adapter path for custom styles"},"lora_weight":{"type":"number","maximum":3.0,"minimum":-3.0,"title":"Lora Weight","description":"LoRA weight","default":1.0},"batch_size":{"type":"integer","maximum":8.0,"minimum":1.0,"title":"Batch Size","description":"Number of variations to generate (1-8)","default":1},"thumbnail_url":{"anyOf":[{"type":"string","maxLength":1024},{"type":"null"}],"title":"Thumbnail Url","description":"URL for the music thumbnail"},"manual_seeds":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Manual Seeds","description":"Manual seeds for batch generation (legacy)"},"scheduler_type":{"anyOf":[{"$ref":"#/components/schemas/SchedulerType"},{"type":"null"}],"description":"Legacy scheduler type (use infer_method instead)"},"cfg_type":{"anyOf":[{"$ref":"#/components/schemas/CFGType"},{"type":"null"}],"description":"Legacy CFG type"},"use_sde":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Use Sde","description":"Legacy SDE flag (use infer_method='sde' instead)"},"debug":{"type":"boolean","title":"Debug","description":"Enable debug mode","default":false},"display_name":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Display Name","description":"Display name for the cover"},"src_audio_url":{"type":"string","maxLength":2048,"minLength":1,"title":"Src Audio Url","description":"URL to source audio file for cover"},"caption":{"type":"string","maxLength":2048,"minLength":1,"title":"Caption","description":"Description of desired style/transformation"},"lyrics":{"type":"string","maxLength":4096,"title":"Lyrics","description":"New lyrics (if changing vocals)","default":""},"audio_cover_strength":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Audio Cover Strength","description":"Influence of original audio (1.0=strong adherence, 0.1=loose interpretation)","default":0.7}},"type":"object","required":["src_audio_url","caption"],"title":"CoverRequest","description":"Request for cover generation - transform existing audio while maintaining structure.\n\nExample: Transform a pop song into a jazz piano version.\n\n{\n    \"src_audio_url\": \"https://example.com/original_song.mp3\",\n    \"caption\": \"jazz piano version with upright bass\",\n    \"audio_cover_strength\": 0.7\n}"},"CreateCheckoutSession":{"properties":{"price_id":{"type":"string","title":"Price Id"},"success_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Success Url"},"cancel_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cancel Url"},"billing_period":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Billing Period"},"coupon_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coupon Code"}},"type":"object","required":["price_id"],"title":"CreateCheckoutSession"},"CreateInvoiceRequest":{"properties":{"period":{"type":"string","pattern":"^\\d{4}-(0[1-9]|1[0-2])$","title":"Period","description":"YYYY-MM"},"amount_cents":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Amount Cents","description":"Defaults to the partner's committed minimum"},"send":{"type":"boolean","title":"Send","default":true}},"type":"object","required":["period"],"title":"CreateInvoiceRequest"},"CreatePartnerRequest":{"properties":{"organisation_name":{"type":"string","maxLength":200,"minLength":1,"title":"Organisation Name"},"slug":{"type":"string","maxLength":64,"minLength":2,"title":"Slug"},"billing_email":{"type":"string","format":"email","title":"Billing Email"},"tier":{"type":"string","title":"Tier","description":"tier_2k | tier_5k | tier_10k"},"contacts":{"anyOf":[{"items":{"$ref":"#/components/schemas/PartnerContact"},"type":"array"},{"type":"null"}],"title":"Contacts"},"stripe_customer_id":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Stripe Customer Id"},"user_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"User Id","description":"AudioPod account whose API keys carry this traffic"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"},"acknowledge_unconfirmed_discount":{"type":"boolean","title":"Acknowledge Unconfirmed Discount","default":false}},"type":"object","required":["organisation_name","slug","billing_email","tier"],"title":"CreatePartnerRequest"},"CreatePaygOrderRequest":{"properties":{"amount_inr":{"type":"integer","minimum":1.0,"title":"Amount Inr","description":"top-up amount in whole rupees"}},"type":"object","required":["amount_inr"],"title":"CreatePaygOrderRequest"},"CreatePortalSessionResponse":{"properties":{"url":{"type":"string","maxLength":2083,"minLength":1,"format":"uri","title":"Url"}},"type":"object","required":["url"],"title":"CreatePortalSessionResponse"},"CreateQuoteRequest":{"properties":{"tier":{"type":"string","title":"Tier","description":"standard or qc","default":"standard"}},"type":"object","title":"CreateQuoteRequest"},"CreateSessionRequest":{"properties":{"vibe_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vibe Prompt"},"energy_arc":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Energy Arc"},"target_duration_sec":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Target Duration Sec"},"session_params":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Session Params"},"tracks":{"anyOf":[{"items":{"$ref":"#/components/schemas/TrackDescriptor"},"type":"array"},{"type":"null"}],"title":"Tracks"}},"type":"object","title":"CreateSessionRequest"},"CreateSubscriptionIntentRequest":{"properties":{"price_id":{"type":"string","title":"Price Id"},"billing_period":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Billing Period","default":"monthly"},"coupon_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coupon Code"},"audiobook_context":{"anyOf":[{"$ref":"#/components/schemas/AudiobookCheckoutContext"},{"type":"null"}]}},"type":"object","required":["price_id"],"title":"CreateSubscriptionIntentRequest","description":"Request schema for creating a subscription with embedded checkout"},"CreateSubscriptionIntentResponse":{"properties":{"client_secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Secret"},"subscription_id":{"type":"string","title":"Subscription Id"},"plan_name":{"type":"string","title":"Plan Name"},"amount":{"type":"integer","title":"Amount"},"currency":{"type":"string","title":"Currency"},"interval":{"type":"string","title":"Interval"},"requires_payment":{"type":"boolean","title":"Requires Payment","default":true},"subscription_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subscription Status"}},"type":"object","required":["subscription_id","plan_name","amount","currency","interval"],"title":"CreateSubscriptionIntentResponse","description":"Response schema for subscription intent creation"},"CreateSubscriptionRequest":{"properties":{"price_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Price Id"},"tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tier","description":"creator | pro | studio | video_downloader"},"interval":{"anyOf":[{"type":"string","enum":["monthly","yearly"]},{"type":"null"}],"title":"Interval"}},"type":"object","title":"CreateSubscriptionRequest","description":"Either a Stripe price_id (preferred — resolved against the canonical map)\nor an explicit tier/interval pair."},"CreateUploadRequest":{"properties":{"filename":{"type":"string","maxLength":500,"minLength":1,"title":"Filename"},"content_type":{"type":"string","maxLength":128,"minLength":1,"title":"Content Type"},"size_bytes":{"type":"integer","exclusiveMinimum":0.0,"title":"Size Bytes"},"fingerprint":{"type":"string","pattern":"^[a-f0-9]{64}$","title":"Fingerprint"},"idempotencyKey":{"type":"string","maxLength":128,"minLength":1,"pattern":"^[A-Za-z0-9_-]+$","title":"Idempotencykey"}},"additionalProperties":false,"type":"object","required":["filename","content_type","size_bytes","fingerprint","idempotencyKey"],"title":"CreateUploadRequest"},"CreditInfo":{"properties":{"credits_balance":{"type":"integer","minimum":0.0,"title":"Credits Balance"},"payg_balance":{"type":"integer","minimum":0.0,"title":"Payg Balance","default":0},"total_available_credits":{"type":"integer","minimum":0.0,"title":"Total Available Credits"},"last_reset_at":{"type":"string","format":"date-time","title":"Last Reset At"},"total_credits_used":{"type":"integer","minimum":0.0,"title":"Total Credits Used"},"total_payg_credits_purchased":{"type":"integer","minimum":0.0,"title":"Total Payg Credits Purchased","default":0},"next_reset_date":{"type":"string","format":"date-time","title":"Next Reset Date"},"credits_per_month":{"type":"integer","minimum":0.0,"title":"Credits Per Month"},"cycle_allotment":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Cycle Allotment"},"rolled_over":{"type":"integer","minimum":0.0,"title":"Rolled Over","default":0},"held_until":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Held Until"},"auto_refill_state":{"anyOf":[{"$ref":"#/components/schemas/AutoRefillState"},{"type":"null"}]}},"type":"object","required":["credits_balance","total_available_credits","last_reset_at","total_credits_used","next_reset_date","credits_per_month"],"title":"CreditInfo"},"CreditUsageLog":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"user_credits_id":{"type":"string","format":"uuid4","title":"User Credits Id"},"credits_used":{"type":"integer","title":"Credits Used"},"service_type":{"type":"string","title":"Service Type","description":"Type of service that used the credits","examples":["voice_cloning","translation","speaker_analysis","payg_purchase"]},"audio_duration":{"type":"integer","minimum":-1.0,"title":"Audio Duration"},"credit_source":{"type":"string","title":"Credit Source","description":"Source of credits used","default":"subscription","examples":["subscription","payg"]},"created_at":{"type":"string","format":"date-time","title":"Created At"},"usage_metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Usage Metadata"}},"type":"object","required":["id","user_credits_id","credits_used","service_type","audio_duration","created_at"],"title":"CreditUsageLog"},"CurateResponse":{"properties":{"setlist":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Setlist"},"transitions":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Transitions"},"score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Score"}},"type":"object","title":"CurateResponse"},"CustomerInsights":{"properties":{"user_id":{"type":"string","title":"User Id"},"email":{"type":"string","title":"Email"},"has_active_subscription":{"type":"boolean","title":"Has Active Subscription"},"current_plan":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Plan"},"total_lifetime_value":{"type":"number","title":"Total Lifetime Value"},"credits_used":{"type":"integer","title":"Credits Used"},"favorite_features":{"items":{"type":"string"},"type":"array","title":"Favorite Features"},"last_activity":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Activity"},"engagement_score":{"type":"number","title":"Engagement Score"}},"type":"object","required":["user_id","email","has_active_subscription","current_plan","total_lifetime_value","credits_used","favorite_features","last_activity","engagement_score"],"title":"CustomerInsights","description":"Customer insights for analysis"},"DAWExportCreate":{"properties":{"project_id":{"type":"string","title":"Project Id"},"format":{"type":"string","title":"Format"},"sample_rate":{"type":"integer","title":"Sample Rate"},"duration_seconds":{"type":"number","title":"Duration Seconds"},"file_size_bytes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"File Size Bytes"},"r2_key":{"type":"string","title":"R2 Key"},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url"}},"type":"object","required":["project_id","format","sample_rate","duration_seconds","r2_key"],"title":"DAWExportCreate"},"DAWExportResponse":{"properties":{"id":{"type":"integer","title":"Id"},"project_id":{"type":"string","title":"Project Id"},"format":{"type":"string","title":"Format"},"sample_rate":{"type":"integer","title":"Sample Rate"},"duration_seconds":{"type":"number","title":"Duration Seconds"},"file_size_bytes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"File Size Bytes"},"r2_key":{"type":"string","title":"R2 Key"},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","project_id","format","sample_rate","duration_seconds","file_size_bytes","r2_key","public_url","created_at"],"title":"DAWExportResponse"},"DAWImportEntry":{"properties":{"buffer_id":{"type":"string","title":"Buffer Id"},"r2_key":{"type":"string","title":"R2 Key"},"url":{"type":"string","title":"Url"},"size_bytes":{"type":"integer","title":"Size Bytes"},"source":{"$ref":"#/components/schemas/DAWImportEntrySource"},"suggested_track_name":{"type":"string","title":"Suggested Track Name"},"suggested_color":{"type":"string","title":"Suggested Color"}},"type":"object","required":["buffer_id","r2_key","url","size_bytes","source","suggested_track_name","suggested_color"],"title":"DAWImportEntry"},"DAWImportEntrySource":{"properties":{"job_type":{"type":"string","title":"Job Type"},"job_id":{"type":"string","title":"Job Id"},"stem":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stem"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"}},"type":"object","required":["job_type","job_id"],"title":"DAWImportEntrySource"},"DAWImportRequest":{"properties":{"job_type":{"type":"string","maxLength":40,"title":"Job Type"},"job_id":{"type":"string","maxLength":64,"title":"Job Id"},"selection":{"anyOf":[{"items":{"type":"string"},"type":"array","maxItems":64},{"type":"null"}],"title":"Selection"}},"type":"object","required":["job_type","job_id"],"title":"DAWImportRequest","description":"`job_id` is an OPAQUE STRING on the wire (1A) — the frontend never\nparses a job id; each JOB_TYPE_MAP entry owns coercion to its model's id\ntype and a mismatch is a 400."},"DAWImportResponse":{"properties":{"version":{"type":"integer","title":"Version"},"entries":{"items":{"$ref":"#/components/schemas/DAWImportEntry"},"type":"array","title":"Entries"}},"type":"object","required":["version","entries"],"title":"DAWImportResponse"},"DAWProjectCreate":{"properties":{"name":{"type":"string","maxLength":200,"title":"Name","default":"Untitled Project"},"project_data":{"additionalProperties":true,"type":"object","title":"Project Data"},"audio_manifest":{"additionalProperties":true,"type":"object","title":"Audio Manifest"},"seed_source":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Seed Source"}},"type":"object","title":"DAWProjectCreate"},"DAWProjectListItem":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"version":{"type":"integer","title":"Version"},"total_audio_size_bytes":{"type":"integer","title":"Total Audio Size Bytes"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","name","version","total_audio_size_bytes","created_at","updated_at"],"title":"DAWProjectListItem"},"DAWProjectListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/DAWProjectListItem"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["items","total"],"title":"DAWProjectListResponse"},"DAWProjectResponse":{"properties":{"id":{"type":"string","title":"Id"},"user_id":{"type":"string","title":"User Id"},"name":{"type":"string","title":"Name"},"project_data":{"additionalProperties":true,"type":"object","title":"Project Data"},"audio_manifest":{"additionalProperties":true,"type":"object","title":"Audio Manifest"},"version":{"type":"integer","title":"Version"},"checksum":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Checksum"},"total_audio_size_bytes":{"type":"integer","title":"Total Audio Size Bytes"},"seed_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Seed Source"},"is_deleted":{"type":"boolean","title":"Is Deleted"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","user_id","name","project_data","audio_manifest","version","checksum","total_audio_size_bytes","is_deleted","created_at","updated_at"],"title":"DAWProjectResponse"},"DAWProjectSave":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Name"},"project_data":{"additionalProperties":true,"type":"object","title":"Project Data"},"audio_manifest":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Audio Manifest"},"version":{"type":"integer","minimum":1.0,"title":"Version"},"checksum":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Checksum"},"force_snapshot":{"type":"boolean","title":"Force Snapshot","default":false}},"type":"object","required":["project_data","version"],"title":"DAWProjectSave"},"DAWStorageResponse":{"properties":{"used_bytes":{"type":"integer","title":"Used Bytes"},"cap_bytes":{"type":"integer","title":"Cap Bytes"}},"type":"object","required":["used_bytes","cap_bytes"],"title":"DAWStorageResponse"},"DashboardStats":{"properties":{"total_projects":{"type":"integer","title":"Total Projects"},"active_projects":{"type":"integer","title":"Active Projects"},"completed_projects":{"type":"integer","title":"Completed Projects"},"total_chapters_narrated":{"type":"integer","title":"Total Chapters Narrated"},"total_audio_hours":{"type":"number","title":"Total Audio Hours"},"recent_projects":{"items":{"$ref":"#/components/schemas/AudiobookProjectResponse"},"type":"array","title":"Recent Projects"}},"type":"object","required":["total_projects","active_projects","completed_projects","total_chapters_narrated","total_audio_hours","recent_projects"],"title":"DashboardStats"},"DawAgentChatRequest":{"properties":{"messages":{"items":{"$ref":"#/components/schemas/DawChatMessage"},"type":"array","maxItems":64,"title":"Messages"},"snapshot":{"additionalProperties":true,"type":"object","title":"Snapshot"},"tools_version":{"type":"string","maxLength":128,"title":"Tools Version"},"results":{"anyOf":[{"items":{"$ref":"#/components/schemas/DawStepResult"},"type":"array","maxItems":24},{"type":"null"}],"title":"Results"}},"additionalProperties":false,"type":"object","required":["snapshot","tools_version"],"title":"DawAgentChatRequest","description":"A turn of the AudioStudio assistant."},"DawChatMessage":{"properties":{"role":{"type":"string","enum":["user","assistant"],"title":"Role"},"content":{"type":"string","maxLength":8000,"title":"Content"}},"additionalProperties":false,"type":"object","required":["role","content"],"title":"DawChatMessage"},"DawStepResult":{"properties":{"step_id":{"type":"string","pattern":"^[A-Za-z0-9_-]{1,40}$","title":"Step Id"},"status":{"type":"string","pattern":"^[a-z_]{1,20}$","title":"Status"},"credits":{"anyOf":[{"type":"integer","maximum":10000000.0,"minimum":0.0},{"type":"null"}],"title":"Credits"},"jobId":{"anyOf":[{"type":"integer"},{"type":"string","pattern":"^[A-Za-z0-9_-]{1,64}$"},{"type":"null"}],"title":"Jobid"},"landed":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Landed"}},"additionalProperties":false,"type":"object","required":["step_id","status"],"title":"DawStepResult","description":"Outcome of one step the editor ran. Rendered into a fixed template."},"DeckResponse":{"properties":{"session_id":{"type":"integer","title":"Session Id"},"setlist":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Setlist"},"transitions":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Transitions"},"tracks":{"additionalProperties":{"$ref":"#/components/schemas/DeckTrack"},"type":"object","title":"Tracks"}},"type":"object","required":["session_id"],"title":"DeckResponse"},"DeckTrack":{"properties":{"track_id":{"type":"string","title":"Track Id"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"audio_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Audio Url"},"duration_sec":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Duration Sec"},"analysis":{"additionalProperties":true,"type":"object","title":"Analysis"}},"type":"object","required":["track_id"],"title":"DeckTrack"},"DeleteAccountRequest":{"properties":{"confirm_phrase":{"type":"string","title":"Confirm Phrase","description":"Must equal 'DELETE MY ACCOUNT' exactly. Acts as a typed confirmation gate to prevent accidental deletion."}},"type":"object","required":["confirm_phrase"],"title":"DeleteAccountRequest"},"DeleteAccountResponse":{"properties":{"deletion_scheduled_at":{"type":"string","format":"date-time","title":"Deletion Scheduled At"},"hard_delete_at":{"type":"string","format":"date-time","title":"Hard Delete At"},"user_message":{"type":"string","title":"User Message"}},"type":"object","required":["deletion_scheduled_at","hard_delete_at","user_message"],"title":"DeleteAccountResponse"},"DemoClaimRequest":{"properties":{"demo_token":{"type":"string","maxLength":256,"minLength":16,"title":"Demo Token","description":"One-time token issued at the end of a live preview session"}},"type":"object","required":["demo_token"],"title":"DemoClaimRequest","description":"Claim a transcript produced by the anonymous live preview.\n\nThe token is a one-time bearer credential minted at the end of a preview\nsession and carried through signup. It is bound to whichever account\npresents it first, and is never bound to an IP (CGNAT and mobile network\nhandoffs would break legitimate claims)."},"DemoClaimResponse":{"properties":{"job_id":{"type":"integer","title":"Job Id","description":"The saved transcript's job ID"},"status":{"type":"string","title":"Status","description":"Job status"},"duration_seconds":{"type":"number","title":"Duration Seconds","description":"Length of the previewed audio"},"segment_count":{"type":"integer","title":"Segment Count","description":"Number of transcript segments saved"},"language":{"type":"string","title":"Language","description":"Transcript language"},"credits_charged":{"type":"integer","title":"Credits Charged","description":"Always 0 — the preview was free and stays free","default":0},"already_claimed":{"type":"boolean","title":"Already Claimed","description":"True when this token had already been claimed by this account","default":false}},"type":"object","required":["job_id","status","duration_seconds","segment_count","language"],"title":"DemoClaimResponse","description":"Result of claiming a live preview transcript into an account."},"DenoiseJob":{"properties":{"id":{"type":"integer","title":"Id"},"status":{"$ref":"#/components/schemas/ProcessingStatus"},"progress":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Progress","description":"Progress percentage (0-100)"},"input_path":{"type":"string","title":"Input Path"},"output_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Output Path"},"video_output_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Video Output Path"},"is_video":{"type":"boolean","title":"Is Video","default":false},"task_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Task Id"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"stats":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Stats"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"},"output_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Output Url"},"video_output_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Video Output Url"},"original_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Original Filename"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"billing_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Billing Status","description":"Billing status: PAID, DEFERRED, or REFUNDED"},"estimated_credits":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Estimated Credits","description":"Credits required to unlock this job"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At","description":"When deferred job results expire"},"r2_purged_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"R2 Purged At"},"daw_project_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Daw Project Id","description":"DAW project this job was dispatched from"},"quality_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Quality Mode","description":"Noise Reduction quality mode this job runs at: 'balanced', 'studio' or 'ultra'. Null for spectral noise reduction jobs, which have no quality mode."}},"type":"object","required":["id","status","input_path","created_at"],"title":"DenoiseJob","description":"Schema for denoising job responses"},"DenoiseQuoteRequest":{"properties":{"duration_seconds":{"type":"number","maximum":10000000.0,"exclusiveMinimum":0.0,"title":"Duration Seconds","description":"Length of the audio or video file in seconds."},"quality_mode":{"type":"string","enum":["balanced","studio","ultra"],"title":"Quality Mode","description":"The quality mode you will start the job with.","default":"studio"}},"type":"object","required":["duration_seconds"],"title":"DenoiseQuoteRequest","description":"Request body for a Noise Reduction quote."},"DeveloperContactRequestCreate":{"properties":{"name":{"type":"string","maxLength":100,"minLength":1,"title":"Name"},"email":{"type":"string","format":"email","title":"Email"},"company":{"anyOf":[{"type":"string","maxLength":150},{"type":"null"}],"title":"Company"},"use_case":{"type":"string","maxLength":200,"minLength":5,"title":"Use Case"},"description":{"type":"string","maxLength":5000,"minLength":10,"title":"Description"}},"type":"object","required":["name","email","use_case","description"],"title":"DeveloperContactRequestCreate"},"Dialogue":{"properties":{"speaker":{"type":"string","title":"Speaker","description":"Speaker name"},"text":{"type":"string","title":"Text","description":"Spoken text"},"id":{"type":"string","title":"Id","description":"Unique dialogue ID"},"order":{"type":"integer","minimum":0.0,"title":"Order","description":"Order in the transcript"},"status":{"$ref":"#/components/schemas/DialogueStatus","description":"Generation status","default":"pending"},"audio_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Audio Url","description":"URL to generated audio clip"},"duration_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Duration Seconds","description":"Audio duration in seconds"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message","description":"Error message if generation failed"},"use_turbo":{"type":"boolean","title":"Use Turbo","description":"Whether the fast English voice engine was used for this dialogue","default":false}},"type":"object","required":["speaker","text","id","order"],"title":"Dialogue","description":"Dialogue response model."},"DialogueCreate":{"properties":{"speaker":{"type":"string","minLength":1,"title":"Speaker","description":"Speaker name"},"text":{"type":"string","maxLength":2000,"minLength":1,"title":"Text","description":"Spoken text"},"use_turbo":{"type":"boolean","title":"Use Turbo","description":"Use our fast English voice engine for this dialogue (English only, supports [laugh], [cough], etc.)","default":false}},"type":"object","required":["speaker","text"],"title":"DialogueCreate","description":"Dialogue creation request."},"DialogueStatus":{"type":"string","enum":["pending","generating","completed","failed"],"title":"DialogueStatus","description":"Status of a dialogue clip."},"DirectionExecutionStatus":{"properties":{"activity":{"type":"string","enum":["directing","recovering","waiting_for_capacity","queued"],"title":"Activity"},"running_shards":{"type":"integer","title":"Running Shards","default":0},"waiting_shards":{"type":"integer","title":"Waiting Shards","default":0},"queued_shards":{"type":"integer","title":"Queued Shards","default":0},"retry_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Retry At"},"requires_action":{"type":"boolean","title":"Requires Action","default":false}},"type":"object","required":["activity"],"title":"DirectionExecutionStatus"},"DisclosureValueResponse":{"properties":{"field":{"type":"string","title":"Field"},"value":{"type":"string","title":"Value"}},"type":"object","required":["field","value"],"title":"DisclosureValueResponse"},"DiscoverCandidate":{"properties":{"source_type":{"type":"string","title":"Source Type"},"source_ref":{"type":"string","title":"Source Ref"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"artist":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Artist"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"}},"type":"object","required":["source_type","source_ref"],"title":"DiscoverCandidate"},"DiscoverResponse":{"properties":{"candidates":{"items":{"$ref":"#/components/schemas/DiscoverCandidate"},"type":"array","title":"Candidates"}},"type":"object","title":"DiscoverResponse"},"DraftBox":{"properties":{"x":{"type":"number","maximum":1.0,"minimum":0.0,"title":"X"},"y":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Y"},"w":{"type":"number","maximum":1.0,"exclusiveMinimum":0.0,"title":"W"},"h":{"type":"number","maximum":1.0,"exclusiveMinimum":0.0,"title":"H"}},"additionalProperties":false,"type":"object","required":["x","y","w","h"],"title":"DraftBox"},"DraftRequest":{"properties":{"requestId":{"type":"string","maxLength":128,"minLength":1,"pattern":"^[A-Za-z0-9_-]+$","title":"Requestid"},"target":{"oneOf":[{"$ref":"#/components/schemas/CaptionTarget"},{"$ref":"#/components/schemas/OverlayTarget"}],"title":"Target","discriminator":{"propertyName":"kind","mapping":{"captions":"#/components/schemas/CaptionTarget","overlay":"#/components/schemas/OverlayTarget"}}},"box":{"$ref":"#/components/schemas/DraftBox"}},"additionalProperties":false,"type":"object","required":["requestId","target","box"],"title":"DraftRequest"},"EditRequest":{"properties":{"daw_project_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Daw Project Id","description":"Studio project this job was dispatched from. Optional; validated and ownership-checked server-side, and dropped (never rejected) when it does not resolve to one of your projects."},"duration":{"type":"number","maximum":600.0,"minimum":-1.0,"title":"Duration","description":"Audio duration in seconds (-1 for auto-detection based on lyrics, max 600s/10min)","default":-1.0},"audio_duration":{"type":"number","maximum":600.0,"minimum":-1.0,"title":"Audio Duration","description":"Alias for duration (legacy)"},"format":{"$ref":"#/components/schemas/app__schemas__music__AudioFormat","description":"Output audio format (flac recommended for quality)","default":"flac"},"model_version":{"anyOf":[{"$ref":"#/components/schemas/ModelVersion"},{"type":"null"}],"description":"Model version: audiomusic-v2 (default) or audiomusic-v1.5","default":"audiomusic-v2"},"quality":{"anyOf":[{"$ref":"#/components/schemas/MusicQuality"},{"type":"null"}],"description":"Deprecated and ignored. Every plan generates with AudioPod's highest-quality music model at the same rate; both values are accepted for compatibility and behave identically."},"bpm":{"anyOf":[{"type":"integer","maximum":300.0,"minimum":30.0},{"type":"null"}],"title":"Bpm","description":"Beats per minute (30-300). None for auto-detection via LM."},"keyscale":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Keyscale","description":"Musical key (e.g. 'C Major', 'Am', 'F# minor'). Empty for auto-detection."},"timesignature":{"anyOf":[{"type":"string","maxLength":10},{"type":"null"}],"title":"Timesignature","description":"Time signature (2='2/4', 3='3/4', 4='4/4', 6='6/8'). Empty for auto-detection."},"vocal_language":{"type":"string","maxLength":20,"title":"Vocal Language","description":"Language code for vocals (ISO 639-1: 'en', 'zh', 'ja', etc.). 'unknown' for auto-detection.","default":"unknown"},"inference_steps":{"type":"integer","maximum":200.0,"minimum":1.0,"title":"Inference Steps","description":"Diffusion steps. SFT/Base: 64 for best quality (32-100 range). Turbo: 8.","default":64},"infer_step":{"type":"integer","maximum":200.0,"minimum":1.0,"title":"Infer Step","description":"Alias for inference_steps (legacy)"},"guidance_scale":{"type":"number","maximum":15.0,"minimum":1.0,"title":"Guidance Scale","description":"CFG scale (1.0-15.0). Higher = more adherence to prompt.","default":7.0},"seed":{"type":"integer","title":"Seed","description":"Random seed (-1 for random, positive for fixed)","default":-1},"shift":{"type":"number","maximum":5.0,"minimum":1.0,"title":"Shift","description":"Timestep shift factor (1.0-5.0). 3.0 recommended for all models.","default":3.0},"infer_method":{"$ref":"#/components/schemas/InferMethod","description":"Inference method: 'ode' (Euler, fast) or 'sde' (stochastic)","default":"ode"},"use_adg":{"type":"boolean","title":"Use Adg","description":"Adaptive Dual Guidance (base model only). Improves quality at the cost of speed.","default":false},"cfg_interval_start":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Cfg Interval Start","description":"CFG application start ratio (0.0-1.0)","default":0.0},"cfg_interval_end":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Cfg Interval End","description":"CFG application end ratio (0.0-1.0)","default":1.0},"timesteps":{"anyOf":[{"items":{"type":"number"},"type":"array"},{"type":"null"}],"title":"Timesteps","description":"Custom timesteps list from 1.0 to 0.0. Overrides inference_steps and shift if provided."},"thinking":{"type":"boolean","title":"Thinking","description":"Enable LM Chain-of-Thought reasoning for semantic planning","default":true},"lm_temperature":{"type":"number","maximum":2.0,"minimum":0.0,"title":"Lm Temperature","description":"LM sampling temperature. Higher = more creative.","default":0.85},"lm_cfg_scale":{"type":"number","maximum":10.0,"minimum":0.0,"title":"Lm Cfg Scale","description":"LM classifier-free guidance scale","default":2.0},"lm_top_k":{"type":"integer","maximum":100.0,"minimum":0.0,"title":"Lm Top K","description":"LM top-k sampling. 0 disables.","default":0},"lm_top_p":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Lm Top P","description":"LM nucleus sampling. 1.0 disables.","default":0.9},"lm_negative_prompt":{"type":"string","maxLength":512,"title":"Lm Negative Prompt","description":"Negative prompt for LM classifier-free guidance","default":"NO USER INPUT"},"use_cot_metas":{"type":"boolean","title":"Use Cot Metas","description":"Generate metadata using LM CoT reasoning","default":true},"use_cot_caption":{"type":"boolean","title":"Use Cot Caption","description":"Refine caption using LM CoT reasoning","default":true},"use_cot_lyrics":{"type":"boolean","title":"Use Cot Lyrics","description":"Generate/refine lyrics using LM CoT reasoning (reserved)","default":false},"use_cot_language":{"type":"boolean","title":"Use Cot Language","description":"Detect vocal language using LM CoT reasoning","default":true},"use_constrained_decoding":{"type":"boolean","title":"Use Constrained Decoding","description":"Enable constrained decoding for structured LM output","default":true},"lora_name_or_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lora Name Or Path","description":"LoRA adapter path for custom styles"},"lora_weight":{"type":"number","maximum":3.0,"minimum":-3.0,"title":"Lora Weight","description":"LoRA weight","default":1.0},"batch_size":{"type":"integer","maximum":8.0,"minimum":1.0,"title":"Batch Size","description":"Number of variations to generate (1-8)","default":1},"thumbnail_url":{"anyOf":[{"type":"string","maxLength":1024},{"type":"null"}],"title":"Thumbnail Url","description":"URL for the music thumbnail"},"manual_seeds":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Manual Seeds","description":"Manual seeds for batch generation (legacy)"},"scheduler_type":{"anyOf":[{"$ref":"#/components/schemas/SchedulerType"},{"type":"null"}],"description":"Legacy scheduler type (use infer_method instead)"},"cfg_type":{"anyOf":[{"$ref":"#/components/schemas/CFGType"},{"type":"null"}],"description":"Legacy CFG type"},"use_sde":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Use Sde","description":"Legacy SDE flag (use infer_method='sde' instead)"},"debug":{"type":"boolean","title":"Debug","description":"Enable debug mode","default":false},"display_name":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Display Name","description":"Display name for the edited audio"},"source_job_id":{"type":"integer","title":"Source Job Id","description":"Source music generation job ID"},"edit_target_prompt":{"type":"string","maxLength":2000,"minLength":1,"title":"Edit Target Prompt","description":"New style description"},"edit_target_lyrics":{"type":"string","maxLength":10000,"title":"Edit Target Lyrics","description":"New lyrics","default":""},"edit_type":{"type":"string","title":"Edit Type","description":"Edit type: 'remix' or 'only_lyrics'","default":"remix"},"edit_n_min":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Edit N Min","description":"Edit strength minimum","default":0.0},"edit_n_max":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Edit N Max","description":"Edit strength maximum","default":1.0},"edit_n_avg":{"type":"integer","maximum":5.0,"minimum":1.0,"title":"Edit N Avg","description":"Edit averaging","default":1}},"type":"object","required":["source_job_id","edit_target_prompt"],"title":"EditRequest","description":"Request for editing existing audio"},"EditableSegment":{"properties":{"id":{"type":"integer","title":"Id","description":"Segment ID"},"start":{"type":"number","title":"Start","description":"Start time in seconds"},"end":{"type":"number","title":"End","description":"End time in seconds"},"text":{"type":"string","title":"Text","description":"Transcribed text"},"speaker_label":{"type":"string","title":"Speaker Label","description":"Speaker label (e.g., SPEAKER_00)"},"confidence":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Confidence","description":"Confidence score"}},"type":"object","required":["id","start","end","text","speaker_label"],"title":"EditableSegment","description":"Editable transcript segment"},"EmailCampaignType":{"type":"string","enum":["welcome_onboarding","credit_usage_reminder","feature_discovery","how_to_guide","use_case_examples","productivity_tips","creator_success_stories","new_feature_announcement","pro_upgrade_promotion","seasonal_discount","flash_sale","referral_program","inactive_user_reactivation","credit_expiry_warning","subscription_renewal","winback_campaign","DUNNING_STAGE_1","DUNNING_STAGE_2","DUNNING_STAGE_3","DUNNING_STAGE_4","DUNNING_STAGE_5","SAVE_OFFER_CANCEL_INTENT","weekly_tips","community_highlights","tutorial_series","best_practices"],"title":"EmailCampaignType","description":"Email campaign types for automation"},"EmailCheckRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"}},"type":"object","required":["email"],"title":"EmailCheckRequest"},"EmailCheckResponse":{"properties":{"available":{"type":"boolean","title":"Available"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"},"message":{"type":"string","title":"Message"},"email_info":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Email Info"},"normalized_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Normalized Email"},"original_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Original Email"}},"type":"object","required":["available","message"],"title":"EmailCheckResponse"},"EmailPreferencesRequest":{"properties":{"email_enabled":{"type":"boolean","title":"Email Enabled","default":true},"frequency":{"type":"string","pattern":"^(daily|weekly|monthly|never)$","title":"Frequency","default":"daily"},"credit_usage_emails":{"type":"boolean","title":"Credit Usage Emails","default":true},"feature_discovery_emails":{"type":"boolean","title":"Feature Discovery Emails","default":true},"how_to_guide_emails":{"type":"boolean","title":"How To Guide Emails","default":true},"use_case_emails":{"type":"boolean","title":"Use Case Emails","default":true},"productivity_tips_emails":{"type":"boolean","title":"Productivity Tips Emails","default":true},"new_feature_emails":{"type":"boolean","title":"New Feature Emails","default":true},"preferred_send_time":{"type":"string","pattern":"^([0-1]?[0-9]|2[0-3]):[0-5][0-9]$","title":"Preferred Send Time","default":"09:00"},"timezone":{"type":"string","title":"Timezone","default":"UTC"}},"type":"object","title":"EmailPreferencesRequest","description":"Request model for updating email preferences"},"EmailPreferencesResponse":{"properties":{"email_enabled":{"type":"boolean","title":"Email Enabled"},"frequency":{"type":"string","title":"Frequency"},"credit_usage_emails":{"type":"boolean","title":"Credit Usage Emails"},"feature_discovery_emails":{"type":"boolean","title":"Feature Discovery Emails"},"how_to_guide_emails":{"type":"boolean","title":"How To Guide Emails"},"use_case_emails":{"type":"boolean","title":"Use Case Emails"},"productivity_tips_emails":{"type":"boolean","title":"Productivity Tips Emails"},"new_feature_emails":{"type":"boolean","title":"New Feature Emails"},"preferred_send_time":{"type":"string","title":"Preferred Send Time"},"timezone":{"type":"string","title":"Timezone"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["email_enabled","frequency","credit_usage_emails","feature_discovery_emails","how_to_guide_emails","use_case_emails","productivity_tips_emails","new_feature_emails","preferred_send_time","timezone","created_at","updated_at"],"title":"EmailPreferencesResponse","description":"Response model for email preferences"},"EnterpriseContactRequestCreate":{"properties":{"company_name":{"type":"string","maxLength":150,"minLength":1,"title":"Company Name"},"contact_name":{"type":"string","maxLength":100,"minLength":1,"title":"Contact Name"},"email":{"type":"string","format":"email","title":"Email"},"phone_number":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Phone Number"},"estimated_monthly_usage":{"type":"string","title":"Estimated Monthly Usage"},"requirements":{"type":"string","maxLength":5000,"minLength":10,"title":"Requirements"}},"type":"object","required":["company_name","contact_name","email","estimated_monthly_usage","requirements"],"title":"EnterpriseContactRequestCreate"},"EntitlementInfo":{"properties":{"tier":{"type":"string","title":"Tier"},"tier_source":{"type":"string","title":"Tier Source"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"web_subscription_active":{"type":"boolean","title":"Web Subscription Active","default":false},"iap_active":{"type":"boolean","title":"Iap Active","default":false},"web_tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Web Tier"},"iap_tiers":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Iap Tiers"}},"type":"object","required":["tier","tier_source"],"title":"EntitlementInfo","description":"Cross-platform entitlement snapshot — highest active tier across\nweb Stripe subscription and mobile IAP rows. See\n``app.services.entitlement_service`` for resolution logic."},"EntitlementResponse":{"properties":{"project_id":{"type":"string","format":"uuid","title":"Project Id"},"tier":{"type":"string","title":"Tier"},"human_qc":{"type":"boolean","title":"Human Qc"},"status":{"type":"string","title":"Status"},"paid_finished_hours":{"type":"number","title":"Paid Finished Hours"},"consumed_seconds":{"type":"number","title":"Consumed Seconds"},"remaining_seconds":{"type":"number","title":"Remaining Seconds"},"regenerations_included_per_paragraph":{"type":"integer","title":"Regenerations Included Per Paragraph"},"voice_swaps_included":{"type":"integer","title":"Voice Swaps Included"},"voice_swaps_used":{"type":"integer","title":"Voice Swaps Used"}},"type":"object","required":["project_id","tier","human_qc","status","paid_finished_hours","consumed_seconds","remaining_seconds","regenerations_included_per_paragraph","voice_swaps_included","voice_swaps_used"],"title":"EntitlementResponse","description":"What a paid book has left."},"EpisodeProfileCreate":{"properties":{"name":{"type":"string","maxLength":120,"minLength":1,"title":"Name"},"description":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Description"},"default_briefing":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Default Briefing"},"num_segments":{"type":"integer","maximum":20.0,"minimum":2.0,"title":"Num Segments","default":5},"tone":{"anyOf":[{"type":"string","maxLength":60},{"type":"null"}],"title":"Tone"},"format":{"anyOf":[{"type":"string","maxLength":60},{"type":"null"}],"title":"Format"}},"type":"object","required":["name"],"title":"EpisodeProfileCreate","description":"Create/save a reusable episode format preset."},"EpisodeProfileOut":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"default_briefing":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Default Briefing"},"num_segments":{"type":"integer","title":"Num Segments","default":5},"tone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tone"},"format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format"},"is_system":{"type":"boolean","title":"Is System","default":false}},"type":"object","required":["id","name"],"title":"EpisodeProfileOut"},"EpisodeProfileUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":120,"minLength":1},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Description"},"default_briefing":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Default Briefing"},"num_segments":{"anyOf":[{"type":"integer","maximum":20.0,"minimum":2.0},{"type":"null"}],"title":"Num Segments"},"tone":{"anyOf":[{"type":"string","maxLength":60},{"type":"null"}],"title":"Tone"},"format":{"anyOf":[{"type":"string","maxLength":60},{"type":"null"}],"title":"Format"}},"type":"object","title":"EpisodeProfileUpdate"},"ErrorBatch":{"properties":{"errors":{"items":{"$ref":"#/components/schemas/FrontendError"},"type":"array","title":"Errors"}},"type":"object","required":["errors"],"title":"ErrorBatch","description":"Batch of frontend errors"},"ErrorSeverity":{"type":"string","enum":["low","medium","high","critical"],"title":"ErrorSeverity"},"ExistingPlanPath":{"properties":{"plan_name":{"type":"string","title":"Plan Name"},"credits_balance":{"type":"integer","title":"Credits Balance"},"covers_narration":{"type":"boolean","title":"Covers Narration"}},"type":"object","required":["plan_name","credits_balance","covers_narration"],"title":"ExistingPlanPath","description":"The narration path a signed-in subscriber already has.\n\nSurfaced so a paying subscriber is never silently steered into the fixed\nprice for output their plan already covers. It is shown ALONGSIDE the\nfixed-price option; the author chooses."},"ExitSurveyRequest":{"properties":{"reason":{"type":"string","pattern":"^(too_expensive|not_using|quality_issues|found_alternative|missing_feature|other)$","title":"Reason","description":"Primary cancellation reason"},"reason_detail":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Reason Detail","description":"Free-text elaboration"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"}},"type":"object","required":["reason"],"title":"ExitSurveyRequest"},"ExportRequest":{"properties":{"rev":{"type":"integer","minimum":0.0,"title":"Rev"},"aspects":{"items":{"type":"string","enum":["9:16","1:1","4:5","16:9"]},"type":"array","maxItems":4,"minItems":1,"title":"Aspects"},"preset":{"type":"string","enum":["1080p","4k"],"title":"Preset","default":"1080p"},"idempotencyKey":{"type":"string","maxLength":128,"minLength":1,"pattern":"^[A-Za-z0-9_-]+$","title":"Idempotencykey"},"quotedCredits":{"type":"integer","minimum":0.0,"title":"Quotedcredits"}},"additionalProperties":false,"type":"object","required":["rev","aspects","idempotencyKey","quotedCredits"],"title":"ExportRequest"},"ExportStartResponse":{"properties":{"export_job_id":{"type":"string","title":"Export Job Id"},"status":{"type":"string","title":"Status","default":"rendering"}},"type":"object","required":["export_job_id"],"title":"ExportStartResponse"},"ExportStatusResponse":{"properties":{"status":{"type":"string","title":"Status"},"mix_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mix Url"},"duration_sec":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Duration Sec"},"cue_sheet":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Cue Sheet"}},"type":"object","required":["status"],"title":"ExportStatusResponse"},"ExtendRequest":{"properties":{"daw_project_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Daw Project Id","description":"Studio project this job was dispatched from. Optional; validated and ownership-checked server-side, and dropped (never rejected) when it does not resolve to one of your projects."},"duration":{"type":"number","maximum":600.0,"minimum":-1.0,"title":"Duration","description":"Audio duration in seconds (-1 for auto-detection based on lyrics, max 600s/10min)","default":-1.0},"audio_duration":{"type":"number","maximum":600.0,"minimum":-1.0,"title":"Audio Duration","description":"Alias for duration (legacy)"},"format":{"$ref":"#/components/schemas/app__schemas__music__AudioFormat","description":"Output audio format (flac recommended for quality)","default":"flac"},"model_version":{"anyOf":[{"$ref":"#/components/schemas/ModelVersion"},{"type":"null"}],"description":"Model version: audiomusic-v2 (default) or audiomusic-v1.5","default":"audiomusic-v2"},"quality":{"anyOf":[{"$ref":"#/components/schemas/MusicQuality"},{"type":"null"}],"description":"Deprecated and ignored. Every plan generates with AudioPod's highest-quality music model at the same rate; both values are accepted for compatibility and behave identically."},"bpm":{"anyOf":[{"type":"integer","maximum":300.0,"minimum":30.0},{"type":"null"}],"title":"Bpm","description":"Beats per minute (30-300). None for auto-detection via LM."},"keyscale":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Keyscale","description":"Musical key (e.g. 'C Major', 'Am', 'F# minor'). Empty for auto-detection."},"timesignature":{"anyOf":[{"type":"string","maxLength":10},{"type":"null"}],"title":"Timesignature","description":"Time signature (2='2/4', 3='3/4', 4='4/4', 6='6/8'). Empty for auto-detection."},"vocal_language":{"type":"string","maxLength":20,"title":"Vocal Language","description":"Language code for vocals (ISO 639-1: 'en', 'zh', 'ja', etc.). 'unknown' for auto-detection.","default":"unknown"},"inference_steps":{"type":"integer","maximum":200.0,"minimum":1.0,"title":"Inference Steps","description":"Diffusion steps. SFT/Base: 64 for best quality (32-100 range). Turbo: 8.","default":64},"infer_step":{"type":"integer","maximum":200.0,"minimum":1.0,"title":"Infer Step","description":"Alias for inference_steps (legacy)"},"guidance_scale":{"type":"number","maximum":15.0,"minimum":1.0,"title":"Guidance Scale","description":"CFG scale (1.0-15.0). Higher = more adherence to prompt.","default":7.0},"seed":{"type":"integer","title":"Seed","description":"Random seed (-1 for random, positive for fixed)","default":-1},"shift":{"type":"number","maximum":5.0,"minimum":1.0,"title":"Shift","description":"Timestep shift factor (1.0-5.0). 3.0 recommended for all models.","default":3.0},"infer_method":{"$ref":"#/components/schemas/InferMethod","description":"Inference method: 'ode' (Euler, fast) or 'sde' (stochastic)","default":"ode"},"use_adg":{"type":"boolean","title":"Use Adg","description":"Adaptive Dual Guidance (base model only). Improves quality at the cost of speed.","default":false},"cfg_interval_start":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Cfg Interval Start","description":"CFG application start ratio (0.0-1.0)","default":0.0},"cfg_interval_end":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Cfg Interval End","description":"CFG application end ratio (0.0-1.0)","default":1.0},"timesteps":{"anyOf":[{"items":{"type":"number"},"type":"array"},{"type":"null"}],"title":"Timesteps","description":"Custom timesteps list from 1.0 to 0.0. Overrides inference_steps and shift if provided."},"thinking":{"type":"boolean","title":"Thinking","description":"Enable LM Chain-of-Thought reasoning for semantic planning","default":true},"lm_temperature":{"type":"number","maximum":2.0,"minimum":0.0,"title":"Lm Temperature","description":"LM sampling temperature. Higher = more creative.","default":0.85},"lm_cfg_scale":{"type":"number","maximum":10.0,"minimum":0.0,"title":"Lm Cfg Scale","description":"LM classifier-free guidance scale","default":2.0},"lm_top_k":{"type":"integer","maximum":100.0,"minimum":0.0,"title":"Lm Top K","description":"LM top-k sampling. 0 disables.","default":0},"lm_top_p":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Lm Top P","description":"LM nucleus sampling. 1.0 disables.","default":0.9},"lm_negative_prompt":{"type":"string","maxLength":512,"title":"Lm Negative Prompt","description":"Negative prompt for LM classifier-free guidance","default":"NO USER INPUT"},"use_cot_metas":{"type":"boolean","title":"Use Cot Metas","description":"Generate metadata using LM CoT reasoning","default":true},"use_cot_caption":{"type":"boolean","title":"Use Cot Caption","description":"Refine caption using LM CoT reasoning","default":true},"use_cot_lyrics":{"type":"boolean","title":"Use Cot Lyrics","description":"Generate/refine lyrics using LM CoT reasoning (reserved)","default":false},"use_cot_language":{"type":"boolean","title":"Use Cot Language","description":"Detect vocal language using LM CoT reasoning","default":true},"use_constrained_decoding":{"type":"boolean","title":"Use Constrained Decoding","description":"Enable constrained decoding for structured LM output","default":true},"lora_name_or_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lora Name Or Path","description":"LoRA adapter path for custom styles"},"lora_weight":{"type":"number","maximum":3.0,"minimum":-3.0,"title":"Lora Weight","description":"LoRA weight","default":1.0},"batch_size":{"type":"integer","maximum":8.0,"minimum":1.0,"title":"Batch Size","description":"Number of variations to generate (1-8)","default":1},"thumbnail_url":{"anyOf":[{"type":"string","maxLength":1024},{"type":"null"}],"title":"Thumbnail Url","description":"URL for the music thumbnail"},"manual_seeds":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Manual Seeds","description":"Manual seeds for batch generation (legacy)"},"scheduler_type":{"anyOf":[{"$ref":"#/components/schemas/SchedulerType"},{"type":"null"}],"description":"Legacy scheduler type (use infer_method instead)"},"cfg_type":{"anyOf":[{"$ref":"#/components/schemas/CFGType"},{"type":"null"}],"description":"Legacy CFG type"},"use_sde":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Use Sde","description":"Legacy SDE flag (use infer_method='sde' instead)"},"debug":{"type":"boolean","title":"Debug","description":"Enable debug mode","default":false},"display_name":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Display Name","description":"Display name for the extended audio"},"source_job_id":{"type":"integer","title":"Source Job Id","description":"Source music generation job ID"},"left_extend_length":{"type":"number","maximum":60.0,"minimum":0.0,"title":"Left Extend Length","description":"Seconds to add at beginning","default":0.0},"right_extend_length":{"type":"number","maximum":60.0,"minimum":0.0,"title":"Right Extend Length","description":"Seconds to add at end","default":30.0},"prompt":{"type":"string","maxLength":2000,"minLength":1,"title":"Prompt","description":"Style for extension"},"lyrics":{"type":"string","maxLength":5000,"title":"Lyrics","description":"Additional lyrics","default":""},"extend_seeds":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Extend Seeds","description":"Seeds for extension"}},"type":"object","required":["source_job_id","prompt"],"title":"ExtendRequest","description":"Request for extending audio"},"ExtractStemRequest":{"properties":{"src_audio_url":{"type":"string","maxLength":2048,"minLength":1,"title":"Src Audio Url","description":"URL to source audio file"},"track_name":{"type":"string","title":"Track Name","description":"Track to extract: vocals, drums, bass, guitar, keyboard, strings, synth, percussion, brass, woodwinds, backing_vocals, fx"},"display_name":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Display Name","description":"Display name for the extracted stem"}},"type":"object","required":["src_audio_url","track_name"],"title":"ExtractStemRequest","description":"Request for extracting a specific stem/track from audio.\n\nUses the extract task to isolate specific instruments or vocals.\n\nExample:\n{\n    \"src_audio_url\": \"https://example.com/song.mp3\",\n    \"track_name\": \"vocals\",\n    \"display_name\": \"Vocals from My Song\"\n}"},"FamilyAcceptRequest":{"properties":{"invite_token":{"type":"string","maxLength":128,"minLength":8,"title":"Invite Token"}},"type":"object","required":["invite_token"],"title":"FamilyAcceptRequest"},"FamilyAcceptResponse":{"properties":{"voice_id":{"type":"string","format":"uuid","title":"Voice Id"},"voice_owner_name":{"type":"string","title":"Voice Owner Name"},"granted_at":{"type":"string","format":"date-time","title":"Granted At"}},"type":"object","required":["voice_id","voice_owner_name","granted_at"],"title":"FamilyAcceptResponse"},"FamilyGrantsResponse":{"properties":{"grants_to_me":{"items":{"$ref":"#/components/schemas/GrantToMe"},"type":"array","title":"Grants To Me"},"grants_by_me":{"items":{"$ref":"#/components/schemas/GrantByMe"},"type":"array","title":"Grants By Me"}},"type":"object","required":["grants_to_me","grants_by_me"],"title":"FamilyGrantsResponse"},"FamilyInviteRequest":{"properties":{"voice_id":{"type":"string","format":"uuid","title":"Voice Id","description":"UUID of the voice to share."},"invitee_contact":{"type":"string","format":"email","title":"Invitee Contact","description":"Email address of the household member to invite."},"expires_in_hours":{"type":"integer","maximum":720.0,"minimum":1.0,"title":"Expires In Hours","description":"How long the invite link should remain valid. Default 168 hours (7 days). Capped at 30 days server-side.","default":168}},"type":"object","required":["voice_id","invitee_contact"],"title":"FamilyInviteRequest"},"FamilyInviteResponse":{"properties":{"invite_id":{"type":"string","format":"uuid","title":"Invite Id"},"invite_link":{"type":"string","title":"Invite Link"},"expires_at":{"type":"string","format":"date-time","title":"Expires At"}},"type":"object","required":["invite_id","invite_link","expires_at"],"title":"FamilyInviteResponse"},"FeatureUsage":{"properties":{"feature_name":{"type":"string","title":"Feature Name"},"display_name":{"type":"string","title":"Display Name"},"usage_count":{"type":"integer","title":"Usage Count"},"credits_used":{"type":"integer","title":"Credits Used"},"last_used":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Used"}},"type":"object","required":["feature_name","display_name","usage_count","credits_used","last_used"],"title":"FeatureUsage","description":"Feature usage details"},"FeaturedTrackResponse":{"properties":{"id":{"type":"integer","title":"Id"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prompt"},"genre":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Genre"},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language"},"emotion":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Emotion"},"occasion":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Occasion"},"quality_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Quality Score"},"audio_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Audio Url"},"thumbnail_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail Url"},"task":{"type":"string","title":"Task"},"audio_duration":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Audio Duration"},"lyrics":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lyrics"},"lrc_content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lrc Content"},"share_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share Token"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"like_count":{"type":"integer","title":"Like Count","default":0},"spotlight_landing":{"type":"boolean","title":"Spotlight Landing","default":false},"spotlight_feature":{"type":"boolean","title":"Spotlight Feature","default":false},"spotlight_radio":{"type":"boolean","title":"Spotlight Radio","default":false}},"type":"object","required":["id","task"],"title":"FeaturedTrackResponse","description":"Public response for a featured/showcase track (Music Radio)"},"FeaturedTracksListResponse":{"properties":{"tracks":{"items":{"$ref":"#/components/schemas/FeaturedTrackResponse"},"type":"array","title":"Tracks"},"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page"},"page_size":{"type":"integer","title":"Page Size"},"available_filters":{"additionalProperties":{"items":{"type":"string"},"type":"array"},"type":"object","title":"Available Filters","default":{}}},"type":"object","required":["tracks","total","page","page_size"],"title":"FeaturedTracksListResponse","description":"Paginated list of featured tracks with filter metadata"},"FeedbackResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"message":{"type":"string","title":"Message"},"credits_awarded":{"type":"integer","title":"Credits Awarded"},"feedback_id":{"type":"string","title":"Feedback Id"}},"type":"object","required":["success","message","credits_awarded","feedback_id"],"title":"FeedbackResponse","description":"Response after feedback submission"},"FeedbackSubmissionResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"message":{"type":"string","title":"Message"},"credits_awarded":{"type":"integer","title":"Credits Awarded"},"feedback_id":{"type":"string","title":"Feedback Id"}},"type":"object","required":["success","message","credits_awarded","feedback_id"],"title":"FeedbackSubmissionResponse","description":"Response after feedback submission"},"FirstPurchaseOffer":{"properties":{"headline":{"type":"string","title":"Headline"},"subhead":{"type":"string","title":"Subhead"},"coupon_code":{"type":"string","title":"Coupon Code"},"cta_url":{"type":"string","title":"Cta Url"},"cta_label":{"type":"string","title":"Cta Label"},"discount_percent":{"type":"integer","title":"Discount Percent"},"plan":{"type":"string","title":"Plan"},"interval":{"type":"string","title":"Interval"}},"type":"object","required":["headline","subhead","coupon_code","cta_url","cta_label","discount_percent","plan","interval"],"title":"FirstPurchaseOffer","description":"The FIRST30 first-purchase offer, byte-identical to the block the 402\nINSUFFICIENT_CREDITS payload carries as `first_paywall_offer`.\n\nThere is no expiry field: the offer has no deadline, so do not render a\ncountdown against it."},"FirstPurchaseOfferResponse":{"properties":{"offer":{"anyOf":[{"$ref":"#/components/schemas/FirstPurchaseOffer"},{"type":"null"}]}},"type":"object","title":"FirstPurchaseOfferResponse","description":"`{\"offer\": {...}}` when this user is eligible, `{\"offer\": null}` otherwise.\n\nNull is the normal answer for most users (anyone who has paid, anyone on a\npaid plan) AND the fallback for any internal failure — callers must treat\nthe two identically and simply show no offer."},"ForgotPassword":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"captcha_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Captcha Id"},"captcha_answer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Captcha Answer"}},"type":"object","required":["email"],"title":"ForgotPassword"},"FrontendError":{"properties":{"error_type":{"type":"string","title":"Error Type","description":"Type of error (React, Network, etc.)"},"message":{"type":"string","title":"Message","description":"Error message"},"stack":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stack","description":"Stack trace if available"},"component_stack":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Component Stack","description":"React component stack"},"url":{"type":"string","title":"Url","description":"URL where error occurred"},"user_agent":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Agent","description":"Browser user agent"},"severity":{"$ref":"#/components/schemas/ErrorSeverity","default":"medium"},"user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id","description":"User ID if authenticated"},"session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id","description":"Session/visitor ID"},"timestamp":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Timestamp","description":"Client-side timestamp"},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata","description":"Additional context"},"action":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Action","description":"What action triggered the error"},"tool":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tool","description":"Which tool/page user was on"},"job_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Job Id","description":"Related job ID if applicable"}},"type":"object","required":["error_type","message","url"],"title":"FrontendError","description":"Frontend error report schema"},"FrontendErrorResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"error_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Id"},"message":{"type":"string","title":"Message"}},"type":"object","required":["success","message"],"title":"FrontendErrorResponse"},"GenerateStoryRequest":{"properties":{"moment":{"type":"string","title":"Moment"},"template_params":{"anyOf":[{"$ref":"#/components/schemas/StoryTemplateParams"},{"type":"null"}]},"voice_id":{"type":"string","title":"Voice Id"},"custom_prompt":{"anyOf":[{"type":"string","maxLength":5000},{"type":"null"}],"title":"Custom Prompt"}},"type":"object","required":["moment","voice_id"],"title":"GenerateStoryRequest"},"GenerateStoryResponse":{"properties":{"job_id":{"type":"string","title":"Job Id"},"status":{"type":"string","title":"Status"},"estimated_seconds":{"type":"integer","title":"Estimated Seconds"}},"type":"object","required":["job_id","status","estimated_seconds"],"title":"GenerateStoryResponse"},"GenerateStoryStatusResponse":{"properties":{"job_id":{"type":"string","title":"Job Id"},"status":{"type":"string","title":"Status"},"progress":{"type":"integer","title":"Progress"},"chunks":{"items":{"$ref":"#/components/schemas/ChunkInfo"},"type":"array","title":"Chunks"},"chapter_markers":{"items":{"$ref":"#/components/schemas/ChapterMarker"},"type":"array","title":"Chapter Markers"},"lrc_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lrc Url"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"saved_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Saved At"}},"type":"object","required":["job_id","status","progress"],"title":"GenerateStoryStatusResponse"},"GeneratedBookRequest":{"properties":{"prompt":{"type":"string","maxLength":4000,"minLength":10,"title":"Prompt"},"title":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Title"},"audience":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Audience"},"tone":{"type":"string","maxLength":50,"title":"Tone","default":"warm"},"chapter_count":{"type":"integer","maximum":20.0,"minimum":1.0,"title":"Chapter Count","default":3},"words_per_chapter":{"type":"integer","maximum":3000.0,"minimum":100.0,"title":"Words Per Chapter","default":600},"force":{"type":"boolean","title":"Force","description":"Replace existing chapters even if narrated audio exists","default":false},"auto_direction":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Auto Direction","description":"Prepare voice direction after creating the manuscript. Omit to follow the web studio account setting; API-key callers default to off. An explicit true or false overrides the default for this book."},"detect_speakers":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Detect Speakers","description":"Attribute dialogue to named speakers (each paragraph's character_name). Free. Omit to accept the caller default: off for API-key callers, on in the web studio. multi_voice=true implies it."},"multi_voice":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Multi Voice","description":"Give each character their own voice: a character's lines take the voice on the book's cast instead of the narrator's. Turning it on gives every known character a library voice at no cost. Omit to leave it as it is; new books start with it off."}},"type":"object","required":["prompt"],"title":"GeneratedBookRequest"},"GenerationProgress":{"properties":{"status":{"$ref":"#/components/schemas/PodcastStatus","description":"Current status"},"progress_percentage":{"type":"integer","maximum":100.0,"minimum":0.0,"title":"Progress Percentage"},"dialogues_completed":{"type":"integer","title":"Dialogues Completed","description":"Dialogues completed"},"dialogues_total":{"type":"integer","title":"Dialogues Total","description":"Total dialogues"},"current_dialogue":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Dialogue","description":"Currently generating dialogue ID"},"estimated_time_remaining_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Estimated Time Remaining Seconds"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"}},"type":"object","required":["status","progress_percentage","dialogues_completed","dialogues_total"],"title":"GenerationProgress","description":"Real-time generation progress."},"GenrePreset":{"type":"string","enum":["Modern Pop","Rock","Hip Hop","Country","EDM","Reggae","Classical","Jazz","Metal","R&B","Custom"],"title":"GenrePreset","description":"Available genre presets"},"GrantByMe":{"properties":{"grant_id":{"type":"string","format":"uuid","title":"Grant Id"},"voice_id":{"type":"string","format":"uuid","title":"Voice Id"},"voice_display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Voice Display Name"},"grantee_email":{"type":"string","title":"Grantee Email"},"grantee_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Grantee Name"},"granted_at":{"type":"string","format":"date-time","title":"Granted At"}},"type":"object","required":["grant_id","voice_id","grantee_email","granted_at"],"title":"GrantByMe"},"GrantToMe":{"properties":{"grant_id":{"type":"string","format":"uuid","title":"Grant Id"},"voice_id":{"type":"string","format":"uuid","title":"Voice Id"},"voice_display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Voice Display Name"},"voice_owner_name":{"type":"string","title":"Voice Owner Name"},"granted_at":{"type":"string","format":"date-time","title":"Granted At"}},"type":"object","required":["grant_id","voice_id","voice_owner_name","granted_at"],"title":"GrantToMe"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"InferMethod":{"type":"string","enum":["ode","sde"],"title":"InferMethod","description":"Diffusion inference methods for music generation"},"IssuedQuoteResponse":{"properties":{"quote_id":{"type":"string","format":"uuid","title":"Quote Id"},"project_id":{"type":"string","format":"uuid","title":"Project Id"},"tier":{"type":"string","title":"Tier"},"finished_hours":{"type":"number","title":"Finished Hours"},"amount_cents":{"type":"integer","title":"Amount Cents"},"currency":{"type":"string","title":"Currency"},"status":{"type":"string","title":"Status"},"valid_until":{"type":"string","title":"Valid Until"}},"type":"object","required":["quote_id","project_id","tier","finished_hours","amount_cents","currency","status","valid_until"],"title":"IssuedQuoteResponse"},"LRCGenerateRequest":{"properties":{"job_id":{"type":"integer","title":"Job Id","description":"Music job ID to generate LRC for"},"lyrics":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lyrics","description":"Override lyrics (if not provided, uses job lyrics)"}},"type":"object","required":["job_id"],"title":"LRCGenerateRequest","description":"Request for LRC (lyric timestamp) generation"},"LRCGenerateResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"job_id":{"type":"integer","title":"Job Id"},"lrc_content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lrc Content","description":"LRC formatted lyrics with timestamps"},"lrc_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lrc Url","description":"URL to download LRC file"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"Error message if failed"}},"type":"object","required":["success","job_id"],"title":"LRCGenerateResponse","description":"Response for LRC generation"},"LedgerEntryResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"entry_type":{"type":"string","title":"Entry Type"},"credits":{"type":"integer","title":"Credits"},"balance_after":{"type":"integer","title":"Balance After"},"amount_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Amount Cents"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"},"source":{"type":"string","title":"Source"},"stripe_invoice_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stripe Invoice Id"},"period":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Period"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","entry_type","credits","balance_after","source","created_at"],"title":"LedgerEntryResponse"},"LiteOffer":{"properties":{"eligible":{"type":"boolean","title":"Eligible"},"mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mode"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"},"price_usd":{"type":"integer","title":"Price Usd"},"credits_per_month":{"type":"integer","title":"Credits Per Month"},"effective_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Effective At"},"pending_effective_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Pending Effective At"}},"type":"object","required":["eligible","price_usd","credits_per_month"],"title":"LiteOffer"},"LiteSwitchRequest":{"properties":{"source":{"type":"string","enum":["cancel_dialog","email","link","support"],"title":"Source","default":"link"}},"type":"object","title":"LiteSwitchRequest"},"LiteSwitchResponse":{"properties":{"effective_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Effective At"},"price_usd":{"type":"integer","title":"Price Usd"},"credits_per_month":{"type":"integer","title":"Credits Per Month"}},"type":"object","required":["price_usd","credits_per_month"],"title":"LiteSwitchResponse"},"LocationResponse":{"properties":{"country":{"type":"string","title":"Country"},"country_code":{"type":"string","title":"Country Code"},"region":{"type":"string","title":"Region"},"region_name":{"type":"string","title":"Region Name"},"city":{"type":"string","title":"City"},"timezone":{"type":"string","title":"Timezone"},"currency":{"type":"string","title":"Currency"},"payment_preferences":{"additionalProperties":true,"type":"object","title":"Payment Preferences"},"ip_address":{"type":"string","title":"Ip Address"}},"type":"object","required":["country","country_code","region","region_name","city","timezone","currency","payment_preferences","ip_address"],"title":"LocationResponse","description":"Response model for user location data"},"Lyric2VocalsRequest":{"properties":{"duration":{"type":"number","maximum":600.0,"minimum":-1.0,"title":"Duration","description":"Audio duration in seconds (-1 for auto-detection based on lyrics, max 600s/10min)","default":-1.0},"audio_duration":{"type":"number","maximum":600.0,"minimum":-1.0,"title":"Audio Duration","description":"Alias for duration (legacy)"},"format":{"$ref":"#/components/schemas/app__schemas__music__AudioFormat","description":"Output audio format (flac recommended for quality)","default":"flac"},"model_version":{"anyOf":[{"$ref":"#/components/schemas/ModelVersion"},{"type":"null"}],"description":"Model version: audiomusic-v2 (default) or audiomusic-v1.5","default":"audiomusic-v2"},"quality":{"anyOf":[{"$ref":"#/components/schemas/MusicQuality"},{"type":"null"}],"description":"Deprecated and ignored. Every plan generates with AudioPod's highest-quality music model at the same rate; both values are accepted for compatibility and behave identically."},"bpm":{"anyOf":[{"type":"integer","maximum":300.0,"minimum":30.0},{"type":"null"}],"title":"Bpm","description":"Beats per minute (30-300). None for auto-detection via LM."},"keyscale":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Keyscale","description":"Musical key (e.g. 'C Major', 'Am', 'F# minor'). Empty for auto-detection."},"timesignature":{"anyOf":[{"type":"string","maxLength":10},{"type":"null"}],"title":"Timesignature","description":"Time signature (2='2/4', 3='3/4', 4='4/4', 6='6/8'). Empty for auto-detection."},"vocal_language":{"type":"string","maxLength":20,"title":"Vocal Language","description":"Language code for vocals (ISO 639-1: 'en', 'zh', 'ja', etc.). 'unknown' for auto-detection.","default":"unknown"},"inference_steps":{"type":"integer","maximum":200.0,"minimum":1.0,"title":"Inference Steps","description":"Diffusion steps. SFT/Base: 64 for best quality (32-100 range). Turbo: 8.","default":64},"infer_step":{"type":"integer","maximum":200.0,"minimum":1.0,"title":"Infer Step","description":"Alias for inference_steps (legacy)"},"guidance_scale":{"type":"number","maximum":15.0,"minimum":1.0,"title":"Guidance Scale","description":"CFG scale (1.0-15.0). Higher = more adherence to prompt.","default":7.0},"seed":{"type":"integer","title":"Seed","description":"Random seed (-1 for random, positive for fixed)","default":-1},"shift":{"type":"number","maximum":5.0,"minimum":1.0,"title":"Shift","description":"Timestep shift factor (1.0-5.0). 3.0 recommended for all models.","default":3.0},"infer_method":{"$ref":"#/components/schemas/InferMethod","description":"Inference method: 'ode' (Euler, fast) or 'sde' (stochastic)","default":"ode"},"use_adg":{"type":"boolean","title":"Use Adg","description":"Adaptive Dual Guidance (base model only). Improves quality at the cost of speed.","default":false},"cfg_interval_start":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Cfg Interval Start","description":"CFG application start ratio (0.0-1.0)","default":0.0},"cfg_interval_end":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Cfg Interval End","description":"CFG application end ratio (0.0-1.0)","default":1.0},"timesteps":{"anyOf":[{"items":{"type":"number"},"type":"array"},{"type":"null"}],"title":"Timesteps","description":"Custom timesteps list from 1.0 to 0.0. Overrides inference_steps and shift if provided."},"thinking":{"type":"boolean","title":"Thinking","description":"Enable LM Chain-of-Thought reasoning for semantic planning","default":true},"lm_temperature":{"type":"number","maximum":2.0,"minimum":0.0,"title":"Lm Temperature","description":"LM sampling temperature. Higher = more creative.","default":0.85},"lm_cfg_scale":{"type":"number","maximum":10.0,"minimum":0.0,"title":"Lm Cfg Scale","description":"LM classifier-free guidance scale","default":2.0},"lm_top_k":{"type":"integer","maximum":100.0,"minimum":0.0,"title":"Lm Top K","description":"LM top-k sampling. 0 disables.","default":0},"lm_top_p":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Lm Top P","description":"LM nucleus sampling. 1.0 disables.","default":0.9},"lm_negative_prompt":{"type":"string","maxLength":512,"title":"Lm Negative Prompt","description":"Negative prompt for LM classifier-free guidance","default":"NO USER INPUT"},"use_cot_metas":{"type":"boolean","title":"Use Cot Metas","description":"Generate metadata using LM CoT reasoning","default":true},"use_cot_caption":{"type":"boolean","title":"Use Cot Caption","description":"Refine caption using LM CoT reasoning","default":true},"use_cot_lyrics":{"type":"boolean","title":"Use Cot Lyrics","description":"Generate/refine lyrics using LM CoT reasoning (reserved)","default":false},"use_cot_language":{"type":"boolean","title":"Use Cot Language","description":"Detect vocal language using LM CoT reasoning","default":true},"use_constrained_decoding":{"type":"boolean","title":"Use Constrained Decoding","description":"Enable constrained decoding for structured LM output","default":true},"lora_name_or_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lora Name Or Path","description":"LoRA adapter path for custom styles"},"lora_weight":{"type":"number","maximum":3.0,"minimum":-3.0,"title":"Lora Weight","description":"LoRA weight","default":1.0},"batch_size":{"type":"integer","maximum":8.0,"minimum":1.0,"title":"Batch Size","description":"Number of variations to generate (1-8)","default":1},"thumbnail_url":{"anyOf":[{"type":"string","maxLength":1024},{"type":"null"}],"title":"Thumbnail Url","description":"URL for the music thumbnail"},"manual_seeds":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Manual Seeds","description":"Manual seeds for batch generation (legacy)"},"scheduler_type":{"anyOf":[{"$ref":"#/components/schemas/SchedulerType"},{"type":"null"}],"description":"Legacy scheduler type (use infer_method instead)"},"cfg_type":{"anyOf":[{"$ref":"#/components/schemas/CFGType"},{"type":"null"}],"description":"Legacy CFG type"},"use_sde":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Use Sde","description":"Legacy SDE flag (use infer_method='sde' instead)"},"debug":{"type":"boolean","title":"Debug","description":"Enable debug mode","default":false},"display_name":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Display Name","description":"Display name for the vocal track"},"prompt":{"type":"string","maxLength":2000,"minLength":1,"title":"Prompt","description":"Vocal style description"},"lyrics":{"type":"string","maxLength":10000,"minLength":1,"title":"Lyrics","description":"Song lyrics"}},"type":"object","required":["prompt","lyrics"],"title":"Lyric2VocalsRequest","description":"Request for lyric-to-vocals generation"},"ManuscriptIntakeResponse":{"properties":{"project_id":{"type":"string","format":"uuid","title":"Project Id"},"source_type":{"type":"string","title":"Source Type"},"total_chapters":{"type":"integer","title":"Total Chapters"},"total_words":{"type":"integer","title":"Total Words"},"estimated_duration_minutes":{"type":"number","title":"Estimated Duration Minutes"},"requires_author_approval":{"type":"boolean","title":"Requires Author Approval","default":true}},"type":"object","required":["project_id","source_type","total_chapters","total_words","estimated_duration_minutes"],"title":"ManuscriptIntakeResponse"},"ManuscriptParseResponse":{"properties":{"job_id":{"type":"integer","title":"Job Id","description":"Parsing job ID"},"estimated_completion_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Estimated Completion Time","description":"Estimated completion time"},"reused":{"type":"boolean","title":"Reused","description":"True when the manuscript was already parsed and the existing chapters were kept. No new parsing job was started and nothing was deleted; job_id refers to the earlier parse.","default":false},"total_chapters":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Chapters","description":"Chapters currently on the project. Only set when reused is true."}},"type":"object","required":["job_id"],"title":"ManuscriptParseResponse"},"ManuscriptStatus":{"type":"string","enum":["finished","in_progress"],"title":"ManuscriptStatus"},"ManuscriptUploadResponse":{"properties":{"upload_url":{"type":"string","title":"Upload Url","description":"Pre-signed URL to PUT the manuscript to"},"file_key":{"type":"string","title":"File Key","description":"Storage key for the uploaded manuscript"},"max_file_size":{"type":"integer","title":"Max File Size","description":"Maximum file size in bytes"}},"type":"object","required":["upload_url","file_key","max_file_size"],"title":"ManuscriptUploadResponse"},"MediaConverterJob":{"properties":{"id":{"type":"integer","title":"Id"},"user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"},"input_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Input Url"},"input_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Input Path"},"input_format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Input Format"},"input_size":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Input Size"},"input_duration":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Input Duration"},"original_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Original Filename"},"output_format":{"type":"string","title":"Output Format"},"audio_only":{"type":"boolean","title":"Audio Only"},"audio_quality":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Audio Quality"},"video_quality":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Video Quality"},"audio_bitrate":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Audio Bitrate"},"video_bitrate":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Video Bitrate"},"sample_rate":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sample Rate"},"channels":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Channels"},"width":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Width"},"height":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Height"},"framerate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Framerate"},"start_time":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Start Time"},"end_time":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"End Time"},"duration":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Duration"},"status":{"$ref":"#/components/schemas/ProcessingStatus"},"progress":{"type":"number","maximum":100.0,"minimum":0.0,"title":"Progress","default":0.0},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"output_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Output Path"},"output_size":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Output Size"},"output_duration":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Output Duration"},"download_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Download Url"},"conversion_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Conversion Type"},"processing_time":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Processing Time"},"compression_ratio":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Compression Ratio"},"estimated_credits":{"type":"integer","title":"Estimated Credits","default":0},"actual_credits":{"type":"integer","title":"Actual Credits","default":0},"billing_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Billing Status","description":"Billing status: PAID, DEFERRED, or REFUNDED"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At","description":"When deferred job results expire"},"r2_purged_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"R2 Purged At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"},"task_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Task Id"}},"type":"object","required":["id","user_id","input_url","input_path","input_format","input_size","input_duration","original_filename","output_format","audio_only","audio_quality","video_quality","audio_bitrate","video_bitrate","sample_rate","channels","width","height","framerate","start_time","end_time","duration","status","created_at"],"title":"MediaConverterJob","description":"Media converter job details"},"MediaConverterListResponse":{"properties":{"jobs":{"items":{"$ref":"#/components/schemas/MediaConverterJob"},"type":"array","title":"Jobs"},"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page"},"per_page":{"type":"integer","title":"Per Page"},"total_pages":{"type":"integer","title":"Total Pages"}},"type":"object","required":["jobs","total","page","per_page","total_pages"],"title":"MediaConverterListResponse","description":"Response for listing media converter jobs"},"MidiConversionJobResponse":{"properties":{"id":{"type":"integer","title":"Id"},"status":{"$ref":"#/components/schemas/ProcessingStatus"},"progress":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Progress","description":"Progress percentage (0-100)"},"stage":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stage","description":"\"split\" | \"transcribe\" | \"merge\""},"mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mode","description":"\"standalone\" | \"from_stem_job\""},"source_job_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Source Job Id"},"stems_requested":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Stems Requested"},"midi_urls":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Midi Urls"},"merged_midi_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Merged Midi Url"},"stem_urls":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Stem Urls"},"detected_tempo_bpm":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Detected Tempo Bpm"},"skipped_stems":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Skipped Stems"},"failed_stems":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Failed Stems"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"duration":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Duration"},"original_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Original Filename"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"}},"type":"object","required":["id","status","created_at"],"title":"MidiConversionJobResponse","description":"Status/response model for a MIDI conversion job (frozen contract)."},"MidiConvertOptions":{"properties":{"onset_threshold":{"type":"number","maximum":0.95,"minimum":0.05,"title":"Onset Threshold","default":0.5},"frame_threshold":{"type":"number","maximum":0.95,"minimum":0.05,"title":"Frame Threshold","default":0.3},"min_note_len_ms":{"type":"number","maximum":2000.0,"minimum":10.0,"title":"Min Note Len Ms","default":128.0},"tempo_bpm":{"anyOf":[{"type":"number","maximum":300.0,"minimum":30.0},{"type":"null"}],"title":"Tempo Bpm"},"engine":{"type":"string","enum":["general","piano","vocal"],"title":"Engine","default":"general"}},"type":"object","title":"MidiConvertOptions","description":"Tunables forwarded to the audio-to-MIDI engine. Thresholds override the\nper-stem presets; the bass octave-correction is always-on and not exposed."},"MidiFromStemsRequest":{"properties":{"stems":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Stems"},"options":{"anyOf":[{"$ref":"#/components/schemas/MidiConvertOptions"},{"type":"null"}]}},"type":"object","title":"MidiFromStemsRequest"},"Milestone":{"properties":{"template_slug":{"type":"string","enum":["two-speaker-interview-split","karaoke-backing-track","warm-narrator-voiceover"],"title":"Template Slug"},"job_id":{"type":"integer","maximum":2147483647.0,"exclusiveMinimum":0.0,"title":"Job Id"},"input_origin":{"type":"string","enum":["example","user"],"title":"Input Origin"},"action":{"type":"string","enum":["started","completed","reviewed","export_requested"],"title":"Action"}},"type":"object","required":["template_slug","job_id","input_origin","action"],"title":"Milestone"},"MintKeyRequest":{"properties":{"name":{"type":"string","maxLength":100,"minLength":1,"title":"Name"},"extra_scopes":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Extra Scopes","description":"Product scopes to add alongside the mandatory 'partner' scope (e.g. 'voice', 'audio')."},"expires_in_days":{"anyOf":[{"type":"integer","maximum":3650.0,"minimum":1.0},{"type":"null"}],"title":"Expires In Days"}},"type":"object","required":["name"],"title":"MintKeyRequest"},"MintKeyResponse":{"properties":{"key_id":{"type":"string","format":"uuid","title":"Key Id"},"api_key":{"type":"string","title":"Api Key","description":"Returned exactly once; never retrievable again"},"scopes":{"items":{"type":"string"},"type":"array","title":"Scopes"}},"type":"object","required":["key_id","api_key","scopes"],"title":"MintKeyResponse"},"ModelStatusResponse":{"properties":{"loaded":{"type":"boolean","title":"Loaded"},"checkpoint_path":{"type":"string","title":"Checkpoint Path"},"device":{"type":"string","title":"Device"},"dtype":{"type":"string","title":"Dtype"},"torch_compile":{"type":"boolean","title":"Torch Compile"},"cpu_offload":{"type":"boolean","title":"Cpu Offload"},"model_version":{"type":"string","title":"Model Version"},"gpu_memory":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Gpu Memory"}},"type":"object","required":["loaded","checkpoint_path","device","dtype","torch_compile","cpu_offload","model_version"],"title":"ModelStatusResponse","description":"Response for model status endpoint"},"ModelVersion":{"type":"string","enum":["audiomusic-v2","audiomusic-v1.5","audiomusic-v3"],"title":"ModelVersion","description":"Available music generation model versions"},"ModerationContext":{"properties":{"moment":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Moment"},"kid_safe_mode":{"type":"boolean","title":"Kid Safe Mode","default":false},"user_age_band":{"type":"string","enum":["adult","teen","child"],"title":"User Age Band","default":"adult"}},"type":"object","title":"ModerationContext"},"ModerationRequest":{"properties":{"prompt":{"type":"string","maxLength":5000,"minLength":1,"title":"Prompt"},"context":{"anyOf":[{"$ref":"#/components/schemas/ModerationContext"},{"type":"null"}]}},"type":"object","required":["prompt"],"title":"ModerationRequest"},"ModerationResponse":{"properties":{"decision":{"type":"string","enum":["allow","review","deny"],"title":"Decision"},"categories_triggered":{"items":{"type":"string"},"type":"array","title":"Categories Triggered"},"user_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Message"}},"type":"object","required":["decision"],"title":"ModerationResponse"},"MultiVoiceTTSJob":{"properties":{"id":{"type":"integer","title":"Id"},"user_id":{"type":"string","title":"User Id"},"status":{"type":"string","title":"Status"},"segments_count":{"type":"integer","title":"Segments Count"},"unique_voices_count":{"type":"integer","title":"Unique Voices Count"},"mix_mode":{"type":"string","title":"Mix Mode"},"output_format":{"type":"string","title":"Output Format"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"},"output_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Output Path"},"total_duration":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Total Duration","description":"Total audio duration in seconds"},"processing_metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Processing Metadata","description":"Processing details and statistics"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"segments_data":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Segments Data","description":"Segments data"},"timestamps_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Timestamps Url","description":"Short-lived download link for the word timings (JSON), or null when none were recorded"},"visemes_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Visemes Url","description":"Short-lived download link for the lip-sync data (JSON), or null when none was recorded"},"billing_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Billing Status","description":"Billing status: PAID, DEFERRED, or REFUNDED"},"estimated_credits":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Estimated Credits","description":"Credits required to unlock this job"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At","description":"When deferred job results expire"},"r2_purged_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"R2 Purged At"}},"type":"object","required":["id","user_id","status","segments_count","unique_voices_count","mix_mode","output_format","created_at"],"title":"MultiVoiceTTSJob","description":"Schema for multi-voice TTS job response","example":{"completed_at":"2023-01-01T12:01:30Z","created_at":"2023-01-01T12:00:00Z","id":123,"mix_mode":"sequential","output_format":"wav","output_path":"outputs/multivoice/uuid/result.wav","segments_count":3,"status":"completed","total_duration":45.2,"unique_voices_count":2,"user_id":"123e4567-e89b-12d3-a456-426614174000"}},"MultiVoiceTTSResponse":{"properties":{"job":{"$ref":"#/components/schemas/MultiVoiceTTSJob"},"message":{"type":"string","title":"Message","default":"Multi-voice TTS job created successfully"},"estimated_duration":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Estimated Duration","description":"Estimated processing time in seconds"},"history_group_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"History Group Id","description":"The History item this audio was saved under"}},"type":"object","required":["job"],"title":"MultiVoiceTTSResponse","description":"Response wrapper for multi-voice TTS operations","example":{"estimated_duration":60,"job":{"created_at":"2023-01-01T12:00:00Z","id":123,"mix_mode":"sequential","output_format":"wav","segments_count":3,"status":"pending","unique_voices_count":2,"user_id":"123e4567-e89b-12d3-a456-426614174000"},"message":"Multi-voice TTS job created successfully"}},"MusicCommentRequest":{"properties":{"content":{"type":"string","maxLength":1000,"minLength":1,"title":"Content","description":"Comment content"},"author_name":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Author Name","description":"Author name for anonymous comments"}},"type":"object","required":["content"],"title":"MusicCommentRequest","description":"Request for creating a comment on a shared track"},"MusicCommentResponse":{"properties":{"id":{"type":"integer","title":"Id"},"content":{"type":"string","title":"Content"},"author_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Author Name"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"is_edited":{"type":"boolean","title":"Is Edited"}},"type":"object","required":["id","content","created_at","updated_at","is_edited"],"title":"MusicCommentResponse","description":"Response for music comment"},"MusicCommentsResponse":{"properties":{"comments":{"items":{"$ref":"#/components/schemas/MusicCommentResponse"},"type":"array","title":"Comments"},"total_count":{"type":"integer","title":"Total Count"},"has_more":{"type":"boolean","title":"Has More"}},"type":"object","required":["comments","total_count","has_more"],"title":"MusicCommentsResponse","description":"Response for list of comments"},"MusicGenerationJob":{"properties":{"id":{"type":"integer","title":"Id"},"task":{"$ref":"#/components/schemas/MusicGenerationTask"},"status":{"$ref":"#/components/schemas/ProcessingStatus"},"progress":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Progress","description":"Progress percentage (0-100)"},"input_params":{"additionalProperties":true,"type":"object","title":"Input Params"},"output_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Output Path"},"output_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Output Url"},"output_paths":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Output Paths"},"output_urls":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Output Urls"},"variations":{"anyOf":[{"items":{"$ref":"#/components/schemas/MusicVariation"},"type":"array"},{"type":"null"}],"title":"Variations","description":"Additional variations from batch generation"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"},"task_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Task Id"},"user_id":{"anyOf":[{"type":"string"},{"type":"string","format":"uuid"},{"type":"null"}],"title":"User Id"},"actual_seeds":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Actual Seeds"},"timecosts":{"anyOf":[{"additionalProperties":{"type":"number"},"type":"object"},{"type":"null"}],"title":"Timecosts"},"audio_duration":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Audio Duration"},"original_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Original Filename"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"thumbnail_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail Url"},"lyrics":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lyrics"},"prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prompt"},"billing_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Billing Status","description":"Billing status: PAID, DEFERRED, or REFUNDED"},"estimated_credits":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Estimated Credits","description":"Credits required to unlock this job"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At","description":"When deferred job results expire"},"lrc_content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lrc Content","description":"LRC format lyric timestamps"},"lrc_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lrc Url","description":"URL to LRC file"},"is_featured":{"type":"boolean","title":"Is Featured","default":false},"quality_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Quality Score"},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language"},"genre":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Genre"},"emotion":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Emotion"},"occasion":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Occasion"},"share_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share Token"},"share_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share Url"},"is_shared":{"type":"boolean","title":"Is Shared","default":false},"quality":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Quality","description":"Quality tier used: 'standard' or 'premium'"},"r2_purged_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"R2 Purged At","description":"When R2 output files were removed by the retention sweep. Job history remains; re-render is available from the same input parameters."},"daw_project_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Daw Project Id","description":"Studio project this job was dispatched from"},"source_job_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Source Job Id","description":"Job this one was refined from"}},"type":"object","required":["id","task","status","input_params","created_at","user_id"],"title":"MusicGenerationJob","description":"Base response model for music generation jobs"},"MusicGenerationResponse":{"properties":{"job":{"$ref":"#/components/schemas/MusicGenerationJob"},"message":{"type":"string","title":"Message","default":"Music generation job created successfully"}},"type":"object","required":["job"],"title":"MusicGenerationResponse","description":"Response for successful music generation"},"MusicGenerationTask":{"type":"string","enum":["text2music","cover","repaint","lego","extract","complete","prompt2instrumental","lyric2vocals","text2rap","text2samples","retake","extend","edit"],"title":"MusicGenerationTask","description":"Music generation task types.\n\nSupports 6 different generation task types:\n- text2music: Generate music from text descriptions (default)\n- cover: Transform existing audio while maintaining structure\n- repaint: Regenerate a specific time segment of audio\n- lego: Generate specific instrument track (base model only)\n- extract: Extract/isolate instrument track (base model only)\n- complete: Complete/extend partial tracks (base model only)"},"MusicInteractionResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"message":{"type":"string","title":"Message"},"interaction_type":{"type":"string","title":"Interaction Type"},"like_count":{"type":"integer","title":"Like Count"},"dislike_count":{"type":"integer","title":"Dislike Count"},"share_count":{"type":"integer","title":"Share Count"},"comment_count":{"type":"integer","title":"Comment Count"},"user_has_liked":{"type":"boolean","title":"User Has Liked"},"user_has_disliked":{"type":"boolean","title":"User Has Disliked"}},"type":"object","required":["success","message","interaction_type","like_count","dislike_count","share_count","comment_count","user_has_liked","user_has_disliked"],"title":"MusicInteractionResponse","description":"Response for music interaction operations"},"MusicJobUpdateRequest":{"properties":{"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"thumbnail_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail Url"}},"type":"object","title":"MusicJobUpdateRequest","description":"Request schema for updating music job metadata"},"MusicPublicJobResponse":{"properties":{"id":{"type":"integer","title":"Id"},"task":{"$ref":"#/components/schemas/MusicGenerationTask"},"status":{"$ref":"#/components/schemas/ProcessingStatus"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"thumbnail_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail Url"},"output_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Output Url"},"output_urls":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Output Urls"},"output_paths":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Output Paths"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"},"audio_duration":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Audio Duration"},"share_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share Token"},"share_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share Url"},"is_shared":{"type":"boolean","title":"Is Shared","default":false},"shared_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Shared At"},"user_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Email"},"like_count":{"type":"integer","title":"Like Count"},"dislike_count":{"type":"integer","title":"Dislike Count"},"share_count":{"type":"integer","title":"Share Count"},"comment_count":{"type":"integer","title":"Comment Count"},"total_interactions":{"type":"integer","title":"Total Interactions"},"like_percentage":{"type":"number","title":"Like Percentage"},"dislike_percentage":{"type":"number","title":"Dislike Percentage"},"prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prompt"},"lyrics":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lyrics"},"lrc_content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lrc Content"},"r2_purged_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"R2 Purged At"}},"type":"object","required":["id","task","status","created_at","like_count","dislike_count","share_count","comment_count","total_interactions","like_percentage","dislike_percentage"],"title":"MusicPublicJobResponse","description":"Public response for music job details (safe for public viewing)"},"MusicQuality":{"type":"string","enum":["standard","premium"],"title":"MusicQuality","description":"Legacy quality selector for music generation.\n\nEvery plan now generates with AudioPod's highest-quality music model at\none rate. Both values are still accepted and behave identically."},"MusicShareRequest":{"properties":{"platform":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform","description":"Platform where music is being shared (e.g., 'twitter', 'facebook', 'reddit')"},"additional_data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Additional Data","description":"Additional metadata for the share"}},"type":"object","title":"MusicShareRequest","description":"Request for sharing music"},"MusicShareResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"message":{"type":"string","title":"Message"},"share_count":{"type":"integer","title":"Share Count"},"share_url":{"type":"string","title":"Share Url"},"share_token":{"type":"string","title":"Share Token"}},"type":"object","required":["success","message","share_count","share_url","share_token"],"title":"MusicShareResponse","description":"Response for music share operations"},"MusicStatsResponse":{"properties":{"like_count":{"type":"integer","title":"Like Count"},"dislike_count":{"type":"integer","title":"Dislike Count"},"share_count":{"type":"integer","title":"Share Count"},"comment_count":{"type":"integer","title":"Comment Count"},"total_interactions":{"type":"integer","title":"Total Interactions"},"like_percentage":{"type":"number","title":"Like Percentage"},"dislike_percentage":{"type":"number","title":"Dislike Percentage"}},"type":"object","required":["like_count","dislike_count","share_count","comment_count","total_interactions","like_percentage","dislike_percentage"],"title":"MusicStatsResponse","description":"Response for music statistics"},"MusicV3AvailabilityResponse":{"properties":{"available":{"type":"boolean","title":"Available"},"revise":{"type":"boolean","title":"Revise","description":"Whether plain-English score revision (`/music/v3/revise`) is offered. Hide the revise controls when false.","default":false}},"type":"object","required":["available"],"title":"MusicV3AvailabilityResponse","description":"Whether AudioMusic v3 is offered on this deployment.\n\nAlways answers; it never says why. Clients should hide the v3 surface when\n`available` is false rather than discovering it through 404s."},"MusicV3BarRange":{"properties":{"start":{"type":"integer","maximum":10000.0,"minimum":1.0,"title":"Start","description":"First bar, numbered from 1."},"end":{"type":"integer","maximum":10000.0,"minimum":1.0,"title":"End","description":"Last bar, included."}},"additionalProperties":false,"type":"object","required":["start","end"],"title":"MusicV3BarRange","description":"A run of bars, numbered from 1, both ends included."},"MusicV3Billing":{"properties":{"plan_credits":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Plan Credits","description":"Charged for writing the score. Absent on an edit."},"render_credits":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Render Credits","description":"Charged for the music, priced from the score."},"total_credits":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Credits"},"score_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Score Seconds","description":"How long the score says the music is — the price input."},"delivered_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Delivered Seconds","description":"How long the finished track actually runs."}},"type":"object","title":"MusicV3Billing","description":"What this job cost, broken into its two parts.\n\nWriting the score is a small fixed charge; the music is priced from the\nscore's own length at the standard music rate. An edit skips the first\npart, because you supplied the score.\n\nNothing here is re-priced after delivery. `delivered_seconds` is reported\nalongside `score_seconds` for transparency, not as a second bill: if the\nfinished track runs slightly longer or shorter than the score said, the\ncharge still stands."},"MusicV3Cot":{"type":"string","enum":["full","melody"],"title":"MusicV3Cot","description":"How much of the song AudioMusic v3 writes as an editable score first.\n\n- ``full``   — write both the melody and the harmony. The richest editable\n  score: you get chords you can change.\n- ``melody`` — write the melody only and let the arrangement follow it\n  freely. Use it to pin the tune but leave the harmony to the engine.\n\nEvery AudioMusic v3 track comes with a score. The engine can also run with\nno score at all, and that mode is deliberately NOT offered here: the score\nis the whole reason to pick v3, and without one there is nothing to hand\nback for you to edit.\n\nNote this is score-based editing — you change the notation and re-render\nfrom it. The standard music endpoints do their own editing (retake,\nextend, repaint) and are cheaper and take a duration; what they cannot do\nis give you the notation. Pick v3 when you want to change the music\nitself rather than ask for another take of it."},"MusicV3Diagnostics":{"properties":{"warnings":{"items":{"type":"string"},"type":"array","title":"Warnings"},"score_error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Score Error","description":"Why the score could not be produced or parsed."},"details":{"additionalProperties":true,"type":"object","title":"Details","description":"Engine-reported detail about how this result was produced."},"truncated":{"additionalProperties":{"type":"boolean"},"type":"object","title":"Truncated","description":"Which parts of the result hit a length limit and were cut short. A truncated track still plays and is still charged, so check this before treating a result as the finished song."},"review_recommended":{"type":"boolean","title":"Review Recommended","description":"True when anything above deserves a look before you continue.","default":false}},"type":"object","title":"MusicV3Diagnostics","description":"What the engine wants you to know about this result.\n\nThese are surfaced rather than swallowed on purpose. A score can be valid\nnotation and still be a wrong reading of the music — reviewing it before\nyou spend another generation is the point of showing you this."},"MusicV3EditRequest":{"properties":{"style":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Style","description":"Replacement style text. Omit to reuse the style of the source job."},"seed":{"anyOf":[{"type":"integer","maximum":2147483647.0,"minimum":0.0},{"type":"null"}],"title":"Seed","description":"Reuse a seed to get closer to a previous render. Note that even the same seed does not pin the finished length."},"cfg_scale":{"type":"number","maximum":10.0,"minimum":1.0,"title":"Cfg Scale","description":"How closely the render follows your style text. Higher is more literal and less musically inventive.","default":3.0},"display_name":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Display Name","description":"Your own name for this track."},"source_job_id":{"type":"integer","maximum":2147483647.0,"exclusiveMinimum":0.0,"title":"Source Job Id","description":"The job whose score you edited."},"abc":{"type":"string","maxLength":200000,"minLength":1,"title":"Abc","description":"The edited score, in ABC notation."},"lyrics":{"anyOf":[{"type":"string","maxLength":20000},{"type":"null"}],"title":"Lyrics","description":"Replacement lyrics. Omit to reuse the lyrics of the source job."},"cot":{"$ref":"#/components/schemas/MusicV3Cot","description":"An edit always renders the score you sent; 'melody' lets the arrangement follow it freely, 'full' holds it to the harmony you wrote.","default":"melody"},"allow_tempo_change":{"type":"boolean","title":"Allow Tempo Change","description":"Permit the edited score to change the tempo of the source score. Off by default, because an accidental tempo edit is the most common way an edit comes back sounding unrelated.","default":false}},"additionalProperties":false,"type":"object","required":["source_job_id","abc"],"title":"MusicV3EditRequest","description":"Re-render a track from an edited score.\n\nEditing REGENERATES the recording from the score you send. It does not\nedit the original waveform, and it will not sound identical to the take\nyou started from — sections you did not touch will still be performed\nafresh."},"MusicV3GenerateRequest":{"properties":{"style":{"type":"string","maxLength":2000,"minLength":1,"title":"Style","description":"Free-text description of the music: genre, instrumentation, mood, tempo feel, vocal character."},"seed":{"anyOf":[{"type":"integer","maximum":2147483647.0,"minimum":0.0},{"type":"null"}],"title":"Seed","description":"Reuse a seed to get closer to a previous render. Note that even the same seed does not pin the finished length."},"cfg_scale":{"type":"number","maximum":10.0,"minimum":1.0,"title":"Cfg Scale","description":"How closely the render follows your style text. Higher is more literal and less musically inventive.","default":3.0},"display_name":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Display Name","description":"Your own name for this track."},"lyrics":{"type":"string","maxLength":20000,"title":"Lyrics","description":"Lyrics, optionally with section tags like [Verse] / [Chorus]. Leave empty for an instrumental. This is also what determines roughly how long the finished track will be.","default":""},"cot":{"$ref":"#/components/schemas/MusicV3Cot","description":"How much to write as an editable score first: 'full' for melody and harmony, 'melody' for the tune alone.","default":"full"},"abc":{"anyOf":[{"type":"string","maxLength":200000},{"type":"null"}],"title":"Abc","description":"An existing score, in ABC notation, to render instead of planning a new one. Usually you would send this to /music/v3/edit against the job it came from; supply it here only when you are authoring a score from scratch."}},"additionalProperties":false,"type":"object","required":["style"],"title":"MusicV3GenerateRequest","description":"Generate a song, with an editable score alongside the audio.\n\nThere is no `duration` — see the note on the shared base. Song length\nfollows the amount of lyric text you supply."},"MusicV3JobResponse":{"properties":{"job_id":{"type":"integer","title":"Job Id"},"workflow":{"$ref":"#/components/schemas/MusicV3Workflow"},"status":{"$ref":"#/components/schemas/ProcessingStatus"},"progress":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Progress"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"style":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Style"},"lyrics":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lyrics"},"lyrics_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lyrics Source","description":"Who wrote `lyrics`: 'audiopod' (written from your description) or 'user' (you supplied them). Absent for instrumentals."},"target_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Target Seconds","description":"The length you asked for on a described plan, if any."},"cot":{"anyOf":[{"$ref":"#/components/schemas/MusicV3Cot"},{"type":"null"}]},"audio_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Audio Url"},"audio_urls":{"additionalProperties":{"type":"string"},"type":"object","title":"Audio Urls"},"duration_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Duration Seconds"},"score":{"anyOf":[{"$ref":"#/components/schemas/MusicV3Score"},{"type":"null"}]},"score_comparison":{"anyOf":[{"$ref":"#/components/schemas/MusicV3ScoreComparison"},{"type":"null"}],"description":"On an edit or a revision: how the new score compares with the score it came from. Notation against notation — it makes no claim about the audio. Absent on generate and plan, and absent when the earlier score could not be recovered or read."},"diagnostics":{"$ref":"#/components/schemas/MusicV3Diagnostics"},"billing":{"$ref":"#/components/schemas/MusicV3Billing"},"source_job_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Source Job Id"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note","description":"A note about how the job finished, when there is one. For example, a job asked for a recording that could not be paid for completes with its score only (workflow `plan`) and says so here; record it later with `/edit`."},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"}},"type":"object","required":["job_id","workflow","status"],"title":"MusicV3JobResponse","description":"A v3 job: its status, its audio, its score, and its diagnostics."},"MusicV3PlanRequest":{"properties":{"style":{"type":"string","maxLength":2000,"title":"Style","description":"Free-text description of the music: genre, instrumentation, mood, tempo feel, vocal character. Required unless `description` is given, in which case it defaults to the description.","default":""},"seed":{"anyOf":[{"type":"integer","maximum":2147483647.0,"minimum":0.0},{"type":"null"}],"title":"Seed","description":"Reuse a seed to get closer to a previous render. Note that even the same seed does not pin the finished length."},"cfg_scale":{"type":"number","maximum":10.0,"minimum":1.0,"title":"Cfg Scale","description":"How closely the render follows your style text. Higher is more literal and less musically inventive.","default":3.0},"display_name":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Display Name","description":"Your own name for this track."},"lyrics":{"type":"string","maxLength":20000,"title":"Lyrics","description":"Lyrics the plan should be written around.","default":""},"cot":{"$ref":"#/components/schemas/MusicV3Cot","description":"'full' writes melody and harmony; 'melody' the tune alone.","default":"full"},"description":{"anyOf":[{"type":"string","maxLength":1000,"minLength":1},{"type":"null"}],"title":"Description","description":"Describe the song — topic, mood, genre — and we write the lyrics. Cannot be combined with `lyrics`."},"target_seconds":{"anyOf":[{"type":"integer","maximum":300.0,"minimum":30.0},{"type":"null"}],"title":"Target Seconds","description":"Roughly how long the song should be, used to size the lyrics we write. A guide, not a guarantee: the score's own length is returned as `score.duration_seconds`."},"language":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Language","description":"Language to write the lyrics in (ISO 639-1, e.g. 'en', 'hi'). Defaults to the language of the description, else English."}},"additionalProperties":false,"type":"object","title":"MusicV3PlanRequest","description":"Produce ONLY the editable score — no audio, no render.\n\nUse this to review or hand-edit the harmony and melody before spending a\nfull generation, then submit the edited score to /music/v3/edit.\n\n**Start from a description instead of lyrics.** Send `description` (and\noptionally `target_seconds` and `language`) with no `lyrics`, and we write\nthe lyrics for you, then write the score from them. Writing the lyrics is\nincluded in the plan charge. A description that asks for an instrumental\ngets no lyrics. If lyrics cannot be written, the request fails with 422\n`LYRICS_FAILED` and nothing is charged."},"MusicV3ReviseRequest":{"properties":{"source_job_id":{"type":"integer","maximum":2147483647.0,"exclusiveMinimum":0.0,"title":"Source Job Id","description":"The track or score to revise. It must have a score."},"instruction":{"type":"string","maxLength":500,"minLength":1,"title":"Instruction","description":"What to change, in plain English."},"section":{"anyOf":[{"type":"string","maxLength":60},{"type":"null"}],"title":"Section","description":"Limit the change to one section, by its label: 'chorus' for every chorus, 'chorus 2' for the second one."},"bars":{"anyOf":[{"$ref":"#/components/schemas/MusicV3BarRange"},{"type":"null"}],"description":"Limit the change to these bars, numbered from 1."},"allow_tempo_change":{"type":"boolean","title":"Allow Tempo Change","description":"Permit the revision to change the tempo. Off by default, so a revision never speeds up or slows down the song unless you ask.","default":false},"display_name":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Display Name","description":"Your own name for the revised score."}},"additionalProperties":false,"type":"object","required":["source_job_id","instruction"],"title":"MusicV3ReviseRequest","description":"Change a score in plain English — \"make the chorus higher\", \"add a\nbridge after the second chorus\".\n\nThe result is a NEW score (no recording) linked to the one you revised;\nthe original is kept. Revise as many times as you like, then record the\nversion you want with `/music/v3/edit`. Each revision is a small fixed\ncharge, and if the change cannot be made, nothing is charged."},"MusicV3Score":{"properties":{"abc":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Abc","description":"The score itself, in ABC notation."},"abc_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Abc Url","description":"Downloadable copy of the score."},"midi_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Midi Url","description":"The score as MIDI, if available."},"editable":{"type":"boolean","title":"Editable","description":"True once a score exists and can be sent back for an edit.","default":false},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source","description":"Where the score came from: 'plan' (written by the engine) or 'user' (you supplied it)."},"duration_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Duration Seconds","description":"How long the music in this score runs, in seconds."}},"type":"object","title":"MusicV3Score","description":"The editable score attached to a v3 job."},"MusicV3ScoreComparison":{"properties":{"comparable":{"type":"boolean","title":"Comparable","description":"True when both scores could be read and compared. When this is false nothing else here is a statement about your edit — the comparison could not be made at all.","default":false},"notes_and_timing_preserved":{"type":"boolean","title":"Notes And Timing Preserved","description":"True when every sounding note in the score you submitted keeps the pitch, the onset and the duration it had in the score you edited. This is a property of the notation only — it does not mean the new recording reproduces the earlier performance.","default":false},"changed":{"items":{"type":"string"},"type":"array","title":"Changed","description":"Which kinds of musical content your edit changed: any of 'pitches', 'rhythm', 'chords', 'tempo', 'structure'. Categories only. The comparison does not record where in the piece a change falls, so it cannot point you at a bar or a moment."},"tempo_change_allowed":{"type":"boolean","title":"Tempo Change Allowed","description":"Whether this edit was submitted with a tempo change permitted.","default":false},"changed_bars":{"anyOf":[{"additionalProperties":{"items":{"items":{"type":"integer"},"type":"array"},"type":"array"},"type":"object"},{"type":"null"}],"title":"Changed Bars","description":"On a revision: per voice ('Vocal', 'Ins'), the bar ranges of the revised score that differ from the score it was revised from, as [start, end] pairs numbered from 1, inclusive. Absent on an edit."}},"type":"object","title":"MusicV3ScoreComparison","description":"How the score you submitted compares with the score you edited it from.\n\nSCORE AGAINST SCORE, NEVER AUDIO. This compares two pieces of notation,\nread as musical events. It is a check on what you asked for, not on what\ncame back: an edit is a new take, not a patch, so every section is\nperformed afresh and the singing, the timbre and the waveform will differ\nfrom the track you started with even where the notation did not change.\n\nPresent on an edit, and only when the score it was edited from could be\nrecovered."},"MusicV3Workflow":{"type":"string","enum":["generate","plan","edit","cover","revise"],"title":"MusicV3Workflow","description":"Which v3 entry point produced a job."},"MusicVariation":{"properties":{"audio_url":{"type":"string","title":"Audio Url"},"seed":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Seed"}},"type":"object","required":["audio_url"],"title":"MusicVariation","description":"A single variation from batch generation"},"NarrationCancelResponse":{"properties":{"job_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Job Id"},"status":{"type":"string","title":"Status","description":"Terminal status of the batch job","default":"cancelled"},"paragraphs_kept":{"type":"integer","title":"Paragraphs Kept","description":"Paragraphs that already have narration audio — untouched"},"paragraphs_reset":{"type":"integer","title":"Paragraphs Reset","description":"Un-narrated paragraphs returned to a runnable state"},"billing_released":{"type":"integer","title":"Billing Released","description":"Charges settled for paragraphs that produced no audio (released, or queued for release if the first attempt failed)"},"project_status":{"type":"string","title":"Project Status"}},"type":"object","required":["paragraphs_kept","paragraphs_reset","billing_released","project_status"],"title":"NarrationCancelResponse","description":"What POST /projects/{id}/narration/cancel settled.\n\nReports the settlement, not just \"ok\": `paragraphs_kept` is every\nparagraph that already has audio and was left untouched, and\n`paragraphs_reset` is what is runnable again. Cancel is\nresume-not-restart."},"NarrationProgress":{"properties":{"execution":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Execution"},"total_chapters":{"type":"integer","title":"Total Chapters"},"completed_chapters":{"type":"integer","title":"Completed Chapters"},"failed_chapters":{"type":"integer","title":"Failed Chapters"},"in_progress_chapters":{"type":"integer","title":"In Progress Chapters"},"estimated_completion_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Estimated Completion Time"},"chapter_status":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Chapter Status","description":"One entry per chapter. `status` is pending, narrating, failed, completed or awaiting_approval (passages wait for your approval; see `review_required`, `review_message` and GET /review). `quality_notes` counts passages published automatically under 'auto_accept' that our check flagged; they need no action."},"needs_review_paragraphs":{"type":"integer","title":"Needs Review Paragraphs","default":0},"review_required":{"type":"integer","title":"Review Required","description":"Passages waiting for your approval, across the book","default":0},"quality_notes":{"type":"integer","title":"Quality Notes","description":"Passages published automatically under 'auto_accept' that our check flagged, across the book. Advisory: no action needed.","default":0},"excluded_chapters":{"type":"integer","title":"Excluded Chapters","description":"Chapters excluded from narration","default":0},"excluded_words_pct":{"type":"number","title":"Excluded Words Pct","description":"Share of the book's words, in percent, in chapters excluded from narration","default":0.0}},"type":"object","required":["total_chapters","completed_chapters","failed_chapters","in_progress_chapters","estimated_completion_time","chapter_status"],"title":"NarrationProgress"},"NarrationRequest":{"properties":{"voice_id":{"type":"integer","title":"Voice Id","description":"Voice ID for narration"},"chapter_ids":{"anyOf":[{"items":{"type":"string","format":"uuid"},"type":"array"},{"type":"null"}],"title":"Chapter Ids","description":"Specific chapters to narrate"},"narration_speed":{"type":"number","maximum":2.0,"minimum":0.5,"title":"Narration Speed","default":1.0},"narration_style":{"type":"string","title":"Narration Style","default":"narrative"}},"type":"object","required":["voice_id"],"title":"NarrationRequest"},"NarrationReviewApproveAll":{"properties":{"chapter_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Chapter Id","description":"Only approve passages in this chapter"}},"type":"object","title":"NarrationReviewApproveAll"},"NarrationReviewItem":{"properties":{"paragraph_id":{"type":"string","title":"Paragraph Id"},"chapter_id":{"type":"string","title":"Chapter Id"},"chapter_number":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Chapter Number"},"position":{"type":"integer","title":"Position"},"status":{"type":"string","title":"Status"},"expected_text":{"type":"string","title":"Expected Text"},"heard_text":{"type":"string","title":"Heard Text"},"coverage":{"type":"number","title":"Coverage"},"candidate_audio_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Candidate Audio Url"},"duration_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Duration Seconds"},"flagged_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Flagged At"},"attempts":{"type":"integer","title":"Attempts","default":0},"auto_accepted":{"type":"boolean","title":"Auto Accepted","default":false},"approved_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Approved At"},"replacement":{"type":"boolean","title":"Replacement","default":false},"reason_code":{"type":"string","title":"Reason Code","description":"Why the passage is held: `possible_mismatch` (the narration may not match the text), `audio_check_failed` (the narration could not be checked automatically) or `replacement_pending` (a new narration waits; the passage keeps its current audio meanwhile) or `candidate_unavailable` (no narration could be kept; narrate it again or edit the text -- there is nothing to approve) or `allowance_exhausted` (a book bought per finished hour has used its hours; no actions apply, and the passage is completed automatically the next time narration starts once hours are added)."},"message":{"type":"string","title":"Message","description":"A plain-language explanation you can show"},"actions":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Actions","description":"The calls that resolve this passage, in recommended order: `approve` publishes the candidate at no charge, `edit_text` updates the passage text (then narrate it again), `regenerate` discards the candidate and narrates again (billed like any narration), `try_another_voice` is `regenerate` with the `voice_id` to narrate it in (fill it in; the passage keeps that voice), and `skip` leaves the passage out of the book at no charge so the rest of the book can be exported. Each has `action`, `method`, `path` and, when needed, a JSON `body`. Empty for `allowance_exhausted`."},"expires_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expires At","description":"When `candidate_audio_url` stops working (ISO 8601, UTC). List the review again for a fresh link."}},"type":"object","required":["paragraph_id","chapter_id","position","status","expected_text","heard_text","coverage","reason_code","message"],"title":"NarrationReviewItem"},"NarrationReviewList":{"properties":{"items":{"items":{"$ref":"#/components/schemas/NarrationReviewItem"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["items","total"],"title":"NarrationReviewList"},"NarrationReviewReject":{"properties":{"regenerate":{"type":"boolean","title":"Regenerate","description":"Narrate the passage again right away (billed like any narration)","default":false},"voice_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Voice Id","description":"With `regenerate`: narrate the passage in this voice instead. The passage keeps this voice from then on."}},"type":"object","title":"NarrationReviewReject"},"NewsletterSubscriptionCreate":{"properties":{"email":{"type":"string","format":"email","title":"Email"}},"type":"object","required":["email"],"title":"NewsletterSubscriptionCreate","description":"Schema for creating a newsletter subscription."},"NewsletterSubscriptionResponse":{"properties":{"id":{"type":"integer","title":"Id"},"email":{"type":"string","format":"email","title":"Email"},"is_active":{"type":"boolean","title":"Is Active"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["id","email","is_active","created_at"],"title":"NewsletterSubscriptionResponse","description":"Schema for newsletter subscription response (admin view)"},"NoiseType":{"type":"string","enum":["white_noise","street_noise","background_chatter","room_noise","air_conditioning","machine_hum","wind_noise","general"],"title":"NoiseType"},"NotificationMetadata":{"properties":{"job_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Job Id"},"job_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Type"},"promo_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Promo Code"},"discount_percent":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Discount Percent"},"feature_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Feature Name"},"credits_remaining":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Credits Remaining"}},"type":"object","title":"NotificationMetadata"},"NotificationResponse":{"properties":{"id":{"type":"string","title":"Id"},"type":{"$ref":"#/components/schemas/NotificationType"},"title":{"type":"string","title":"Title"},"message":{"type":"string","title":"Message"},"timestamp":{"type":"string","title":"Timestamp"},"read":{"type":"boolean","title":"Read"},"link":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Link"},"metadata":{"anyOf":[{"$ref":"#/components/schemas/NotificationMetadata"},{"type":"null"}]}},"type":"object","required":["id","type","title","message","timestamp","read"],"title":"NotificationResponse"},"NotificationType":{"type":"string","enum":["job_completed","job_failed","announcement","promo","feature_launch","credits_low","subscription"],"title":"NotificationType"},"NotificationsListResponse":{"properties":{"notifications":{"items":{"$ref":"#/components/schemas/NotificationResponse"},"type":"array","title":"Notifications"},"total":{"type":"integer","title":"Total"},"unread_count":{"type":"integer","title":"Unread Count"}},"type":"object","required":["notifications","total","unread_count"],"title":"NotificationsListResponse"},"OAuthLoginRequest":{"properties":{"profile":{"additionalProperties":true,"type":"object","title":"Profile"},"account":{"additionalProperties":true,"type":"object","title":"Account"},"browser_fingerprint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Browser Fingerprint"}},"type":"object","required":["profile","account"],"title":"OAuthLoginRequest"},"OTPVerificationRequest":{"properties":{"phone_number":{"type":"string","title":"Phone Number"},"otp_code":{"type":"string","title":"Otp Code"}},"type":"object","required":["phone_number","otp_code"],"title":"OTPVerificationRequest","description":"Schema for OTP verification"},"OTPVerificationResponse":{"properties":{"verified":{"type":"boolean","title":"Verified"},"message":{"type":"string","title":"Message"}},"type":"object","required":["verified","message"],"title":"OTPVerificationResponse","description":"Schema for OTP verification response"},"Outline":{"properties":{"segments":{"items":{"$ref":"#/components/schemas/Segment"},"type":"array","title":"Segments","description":"Ordered list of segments"},"id":{"type":"string","title":"Id","description":"Unique outline ID"},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"Creation timestamp"},"updated_at":{"type":"string","format":"date-time","title":"Updated At","description":"Last update timestamp"}},"type":"object","required":["id","created_at","updated_at"],"title":"Outline","description":"Outline response model."},"OutlineCreate":{"properties":{"segments":{"items":{"$ref":"#/components/schemas/SegmentCreate"},"type":"array","maxItems":20,"minItems":1,"title":"Segments","description":"Segments to create"}},"type":"object","required":["segments"],"title":"OutlineCreate","description":"Outline creation/update request."},"OutlineGenerateRequest":{"properties":{"num_segments":{"type":"integer","maximum":20.0,"minimum":2.0,"title":"Num Segments","description":"Number of segments to generate","default":5},"focus_areas":{"items":{"type":"string"},"type":"array","title":"Focus Areas","description":"Specific areas to focus on"},"target_duration_minutes":{"anyOf":[{"type":"integer","maximum":60.0,"minimum":5.0},{"type":"null"}],"title":"Target Duration Minutes"}},"type":"object","title":"OutlineGenerateRequest","description":"Request to AI-generate an outline."},"OutlineGenerateResponse":{"properties":{"outline":{"$ref":"#/components/schemas/Outline"},"estimated_duration_minutes":{"type":"number","title":"Estimated Duration Minutes","description":"Estimated podcast duration"}},"type":"object","required":["outline","estimated_duration_minutes"],"title":"OutlineGenerateResponse","description":"Response from outline generation."},"OverlayTarget":{"properties":{"kind":{"type":"string","const":"overlay","title":"Kind"},"id":{"type":"string","maxLength":128,"minLength":1,"title":"Id"}},"additionalProperties":false,"type":"object","required":["kind","id"],"title":"OverlayTarget"},"PacingSettings":{"properties":{"paragraph_gap_ms":{"type":"integer","maximum":10000.0,"minimum":0.0,"title":"Paragraph Gap Ms","description":"Silence between two passages read by the same voice. When a named character speaks two lines in a row, the gap is half this value.","default":500},"speaker_change_gap_ms":{"type":"integer","maximum":10000.0,"minimum":0.0,"title":"Speaker Change Gap Ms","description":"Silence when the voice changes — from the narrator to a character, or from one character to another.","default":500},"scene_break_ms":{"type":"integer","maximum":10000.0,"minimum":0.0,"title":"Scene Break Ms","description":"Silence at a scene break. A paragraph made only of divider marks (for example `* * *`, `#`, `⁂` or `~~~`) is a scene break: it is never narrated or charged, and becomes this pause instead.","default":1500}},"type":"object","title":"PacingSettings","description":"How much silence the book places between its passages.\n\nEvery value is in milliseconds (0–10000). A single passage's own\n`pause_after_ms` always overrides these for the gap after that passage."},"PacingUpdate":{"properties":{"paragraph_gap_ms":{"anyOf":[{"type":"integer","maximum":10000.0,"minimum":0.0},{"type":"null"}],"title":"Paragraph Gap Ms","description":"Silence between two passages read by the same voice (ms)."},"speaker_change_gap_ms":{"anyOf":[{"type":"integer","maximum":10000.0,"minimum":0.0},{"type":"null"}],"title":"Speaker Change Gap Ms","description":"Silence when the voice changes between passages (ms)."},"scene_break_ms":{"anyOf":[{"type":"integer","maximum":10000.0,"minimum":0.0},{"type":"null"}],"title":"Scene Break Ms","description":"Silence at a scene break (ms)."}},"type":"object","title":"PacingUpdate","description":"Change the book's pacing. Omitted fields keep their current value."},"PaginatedChaptersResponse":{"properties":{"chapters":{"items":{"$ref":"#/components/schemas/AudiobookChapterResponse"},"type":"array","title":"Chapters"},"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page"},"per_page":{"type":"integer","title":"Per Page"},"has_next":{"type":"boolean","title":"Has Next"},"has_prev":{"type":"boolean","title":"Has Prev"}},"type":"object","required":["chapters","total","page","per_page","has_next","has_prev"],"title":"PaginatedChaptersResponse"},"PaginatedParagraphsResponse":{"properties":{"paragraphs":{"items":{"$ref":"#/components/schemas/AudiobookParagraphResponse"},"type":"array","title":"Paragraphs"},"total":{"type":"integer","title":"Total"},"page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Page"},"per_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Per Page"},"has_next":{"type":"boolean","title":"Has Next","default":false},"has_prev":{"type":"boolean","title":"Has Prev","default":false}},"type":"object","required":["paragraphs","total"],"title":"PaginatedParagraphsResponse"},"PaginatedProjectsResponse":{"properties":{"projects":{"items":{"$ref":"#/components/schemas/AudiobookProjectResponse"},"type":"array","title":"Projects"},"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page"},"per_page":{"type":"integer","title":"Per Page"},"has_next":{"type":"boolean","title":"Has Next"},"has_prev":{"type":"boolean","title":"Has Prev"}},"type":"object","required":["projects","total","page","per_page","has_next","has_prev"],"title":"PaginatedProjectsResponse"},"PaginatedSpeakerJobResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/SpeakerJobResponse"},"type":"array","title":"Items"},"hasMore":{"type":"boolean","title":"Hasmore"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["items","hasMore","total"],"title":"PaginatedSpeakerJobResponse"},"PartRequest":{"properties":{"numbers":{"items":{"type":"integer"},"type":"array","maxItems":16,"minItems":1,"title":"Numbers"}},"additionalProperties":false,"type":"object","required":["numbers"],"title":"PartRequest"},"PartnerContact":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Name"},"email":{"anyOf":[{"type":"string","format":"email"},{"type":"null"}],"title":"Email"},"role":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Role"}},"type":"object","title":"PartnerContact"},"PartnerInvoiceResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"partner_id":{"type":"string","format":"uuid","title":"Partner Id"},"stripe_invoice_id":{"type":"string","title":"Stripe Invoice Id"},"period":{"type":"string","title":"Period"},"amount_cents":{"type":"integer","title":"Amount Cents"},"currency":{"type":"string","title":"Currency"},"credits":{"type":"integer","title":"Credits"},"status":{"type":"string","title":"Status"},"stripe_payment_intent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stripe Payment Intent Id"},"paid_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Paid At"},"voided_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Voided At"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","partner_id","stripe_invoice_id","period","amount_cents","currency","credits","status","created_at"],"title":"PartnerInvoiceResponse"},"PartnerLedgerResponse":{"properties":{"partner_id":{"type":"string","format":"uuid","title":"Partner Id"},"slug":{"type":"string","title":"Slug"},"balance_credits":{"type":"integer","title":"Balance Credits"},"committed_credits_total":{"type":"integer","title":"Committed Credits Total"},"granted_credits_total":{"type":"integer","title":"Granted Credits Total"},"debited_credits_total":{"type":"integer","title":"Debited Credits Total"},"entries":{"items":{"$ref":"#/components/schemas/LedgerEntryResponse"},"type":"array","title":"Entries"}},"type":"object","required":["partner_id","slug","balance_credits","committed_credits_total","granted_credits_total","debited_credits_total","entries"],"title":"PartnerLedgerResponse"},"PartnerResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"organisation_name":{"type":"string","title":"Organisation Name"},"slug":{"type":"string","title":"Slug"},"billing_email":{"type":"string","title":"Billing Email"},"tier":{"type":"string","title":"Tier"},"minimum_cents":{"type":"integer","title":"Minimum Cents"},"discount_pct":{"type":"integer","title":"Discount Pct"},"term_months":{"type":"integer","title":"Term Months"},"status":{"type":"string","title":"Status"},"stripe_customer_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stripe Customer Id"},"user_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"User Id"},"suspended_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Suspended At"},"suspension_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Suspension Reason"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","organisation_name","slug","billing_email","tier","minimum_cents","discount_pct","term_months","status","created_at"],"title":"PartnerResponse"},"PassphraseResponse":{"properties":{"session_token":{"type":"string","title":"Session Token"},"passphrase":{"type":"string","title":"Passphrase"},"expires_at":{"type":"string","title":"Expires At"}},"type":"object","required":["session_token","passphrase","expires_at"],"title":"PassphraseResponse"},"PasswordChange":{"properties":{"current_password":{"type":"string","title":"Current Password"},"new_password":{"type":"string","title":"New Password"}},"type":"object","required":["current_password","new_password"],"title":"PasswordChange"},"PayAsYouGoCheckoutRequest":{"properties":{"amount_usd":{"type":"integer","multipleOf":5.0,"maximum":1000.0,"minimum":5.0,"title":"Amount Usd","description":"Amount in USD to purchase (minimum $5, maximum $1000, multiples of $5)"}},"type":"object","required":["amount_usd"],"title":"PayAsYouGoCheckoutRequest"},"PayAsYouGoCheckoutResponse":{"properties":{"session_id":{"type":"string","title":"Session Id"},"url":{"type":"string","title":"Url"},"credits_to_receive":{"type":"integer","title":"Credits To Receive"},"amount_usd":{"type":"integer","title":"Amount Usd"}},"type":"object","required":["session_id","url","credits_to_receive","amount_usd"],"title":"PayAsYouGoCheckoutResponse"},"PayAsYouGoInfo":{"properties":{"credits_per_dollar":{"type":"integer","title":"Credits Per Dollar"},"min_amount_usd":{"type":"integer","title":"Min Amount Usd"},"max_amount_usd":{"type":"integer","title":"Max Amount Usd"},"currency":{"type":"string","title":"Currency"}},"type":"object","required":["credits_per_dollar","min_amount_usd","max_amount_usd","currency"],"title":"PayAsYouGoInfo"},"PayAsYouGoInfoLocalized":{"properties":{"credits_per_dollar":{"type":"integer","title":"Credits Per Dollar"},"min_amount_usd":{"type":"integer","title":"Min Amount Usd"},"max_amount_usd":{"type":"integer","title":"Max Amount Usd"},"currency":{"type":"string","title":"Currency"},"currency_info":{"additionalProperties":true,"type":"object","title":"Currency Info"},"suggested_amounts":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Suggested Amounts"}},"type":"object","required":["credits_per_dollar","min_amount_usd","max_amount_usd","currency","currency_info","suggested_amounts"],"title":"PayAsYouGoInfoLocalized","description":"Localized PAYG info with regional currency display"},"PayAsYouGoPaymentIntentRequest":{"properties":{"amount_usd":{"type":"integer","multipleOf":5.0,"maximum":1000.0,"minimum":5.0,"title":"Amount Usd","description":"Amount in USD to purchase (minimum $5, maximum $1000, multiples of $5)"},"audiobook_context":{"anyOf":[{"$ref":"#/components/schemas/AudiobookCheckoutContext"},{"type":"null"}],"description":"Optional: the audiobook this purchase funds. Recorded with the payment; the book starts once your balance covers it."}},"type":"object","required":["amount_usd"],"title":"PayAsYouGoPaymentIntentRequest"},"PayAsYouGoPaymentIntentResponse":{"properties":{"client_secret":{"type":"string","title":"Client Secret"},"payment_intent_id":{"type":"string","title":"Payment Intent Id"},"credits_to_receive":{"type":"integer","title":"Credits To Receive"},"amount_usd":{"type":"integer","title":"Amount Usd"},"amount_local":{"type":"integer","title":"Amount Local"},"currency":{"type":"string","title":"Currency"}},"type":"object","required":["client_secret","payment_intent_id","credits_to_receive","amount_usd","amount_local","currency"],"title":"PayAsYouGoPaymentIntentResponse"},"PayAsYouGoVerifyRequest":{"properties":{"session_id":{"type":"string","minLength":1,"title":"Session Id","description":"Stripe Checkout Session ID"}},"type":"object","required":["session_id"],"title":"PayAsYouGoVerifyRequest"},"PayAsYouGoVerifyResponse":{"properties":{"status":{"type":"string","title":"Status"},"credits_added":{"type":"integer","title":"Credits Added"},"amount_paid":{"type":"integer","title":"Amount Paid"}},"type":"object","required":["status","credits_added","amount_paid"],"title":"PayAsYouGoVerifyResponse"},"PaymentMethodEnum":{"type":"string","enum":["paypal","stripe","bank_transfer"],"title":"PaymentMethodEnum"},"PaymentRecoveryInfo":{"properties":{"status":{"type":"string","title":"Status"},"plan_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Plan Name"},"current_period_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Current Period End"}},"type":"object","required":["status"],"title":"PaymentRecoveryInfo","description":"A recoverable-but-not-active subscription (payment failed at renewal).\n\nSurfaced SEPARATELY from ``subscription`` (which stays null for non-active\nsubs) so the dashboard can show a \"your payment failed — update your card to\nrestore your plan\" banner WITHOUT feature-gating code that reads\n``subscription.plan_name`` accidentally re-granting paid features to a user\nwhose plan has lapsed. Only populated when there is no active subscription\nand the most recent subscription is ``past_due`` or ``unpaid``."},"PayoutRequestCreate":{"properties":{"requested_amount":{"anyOf":[{"type":"number","exclusiveMinimum":0.0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"}],"title":"Requested Amount","description":"Amount to request for payout"},"payment_method":{"$ref":"#/components/schemas/PaymentMethodEnum"},"payment_details":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Payment Details"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"}},"type":"object","required":["requested_amount","payment_method"],"title":"PayoutRequestCreate","description":"Schema for creating payout requests"},"PayoutRequestResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"affiliate_id":{"type":"string","format":"uuid","title":"Affiliate Id"},"requested_amount":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Requested Amount"},"currency":{"type":"string","title":"Currency"},"status":{"$ref":"#/components/schemas/PayoutStatusEnum"},"payment_method":{"type":"string","title":"Payment Method"},"processed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Processed At"},"external_payment_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"External Payment Id"},"failure_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Failure Reason"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","affiliate_id","requested_amount","currency","status","payment_method","created_at","updated_at"],"title":"PayoutRequestResponse","description":"Schema for payout request responses"},"PayoutStatusEnum":{"type":"string","enum":["pending","processing","completed","failed","cancelled"],"title":"PayoutStatusEnum"},"PendingStartRequest":{"properties":{"option_kind":{"type":"string","enum":["payg","plan","sku"],"title":"Option Kind","description":"The purchase option the author chose at the credit wall."}},"type":"object","required":["option_kind"],"title":"PendingStartRequest"},"PerformanceMetrics":{"properties":{"period_start":{"type":"string","format":"date-time","title":"Period Start"},"period_end":{"type":"string","format":"date-time","title":"Period End"},"clicks":{"type":"integer","title":"Clicks"},"signups":{"type":"integer","title":"Signups"},"conversions":{"type":"integer","title":"Conversions"},"revenue":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Revenue"},"commissions":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Commissions"},"conversion_rate":{"type":"number","title":"Conversion Rate"},"avg_order_value":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Avg Order Value"}},"type":"object","required":["period_start","period_end","clicks","signups","conversions","revenue","commissions","conversion_rate","avg_order_value"],"title":"PerformanceMetrics","description":"Performance metrics for affiliates"},"PhoneVerificationRequest":{"properties":{"phone_number":{"type":"string","title":"Phone Number"},"country_code":{"type":"string","title":"Country Code"}},"type":"object","required":["phone_number","country_code"],"title":"PhoneVerificationRequest","description":"Schema for initiating phone verification"},"PhoneVerificationResponse":{"properties":{"message":{"type":"string","title":"Message"},"expires_in_minutes":{"type":"integer","title":"Expires In Minutes"},"can_resend":{"type":"boolean","title":"Can Resend","default":false},"resend_available_in_seconds":{"type":"integer","title":"Resend Available In Seconds","default":0},"attempts_remaining":{"type":"integer","title":"Attempts Remaining","default":3}},"type":"object","required":["message","expires_in_minutes"],"title":"PhoneVerificationResponse","description":"Schema for phone verification response"},"Plan":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"description":{"type":"string","title":"Description"},"features":{"items":{"type":"string"},"type":"array","title":"Features"},"credits_per_interval":{"type":"integer","title":"Credits Per Interval"},"prices":{"additionalProperties":{"$ref":"#/components/schemas/Price"},"propertyNames":{"$ref":"#/components/schemas/PlanInterval"},"type":"object","title":"Prices"},"max_custom_voices":{"type":"integer","title":"Max Custom Voices","default":0},"max_audiobook_projects":{"type":"integer","title":"Max Audiobook Projects","default":0}},"type":"object","required":["id","name","description","features","credits_per_interval","prices"],"title":"Plan"},"PlanInterval":{"type":"string","enum":["month","year"],"title":"PlanInterval"},"PlaylistCreate":{"properties":{"name":{"type":"string","maxLength":200,"title":"Name"},"description":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Description"},"track_ids":{"items":{"type":"integer"},"type":"array","maxItems":500,"title":"Track Ids"}},"type":"object","required":["name"],"title":"PlaylistCreate"},"PlaylistPublicResponse":{"properties":{"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"share_token":{"type":"string","title":"Share Token"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"owner_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Owner Email"},"track_count":{"type":"integer","title":"Track Count","default":0},"available_count":{"type":"integer","title":"Available Count","default":0},"total_duration":{"type":"number","title":"Total Duration","default":0.0},"tracks":{"items":{"$ref":"#/components/schemas/PlaylistPublicTrackResponse"},"type":"array","title":"Tracks"}},"type":"object","required":["name","share_token","created_at"],"title":"PlaylistPublicResponse","description":"No user_id, no unmasked email, no share-management fields."},"PlaylistPublicTrackResponse":{"properties":{"position":{"type":"integer","title":"Position"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"thumbnail_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail Url"},"output_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Output Url"},"audio_duration":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Audio Duration"},"share_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share Token"},"lrc_content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lrc Content"},"is_available":{"type":"boolean","title":"Is Available","default":true},"unavailable_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unavailable Reason"}},"type":"object","required":["position"],"title":"PlaylistPublicTrackResponse","description":"A member track as an anonymous visitor sees it.\n\nUnavailable members are still returned, as tombstones with no URLs — the\nposition is real information (\"track 3 was removed by its owner\") and\nsilently compacting the list would misrepresent the playlist."},"PlaylistReorder":{"properties":{"track_ids":{"items":{"type":"integer"},"type":"array","maxItems":500,"title":"Track Ids"}},"type":"object","required":["track_ids"],"title":"PlaylistReorder","description":"The complete ordered member list, not a delta.\n\nA full list is idempotent and self-correcting: replaying it converges, and a\nclient that missed an update cannot half-apply a move. It must name exactly\nthe current members — the service rejects a mismatch rather than silently\ndropping whatever was omitted."},"PlaylistResponse":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"share_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share Token"},"share_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share Url"},"is_shared":{"type":"boolean","title":"Is Shared","default":false},"shared_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Shared At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"track_count":{"type":"integer","title":"Track Count","default":0},"total_duration":{"type":"number","title":"Total Duration","default":0.0},"tracks":{"items":{"$ref":"#/components/schemas/PlaylistTrackResponse"},"type":"array","title":"Tracks"},"unavailable_count":{"type":"integer","title":"Unavailable Count","default":0}},"type":"object","required":["id","name","created_at","updated_at"],"title":"PlaylistResponse"},"PlaylistShareResponse":{"properties":{"id":{"type":"integer","title":"Id"},"is_shared":{"type":"boolean","title":"Is Shared"},"share_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share Token"},"share_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share Url"},"shared_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Shared At"},"unavailable_count":{"type":"integer","title":"Unavailable Count","default":0}},"type":"object","required":["id","is_shared"],"title":"PlaylistShareResponse"},"PlaylistSummaryResponse":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"share_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share Token"},"share_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share Url"},"is_shared":{"type":"boolean","title":"Is Shared","default":false},"shared_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Shared At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"track_count":{"type":"integer","title":"Track Count","default":0},"thumbnail_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail Url"},"thumbnail_urls":{"items":{"type":"string"},"type":"array","maxItems":4,"title":"Thumbnail Urls"}},"type":"object","required":["id","name","created_at","updated_at"],"title":"PlaylistSummaryResponse","description":"List-view row — no member tracks, so listing N playlists stays one query."},"PlaylistTrackResponse":{"properties":{"music_job_id":{"type":"integer","title":"Music Job Id"},"position":{"type":"integer","title":"Position"},"added_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Added At"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"thumbnail_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail Url"},"output_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Output Url"},"audio_duration":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Audio Duration"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"lrc_content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lrc Content"},"is_available":{"type":"boolean","title":"Is Available","default":true},"unavailable_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unavailable Reason"},"is_external":{"type":"boolean","title":"Is External","default":false}},"type":"object","required":["music_job_id","position"],"title":"PlaylistTrackResponse","description":"One member track, as the owner sees it."},"PlaylistTracksAdd":{"properties":{"track_ids":{"items":{"type":"integer"},"type":"array","maxItems":500,"minItems":1,"title":"Track Ids"}},"type":"object","required":["track_ids"],"title":"PlaylistTracksAdd","description":"Bulk add. One request, one transaction — see PlaylistCreate.track_ids."},"PlaylistUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Description"}},"type":"object","title":"PlaylistUpdate"},"PodcastDashboardStats":{"properties":{"total_projects":{"type":"integer","title":"Total Projects"},"active_projects":{"type":"integer","title":"Active Projects"},"completed_projects":{"type":"integer","title":"Completed Projects"},"total_audio_hours":{"type":"number","title":"Total Audio Hours"},"recent_projects":{"items":{"$ref":"#/components/schemas/PodcastProjectSummary"},"type":"array","title":"Recent Projects"}},"type":"object","required":["total_projects","active_projects","completed_projects","total_audio_hours","recent_projects"],"title":"PodcastDashboardStats","description":"Dashboard statistics for podcast studio."},"PodcastListResponse":{"properties":{"projects":{"items":{"$ref":"#/components/schemas/PodcastProjectSummary"},"type":"array","title":"Projects"},"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page"},"per_page":{"type":"integer","title":"Per Page"},"has_next":{"type":"boolean","title":"Has Next"},"has_prev":{"type":"boolean","title":"Has Prev"}},"type":"object","required":["projects","total","page","per_page","has_next","has_prev"],"title":"PodcastListResponse","description":"Paginated list of podcast projects."},"PodcastProject":{"properties":{"title":{"type":"string","maxLength":200,"minLength":1,"title":"Title","description":"Podcast title"},"topic":{"type":"string","maxLength":500,"minLength":1,"title":"Topic","description":"Main topic"},"briefing":{"type":"string","maxLength":2000,"title":"Briefing","description":"Additional context/briefing","default":""},"key_points":{"items":{"type":"string"},"type":"array","title":"Key Points","description":"Key points to cover"},"language":{"type":"string","title":"Language","description":"Primary language code","default":"en"},"quality_preset":{"$ref":"#/components/schemas/QualityPreset","description":"Quality preset","default":"standard"},"target_duration_minutes":{"anyOf":[{"type":"integer","maximum":60.0,"minimum":5.0},{"type":"null"}],"title":"Target Duration Minutes","description":"Target episode length in minutes (5-60). Drives segment count + dialogue density."},"id":{"type":"string","title":"Id","description":"Unique project ID"},"user_id":{"type":"string","title":"User Id","description":"Owner user ID"},"status":{"$ref":"#/components/schemas/PodcastStatus","description":"Project status"},"speakers":{"items":{"$ref":"#/components/schemas/Speaker"},"type":"array","title":"Speakers","description":"Project speakers"},"outline":{"anyOf":[{"$ref":"#/components/schemas/Outline"},{"type":"null"}],"description":"Project outline"},"transcript":{"anyOf":[{"$ref":"#/components/schemas/Transcript"},{"type":"null"}],"description":"Project transcript"},"segments":{"items":{"$ref":"#/components/schemas/Segment"},"type":"array","title":"Segments","description":"Outline segments"},"dialogues":{"items":{"$ref":"#/components/schemas/Dialogue"},"type":"array","title":"Dialogues","description":"Transcript dialogues"},"sources":{"items":{"$ref":"#/components/schemas/PodcastSourceResponse"},"type":"array","title":"Sources","description":"Grounding sources"},"grounding_mode":{"type":"string","title":"Grounding Mode","description":"topic or sourced","default":"topic"},"episode_profile_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Episode Profile Id","description":"Applied episode profile id"},"combined_audio_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Combined Audio Url","description":"URL to combined final audio (WAV)"},"combined_audio_mp3_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Combined Audio Mp3 Url","description":"URL to combined final audio (MP3)"},"total_duration_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Total Duration Seconds","description":"Total audio duration"},"progress_percentage":{"type":"integer","maximum":100.0,"minimum":0.0,"title":"Progress Percentage","description":"Generation progress","default":0},"dialogues_completed":{"type":"integer","title":"Dialogues Completed","description":"Number of dialogues generated","default":0},"dialogues_total":{"type":"integer","title":"Dialogues Total","description":"Total number of dialogues","default":0},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"Creation timestamp"},"updated_at":{"type":"string","format":"date-time","title":"Updated At","description":"Last update timestamp"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At","description":"Completion timestamp"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message","description":"Error message if failed"}},"type":"object","required":["title","topic","id","user_id","status","created_at","updated_at"],"title":"PodcastProject","description":"Podcast project response model."},"PodcastProjectCreate":{"properties":{"title":{"type":"string","maxLength":200,"minLength":1,"title":"Title","description":"Podcast title"},"topic":{"type":"string","maxLength":500,"minLength":1,"title":"Topic","description":"Main topic"},"briefing":{"type":"string","maxLength":2000,"title":"Briefing","description":"Additional context/briefing","default":""},"key_points":{"items":{"type":"string"},"type":"array","title":"Key Points","description":"Key points to cover"},"language":{"type":"string","title":"Language","description":"Primary language code","default":"en"},"quality_preset":{"$ref":"#/components/schemas/QualityPreset","description":"Quality preset","default":"standard"},"target_duration_minutes":{"anyOf":[{"type":"integer","maximum":60.0,"minimum":5.0},{"type":"null"}],"title":"Target Duration Minutes","description":"Target episode length in minutes (5-60). Drives segment count + dialogue density."},"speakers":{"items":{"$ref":"#/components/schemas/SpeakerCreate"},"type":"array","maxItems":4,"minItems":1,"title":"Speakers","description":"Initial speakers"},"episode_profile_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Episode Profile Id","description":"Apply a saved episode profile"},"briefing_suffix":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Briefing Suffix","description":"Appended to the profile's default briefing"}},"type":"object","required":["title","topic","speakers"],"title":"PodcastProjectCreate","description":"Project creation request."},"PodcastProjectSummary":{"properties":{"id":{"type":"string","title":"Id"},"title":{"type":"string","title":"Title"},"topic":{"type":"string","title":"Topic"},"status":{"$ref":"#/components/schemas/PodcastStatus"},"language":{"type":"string","title":"Language"},"quality_preset":{"$ref":"#/components/schemas/QualityPreset"},"speaker_count":{"type":"integer","title":"Speaker Count"},"total_duration_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Total Duration Seconds"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","title","topic","status","language","quality_preset","speaker_count","total_duration_seconds","created_at","updated_at"],"title":"PodcastProjectSummary","description":"Summary view of a podcast project for lists."},"PodcastProjectUpdate":{"properties":{"title":{"anyOf":[{"type":"string","maxLength":200,"minLength":1},{"type":"null"}],"title":"Title"},"topic":{"anyOf":[{"type":"string","maxLength":500,"minLength":1},{"type":"null"}],"title":"Topic"},"briefing":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Briefing"},"key_points":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Key Points"},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language"},"quality_preset":{"anyOf":[{"$ref":"#/components/schemas/QualityPreset"},{"type":"null"}]},"target_duration_minutes":{"anyOf":[{"type":"integer","maximum":60.0,"minimum":5.0},{"type":"null"}],"title":"Target Duration Minutes"}},"type":"object","title":"PodcastProjectUpdate","description":"Project update request."},"PodcastSourceResponse":{"properties":{"id":{"type":"string","title":"Id"},"source_type":{"$ref":"#/components/schemas/SourceType"},"status":{"$ref":"#/components/schemas/SourceStatus"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"original_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Original Ref"},"original_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Original Filename"},"token_count":{"type":"integer","title":"Token Count","default":0},"char_count":{"type":"integer","title":"Char Count","default":0},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"}},"type":"object","required":["id","source_type","status"],"title":"PodcastSourceResponse","description":"A grounding source attached to a project."},"PodcastStatus":{"type":"string","enum":["draft","sources_ingesting","sources_ready","outline_generating","outline_ready","transcript_generating","transcript_ready","audio_generating","audio_ready","combining","completed","failed"],"title":"PodcastStatus","description":"Status of a podcast project."},"PreflightCheckResponse":{"properties":{"id":{"type":"string","title":"Id"},"severity":{"type":"string","enum":["error","warning"],"title":"Severity"},"passed":{"type":"boolean","title":"Passed"},"requirement":{"type":"string","title":"Requirement"},"detail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Detail"},"field":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Field"}},"type":"object","required":["id","severity","passed","requirement"],"title":"PreflightCheckResponse"},"PresetVoice":{"properties":{"id":{"type":"string","title":"Id","description":"Voice ID"},"display_name":{"type":"string","title":"Display Name","description":"The voice's human label."},"name":{"type":"string","title":"Name","description":"Deprecated mirror of `display_name`."},"language":{"type":"string","title":"Language","description":"Primary language"},"gender":{"type":"string","title":"Gender","description":"male or female"},"style":{"type":"string","title":"Style","description":"Voice style description"},"sample_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sample Url","description":"Sample audio URL"}},"type":"object","required":["id","display_name","name","language","gender","style"],"title":"PresetVoice","description":"A curated podcast voice."},"PresetVoiceListResponse":{"properties":{"voices":{"items":{"$ref":"#/components/schemas/PresetVoice"},"type":"array","title":"Voices"},"languages":{"items":{"type":"string"},"type":"array","title":"Languages","description":"Supported languages"}},"type":"object","required":["voices","languages"],"title":"PresetVoiceListResponse","description":"List of available preset voices."},"PresetsResponse":{"properties":{"genre_presets":{"additionalProperties":{"type":"string"},"type":"object","title":"Genre Presets"}},"type":"object","required":["genre_presets"],"title":"PresetsResponse","description":"Response for presets endpoint"},"PresignRequest":{"properties":{"service":{"type":"string","title":"Service","description":"Allowlisted upload service key"},"filename":{"type":"string","title":"Filename","description":"Original filename (used only as key suffix)"},"content_type":{"type":"string","title":"Content Type","description":"MIME type the client will PUT with"},"size_bytes":{"type":"integer","minimum":1.0,"title":"Size Bytes","description":"Declared upload size in bytes (advisory)"}},"type":"object","required":["service","filename","content_type","size_bytes"],"title":"PresignRequest"},"PresignResponse":{"properties":{"upload_id":{"type":"string","title":"Upload Id"},"url":{"type":"string","title":"Url"},"method":{"type":"string","title":"Method","default":"PUT"},"headers":{"additionalProperties":true,"type":"object","title":"Headers"},"key_expires_in":{"type":"integer","title":"Key Expires In"}},"type":"object","required":["upload_id","url","headers","key_expires_in"],"title":"PresignResponse"},"Price":{"properties":{"id":{"type":"string","title":"Id"},"lookup_key":{"type":"string","title":"Lookup Key"},"unit_amount":{"type":"integer","title":"Unit Amount"},"interval":{"$ref":"#/components/schemas/PlanInterval"},"currency":{"type":"string","title":"Currency","default":"usd"}},"type":"object","required":["id","lookup_key","unit_amount","interval"],"title":"Price"},"PricingInfoResponse":{"properties":{"currency":{"type":"string","title":"Currency"},"currency_info":{"additionalProperties":true,"type":"object","title":"Currency Info"},"supported_plans":{"additionalProperties":{"additionalProperties":true,"type":"object"},"type":"object","title":"Supported Plans"},"sample_pricing":{"additionalProperties":{"additionalProperties":{"type":"string"},"type":"object"},"type":"object","title":"Sample Pricing"},"pricing_display":{"additionalProperties":{"additionalProperties":{"additionalProperties":{"type":"string"},"type":"object"},"type":"object"},"type":"object","title":"Pricing Display"},"country_code":{"type":"string","title":"Country Code","default":"US"},"country_name":{"type":"string","title":"Country Name","default":"United States"},"region":{"type":"string","title":"Region","default":"north_america"}},"type":"object","required":["currency","currency_info","supported_plans","sample_pricing","pricing_display"],"title":"PricingInfoResponse","description":"Response model for regional pricing information"},"PricingResponse":{"properties":{"stem_pricing":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Stem Pricing"},"services":{"additionalProperties":{"$ref":"#/components/schemas/ServicePricing"},"type":"object","title":"Services"},"wallet":{"$ref":"#/components/schemas/WalletConfig"}},"type":"object","required":["services","wallet"],"title":"PricingResponse","description":"Complete pricing table response"},"ProcessReferralRequest":{"properties":{"referred_user_id":{"type":"string","title":"Referred User Id","description":"ID of the newly registered user"},"referral_code_used":{"type":"string","title":"Referral Code Used","description":"Referral code that was used during signup"}},"type":"object","required":["referred_user_id","referral_code_used"],"title":"ProcessReferralRequest","description":"Request to process a referral signup"},"ProcessReferralResponse":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether the referral was processed successfully"},"referrer_reward_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Referrer Reward Id","description":"ID of reward given to referrer"},"referee_reward_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Referee Reward Id","description":"ID of reward given to referee"},"message":{"type":"string","title":"Message","description":"Processing message"}},"type":"object","required":["success","message"],"title":"ProcessReferralResponse","description":"Response for referral processing"},"ProcessingStatus":{"type":"string","enum":["PENDING","PROCESSING","COMPLETED","FAILED","CANCELLED"],"title":"ProcessingStatus"},"ProductionCover":{"properties":{"media_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Media Id"},"storage_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Storage Key"},"filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Filename"},"width":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Width"},"height":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Height"},"available":{"type":"boolean","title":"Available","default":true}},"type":"object","title":"ProductionCover"},"ProductionCoverInput":{"properties":{"media_id":{"type":"string","format":"uuid","title":"Media Id"}},"type":"object","required":["media_id"],"title":"ProductionCoverInput"},"ProductionCredits":{"properties":{"narrator_name":{"type":"string","title":"Narrator Name"},"include_opening":{"type":"boolean","title":"Include Opening","default":true},"include_closing":{"type":"boolean","title":"Include Closing","default":true},"opening_line":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Opening Line"},"closing_line":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Closing Line"},"opening_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Opening Text"},"closing_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Closing Text"}},"type":"object","required":["narrator_name"],"title":"ProductionCredits"},"ProductionCreditsInput":{"properties":{"narrator_name":{"type":"string","maxLength":120,"minLength":1,"title":"Narrator Name"},"include_opening":{"type":"boolean","title":"Include Opening","default":true},"include_closing":{"type":"boolean","title":"Include Closing","default":true},"opening_text":{"anyOf":[{"type":"string","maxLength":600},{"type":"null"}],"title":"Opening Text"},"closing_text":{"anyOf":[{"type":"string","maxLength":600},{"type":"null"}],"title":"Closing Text"}},"type":"object","required":["narrator_name"],"title":"ProductionCreditsInput"},"ProductionMusicSettings":{"properties":{"intro":{"anyOf":[{"$ref":"#/components/schemas/ProductionMusicSlot"},{"type":"null"}]},"outro":{"anyOf":[{"$ref":"#/components/schemas/ProductionMusicSlot"},{"type":"null"}]},"credits":{"anyOf":[{"$ref":"#/components/schemas/ProductionCredits"},{"type":"null"}]},"cover":{"anyOf":[{"$ref":"#/components/schemas/ProductionCover"},{"type":"null"}]},"silence":{"$ref":"#/components/schemas/ProductionSilence"},"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated At"},"warnings":{"items":{"type":"string"},"type":"array","title":"Warnings"}},"type":"object","required":["silence"],"title":"ProductionMusicSettings"},"ProductionMusicSlot":{"properties":{"media_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Media Id"},"storage_key":{"type":"string","title":"Storage Key"},"filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Filename"},"duration_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Duration Seconds"},"source":{"type":"string","title":"Source","default":"upload"},"music_job_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Music Job Id"},"available":{"type":"boolean","title":"Available","default":true}},"type":"object","required":["storage_key"],"title":"ProductionMusicSlot"},"ProductionMusicSlotInput":{"properties":{"media_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Media Id"},"music_job_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Music Job Id"}},"type":"object","title":"ProductionMusicSlotInput","description":"Set a music slot from an uploaded media row OR a completed Music Studio job."},"ProductionMusicUpdate":{"properties":{"intro":{"anyOf":[{"$ref":"#/components/schemas/ProductionMusicSlotInput"},{"type":"null"}]},"outro":{"anyOf":[{"$ref":"#/components/schemas/ProductionMusicSlotInput"},{"type":"null"}]},"credits":{"anyOf":[{"$ref":"#/components/schemas/ProductionCreditsInput"},{"type":"null"}]},"cover":{"anyOf":[{"$ref":"#/components/schemas/ProductionCoverInput"},{"type":"null"}]},"silence":{"anyOf":[{"$ref":"#/components/schemas/ProductionSilenceInput"},{"type":"null"}]}},"type":"object","title":"ProductionMusicUpdate","description":"Tri-state per field: omitted = unchanged, null = clear, object = set."},"ProductionSilence":{"properties":{"head_ms":{"type":"integer","title":"Head Ms"},"tail_ms":{"type":"integer","title":"Tail Ms"},"acx_compliant":{"type":"boolean","title":"Acx Compliant"}},"type":"object","required":["head_ms","tail_ms","acx_compliant"],"title":"ProductionSilence","description":"The room tone in effect for this project's chapters."},"ProductionSilenceInput":{"properties":{"head_ms":{"anyOf":[{"type":"integer","maximum":5000.0,"minimum":0.0},{"type":"null"}],"title":"Head Ms"},"tail_ms":{"anyOf":[{"type":"integer","maximum":10000.0,"minimum":0.0},{"type":"null"}],"title":"Tail Ms"}},"type":"object","title":"ProductionSilenceInput","description":"Per-project chapter room tone (leading and trailing silence).\n\nThe accepted range is deliberately wider than ACX (0.5-1 s head, 1-5 s\ntail) because not every delivery targets ACX: an out-of-ACX value is\naccepted and warned about, not rejected. The bounds only stop an absurd\nvalue turning a chapter into mostly silence. An omitted field leaves that\nside unchanged."},"ProgramStatistics":{"properties":{"total_affiliates":{"type":"integer","title":"Total Affiliates"},"active_affiliates":{"type":"integer","title":"Active Affiliates"},"pending_affiliates":{"type":"integer","title":"Pending Affiliates"},"total_commissions_paid":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Total Commissions Paid"},"total_commissions_pending":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Total Commissions Pending"},"total_revenue_generated":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Total Revenue Generated"},"total_clicks":{"type":"integer","title":"Total Clicks"},"total_signups":{"type":"integer","title":"Total Signups"},"total_conversions":{"type":"integer","title":"Total Conversions"},"overall_conversion_rate":{"type":"number","title":"Overall Conversion Rate"},"new_affiliates_this_month":{"type":"integer","title":"New Affiliates This Month"},"active_affiliates_this_month":{"type":"integer","title":"Active Affiliates This Month"},"commissions_paid_this_month":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Commissions Paid This Month"}},"type":"object","required":["total_affiliates","active_affiliates","pending_affiliates","total_commissions_paid","total_commissions_pending","total_revenue_generated","total_clicks","total_signups","total_conversions","overall_conversion_rate","new_affiliates_this_month","active_affiliates_this_month","commissions_paid_this_month"],"title":"ProgramStatistics","description":"Overall program statistics for admin dashboard"},"PromoOfferResponse":{"properties":{"eligible":{"type":"boolean","title":"Eligible"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"},"promo_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Promo Key"},"price_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Price Id"},"amount":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Amount"},"original_amount":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Original Amount"},"discount_percent":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Discount Percent"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currency"},"interval":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Interval"},"plan_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Plan Name"}},"type":"object","required":["eligible"],"title":"PromoOfferResponse","description":"Response model for promotional offer details"},"Prompt2InstrumentalRequest":{"properties":{"duration":{"type":"number","maximum":600.0,"minimum":-1.0,"title":"Duration","description":"Audio duration in seconds (-1 for auto-detection based on lyrics, max 600s/10min)","default":-1.0},"audio_duration":{"type":"number","maximum":600.0,"minimum":-1.0,"title":"Audio Duration","description":"Alias for duration (legacy)"},"format":{"$ref":"#/components/schemas/app__schemas__music__AudioFormat","description":"Output audio format (flac recommended for quality)","default":"flac"},"model_version":{"anyOf":[{"$ref":"#/components/schemas/ModelVersion"},{"type":"null"}],"description":"Model version: audiomusic-v2 (default) or audiomusic-v1.5","default":"audiomusic-v2"},"quality":{"anyOf":[{"$ref":"#/components/schemas/MusicQuality"},{"type":"null"}],"description":"Deprecated and ignored. Every plan generates with AudioPod's highest-quality music model at the same rate; both values are accepted for compatibility and behave identically."},"bpm":{"anyOf":[{"type":"integer","maximum":300.0,"minimum":30.0},{"type":"null"}],"title":"Bpm","description":"Beats per minute (30-300). None for auto-detection via LM."},"keyscale":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Keyscale","description":"Musical key (e.g. 'C Major', 'Am', 'F# minor'). Empty for auto-detection."},"timesignature":{"anyOf":[{"type":"string","maxLength":10},{"type":"null"}],"title":"Timesignature","description":"Time signature (2='2/4', 3='3/4', 4='4/4', 6='6/8'). Empty for auto-detection."},"vocal_language":{"type":"string","maxLength":20,"title":"Vocal Language","description":"Language code for vocals (ISO 639-1: 'en', 'zh', 'ja', etc.). 'unknown' for auto-detection.","default":"unknown"},"inference_steps":{"type":"integer","maximum":200.0,"minimum":1.0,"title":"Inference Steps","description":"Diffusion steps. SFT/Base: 64 for best quality (32-100 range). Turbo: 8.","default":64},"infer_step":{"type":"integer","maximum":200.0,"minimum":1.0,"title":"Infer Step","description":"Alias for inference_steps (legacy)"},"guidance_scale":{"type":"number","maximum":15.0,"minimum":1.0,"title":"Guidance Scale","description":"CFG scale (1.0-15.0). Higher = more adherence to prompt.","default":7.0},"seed":{"type":"integer","title":"Seed","description":"Random seed (-1 for random, positive for fixed)","default":-1},"shift":{"type":"number","maximum":5.0,"minimum":1.0,"title":"Shift","description":"Timestep shift factor (1.0-5.0). 3.0 recommended for all models.","default":3.0},"infer_method":{"$ref":"#/components/schemas/InferMethod","description":"Inference method: 'ode' (Euler, fast) or 'sde' (stochastic)","default":"ode"},"use_adg":{"type":"boolean","title":"Use Adg","description":"Adaptive Dual Guidance (base model only). Improves quality at the cost of speed.","default":false},"cfg_interval_start":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Cfg Interval Start","description":"CFG application start ratio (0.0-1.0)","default":0.0},"cfg_interval_end":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Cfg Interval End","description":"CFG application end ratio (0.0-1.0)","default":1.0},"timesteps":{"anyOf":[{"items":{"type":"number"},"type":"array"},{"type":"null"}],"title":"Timesteps","description":"Custom timesteps list from 1.0 to 0.0. Overrides inference_steps and shift if provided."},"thinking":{"type":"boolean","title":"Thinking","description":"Enable LM Chain-of-Thought reasoning for semantic planning","default":true},"lm_temperature":{"type":"number","maximum":2.0,"minimum":0.0,"title":"Lm Temperature","description":"LM sampling temperature. Higher = more creative.","default":0.85},"lm_cfg_scale":{"type":"number","maximum":10.0,"minimum":0.0,"title":"Lm Cfg Scale","description":"LM classifier-free guidance scale","default":2.0},"lm_top_k":{"type":"integer","maximum":100.0,"minimum":0.0,"title":"Lm Top K","description":"LM top-k sampling. 0 disables.","default":0},"lm_top_p":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Lm Top P","description":"LM nucleus sampling. 1.0 disables.","default":0.9},"lm_negative_prompt":{"type":"string","maxLength":512,"title":"Lm Negative Prompt","description":"Negative prompt for LM classifier-free guidance","default":"NO USER INPUT"},"use_cot_metas":{"type":"boolean","title":"Use Cot Metas","description":"Generate metadata using LM CoT reasoning","default":true},"use_cot_caption":{"type":"boolean","title":"Use Cot Caption","description":"Refine caption using LM CoT reasoning","default":true},"use_cot_lyrics":{"type":"boolean","title":"Use Cot Lyrics","description":"Generate/refine lyrics using LM CoT reasoning (reserved)","default":false},"use_cot_language":{"type":"boolean","title":"Use Cot Language","description":"Detect vocal language using LM CoT reasoning","default":true},"use_constrained_decoding":{"type":"boolean","title":"Use Constrained Decoding","description":"Enable constrained decoding for structured LM output","default":true},"lora_name_or_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lora Name Or Path","description":"LoRA adapter path for custom styles"},"lora_weight":{"type":"number","maximum":3.0,"minimum":-3.0,"title":"Lora Weight","description":"LoRA weight","default":1.0},"batch_size":{"type":"integer","maximum":8.0,"minimum":1.0,"title":"Batch Size","description":"Number of variations to generate (1-8)","default":1},"thumbnail_url":{"anyOf":[{"type":"string","maxLength":1024},{"type":"null"}],"title":"Thumbnail Url","description":"URL for the music thumbnail"},"manual_seeds":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Manual Seeds","description":"Manual seeds for batch generation (legacy)"},"scheduler_type":{"anyOf":[{"$ref":"#/components/schemas/SchedulerType"},{"type":"null"}],"description":"Legacy scheduler type (use infer_method instead)"},"cfg_type":{"anyOf":[{"$ref":"#/components/schemas/CFGType"},{"type":"null"}],"description":"Legacy CFG type"},"use_sde":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Use Sde","description":"Legacy SDE flag (use infer_method='sde' instead)"},"debug":{"type":"boolean","title":"Debug","description":"Enable debug mode","default":false},"display_name":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Display Name","description":"Display name for the instrumental track"},"prompt":{"type":"string","maxLength":2000,"minLength":1,"title":"Prompt","description":"Instrumental style description"},"genre_preset":{"anyOf":[{"$ref":"#/components/schemas/GenrePreset"},{"type":"null"}],"description":"Genre preset to use"},"tempo":{"anyOf":[{"type":"integer","maximum":200.0,"minimum":60.0},{"type":"null"}],"title":"Tempo","description":"Target tempo in BPM"}},"type":"object","required":["prompt"],"title":"Prompt2InstrumentalRequest","description":"Request for prompt-to-instrumental generation"},"PronunciationAuditionRequest":{"properties":{"source":{"type":"string","maxLength":200,"minLength":1,"title":"Source"},"alias":{"type":"string","maxLength":200,"minLength":1,"title":"Alias"},"case_sensitive":{"type":"boolean","title":"Case Sensitive","default":false}},"type":"object","required":["source","alias"],"title":"PronunciationAuditionRequest"},"PronunciationCreate":{"properties":{"source":{"type":"string","maxLength":200,"minLength":1,"title":"Source"},"alias":{"type":"string","minLength":1,"title":"Alias"},"case_sensitive":{"type":"boolean","title":"Case Sensitive","default":false}},"type":"object","required":["source","alias"],"title":"PronunciationCreate"},"PronunciationMatch":{"properties":{"paragraph_id":{"type":"string","format":"uuid","title":"Paragraph Id"},"chapter_id":{"type":"string","format":"uuid","title":"Chapter Id"},"sources":{"items":{"type":"string"},"type":"array","title":"Sources","description":"Dictionary entries whose pattern matches this paragraph's current text. The set of PARAGRAPHS is exact — every paragraph the dictionary would change appears here, none are missed. Per-entry attribution is approximate when entries overlap (e.g. 'Smith' and 'Mr. Smith'): the renderer substitutes sequentially, longest source first, so a shorter entry listed here may end up with nothing left to replace. Use this to decide WHICH paragraphs to re-narrate, not to predict the exact output text."},"has_audio":{"type":"boolean","title":"Has Audio","description":"This paragraph already has narration audio, so it is currently carrying the wrong pronunciation. Paragraphs without audio need no re-render — they pick the dictionary up on their first pass.","default":false},"regenerable":{"type":"boolean","title":"Regenerable","description":"A 'regenerate everything this entry affects' action would actually re-render this paragraph: it has audio, and it is neither locked nor marked skip-narration. Count and bill from THIS flag, not from has_audio.","default":false},"credits":{"type":"integer","title":"Credits","description":"Credits re-narrating THIS paragraph would cost, at the same rate narration later charges, and 0 when it is a free regeneration. An estimate: the final character count is resolved at render time. 0 whenever `regenerable` is false, since those paragraphs are not part of a re-render.","default":0}},"type":"object","required":["paragraph_id","chapter_id","sources"],"title":"PronunciationMatch","description":"One paragraph the dictionary would change, and which entries hit it."},"PronunciationMatchesResponse":{"properties":{"matches":{"items":{"$ref":"#/components/schemas/PronunciationMatch"},"type":"array","title":"Matches"}},"type":"object","required":["matches"],"title":"PronunciationMatchesResponse"},"PronunciationPreviewRequest":{"properties":{"source":{"type":"string","maxLength":200,"minLength":1,"title":"Source"},"alias":{"type":"string","maxLength":200,"minLength":1,"title":"Alias"},"case_sensitive":{"type":"boolean","title":"Case Sensitive","default":false}},"type":"object","required":["source","alias"],"title":"PronunciationPreviewRequest"},"PronunciationResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"project_id":{"type":"string","format":"uuid","title":"Project Id"},"source":{"type":"string","title":"Source"},"alias":{"type":"string","title":"Alias"},"case_sensitive":{"type":"boolean","title":"Case Sensitive"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","project_id","source","alias","case_sensitive","created_at","updated_at"],"title":"PronunciationResponse"},"PronunciationUpdate":{"properties":{"alias":{"anyOf":[{"type":"string","minLength":1},{"type":"null"}],"title":"Alias"},"case_sensitive":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Case Sensitive"}},"type":"object","title":"PronunciationUpdate"},"ProvenanceCheckResponse":{"properties":{"verdict":{"type":"string","enum":["pass","fail"],"title":"Verdict"},"transcript_match_score":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Transcript Match Score"},"liveness_score":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Liveness Score"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"}},"type":"object","required":["verdict","transcript_match_score","liveness_score"],"title":"ProvenanceCheckResponse"},"PublicMusicShareableResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"audio_url":{"type":"string","title":"Audio Url"},"share_url":{"type":"string","title":"Share Url"},"share_token":{"type":"string","title":"Share Token"},"job_id":{"type":"integer","title":"Job Id"},"display_name":{"type":"string","title":"Display Name"},"duration":{"type":"number","title":"Duration"},"task":{"type":"string","title":"Task"},"thumbnail_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail Url"},"lyrics":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lyrics"},"caption":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Caption"}},"type":"object","required":["success","audio_url","share_url","share_token","job_id","display_name","duration","task"],"title":"PublicMusicShareableResponse","description":"Response for shareable public music generation"},"PublicPreviewVoicesResponse":{"properties":{"voices":{"items":{"$ref":"#/components/schemas/VoicePublicItem"},"type":"array","title":"Voices"},"supported_languages":{"additionalProperties":{"type":"string"},"type":"object","title":"Supported Languages","description":"BCP-47 code to display label."},"total_voices":{"type":"integer","title":"Total Voices","default":0},"total_languages":{"type":"integer","title":"Total Languages","default":0}},"type":"object","title":"PublicPreviewVoicesResponse","description":"The curated voices offered on the public preview surface."},"PublicVoiceCatalogItem":{"properties":{"id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Id","description":"Numeric voice identifier."},"uuid":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Uuid","description":"Stable voice identifier."},"slug":{"type":"string","title":"Slug","description":"URL-safe form of `uuid`.","default":""},"display_name":{"type":"string","title":"Display Name","description":"The voice's human label. Always present, never empty."},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Voice description."},"gender":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gender"},"accent":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accent"},"age_group":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Age Group"},"voice_style":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Voice Style"},"language_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language Code","description":"Primary BCP-47 code for this voice."},"language_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language Name"},"supported_languages":{"items":{"type":"string"},"type":"array","title":"Supported Languages","description":"BCP-47 codes this voice can speak."},"language_codes":{"items":{"type":"string"},"type":"array","title":"Language Codes","description":"Alias of `supported_languages`, kept for existing clients."},"best_suited_languages":{"items":{"type":"string"},"type":"array","title":"Best Suited Languages","description":"BCP-47 codes this specific voice is best suited for. May be empty, which means 'not characterised', not 'no languages'."},"language_filter_codes":{"items":{"type":"string"},"type":"array","title":"Language Filter Codes","description":"The codes a voice picker should FILTER this voice under. Resolved server-side; prefer it over deriving one from the language lists. Empty means 'not characterised' — keep your own fallback."},"cross_lingual_capable":{"type":"boolean","title":"Cross Lingual Capable","description":"True when the engine can synthesize this voice well beyond its best-suited languages. Display fact only — nothing is gated on it.","default":false},"use_case":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Use Case","description":"Derived filter axis: narration | conversational | character | explainer. Filter voice pickers on this rather than on `voice_style`."},"use_cases":{"items":{"type":"string"},"type":"array","title":"Use Cases","description":"Marketing-curated tags. Populated on no catalog row today; use the singular `use_case` above."},"tags":{"items":{"type":"string"},"type":"array","title":"Tags","description":"Voice descriptors."},"categories":{"items":{"type":"string"},"type":"array","title":"Categories","description":"Voice categories."},"sample_audio_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sample Audio Url","description":"A URL the player can use directly. Present whenever this voice has any preview audio at all."},"can_be_conversion_target":{"type":"boolean","title":"Can Be Conversion Target","description":"Whether this voice can be the TARGET of a voice conversion. Conversion needs a stored reference clip; a catalog voice synthesized on demand has a preview but no clip, so it is a valid TTS speaker and an invalid conversion target.","default":false},"sample_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sample Text","description":"The line spoken in the preview."},"is_public":{"type":"boolean","title":"Is Public","description":"Whether this voice is visible to other accounts.","default":false},"voice_type":{"anyOf":[{"$ref":"#/components/schemas/app__schemas__enums__VoiceType"},{"type":"null"}],"description":"STANDARD for catalog voices, CUSTOM for cloned ones."},"featured_rank":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Featured Rank","description":"Curated 'Start here' position, 1-based, or null."},"popularity_score":{"type":"integer","title":"Popularity Score","description":"Distinct accounts that used this voice in the last 30 days.","default":0}},"type":"object","required":["display_name"],"title":"PublicVoiceCatalogItem","description":"A voice as returned on public, unauthenticated surfaces."},"PublicationCreate":{"properties":{"store_label":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Store Label","description":"Store name; required when store is 'other'"},"listing_url":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Listing Url"},"submitted_on":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Submitted On"},"live_on":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Live On"},"rejected_on":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Rejected On"},"rejection_reason":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Rejection Reason"},"export_package_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Export Package Id"},"store":{"type":"string","enum":["authors_republic","kobo","streetlib","publishdrive","acx","other"],"title":"Store"},"status":{"type":"string","enum":["submitted","live","rejected"],"title":"Status","default":"submitted"}},"type":"object","required":["store"],"title":"PublicationCreate"},"PublicationListResponse":{"properties":{"publications":{"items":{"$ref":"#/components/schemas/PublicationResponse"},"type":"array","title":"Publications"}},"type":"object","required":["publications"],"title":"PublicationListResponse"},"PublicationResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"project_id":{"type":"string","format":"uuid","title":"Project Id"},"store":{"type":"string","title":"Store"},"store_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Store Label"},"status":{"type":"string","title":"Status"},"listing_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Listing Url"},"submitted_on":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Submitted On"},"live_on":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Live On"},"rejected_on":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Rejected On"},"rejection_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rejection Reason"},"export_package_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Export Package Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","project_id","store","status","created_at","updated_at"],"title":"PublicationResponse"},"PublicationUpdate":{"properties":{"store_label":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Store Label","description":"Store name; required when store is 'other'"},"listing_url":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Listing Url"},"submitted_on":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Submitted On"},"live_on":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Live On"},"rejected_on":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Rejected On"},"rejection_reason":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Rejection Reason"},"export_package_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Export Package Id"},"status":{"anyOf":[{"type":"string","enum":["submitted","live","rejected"]},{"type":"null"}],"title":"Status"}},"type":"object","title":"PublicationUpdate","description":"Every field optional: omitted is left alone, null clears. The store is fixed."},"PublishingPlan":{"type":"string","enum":["acx","spotify","wide","undecided"],"title":"PublishingPlan"},"QualityPreset":{"type":"string","enum":["quick","standard","premium"],"title":"QualityPreset","description":"Quality preset for podcast generation."},"QueueItem":{"properties":{"queue_index":{"type":"integer","title":"Queue Index"},"source_type":{"type":"string","title":"Source Type"},"source_ref":{"type":"string","title":"Source Ref"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"track_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Track Id"},"analysis_status":{"type":"string","title":"Analysis Status","default":"not_analyzed"}},"type":"object","required":["queue_index","source_type","source_ref"],"title":"QueueItem"},"QuickFeedback":{"properties":{"primary_use_case":{"type":"string","title":"Primary Use Case"},"favorite_feature":{"type":"string","title":"Favorite Feature"},"feature_request":{"type":"string","title":"Feature Request"},"nps_score":{"type":"integer","maximum":10.0,"minimum":0.0,"title":"Nps Score"}},"type":"object","required":["primary_use_case","favorite_feature","feature_request","nps_score"],"title":"QuickFeedback","description":"Quick feedback submission (for WhatsApp/SMS)"},"QuoteRequest":{"properties":{"export_settings":{"$ref":"#/components/schemas/ACXExportRequest"},"auto_direction":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Auto Direction","description":"Prepare voice direction for the sample and book. Omit to follow the account preference, or pass true/false for this production."},"leave_out_held":{"type":"boolean","title":"Leave Out Held","description":"Finish the book without the passages still waiting for review: they are left out of this version (nothing is charged for them) and listed in the package's LEFT_OUT_PASSAGES.txt and in `left_out_passages`. Passages you chose to skip after review are always left out and listed. Off by default: a chapter with a passage waiting for review is not finished.","default":false}},"type":"object","title":"QuoteRequest"},"QuoteResponse":{"properties":{"project_id":{"type":"string","format":"uuid","title":"Project Id"},"word_count":{"type":"integer","title":"Word Count"},"chapter_count":{"type":"integer","title":"Chapter Count"},"words_per_finished_hour":{"type":"integer","title":"Words Per Finished Hour"},"finished_hours":{"type":"number","title":"Finished Hours"},"currency":{"type":"string","title":"Currency"},"tiers":{"items":{"$ref":"#/components/schemas/AuthorSkuTierQuote"},"type":"array","title":"Tiers"},"regenerations_included_per_paragraph":{"type":"integer","title":"Regenerations Included Per Paragraph"},"voice_swaps_included":{"type":"integer","title":"Voice Swaps Included"},"existing_plan_path":{"anyOf":[{"$ref":"#/components/schemas/ExistingPlanPath"},{"type":"null"}]}},"type":"object","required":["project_id","word_count","chapter_count","words_per_finished_hour","finished_hours","currency","tiers","regenerations_included_per_paragraph","voice_swaps_included"],"title":"QuoteResponse","description":"A price for a PARSED manuscript."},"RadioGenerateRequest":{"properties":{"query":{"type":"string","maxLength":500,"minLength":1,"title":"Query","description":"Natural language music prompt"}},"type":"object","required":["query"],"title":"RadioGenerateRequest","description":"Request for on-the-fly turbo music generation on radio page"},"RawTextIntakeRequest":{"properties":{"text":{"type":"string","minLength":1,"title":"Text","description":"Pasted manuscript or chapter text"},"source_type":{"type":"string","title":"Source Type","description":"Source label for the text intake","default":"paste"},"force":{"type":"boolean","title":"Force","description":"Replace existing chapters even if narrated audio exists","default":false},"auto_direction":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Auto Direction","description":"Prepare voice direction after creating the manuscript. Omit to follow the web studio account setting; API-key callers default to off. An explicit true or false overrides the default for this book."},"detect_speakers":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Detect Speakers","description":"Attribute dialogue to named speakers (each paragraph's character_name). Free. Omit to accept the caller default: off for API-key callers, on in the web studio. multi_voice=true implies it."},"multi_voice":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Multi Voice","description":"Give each character their own voice: a character's lines take the voice on the book's cast instead of the narrator's. Turning it on gives every known character a library voice at no cost. Omit to leave it as it is; new books start with it off."}},"type":"object","required":["text"],"title":"RawTextIntakeRequest"},"ReaderEstimateRequest":{"properties":{"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content"},"voice":{"type":"string","title":"Voice","default":"aura-asteria-en"}},"type":"object","title":"ReaderEstimateRequest"},"ReaderEstimateResponse":{"properties":{"is_premium":{"type":"boolean","title":"Is Premium"},"estimated_credits":{"type":"integer","title":"Estimated Credits"},"word_count":{"type":"integer","title":"Word Count"},"char_count":{"type":"integer","title":"Char Count"},"measured":{"type":"boolean","title":"Measured"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"}},"type":"object","required":["is_premium","estimated_credits","word_count","char_count","measured"],"title":"ReaderEstimateResponse","description":"Cost preview for the Audio Reader.\n\n`is_premium=false` means a free voice and zero cost. `measured=false`\nmeans the article could not be fetched in advance, so\n`estimated_credits` is a baseline and billing follows the actual length."},"ReaderGenerateRequest":{"properties":{"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"content":{"anyOf":[{"type":"string","maxLength":300000},{"type":"null"}],"title":"Content"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"voice":{"type":"string","title":"Voice","default":"aura-asteria-en"},"webhook_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Webhook Url"},"show_branding":{"type":"boolean","title":"Show Branding","default":true},"template_slug":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Template Slug"}},"type":"object","title":"ReaderGenerateRequest"},"ReaderJobResponse":{"properties":{"id":{"type":"integer","title":"Id"},"status":{"type":"string","title":"Status"},"progress":{"type":"number","title":"Progress"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"word_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Word Count"},"audio_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Audio Url"},"embed_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Embed Url"},"embed_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Embed Html"},"audio_duration_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Audio Duration Seconds"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"},"chunks_total":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Chunks Total"},"chunks_skipped":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Chunks Skipped"},"content_omitted":{"type":"boolean","title":"Content Omitted","default":false}},"type":"object","required":["id","status","progress","created_at"],"title":"ReaderJobResponse"},"ReaderJobsResponse":{"properties":{"jobs":{"items":{"$ref":"#/components/schemas/ReaderJobResponse"},"type":"array","title":"Jobs"},"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page"},"page_size":{"type":"integer","title":"Page Size"}},"type":"object","required":["jobs","total","page","page_size"],"title":"ReaderJobsResponse"},"ReaderPublicResponse":{"properties":{"id":{"type":"integer","title":"Id"},"status":{"type":"string","title":"Status"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"audio_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Audio Url"},"audio_duration_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Audio Duration Seconds"},"show_branding":{"type":"boolean","title":"Show Branding","default":true}},"type":"object","required":["id","status"],"title":"ReaderPublicResponse","description":"Unauthenticated view for the hosted share/embed page (audiopod.ai/r/{id}).\n\nDeliberately minimal — never leaks user, provider/model, source URL, raw\ncontent, parameters, or error internals. The audio is already at a public R2\nURL, so this exposes nothing the share link doesn't already imply."},"RecordDownloadRequest":{"properties":{"job_type":{"type":"string","title":"Job Type","description":"Job type slug, e.g. 'stem'"},"job_id":{"type":"integer","title":"Job Id","description":"The job's primary key"}},"type":"object","required":["job_type","job_id"],"title":"RecordDownloadRequest"},"RecordingListResponse":{"properties":{"recordings":{"items":{"$ref":"#/components/schemas/RecordingOut"},"type":"array","title":"Recordings"}},"type":"object","title":"RecordingListResponse"},"RecordingOut":{"properties":{"recording_id":{"type":"string","title":"Recording Id"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"duration_sec":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Duration Sec"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"}},"type":"object","required":["recording_id"],"title":"RecordingOut"},"ReferenceAudioRequest":{"properties":{"duration":{"type":"number","maximum":600.0,"minimum":-1.0,"title":"Duration","description":"Audio duration in seconds (-1 for auto-detection based on lyrics, max 600s/10min)","default":-1.0},"audio_duration":{"type":"number","maximum":600.0,"minimum":-1.0,"title":"Audio Duration","description":"Alias for duration (legacy)"},"format":{"$ref":"#/components/schemas/app__schemas__music__AudioFormat","description":"Output audio format (flac recommended for quality)","default":"flac"},"model_version":{"anyOf":[{"$ref":"#/components/schemas/ModelVersion"},{"type":"null"}],"description":"Model version: audiomusic-v2 (default) or audiomusic-v1.5","default":"audiomusic-v2"},"quality":{"anyOf":[{"$ref":"#/components/schemas/MusicQuality"},{"type":"null"}],"description":"Deprecated and ignored. Every plan generates with AudioPod's highest-quality music model at the same rate; both values are accepted for compatibility and behave identically."},"bpm":{"anyOf":[{"type":"integer","maximum":300.0,"minimum":30.0},{"type":"null"}],"title":"Bpm","description":"Beats per minute (30-300). None for auto-detection via LM."},"keyscale":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Keyscale","description":"Musical key (e.g. 'C Major', 'Am', 'F# minor'). Empty for auto-detection."},"timesignature":{"anyOf":[{"type":"string","maxLength":10},{"type":"null"}],"title":"Timesignature","description":"Time signature (2='2/4', 3='3/4', 4='4/4', 6='6/8'). Empty for auto-detection."},"vocal_language":{"type":"string","maxLength":20,"title":"Vocal Language","description":"Language code for vocals (ISO 639-1: 'en', 'zh', 'ja', etc.). 'unknown' for auto-detection.","default":"unknown"},"inference_steps":{"type":"integer","maximum":200.0,"minimum":1.0,"title":"Inference Steps","description":"Diffusion steps. SFT/Base: 64 for best quality (32-100 range). Turbo: 8.","default":64},"infer_step":{"type":"integer","maximum":200.0,"minimum":1.0,"title":"Infer Step","description":"Alias for inference_steps (legacy)"},"guidance_scale":{"type":"number","maximum":15.0,"minimum":1.0,"title":"Guidance Scale","description":"CFG scale (1.0-15.0). Higher = more adherence to prompt.","default":7.0},"seed":{"type":"integer","title":"Seed","description":"Random seed (-1 for random, positive for fixed)","default":-1},"shift":{"type":"number","maximum":5.0,"minimum":1.0,"title":"Shift","description":"Timestep shift factor (1.0-5.0). 3.0 recommended for all models.","default":3.0},"infer_method":{"$ref":"#/components/schemas/InferMethod","description":"Inference method: 'ode' (Euler, fast) or 'sde' (stochastic)","default":"ode"},"use_adg":{"type":"boolean","title":"Use Adg","description":"Adaptive Dual Guidance (base model only). Improves quality at the cost of speed.","default":false},"cfg_interval_start":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Cfg Interval Start","description":"CFG application start ratio (0.0-1.0)","default":0.0},"cfg_interval_end":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Cfg Interval End","description":"CFG application end ratio (0.0-1.0)","default":1.0},"timesteps":{"anyOf":[{"items":{"type":"number"},"type":"array"},{"type":"null"}],"title":"Timesteps","description":"Custom timesteps list from 1.0 to 0.0. Overrides inference_steps and shift if provided."},"thinking":{"type":"boolean","title":"Thinking","description":"Enable LM Chain-of-Thought reasoning for semantic planning","default":true},"lm_temperature":{"type":"number","maximum":2.0,"minimum":0.0,"title":"Lm Temperature","description":"LM sampling temperature. Higher = more creative.","default":0.85},"lm_cfg_scale":{"type":"number","maximum":10.0,"minimum":0.0,"title":"Lm Cfg Scale","description":"LM classifier-free guidance scale","default":2.0},"lm_top_k":{"type":"integer","maximum":100.0,"minimum":0.0,"title":"Lm Top K","description":"LM top-k sampling. 0 disables.","default":0},"lm_top_p":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Lm Top P","description":"LM nucleus sampling. 1.0 disables.","default":0.9},"lm_negative_prompt":{"type":"string","maxLength":512,"title":"Lm Negative Prompt","description":"Negative prompt for LM classifier-free guidance","default":"NO USER INPUT"},"use_cot_metas":{"type":"boolean","title":"Use Cot Metas","description":"Generate metadata using LM CoT reasoning","default":true},"use_cot_caption":{"type":"boolean","title":"Use Cot Caption","description":"Refine caption using LM CoT reasoning","default":true},"use_cot_lyrics":{"type":"boolean","title":"Use Cot Lyrics","description":"Generate/refine lyrics using LM CoT reasoning (reserved)","default":false},"use_cot_language":{"type":"boolean","title":"Use Cot Language","description":"Detect vocal language using LM CoT reasoning","default":true},"use_constrained_decoding":{"type":"boolean","title":"Use Constrained Decoding","description":"Enable constrained decoding for structured LM output","default":true},"lora_name_or_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lora Name Or Path","description":"LoRA adapter path for custom styles"},"lora_weight":{"type":"number","maximum":3.0,"minimum":-3.0,"title":"Lora Weight","description":"LoRA weight","default":1.0},"batch_size":{"type":"integer","maximum":8.0,"minimum":1.0,"title":"Batch Size","description":"Number of variations to generate (1-8)","default":1},"thumbnail_url":{"anyOf":[{"type":"string","maxLength":1024},{"type":"null"}],"title":"Thumbnail Url","description":"URL for the music thumbnail"},"manual_seeds":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Manual Seeds","description":"Manual seeds for batch generation (legacy)"},"scheduler_type":{"anyOf":[{"$ref":"#/components/schemas/SchedulerType"},{"type":"null"}],"description":"Legacy scheduler type (use infer_method instead)"},"cfg_type":{"anyOf":[{"$ref":"#/components/schemas/CFGType"},{"type":"null"}],"description":"Legacy CFG type"},"use_sde":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Use Sde","description":"Legacy SDE flag (use infer_method='sde' instead)"},"debug":{"type":"boolean","title":"Debug","description":"Enable debug mode","default":false},"display_name":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Display Name","description":"Display name for the track"},"caption":{"type":"string","maxLength":2048,"minLength":1,"title":"Caption","description":"Text description of desired music"},"lyrics":{"type":"string","maxLength":4096,"title":"Lyrics","description":"Lyrics with structure tags","default":""},"reference_audio_url":{"type":"string","maxLength":2048,"minLength":1,"title":"Reference Audio Url","description":"URL to reference audio for style guidance"},"instrumental":{"type":"boolean","title":"Instrumental","description":"Generate instrumental music","default":false}},"type":"object","required":["caption","reference_audio_url"],"title":"ReferenceAudioRequest","description":"Request for generation with reference audio for style guidance.\n\nReference audio provides global acoustic feature control:\n- Timbre texture (vocal/instrument timbre)\n- Mixing style (spatial sense, dynamic range)\n- Performance style (techniques, expression)\n- Overall atmosphere"},"ReferralCodeResponse":{"properties":{"referral_code":{"type":"string","title":"Referral Code","description":"User's unique referral code"},"referral_url":{"type":"string","title":"Referral Url","description":"Full referral URL for sharing"}},"type":"object","required":["referral_code","referral_url"],"title":"ReferralCodeResponse","description":"Response containing user's referral code"},"ReferralRewardResponse":{"properties":{"reward_type":{"$ref":"#/components/schemas/RewardType","description":"Type of reward"},"reward_amount":{"type":"integer","exclusiveMinimum":0.0,"title":"Reward Amount","description":"Reward amount in credits"},"referral_code_used":{"type":"string","title":"Referral Code Used","description":"The referral code that was used"},"notes":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Notes","description":"Additional notes"},"id":{"type":"string","title":"Id","description":"Unique reward ID"},"user_id":{"type":"string","title":"User Id","description":"ID of user receiving the reward"},"status":{"$ref":"#/components/schemas/RewardStatus","description":"Current status of the reward"},"processed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Processed At","description":"When the reward was processed"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At","description":"When the reward expires"},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"When the reward was created"},"updated_at":{"type":"string","format":"date-time","title":"Updated At","description":"When the reward was last updated"}},"type":"object","required":["reward_type","reward_amount","referral_code_used","id","user_id","status","created_at","updated_at"],"title":"ReferralRewardResponse","description":"Schema for referral reward responses"},"ReferralStatsResponse":{"properties":{"referral_code":{"type":"string","title":"Referral Code","description":"User's referral code"},"total_referrals":{"type":"integer","title":"Total Referrals","description":"Total number of successful referrals","default":0},"pending_rewards":{"type":"integer","title":"Pending Rewards","description":"Number of pending reward transactions","default":0},"total_rewards_earned":{"type":"integer","title":"Total Rewards Earned","description":"Total credits earned from referrals","default":0}},"type":"object","required":["referral_code"],"title":"ReferralStatsResponse","description":"Response containing user's referral statistics"},"RefreshTokenRequest":{"properties":{"refresh_token":{"type":"string","title":"Refresh Token"}},"type":"object","required":["refresh_token"],"title":"RefreshTokenRequest"},"RegenerateDialogueRequest":{"properties":{"dialogue_id":{"type":"string","title":"Dialogue Id","description":"Dialogue ID to regenerate"},"new_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"New Text","description":"Optional new text for the dialogue"}},"type":"object","required":["dialogue_id"],"title":"RegenerateDialogueRequest","description":"Request to regenerate a specific dialogue."},"RegenerateIn":{"properties":{"paragraph_index":{"type":"integer","maximum":1000.0,"minimum":0.0,"title":"Paragraph Index","description":"Index of the paragraph to replace (0-based)"},"text":{"type":"string","maxLength":5000,"minLength":1,"title":"Text","description":"The paragraph's new text"},"voice_id":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"null"}],"title":"Voice Id","description":"Another voice for this paragraph"},"take":{"anyOf":[{"type":"string","enum":["single","multi"]},{"type":"null"}],"title":"Take","description":"Which kind of audio the id names (single or multi), when both kinds share it"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source","description":"The whole script as now written in the editor, saved with the new version in History"}},"type":"object","required":["paragraph_index","text"],"title":"RegenerateIn"},"RegisterResponse":{"properties":{"user":{"$ref":"#/components/schemas/User"},"access_token":{"type":"string","title":"Access Token"},"refresh_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Refresh Token"},"token_type":{"type":"string","title":"Token Type"},"expires_in":{"type":"integer","title":"Expires In"},"pending_deletion":{"type":"boolean","title":"Pending Deletion","default":false},"deletion_scheduled_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Deletion Scheduled At"},"hard_delete_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Hard Delete At"}},"type":"object","required":["user","access_token","token_type","expires_in"],"title":"RegisterResponse","description":"Combined user and token response for registration"},"RegisterTokenRequest":{"properties":{"token":{"type":"string","maxLength":4096,"minLength":1,"title":"Token"},"platform":{"type":"string","enum":["ios","android"],"title":"Platform"},"device_name":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Device Name"},"app_version":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"App Version"}},"type":"object","required":["token","platform"],"title":"RegisterTokenRequest"},"RenameSessionRequest":{"properties":{"title":{"type":"string","title":"Title"}},"type":"object","required":["title"],"title":"RenameSessionRequest","description":"Request body for renaming a session"},"RepaintRequest":{"properties":{"daw_project_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Daw Project Id","description":"Studio project this job was dispatched from. Optional; validated and ownership-checked server-side, and dropped (never rejected) when it does not resolve to one of your projects."},"duration":{"type":"number","maximum":600.0,"minimum":-1.0,"title":"Duration","description":"Audio duration in seconds (-1 for auto-detection based on lyrics, max 600s/10min)","default":-1.0},"audio_duration":{"type":"number","maximum":600.0,"minimum":-1.0,"title":"Audio Duration","description":"Alias for duration (legacy)"},"format":{"$ref":"#/components/schemas/app__schemas__music__AudioFormat","description":"Output audio format (flac recommended for quality)","default":"flac"},"model_version":{"anyOf":[{"$ref":"#/components/schemas/ModelVersion"},{"type":"null"}],"description":"Model version: audiomusic-v2 (default) or audiomusic-v1.5","default":"audiomusic-v2"},"quality":{"anyOf":[{"$ref":"#/components/schemas/MusicQuality"},{"type":"null"}],"description":"Deprecated and ignored. Every plan generates with AudioPod's highest-quality music model at the same rate; both values are accepted for compatibility and behave identically."},"bpm":{"anyOf":[{"type":"integer","maximum":300.0,"minimum":30.0},{"type":"null"}],"title":"Bpm","description":"Beats per minute (30-300). None for auto-detection via LM."},"keyscale":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Keyscale","description":"Musical key (e.g. 'C Major', 'Am', 'F# minor'). Empty for auto-detection."},"timesignature":{"anyOf":[{"type":"string","maxLength":10},{"type":"null"}],"title":"Timesignature","description":"Time signature (2='2/4', 3='3/4', 4='4/4', 6='6/8'). Empty for auto-detection."},"vocal_language":{"type":"string","maxLength":20,"title":"Vocal Language","description":"Language code for vocals (ISO 639-1: 'en', 'zh', 'ja', etc.). 'unknown' for auto-detection.","default":"unknown"},"inference_steps":{"type":"integer","maximum":200.0,"minimum":1.0,"title":"Inference Steps","description":"Diffusion steps. SFT/Base: 64 for best quality (32-100 range). Turbo: 8.","default":64},"infer_step":{"type":"integer","maximum":200.0,"minimum":1.0,"title":"Infer Step","description":"Alias for inference_steps (legacy)"},"guidance_scale":{"type":"number","maximum":15.0,"minimum":1.0,"title":"Guidance Scale","description":"CFG scale (1.0-15.0). Higher = more adherence to prompt.","default":7.0},"seed":{"type":"integer","title":"Seed","description":"Random seed (-1 for random, positive for fixed)","default":-1},"shift":{"type":"number","maximum":5.0,"minimum":1.0,"title":"Shift","description":"Timestep shift factor (1.0-5.0). 3.0 recommended for all models.","default":3.0},"infer_method":{"$ref":"#/components/schemas/InferMethod","description":"Inference method: 'ode' (Euler, fast) or 'sde' (stochastic)","default":"ode"},"use_adg":{"type":"boolean","title":"Use Adg","description":"Adaptive Dual Guidance (base model only). Improves quality at the cost of speed.","default":false},"cfg_interval_start":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Cfg Interval Start","description":"CFG application start ratio (0.0-1.0)","default":0.0},"cfg_interval_end":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Cfg Interval End","description":"CFG application end ratio (0.0-1.0)","default":1.0},"timesteps":{"anyOf":[{"items":{"type":"number"},"type":"array"},{"type":"null"}],"title":"Timesteps","description":"Custom timesteps list from 1.0 to 0.0. Overrides inference_steps and shift if provided."},"thinking":{"type":"boolean","title":"Thinking","description":"Enable LM Chain-of-Thought reasoning for semantic planning","default":true},"lm_temperature":{"type":"number","maximum":2.0,"minimum":0.0,"title":"Lm Temperature","description":"LM sampling temperature. Higher = more creative.","default":0.85},"lm_cfg_scale":{"type":"number","maximum":10.0,"minimum":0.0,"title":"Lm Cfg Scale","description":"LM classifier-free guidance scale","default":2.0},"lm_top_k":{"type":"integer","maximum":100.0,"minimum":0.0,"title":"Lm Top K","description":"LM top-k sampling. 0 disables.","default":0},"lm_top_p":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Lm Top P","description":"LM nucleus sampling. 1.0 disables.","default":0.9},"lm_negative_prompt":{"type":"string","maxLength":512,"title":"Lm Negative Prompt","description":"Negative prompt for LM classifier-free guidance","default":"NO USER INPUT"},"use_cot_metas":{"type":"boolean","title":"Use Cot Metas","description":"Generate metadata using LM CoT reasoning","default":true},"use_cot_caption":{"type":"boolean","title":"Use Cot Caption","description":"Refine caption using LM CoT reasoning","default":true},"use_cot_lyrics":{"type":"boolean","title":"Use Cot Lyrics","description":"Generate/refine lyrics using LM CoT reasoning (reserved)","default":false},"use_cot_language":{"type":"boolean","title":"Use Cot Language","description":"Detect vocal language using LM CoT reasoning","default":true},"use_constrained_decoding":{"type":"boolean","title":"Use Constrained Decoding","description":"Enable constrained decoding for structured LM output","default":true},"lora_name_or_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lora Name Or Path","description":"LoRA adapter path for custom styles"},"lora_weight":{"type":"number","maximum":3.0,"minimum":-3.0,"title":"Lora Weight","description":"LoRA weight","default":1.0},"batch_size":{"type":"integer","maximum":8.0,"minimum":1.0,"title":"Batch Size","description":"Number of variations to generate (1-8)","default":1},"thumbnail_url":{"anyOf":[{"type":"string","maxLength":1024},{"type":"null"}],"title":"Thumbnail Url","description":"URL for the music thumbnail"},"manual_seeds":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Manual Seeds","description":"Manual seeds for batch generation (legacy)"},"scheduler_type":{"anyOf":[{"$ref":"#/components/schemas/SchedulerType"},{"type":"null"}],"description":"Legacy scheduler type (use infer_method instead)"},"cfg_type":{"anyOf":[{"$ref":"#/components/schemas/CFGType"},{"type":"null"}],"description":"Legacy CFG type"},"use_sde":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Use Sde","description":"Legacy SDE flag (use infer_method='sde' instead)"},"debug":{"type":"boolean","title":"Debug","description":"Enable debug mode","default":false},"display_name":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Display Name","description":"Display name for the repainted audio"},"source_job_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Source Job Id","description":"Source music generation job ID (alternative to src_audio_url)"},"src_audio_url":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Src Audio Url","description":"URL to source audio file"},"repainting_start":{"type":"number","minimum":0.0,"title":"Repainting Start","description":"Start time in seconds"},"repainting_end":{"type":"number","title":"Repainting End","description":"End time in seconds (-1 for end of file)"},"caption":{"type":"string","maxLength":2048,"minLength":1,"title":"Caption","description":"Description of desired content for repainted section"},"lyrics":{"type":"string","maxLength":4096,"title":"Lyrics","description":"New lyrics for section","default":""}},"type":"object","required":["repainting_start","repainting_end","caption"],"title":"RepaintRequest","description":"Request for repainting - regenerate a specific time segment of audio.\n\nExample: Replace seconds 10-20 with a piano solo.\n\n{\n    \"src_audio_url\": \"https://example.com/original.mp3\",\n    \"repainting_start\": 10.0,\n    \"repainting_end\": 20.0,\n    \"caption\": \"smooth piano solo transition\"\n}"},"ReplayLinkResponse":{"properties":{"user_id":{"type":"string","title":"User Id"},"at":{"type":"string","title":"At"},"window_minutes":{"type":"integer","title":"Window Minutes"},"url":{"type":"string","title":"Url"},"note":{"type":"string","title":"Note"}},"type":"object","required":["user_id","at","window_minutes","url","note"],"title":"ReplayLinkResponse"},"ResetPassword":{"properties":{"token":{"type":"string","title":"Token"},"new_password":{"type":"string","title":"New Password"}},"type":"object","required":["token","new_password"],"title":"ResetPassword"},"RetakeRequest":{"properties":{"daw_project_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Daw Project Id","description":"Studio project this job was dispatched from. Optional; validated and ownership-checked server-side, and dropped (never rejected) when it does not resolve to one of your projects."},"display_name":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Display Name","description":"Display name for the retake"},"thumbnail_url":{"anyOf":[{"type":"string","maxLength":1024},{"type":"null"}],"title":"Thumbnail Url","description":"URL for the music thumbnail"},"original_job_id":{"type":"integer","title":"Original Job Id","description":"ID of original music generation job"},"retake_variance":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Retake Variance","description":"Variation strength","default":0.5},"retake_seeds":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Retake Seeds","description":"Seeds for retake"}},"type":"object","required":["original_job_id"],"title":"RetakeRequest","description":"Request for music retake/variation"},"RetentionOfferAcceptResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"discount":{"type":"string","title":"Discount"},"next_invoice_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Next Invoice At"}},"type":"object","required":["success","discount"],"title":"RetentionOfferAcceptResponse"},"RetentionOfferEligibilityResponse":{"properties":{"eligible":{"type":"boolean","title":"Eligible"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"},"next_invoice_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Next Invoice At"},"lite_offer":{"anyOf":[{"$ref":"#/components/schemas/LiteOffer"},{"type":"null"}]}},"type":"object","required":["eligible"],"title":"RetentionOfferEligibilityResponse"},"ReviewRequest":{"properties":{"rev":{"type":"integer","minimum":0.0,"title":"Rev"},"aspect":{"type":"string","enum":["9:16","1:1","4:5","16:9"],"title":"Aspect"},"preset":{"type":"string","enum":["1080p","4k"],"title":"Preset","default":"1080p"},"idempotencyKey":{"type":"string","maxLength":120,"minLength":1,"pattern":"^[A-Za-z0-9_-]+$","title":"Idempotencykey"}},"additionalProperties":false,"type":"object","required":["rev","aspect","idempotencyKey"],"title":"ReviewRequest"},"RevokeGrantResponse":{"properties":{"grant_id":{"type":"string","format":"uuid","title":"Grant Id"},"revoked_at":{"type":"string","format":"date-time","title":"Revoked At"}},"type":"object","required":["grant_id","revoked_at"],"title":"RevokeGrantResponse"},"RevokeSessionRequest":{"properties":{"session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id"},"revoke_all_others":{"type":"boolean","title":"Revoke All Others","default":false}},"type":"object","title":"RevokeSessionRequest"},"RewardOfferResponse":{"properties":{"eligible":{"type":"boolean","title":"Eligible"},"credits":{"type":"integer","title":"Credits"},"description":{"type":"string","title":"Description"},"plan_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Plan Name"},"already_submitted":{"type":"boolean","title":"Already Submitted"},"features_used":{"items":{"$ref":"#/components/schemas/FeatureUsage"},"type":"array","title":"Features Used","default":[]}},"type":"object","required":["eligible","credits","description","plan_name","already_submitted"],"title":"RewardOfferResponse","description":"Reward offer for the user"},"RewardStatus":{"type":"string","enum":["PENDING","COMPLETED","EXPIRED","CANCELLED"],"title":"RewardStatus","description":"Referral reward status"},"RewardType":{"type":"string","enum":["SIGNUP_BONUS","REFERRAL_BONUS"],"title":"RewardType","description":"Types of referral rewards"},"SafetyCheckBody":{"properties":{"text":{"type":"string","maxLength":20000,"title":"Text"},"kind":{"type":"string","maxLength":12,"title":"Kind","default":"input"}},"type":"object","required":["text"],"title":"SafetyCheckBody"},"SafetyCheckResponse":{"properties":{"safe":{"type":"boolean","title":"Safe"},"categories":{"items":{"type":"string"},"type":"array","title":"Categories"}},"type":"object","required":["safe","categories"],"title":"SafetyCheckResponse"},"SampleDataResponse":{"properties":{"prompt":{"type":"string","title":"Prompt"},"lyrics":{"type":"string","title":"Lyrics"},"audio_duration":{"type":"number","title":"Audio Duration"},"infer_step":{"type":"integer","title":"Infer Step"},"guidance_scale":{"type":"number","title":"Guidance Scale"},"scheduler_type":{"type":"string","title":"Scheduler Type"},"cfg_type":{"type":"string","title":"Cfg Type"},"omega_scale":{"type":"integer","title":"Omega Scale"},"guidance_interval":{"type":"number","title":"Guidance Interval"},"guidance_interval_decay":{"type":"number","title":"Guidance Interval Decay"},"min_guidance_scale":{"type":"number","title":"Min Guidance Scale"},"use_erg_tag":{"type":"boolean","title":"Use Erg Tag"},"use_erg_lyric":{"type":"boolean","title":"Use Erg Lyric"},"use_erg_diffusion":{"type":"boolean","title":"Use Erg Diffusion"},"oss_steps":{"items":{"type":"integer"},"type":"array","title":"Oss Steps"},"actual_seeds":{"items":{"type":"integer"},"type":"array","title":"Actual Seeds"}},"type":"object","required":["prompt","lyrics","audio_duration","infer_step","guidance_scale","scheduler_type","cfg_type","omega_scale","guidance_interval","guidance_interval_decay","min_guidance_scale","use_erg_tag","use_erg_lyric","use_erg_diffusion","oss_steps","actual_seeds"],"title":"SampleDataResponse","description":"Response for sample data endpoint"},"SandboxKeyResponse":{"properties":{"key":{"type":"string","title":"Key","description":"Opaque sandbox key. Treat as a bearer token."},"expires_at":{"type":"string","title":"Expires At","description":"ISO 8601 UTC expiration timestamp."},"remaining_credits":{"type":"integer","title":"Remaining Credits","description":"Calls remaining on this key."},"rate_limit_per_min":{"type":"integer","title":"Rate Limit Per Min","description":"Max calls per minute against this key."},"capabilities":{"items":{"type":"string"},"type":"array","title":"Capabilities","description":"Capabilities this sandbox key may exercise."}},"type":"object","required":["key","expires_at","remaining_credits","rate_limit_per_min","capabilities"],"title":"SandboxKeyResponse","description":"Response payload for a freshly issued sandbox key."},"SandboxTTSRequest":{"properties":{"key":{"type":"string","title":"Key","description":"Sandbox key issued by POST /sandbox/key."},"text":{"type":"string","title":"Text","description":"Text to synthesize (max 200 characters)."},"voice_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Voice Slug","description":"Public voice slug. Defaults to a curated English voice."}},"type":"object","required":["key","text"],"title":"SandboxTTSRequest","description":"Request payload for sandbox text-to-speech synthesis."},"SaveKit":{"properties":{"name":{"type":"string","maxLength":80,"minLength":1,"title":"Name"},"config":{"$ref":"#/components/schemas/BrandSettings"},"baseRev":{"type":"integer","minimum":0.0,"title":"Baserev"},"idempotencyKey":{"type":"string","maxLength":128,"minLength":1,"pattern":"^[A-Za-z0-9_-]+$","title":"Idempotencykey"}},"additionalProperties":false,"type":"object","required":["name","config","baseRev","idempotencyKey"],"title":"SaveKit"},"SavePhoneRequest":{"properties":{"phone_number":{"type":"string","title":"Phone Number"},"country_code":{"type":"string","title":"Country Code"}},"type":"object","required":["phone_number","country_code"],"title":"SavePhoneRequest","description":"Request to save phone number without OTP verification"},"SavePhoneResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"message":{"type":"string","title":"Message"},"phone_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone Number"}},"type":"object","required":["success","message"],"title":"SavePhoneResponse","description":"Response for saving phone number"},"SaveStoryResponse":{"properties":{"job_id":{"type":"string","title":"Job Id"},"saved":{"type":"boolean","title":"Saved"},"saved_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Saved At"}},"type":"object","required":["job_id","saved"],"title":"SaveStoryResponse"},"SavedStoriesResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/SavedStoryItem"},"type":"array","title":"Items"}},"type":"object","title":"SavedStoriesResponse"},"SavedStoryItem":{"properties":{"job_id":{"type":"string","title":"Job Id"},"moment":{"type":"string","title":"Moment"},"prompt_preview":{"type":"string","title":"Prompt Preview"},"length_minutes":{"type":"integer","title":"Length Minutes"},"language":{"type":"string","title":"Language"},"status":{"type":"string","title":"Status"},"created_at":{"type":"string","title":"Created At"},"saved_at":{"type":"string","title":"Saved At"},"chunks":{"items":{"$ref":"#/components/schemas/ChunkInfo"},"type":"array","title":"Chunks"},"chapter_markers":{"items":{"$ref":"#/components/schemas/ChapterMarker"},"type":"array","title":"Chapter Markers"},"lrc_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lrc Url"}},"type":"object","required":["job_id","moment","prompt_preview","length_minutes","language","status","created_at","saved_at"],"title":"SavedStoryItem"},"SchedulerType":{"type":"string","enum":["euler","heun","pingpong"],"title":"SchedulerType","description":"Diffusion scheduler types (legacy - use InferMethod for music generation)"},"ScreenplayAnnotateRequest":{"properties":{"chapter_ids":{"anyOf":[{"items":{"type":"string","format":"uuid"},"type":"array"},{"type":"null"}],"title":"Chapter Ids","description":"Chapters to annotate. Omit for the whole book; an empty list is refused with 400 (code empty_selection)."}},"type":"object","title":"ScreenplayAnnotateRequest"},"ScreenplayAnnotateResponse":{"properties":{"job_id":{"type":"string","title":"Job Id"},"total_chapters":{"type":"integer","title":"Total Chapters"}},"type":"object","required":["job_id","total_chapters"],"title":"ScreenplayAnnotateResponse"},"ScreenplayAnnotateResult":{"properties":{"chapters_annotated":{"type":"integer","title":"Chapters Annotated","default":0},"paragraphs_split":{"type":"integer","title":"Paragraphs Split","default":0},"characters_found":{"items":{"type":"string"},"type":"array","title":"Characters Found"},"skipped_paragraphs":{"type":"integer","title":"Skipped Paragraphs","default":0}},"type":"object","title":"ScreenplayAnnotateResult"},"ScreenplayAnnotateStatusResponse":{"properties":{"job_id":{"type":"string","title":"Job Id"},"status":{"type":"string","title":"Status"},"progress":{"type":"number","title":"Progress","default":0},"current_step":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Step"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"result":{"anyOf":[{"$ref":"#/components/schemas/ScreenplayAnnotateResult"},{"type":"null"}]}},"type":"object","required":["job_id","status"],"title":"ScreenplayAnnotateStatusResponse"},"Segment":{"properties":{"title":{"type":"string","title":"Title","description":"Segment title"},"description":{"type":"string","title":"Description","description":"Segment description/notes","default":""},"size":{"$ref":"#/components/schemas/SegmentSize","description":"Segment size: short, medium, or long","default":"medium"},"id":{"type":"string","title":"Id","description":"Unique segment ID"},"order":{"type":"integer","minimum":0.0,"title":"Order","description":"Order in the outline"}},"type":"object","required":["title","id","order"],"title":"Segment","description":"Segment response model."},"SegmentCreate":{"properties":{"title":{"type":"string","maxLength":200,"minLength":1,"title":"Title","description":"Segment title"},"description":{"type":"string","maxLength":4000,"title":"Description","description":"Segment description/notes","default":""},"size":{"$ref":"#/components/schemas/SegmentSize","description":"Segment size: short, medium, or long","default":"medium"}},"type":"object","required":["title"],"title":"SegmentCreate","description":"Segment creation request."},"SegmentSize":{"type":"string","enum":["short","medium","long"],"title":"SegmentSize","description":"Size/length of a podcast segment."},"ServicePricing":{"properties":{"unit":{"type":"string","title":"Unit","description":"'minute' or '1k_characters'."},"rate_per_minute":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rate Per Minute"},"rate_per_hour":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rate Per Hour"},"cents_per_minute":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cents Per Minute"},"cents_per_1k_characters":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cents Per 1K Characters"},"rate_per_1k_characters":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rate Per 1K Characters","description":"Display rate, e.g. '$0.05 / 1K chars'."},"description":{"type":"string","title":"Description"},"per_dollar_minutes":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Per Dollar Minutes"},"per_dollar_characters":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Per Dollar Characters","description":"Characters $1 buys; null for per-minute services."},"billed_per_character":{"type":"boolean","title":"Billed Per Character","default":false}},"type":"object","required":["unit","description"],"title":"ServicePricing","description":"Pricing for a single service.\n\nEach service is metered in one unit. Per-minute services fill the\n``*_minute`` / ``rate_per_hour`` fields; services priced per 1,000\ncharacters fill ``cents_per_1k_characters`` / ``rate_per_1k_characters``\nand leave the per-minute fields null."},"SessionInfo":{"properties":{"session_id":{"type":"string","title":"Session Id"},"user_id":{"type":"string","title":"User Id"},"device_info":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Device Info"},"ip_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ip Address"},"user_agent":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Agent"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"last_active":{"type":"string","format":"date-time","title":"Last Active"},"expires_at":{"type":"string","format":"date-time","title":"Expires At"},"is_current":{"type":"boolean","title":"Is Current","default":false}},"type":"object","required":["session_id","user_id","created_at","last_active","expires_at"],"title":"SessionInfo"},"SessionOut":{"properties":{"session_id":{"type":"integer","title":"Session Id"},"status":{"type":"string","title":"Status"},"live_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Live Status"},"vibe_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vibe Prompt"},"energy_arc":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Energy Arc"},"target_duration_sec":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Target Duration Sec"},"queue":{"items":{"$ref":"#/components/schemas/QueueItem"},"type":"array","title":"Queue"},"setlist":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Setlist"},"transitions":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Transitions"},"curation_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Curation Score"}},"type":"object","required":["session_id","status"],"title":"SessionOut"},"SessionStatusResponse":{"properties":{"status":{"type":"string","title":"Status"},"live_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Live Status"},"curated":{"type":"boolean","title":"Curated","default":false},"tracks":{"items":{"$ref":"#/components/schemas/StatusTrack"},"type":"array","title":"Tracks"}},"type":"object","required":["status"],"title":"SessionStatusResponse"},"SessionValidationResponse":{"properties":{"is_valid":{"type":"boolean","title":"Is Valid"},"session_info":{"anyOf":[{"$ref":"#/components/schemas/SessionInfo"},{"type":"null"}]},"user":{"anyOf":[{"$ref":"#/components/schemas/User"},{"type":"null"}]},"expires_in":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Expires In"},"needs_refresh":{"type":"boolean","title":"Needs Refresh","default":false},"session_extended":{"type":"boolean","title":"Session Extended","default":false},"grace_period_used":{"type":"boolean","title":"Grace Period Used","default":false},"auto_refresh_recommended":{"type":"boolean","title":"Auto Refresh Recommended","default":false},"refresh_threshold_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Refresh Threshold Seconds"},"session_max_age_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Session Max Age Seconds"}},"type":"object","required":["is_valid"],"title":"SessionValidationResponse"},"ShareStoryResponse":{"properties":{"job_id":{"type":"string","title":"Job Id"},"shared":{"type":"boolean","title":"Shared"},"share_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Share Url"}},"type":"object","required":["job_id","shared"],"title":"ShareStoryResponse"},"SharedStoryResponse":{"properties":{"moment":{"type":"string","title":"Moment"},"length_minutes":{"type":"integer","title":"Length Minutes"},"language":{"type":"string","title":"Language"},"duration_ms":{"type":"integer","title":"Duration Ms"},"chunks":{"items":{"$ref":"#/components/schemas/ChunkInfo"},"type":"array","title":"Chunks"},"chapter_markers":{"items":{"$ref":"#/components/schemas/ChapterMarker"},"type":"array","title":"Chapter Markers"},"created_at":{"type":"string","title":"Created At"}},"type":"object","required":["moment","length_minutes","language","duration_ms","created_at"],"title":"SharedStoryResponse","description":"Public share payload. Deliberately excludes the prompt (it can carry\na child's name), the owner's identity, and any account data — the\nlistening experience only."},"SharedTrackDownloadResponse":{"properties":{"download_url":{"type":"string","title":"Download Url"},"filename":{"type":"string","title":"Filename"},"format":{"type":"string","title":"Format"},"expires_at":{"type":"string","format":"date-time","title":"Expires At"}},"type":"object","required":["download_url","filename","format","expires_at"],"title":"SharedTrackDownloadResponse","description":"Response for downloading a shared track"},"SharedTrackResponse":{"properties":{"track":{"$ref":"#/components/schemas/MusicPublicJobResponse"},"can_download":{"type":"boolean","title":"Can Download","default":true},"can_comment":{"type":"boolean","title":"Can Comment","default":true},"can_interact":{"type":"boolean","title":"Can Interact","default":true}},"type":"object","required":["track"],"title":"SharedTrackResponse","description":"Response for accessing a shared track via share token"},"SimpleGenerateRequest":{"properties":{"daw_project_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Daw Project Id","description":"Studio project this job was dispatched from. Optional; validated and ownership-checked server-side, and dropped (never rejected) when it does not resolve to one of your projects."},"duration":{"type":"number","maximum":600.0,"minimum":-1.0,"title":"Duration","description":"Audio duration in seconds (-1 for auto-detection based on lyrics, max 600s/10min)","default":-1.0},"audio_duration":{"type":"number","maximum":600.0,"minimum":-1.0,"title":"Audio Duration","description":"Alias for duration (legacy)"},"format":{"$ref":"#/components/schemas/app__schemas__music__AudioFormat","description":"Output audio format (flac recommended for quality)","default":"flac"},"model_version":{"anyOf":[{"$ref":"#/components/schemas/ModelVersion"},{"type":"null"}],"description":"Model version: audiomusic-v2 (default) or audiomusic-v1.5","default":"audiomusic-v2"},"quality":{"anyOf":[{"$ref":"#/components/schemas/MusicQuality"},{"type":"null"}],"description":"Deprecated and ignored. Every plan generates with AudioPod's highest-quality music model at the same rate; both values are accepted for compatibility and behave identically."},"bpm":{"anyOf":[{"type":"integer","maximum":300.0,"minimum":30.0},{"type":"null"}],"title":"Bpm","description":"Beats per minute (30-300). None for auto-detection via LM."},"keyscale":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Keyscale","description":"Musical key (e.g. 'C Major', 'Am', 'F# minor'). Empty for auto-detection."},"timesignature":{"anyOf":[{"type":"string","maxLength":10},{"type":"null"}],"title":"Timesignature","description":"Time signature (2='2/4', 3='3/4', 4='4/4', 6='6/8'). Empty for auto-detection."},"vocal_language":{"type":"string","maxLength":20,"title":"Vocal Language","description":"Constrain lyrics to specific language","default":"unknown"},"inference_steps":{"type":"integer","maximum":200.0,"minimum":1.0,"title":"Inference Steps","description":"Diffusion steps. SFT/Base: 64 for best quality (32-100 range). Turbo: 8.","default":64},"infer_step":{"type":"integer","maximum":200.0,"minimum":1.0,"title":"Infer Step","description":"Alias for inference_steps (legacy)"},"guidance_scale":{"type":"number","maximum":15.0,"minimum":1.0,"title":"Guidance Scale","description":"CFG scale (1.0-15.0). Higher = more adherence to prompt.","default":7.0},"seed":{"type":"integer","title":"Seed","description":"Random seed (-1 for random, positive for fixed)","default":-1},"shift":{"type":"number","maximum":5.0,"minimum":1.0,"title":"Shift","description":"Timestep shift factor (1.0-5.0). 3.0 recommended for all models.","default":3.0},"infer_method":{"$ref":"#/components/schemas/InferMethod","description":"Inference method: 'ode' (Euler, fast) or 'sde' (stochastic)","default":"ode"},"use_adg":{"type":"boolean","title":"Use Adg","description":"Adaptive Dual Guidance (base model only). Improves quality at the cost of speed.","default":false},"cfg_interval_start":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Cfg Interval Start","description":"CFG application start ratio (0.0-1.0)","default":0.0},"cfg_interval_end":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Cfg Interval End","description":"CFG application end ratio (0.0-1.0)","default":1.0},"timesteps":{"anyOf":[{"items":{"type":"number"},"type":"array"},{"type":"null"}],"title":"Timesteps","description":"Custom timesteps list from 1.0 to 0.0. Overrides inference_steps and shift if provided."},"thinking":{"type":"boolean","title":"Thinking","description":"Enable LM Chain-of-Thought reasoning for semantic planning","default":true},"lm_temperature":{"type":"number","maximum":2.0,"minimum":0.0,"title":"Lm Temperature","description":"LM sampling temperature. Higher = more creative.","default":0.85},"lm_cfg_scale":{"type":"number","maximum":10.0,"minimum":0.0,"title":"Lm Cfg Scale","description":"LM classifier-free guidance scale","default":2.0},"lm_top_k":{"type":"integer","maximum":100.0,"minimum":0.0,"title":"Lm Top K","description":"LM top-k sampling. 0 disables.","default":0},"lm_top_p":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Lm Top P","description":"LM nucleus sampling. 1.0 disables.","default":0.9},"lm_negative_prompt":{"type":"string","maxLength":512,"title":"Lm Negative Prompt","description":"Negative prompt for LM classifier-free guidance","default":"NO USER INPUT"},"use_cot_metas":{"type":"boolean","title":"Use Cot Metas","description":"Generate metadata using LM CoT reasoning","default":true},"use_cot_caption":{"type":"boolean","title":"Use Cot Caption","description":"Refine caption using LM CoT reasoning","default":true},"use_cot_lyrics":{"type":"boolean","title":"Use Cot Lyrics","description":"Generate/refine lyrics using LM CoT reasoning (reserved)","default":false},"use_cot_language":{"type":"boolean","title":"Use Cot Language","description":"Detect vocal language using LM CoT reasoning","default":true},"use_constrained_decoding":{"type":"boolean","title":"Use Constrained Decoding","description":"Enable constrained decoding for structured LM output","default":true},"lora_name_or_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lora Name Or Path","description":"LoRA adapter path for custom styles"},"lora_weight":{"type":"number","maximum":3.0,"minimum":-3.0,"title":"Lora Weight","description":"LoRA weight","default":1.0},"batch_size":{"type":"integer","maximum":8.0,"minimum":1.0,"title":"Batch Size","description":"Number of variations to generate (1-8)","default":1},"thumbnail_url":{"anyOf":[{"type":"string","maxLength":1024},{"type":"null"}],"title":"Thumbnail Url","description":"URL for the music thumbnail"},"manual_seeds":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Manual Seeds","description":"Manual seeds for batch generation (legacy)"},"scheduler_type":{"anyOf":[{"$ref":"#/components/schemas/SchedulerType"},{"type":"null"}],"description":"Legacy scheduler type (use infer_method instead)"},"cfg_type":{"anyOf":[{"$ref":"#/components/schemas/CFGType"},{"type":"null"}],"description":"Legacy CFG type"},"use_sde":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Use Sde","description":"Legacy SDE flag (use infer_method='sde' instead)"},"debug":{"type":"boolean","title":"Debug","description":"Enable debug mode","default":false},"display_name":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Display Name","description":"Display name for the track"},"query":{"type":"string","maxLength":1000,"minLength":1,"title":"Query","description":"Natural language description of desired music"},"instrumental":{"type":"boolean","title":"Instrumental","description":"Generate instrumental music","default":false}},"type":"object","required":["query"],"title":"SimpleGenerateRequest","description":"Request for simple mode generation - generate complete song from natural language.\n\nThe LM will generate caption, lyrics, and all metadata from your query.\n\nExample:\n{\n    \"query\": \"a soft Bengali love song for a quiet evening\"\n}"},"SkipResponse":{"properties":{"setlist":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Setlist"},"transitions":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Transitions"},"now_playing_index":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Now Playing Index"}},"type":"object","title":"SkipResponse"},"SongTypeFilter":{"type":"string","enum":["song","instrumental","edits","scores","rap","vocals","samples"],"title":"SongTypeFilter","description":"Library categories for filtering.\n\n``song`` / ``instrumental`` / ``edits`` / ``scores`` partition the\nlibrary. ``rap`` / ``vocals`` /\n``samples`` are legacy sub-filters of songs / songs / instrumental."},"SourceStatus":{"type":"string","enum":["pending","extracting","ready","failed"],"title":"SourceStatus","description":"Extraction lifecycle of a grounding source."},"SourceType":{"type":"string","enum":["file","text","url","youtube"],"title":"SourceType","description":"Grounding source kind."},"Speaker":{"properties":{"name":{"type":"string","maxLength":50,"minLength":1,"title":"Name","description":"Display name for the speaker"},"role":{"$ref":"#/components/schemas/SpeakerRole","description":"Speaker role: Host, Expert, Guest, or Narrator"},"voice_type":{"$ref":"#/components/schemas/app__schemas__podcast__VoiceType","description":"Voice type: preset, cloned, or standard","default":"preset"},"voice_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Voice Id","description":"Legacy voice identifier (preset name or reference URL)"},"voice_ref_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Voice Ref Id","description":"In-house Voice catalog id for the audiobook TTS path"},"language":{"type":"string","title":"Language","description":"Language code (e.g., en, zh, ja)","default":"en"},"use_turbo":{"type":"boolean","title":"Use Turbo","description":"Use our fast English voice engine (faster, supports paralinguistic tags like [laugh], [cough])","default":false},"backstory":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Backstory","description":"Speaker backstory/expertise"},"personality":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Personality","description":"Speaker personality/voice"},"id":{"type":"string","title":"Id","description":"Unique speaker ID"}},"type":"object","required":["name","role","id"],"title":"Speaker","description":"Speaker response model."},"SpeakerCreate":{"properties":{"name":{"type":"string","maxLength":50,"minLength":1,"title":"Name","description":"Display name for the speaker"},"role":{"$ref":"#/components/schemas/SpeakerRole","description":"Speaker role: Host, Expert, Guest, or Narrator"},"voice_type":{"$ref":"#/components/schemas/app__schemas__podcast__VoiceType","description":"Voice type: preset, cloned, or standard","default":"preset"},"voice_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Voice Id","description":"Legacy voice identifier (preset name or reference URL)"},"voice_ref_id":{"anyOf":[{"type":"integer","maximum":2147483647.0,"minimum":1.0},{"type":"null"}],"title":"Voice Ref Id","description":"In-house Voice catalog id for the audiobook TTS path"},"language":{"type":"string","title":"Language","description":"Language code (e.g., en, zh, ja)","default":"en"},"use_turbo":{"type":"boolean","title":"Use Turbo","description":"Use our fast English voice engine (faster, supports paralinguistic tags like [laugh], [cough])","default":false},"backstory":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Backstory","description":"Speaker backstory/expertise"},"personality":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Personality","description":"Speaker personality/voice"}},"type":"object","required":["name","role"],"title":"SpeakerCreate","description":"Speaker creation request."},"SpeakerEditableTranscript":{"properties":{"job_id":{"type":"integer","title":"Job Id"},"version":{"type":"integer","title":"Version","description":"Next edit version (1 = never edited)"},"segments":{"items":{"$ref":"#/components/schemas/SpeakerTranscriptSegment"},"type":"array","title":"Segments"},"formatted_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Formatted Text"},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language"},"total_duration":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Total Duration"},"speakers":{"items":{"type":"string"},"type":"array","title":"Speakers","description":"Distinct speaker labels in order of first appearance"}},"type":"object","required":["job_id","version","segments"],"title":"SpeakerEditableTranscript","description":"Speaker-labeled transcription returned in an editable shape."},"SpeakerJobResponse":{"properties":{"id":{"type":"integer","title":"Id"},"job_type":{"$ref":"#/components/schemas/SpeakerJobType"},"status":{"$ref":"#/components/schemas/ProcessingStatus"},"progress":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Progress","description":"Progress percentage (0-100)"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"},"task_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Task Id"},"result":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Result"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"user_id":{"type":"string","title":"User Id"},"filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Filename"},"outputFiles":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Outputfiles","default":[]},"original_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Original Filename"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"partial_result":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Partial Result","default":false},"requested_speakers":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Requested Speakers"},"delivered_speakers":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Delivered Speakers"},"billing_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Billing Status","description":"Billing status: PAID, DEFERRED, or REFUNDED"},"estimated_credits":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Estimated Credits","description":"Credits required to unlock this job"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At","description":"When deferred job results expire"},"duplicate_of":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Duplicate Of","description":"Present and true when this request matched a job you already submitted (same input and options) that is still running. The response describes that existing job and nothing was charged for this request."},"stage":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stage","description":"Current step of an active job: held, queued, preparing, analyzing, detecting, separating, matching, rendering or finalizing. Null once the job has finished."},"stage_index":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Stage Index","description":"1-based position of the current step while the job is running"},"stage_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Stage Count","description":"Number of steps in a run (use with stage_index)"},"queued_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Queued At","description":"When the job was submitted"},"started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started At","description":"When processing began"},"heartbeat_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Heartbeat At","description":"Last time the running job reported that it is alive"},"eta_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Eta Seconds","description":"Upper-bound estimate of the seconds left for an active job. Null when no honest estimate exists, for example when the job is taking much longer than expected."},"eta_basis":{"anyOf":[{"type":"string","enum":["estimate","planned"]},{"type":"null"}],"title":"Eta Basis","description":"How firm eta_seconds is: 'estimate' while the job is waiting or still being analysed (a rough upper bound; show it as approximate), 'planned' once the work for this file is known. Null when eta_seconds is null."},"stalled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Stalled","description":"True when a running job has stopped reporting progress for longer than expected. Informational only; null when unknown."},"queue_position":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Queue Position","description":"1-based place in line for a job that has not started"}},"type":"object","required":["id","job_type","status","created_at","user_id"],"title":"SpeakerJobResponse"},"SpeakerJobType":{"type":"string","enum":["diarization","extraction","voice_separation"],"title":"SpeakerJobType"},"SpeakerProfileCreate":{"properties":{"name":{"type":"string","maxLength":120,"minLength":1,"title":"Name"},"speaker_name":{"type":"string","maxLength":50,"minLength":1,"title":"Speaker Name"},"voice_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Voice Id","description":"In-house Voice catalog id"},"backstory":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Backstory"},"personality":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Personality"},"role":{"anyOf":[{"$ref":"#/components/schemas/SpeakerRole"},{"type":"null"}]},"language":{"type":"string","title":"Language","default":"en"}},"type":"object","required":["name","speaker_name"],"title":"SpeakerProfileCreate","description":"Create/save a reusable speaker persona preset."},"SpeakerProfileOut":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"speaker_name":{"type":"string","title":"Speaker Name"},"voice_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Voice Id"},"backstory":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Backstory"},"personality":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Personality"},"role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role"},"language":{"type":"string","title":"Language","default":"en"},"is_system":{"type":"boolean","title":"Is System","default":false}},"type":"object","required":["id","name","speaker_name"],"title":"SpeakerProfileOut"},"SpeakerProfileUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":120,"minLength":1},{"type":"null"}],"title":"Name"},"speaker_name":{"anyOf":[{"type":"string","maxLength":50,"minLength":1},{"type":"null"}],"title":"Speaker Name"},"voice_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Voice Id"},"backstory":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Backstory"},"personality":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Personality"},"role":{"anyOf":[{"$ref":"#/components/schemas/SpeakerRole"},{"type":"null"}]},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language"}},"type":"object","title":"SpeakerProfileUpdate"},"SpeakerQuoteRequest":{"properties":{"duration_seconds":{"type":"number","maximum":10000000.0,"exclusiveMinimum":0.0,"title":"Duration Seconds","description":"Length of the audio or video file in seconds."},"job_type":{"$ref":"#/components/schemas/SpeakerJobType","description":"`diarization` (/speaker/diarize), `extraction` (/speaker/extract) or `voice_separation` (/speaker/separate).","default":"diarization"}},"type":"object","required":["duration_seconds"],"title":"SpeakerQuoteRequest","description":"Request body for a Speaker Separation quote."},"SpeakerRole":{"type":"string","enum":["Host","Expert","Guest","Narrator"],"title":"SpeakerRole","description":"Role of a speaker in the podcast."},"SpeakerTranscriptEditRequest":{"properties":{"segments":{"items":{"$ref":"#/components/schemas/SpeakerTranscriptSegment"},"type":"array","title":"Segments","description":"Full replacement list of edited segments"},"edit_notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Edit Notes","description":"Optional note describing the edit"}},"type":"object","required":["segments"],"title":"SpeakerTranscriptEditRequest","description":"User-submitted edited transcription for a speaker job.\n\nThe client sends the FULL segment list (rename = changed `speaker`, merge =\nfewer segments, split = more segments), so the server replaces the stored\nsegments wholesale rather than diffing by id."},"SpeakerTranscriptEditResponse":{"properties":{"job_id":{"type":"integer","title":"Job Id"},"version":{"type":"integer","title":"Version","description":"Edit version applied (1 = first edit)"},"changes_count":{"type":"integer","title":"Changes Count","description":"Number of segments that differ from the previous version"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"segments":{"items":{"$ref":"#/components/schemas/SpeakerTranscriptSegment"},"type":"array","title":"Segments"},"formatted_text":{"type":"string","title":"Formatted Text"}},"type":"object","required":["job_id","version","changes_count","updated_at","segments","formatted_text"],"title":"SpeakerTranscriptEditResponse","description":"Result of editing a speaker job's transcription."},"SpeakerTranscriptSegment":{"properties":{"speaker":{"type":"string","title":"Speaker","description":"Speaker identifier (e.g., SPEAKER_00)"},"start":{"type":"number","title":"Start","description":"Start time in seconds"},"end":{"type":"number","title":"End","description":"End time in seconds"},"text":{"type":"string","title":"Text","description":"Transcribed text for this segment"}},"type":"object","required":["speaker","start","end","text"],"title":"SpeakerTranscriptSegment","description":"A transcription segment with speaker label and timing","example":{"end":15.5,"speaker":"SPEAKER_00","start":0.0,"text":"The second and importance is as follows. Sovereignty may be defined to be the right of making laws."}},"SpeakerUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":50,"minLength":1},{"type":"null"}],"title":"Name"},"role":{"anyOf":[{"$ref":"#/components/schemas/SpeakerRole"},{"type":"null"}]},"voice_ref_id":{"anyOf":[{"type":"integer","maximum":2147483647.0,"minimum":1.0},{"type":"null"}],"title":"Voice Ref Id","description":"In-house Voice catalog id"},"backstory":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Backstory"},"personality":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Personality"},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language"}},"type":"object","title":"SpeakerUpdate","description":"Partial speaker update — re-assign voice, role or persona."},"SpeechRequest":{"properties":{"model":{"type":"string","title":"Model","default":"tts-1"},"input":{"type":"string","maxLength":50000,"minLength":1,"title":"Input"},"voice":{"type":"string","title":"Voice"},"response_format":{"type":"string","title":"Response Format","default":"mp3"},"speed":{"type":"number","maximum":4.0,"minimum":0.25,"title":"Speed","default":1.0}},"type":"object","required":["input","voice"],"title":"SpeechRequest","description":"Speech synthesis request body. Extra fields (e.g. ``instructions``)\nare tolerated so newer client SDKs don't 422."},"StandardResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"message":{"type":"string","title":"Message"},"data":{"anyOf":[{},{"type":"null"}],"title":"Data"}},"type":"object","required":["success","message"],"title":"StandardResponse","description":"Standard API response format","example":{"data":{},"message":"Operation completed successfully","success":true}},"StartRequest":{"properties":{"approval_id":{"type":"string","format":"uuid","title":"Approval Id"}},"type":"object","required":["approval_id"],"title":"StartRequest"},"StartupGrantApplicationCreate":{"properties":{"company_name":{"type":"string","maxLength":200,"minLength":1,"title":"Company Name"},"website_url":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Website Url"},"founder_name":{"type":"string","maxLength":200,"minLength":1,"title":"Founder Name"},"business_email":{"type":"string","format":"email","title":"Business Email"},"team_size":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Team Size"},"funding_stage":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Funding Stage"},"country":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Country"},"use_case":{"type":"string","maxLength":5000,"minLength":1,"title":"Use Case"},"expected_volume":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Expected Volume"},"source":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Source"},"utm_source":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Utm Source"},"utm_medium":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Utm Medium"},"utm_campaign":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Utm Campaign"}},"type":"object","required":["company_name","founder_name","business_email","use_case"],"title":"StartupGrantApplicationCreate","description":"Public, unauthenticated apply payload.\n\nField names accept both the canonical names and the shorter names the\npublic landing-page form posts (``website``/``email``/``monthly_volume``),\nso the contract stays robust to either caller. Validation stays lenient on\nlength/format for everything EXCEPT business-email eligibility, which the\nendpoint enforces explicitly with a 422 — the landing form renders any 422\nas an \"ineligible email\" message, so we must not raise spurious 422s for\nbenign length issues (e.g. a free-text country name or a short use case)."},"StartupGrantApplicationResponse":{"properties":{"message":{"type":"string","title":"Message"}},"type":"object","required":["message"],"title":"StartupGrantApplicationResponse","description":"Public apply acknowledgement."},"StartupGrantApproveRequest":{"properties":{"granted_tier":{"type":"string","maxLength":50,"title":"Granted Tier","default":"Pro"},"grant_months":{"type":"integer","maximum":36.0,"minimum":1.0,"title":"Grant Months","default":3},"api_credit_grant_cents":{"type":"integer","minimum":0.0,"title":"Api Credit Grant Cents","default":25000}},"type":"object","title":"StartupGrantApproveRequest","description":"Admin approve override (defaults applied server-side when omitted)."},"StartupGrantDetail":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"company_name":{"type":"string","title":"Company Name"},"website_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website Url"},"website_domain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website Domain"},"business_email":{"type":"string","format":"email","title":"Business Email"},"email_domain":{"type":"string","title":"Email Domain"},"founder_name":{"type":"string","title":"Founder Name"},"team_size":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Team Size"},"funding_stage":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Funding Stage"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"},"use_case":{"type":"string","title":"Use Case"},"expected_volume":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expected Volume"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"},"utm_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Utm Source"},"utm_medium":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Utm Medium"},"utm_campaign":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Utm Campaign"},"status":{"type":"string","title":"Status"},"reviewer_notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reviewer Notes"},"reviewed_by":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Reviewed By"},"user_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"User Id"},"subscription_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Subscription Id"},"api_topup_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Api Topup Id"},"granted_tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Granted Tier"},"grant_months":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Grant Months"},"api_credit_grant_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Api Credit Grant Cents"},"granted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Granted At"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"backlink_verified":{"type":"boolean","title":"Backlink Verified","default":false},"reminder_sent_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Reminder Sent At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","company_name","business_email","email_domain","founder_name","use_case","status","created_at","updated_at"],"title":"StartupGrantDetail"},"StartupGrantExtendRequest":{"properties":{"extra_months":{"type":"integer","maximum":36.0,"minimum":1.0,"title":"Extra Months"}},"type":"object","required":["extra_months"],"title":"StartupGrantExtendRequest"},"StartupGrantRejectRequest":{"properties":{"reason":{"type":"string","maxLength":2000,"minLength":1,"title":"Reason"}},"type":"object","required":["reason"],"title":"StartupGrantRejectRequest"},"StartupGrantRevokeRequest":{"properties":{"reason":{"type":"string","maxLength":2000,"minLength":1,"title":"Reason"}},"type":"object","required":["reason"],"title":"StartupGrantRevokeRequest"},"StatusTrack":{"properties":{"queue_index":{"type":"integer","title":"Queue Index"},"track_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Track Id"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"analysis_status":{"type":"string","title":"Analysis Status"},"bpm":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Bpm"},"camelot":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Camelot"}},"type":"object","required":["queue_index","analysis_status"],"title":"StatusTrack"},"SteerRequest":{"properties":{"steer_text":{"type":"string","title":"Steer Text","description":"Natural-language steering directive"}},"type":"object","required":["steer_text"],"title":"SteerRequest"},"SteerResponse":{"properties":{"setlist":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Setlist"},"transitions":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Transitions"},"live_fx":{"additionalProperties":true,"type":"object","title":"Live Fx"},"hard_cut":{"type":"boolean","title":"Hard Cut","default":false},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","title":"SteerResponse"},"StemExtractionJobResponse":{"properties":{"requested_stems":{"items":{"type":"string"},"type":"array","title":"Requested Stems"},"delivered_stems":{"items":{"type":"string"},"type":"array","title":"Delivered Stems"},"missing_stems":{"items":{"type":"string"},"type":"array","title":"Missing Stems"},"completion_state":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Completion State"},"can_retry_missing":{"type":"boolean","title":"Can Retry Missing","default":false},"charged_credits":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Charged Credits"},"released_credits":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Released Credits"},"retry_parent_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Retry Parent Id"},"retry_child_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Retry Child Id"},"id":{"type":"integer","title":"Id"},"status":{"$ref":"#/components/schemas/ProcessingStatus"},"progress":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Progress","description":"Progress percentage (0-100)"},"source_type":{"$ref":"#/components/schemas/AudioSource"},"input_path":{"type":"string","title":"Input Path"},"stem_paths":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Stem Paths"},"stem_format_paths":{"additionalProperties":{"additionalProperties":{"type":"string"},"type":"object"},"type":"object","title":"Stem Format Paths"},"task_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Task Id"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"},"quality_scores":{"anyOf":[{"additionalProperties":{"type":"number"},"type":"object"},{"type":"null"}],"title":"Quality Scores"},"download_urls":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Download Urls"},"original_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Original Filename"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"package":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Package","description":"Stem package used for extraction"},"separation_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Separation Mode","description":"Separation mode (single, two, four, six)"},"daw_project_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Daw Project Id","description":"DAW project this job was dispatched from"},"billing_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Billing Status","description":"Billing status: PAID, DEFERRED, or REFUNDED"},"estimated_credits":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Estimated Credits","description":"Credits required to unlock this job (for deferred jobs)"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At","description":"When deferred job results expire"},"r2_purged_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"R2 Purged At"},"midi_jobs":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Midi Jobs"}},"type":"object","required":["id","status","source_type","input_path","created_at"],"title":"StemExtractionJobResponse","example":{"display_name":"My Song.wav","download_urls":{"bass":"https://storage.example.com/stems/1/bass.wav?token=...","kick":"https://storage.example.com/stems/1/kick.wav?token=...","vocals":"https://storage.example.com/stems/1/vocals.wav?token=..."},"id":1,"input_path":"inputs/original.wav","original_filename":"My Song.wav","quality_scores":{"bass":0.92,"drums":0.89,"kick":0.85,"other":0.87,"synth":0.82,"vocals":0.95},"source_type":"FILE","status":"completed","stem_paths":{"bass":"stems/1/bass.wav","drums":"stems/1/drums.wav","guitar":"stems/1/guitar.wav","kick":"stems/1/kick.wav","other":"stems/1/other.wav","piano":"stems/1/piano.wav","snare":"stems/1/snare.wav","synth":"stems/1/synth.wav","vocals":"stems/1/vocals.wav"}}},"StemQuoteRequest":{"properties":{"duration_seconds":{"anyOf":[{"type":"number","maximum":86400.0,"exclusiveMinimum":0.0},{"type":"null"}],"title":"Duration Seconds"},"source_url":{"anyOf":[{"type":"string","maxLength":2083,"minLength":1,"format":"uri"},{"type":"null"}],"title":"Source Url"},"custom_stems":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Custom Stems"},"single_stem":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Single Stem"},"multi_stem_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Multi Stem Count"},"package":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Package"},"exclude_stems":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Exclude Stems"},"quality":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Quality"}},"type":"object","title":"StemQuoteRequest"},"StoreCover":{"properties":{"formats":{"items":{"type":"string"},"type":"array","title":"Formats"},"min_px":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Min Px"},"max_px":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Px"},"exact_px":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Exact Px"},"max_bytes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Bytes"}},"type":"object","required":["formats"],"title":"StoreCover"},"StoreDisclosure":{"properties":{"status":{"type":"string","enum":["stated","needs_confirmation","not_applicable"],"title":"Status"},"fields":{"items":{"$ref":"#/components/schemas/StoreDisclosureField"},"type":"array","title":"Fields","default":[]},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"}},"type":"object","required":["status"],"title":"StoreDisclosure"},"StoreDisclosureField":{"properties":{"field":{"type":"string","title":"Field"},"requirement":{"type":"string","title":"Requirement"},"value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Value"},"accepted_values":{"items":{"type":"string"},"type":"array","title":"Accepted Values","default":[]},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"},"source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Url"}},"type":"object","required":["field","requirement"],"title":"StoreDisclosureField"},"StoreMetadataRule":{"properties":{"field":{"type":"string","title":"Field"},"severity":{"type":"string","enum":["error","warning"],"title":"Severity"},"requirement":{"type":"string","title":"Requirement"}},"type":"object","required":["field","severity","requirement"],"title":"StoreMetadataRule"},"StorePackage":{"properties":{"containers":{"items":{"type":"string"},"type":"array","title":"Containers"},"max_file_minutes":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max File Minutes"},"min_file_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Min File Seconds"},"max_file_mb":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max File Mb"},"max_total_mb":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Total Mb"},"silence":{"$ref":"#/components/schemas/StoreSilence"},"credits_required":{"type":"boolean","title":"Credits Required","default":false},"sample_seconds":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Sample Seconds"},"file_naming":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Naming"},"audio":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Audio"}},"type":"object","required":["containers","silence"],"title":"StorePackage"},"StorePreflightListResponse":{"properties":{"results":{"items":{"$ref":"#/components/schemas/StorePreflightResponse"},"type":"array","title":"Results"}},"type":"object","required":["results"],"title":"StorePreflightListResponse"},"StorePreflightResponse":{"properties":{"store":{"type":"string","title":"Store"},"ai_narration":{"type":"string","enum":["accepted","not_accepted","unconfirmed"],"title":"Ai Narration"},"passed":{"type":"boolean","title":"Passed","description":"No blocking check failed"},"ready":{"type":"boolean","title":"Ready","description":"Passed AND the store is known to accept AI narration"},"checks":{"items":{"$ref":"#/components/schemas/PreflightCheckResponse"},"type":"array","title":"Checks"},"disclosure_values":{"items":{"$ref":"#/components/schemas/DisclosureValueResponse"},"type":"array","title":"Disclosure Values","description":"What to type into the store's AI-disclosure fields for this book","default":[]},"export_settings":{"additionalProperties":true,"type":"object","title":"Export Settings"}},"type":"object","required":["store","ai_narration","passed","ready","checks","export_settings"],"title":"StorePreflightResponse"},"StorePresetResponse":{"properties":{"key":{"type":"string","title":"Key"},"name":{"type":"string","title":"Name"},"ai_narration":{"type":"string","enum":["accepted","not_accepted","unconfirmed"],"title":"Ai Narration"},"ai_narration_note":{"type":"string","title":"Ai Narration Note"},"export_settings":{"additionalProperties":true,"type":"object","title":"Export Settings","description":"Pass as `custom_settings` to POST /projects/{id}/export"},"package":{"$ref":"#/components/schemas/StorePackage"},"cover":{"$ref":"#/components/schemas/StoreCover"},"metadata":{"items":{"$ref":"#/components/schemas/StoreMetadataRule"},"type":"array","title":"Metadata"},"isbn_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Isbn Note"},"disclosure":{"$ref":"#/components/schemas/StoreDisclosure"},"notes":{"items":{"type":"string"},"type":"array","title":"Notes","default":[]},"sources":{"items":{"$ref":"#/components/schemas/StoreSource"},"type":"array","title":"Sources"},"verified_on":{"type":"string","title":"Verified On"}},"type":"object","required":["key","name","ai_narration","ai_narration_note","export_settings","package","cover","metadata","disclosure","sources","verified_on"],"title":"StorePresetResponse"},"StoreSilence":{"properties":{"head_ms":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Head Ms"},"tail_ms":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Tail Ms"},"max_pause_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Pause Ms"},"follows_acx":{"type":"boolean","title":"Follows Acx","default":false}},"type":"object","title":"StoreSilence"},"StoreSource":{"properties":{"title":{"type":"string","title":"Title"},"url":{"type":"string","title":"Url"}},"type":"object","required":["title","url"],"title":"StoreSource"},"StoryJobBody":{"properties":{"language":{"type":"string","maxLength":12,"title":"Language","default":"en"},"kid_name":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Kid Name"},"theme":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Theme"},"age_band":{"type":"string","maxLength":12,"title":"Age Band","default":"3-5"},"length_minutes":{"type":"integer","maximum":20.0,"minimum":1.0,"title":"Length Minutes","default":5},"heritage_tale":{"type":"boolean","title":"Heritage Tale","default":false},"clone_reference_url":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Clone Reference Url"},"bespoke_music":{"type":"boolean","title":"Bespoke Music","default":false},"job_id":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Job Id"}},"type":"object","title":"StoryJobBody"},"StoryJobResponse":{"properties":{"job_id":{"type":"string","title":"Job Id"},"title":{"type":"string","title":"Title"},"language":{"type":"string","title":"Language"},"audio_url":{"type":"string","title":"Audio Url"},"duration_ms":{"type":"integer","title":"Duration Ms"},"mood":{"type":"string","title":"Mood"},"is_heritage":{"type":"boolean","title":"Is Heritage"},"voice_kind":{"type":"string","title":"Voice Kind"}},"type":"object","required":["job_id","title","language","audio_url","duration_ms","mood","is_heritage","voice_kind"],"title":"StoryJobResponse"},"StoryPreviewBody":{"properties":{"language":{"type":"string","maxLength":12,"title":"Language","default":"en"},"kid_name":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Kid Name"},"theme":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Theme"},"age_band":{"type":"string","maxLength":12,"title":"Age Band","default":"3-5"},"length_minutes":{"type":"integer","maximum":20.0,"minimum":1.0,"title":"Length Minutes","default":5},"heritage_tale":{"type":"boolean","title":"Heritage Tale","default":false}},"type":"object","title":"StoryPreviewBody"},"StoryPreviewResponse":{"properties":{"title":{"type":"string","title":"Title"},"text":{"type":"string","title":"Text"},"language":{"type":"string","title":"Language"},"mood":{"type":"string","title":"Mood"},"is_heritage":{"type":"boolean","title":"Is Heritage"}},"type":"object","required":["title","text","language","mood","is_heritage"],"title":"StoryPreviewResponse"},"StoryTemplateExtras":{"properties":{"include_hero":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Include Hero"},"end_with_moral":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"End With Moral"}},"additionalProperties":true,"type":"object","title":"StoryTemplateExtras"},"StoryTemplateParams":{"properties":{"kid_name":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Kid Name"},"topic":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Topic"},"length_minutes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Length Minutes","default":10},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language","default":"en"},"extras":{"anyOf":[{"$ref":"#/components/schemas/StoryTemplateExtras"},{"type":"null"}]}},"type":"object","title":"StoryTemplateParams"},"StreamCreateIn":{"properties":{"segments":{"items":{"$ref":"#/components/schemas/StreamSegmentIn"},"type":"array","maxItems":50,"minItems":1,"title":"Segments"},"settings":{"$ref":"#/components/schemas/StreamSettingsIn"},"history_group_id":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"History Group Id","description":"History item this audio is a new version of; omit to start a new item"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source","description":"The script exactly as written in the editor (at most 40,000 characters)"},"cast":{"anyOf":[{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"object"},{"type":"null"}],"title":"Cast","description":"Speaker name to voice id, as the editor assigned them"}},"type":"object","required":["segments"],"title":"StreamCreateIn"},"StreamSegmentIn":{"properties":{"voice_id":{"anyOf":[{"type":"integer"},{"type":"string"}],"title":"Voice Id","description":"ID or UUID of the voice for this segment"},"text":{"type":"string","minLength":1,"title":"Text","description":"Text to speak; supports the usual TTS markup"},"speaker_label":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Speaker Label","description":"Speaker name for this segment, as written in the script"}},"type":"object","required":["voice_id","text"],"title":"StreamSegmentIn"},"StreamSettingsIn":{"properties":{"speed":{"type":"number","maximum":1.5,"minimum":0.5,"title":"Speed","description":"Speaking rate","default":1.0},"delivery_mode":{"anyOf":[{"type":"string","enum":["stable","balanced","creative"]},{"type":"null"}],"title":"Delivery Mode"},"text_normalization":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Text Normalization","description":"Read numbers and dates naturally"},"language":{"anyOf":[{"type":"string","maxLength":16},{"type":"null"}],"title":"Language","description":"Language code, or omit to detect"},"instruction":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Instruction","description":"Overall direction for the audio"},"enhance":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enhance","description":"Clean up the audio"},"lipsync":{"type":"boolean","title":"Lipsync","description":"Also return lip-sync timing","default":false},"silence_duration":{"type":"number","maximum":5.0,"minimum":0.0,"title":"Silence Duration","description":"Pause between segments, in seconds","default":0.5},"take_name":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Take Name","description":"Name used for downloads"}},"type":"object","title":"StreamSettingsIn"},"Style":{"properties":{"preset":{"type":"string","enum":["clean","bold","karaoke"],"title":"Preset"},"fontId":{"type":"string","maxLength":128,"minLength":1,"pattern":"^[A-Za-z0-9_-]+$","title":"Fontid"},"fontSize":{"type":"number","maximum":144.0,"minimum":16.0,"title":"Fontsize"},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","title":"Color"},"highlight":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","title":"Highlight"},"position":{"type":"string","enum":["top","center","bottom"],"title":"Position"},"box":{"anyOf":[{"$ref":"#/components/schemas/Box"},{"type":"null"}]}},"additionalProperties":false,"type":"object","required":["preset","fontId","fontSize","color","highlight","position"],"title":"Style"},"Subscription":{"properties":{"plan_id":{"type":"string","title":"Plan Id"},"id":{"type":"string","format":"uuid4","title":"Id"},"user_id":{"type":"string","format":"uuid4","title":"User Id"},"status":{"$ref":"#/components/schemas/SubscriptionStatus"},"current_period_start":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Current Period Start"},"current_period_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Current Period End"},"trial_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Trial End"},"cancel_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Cancel At"}},"type":"object","required":["plan_id","id","user_id","status"],"title":"Subscription"},"SubscriptionInfo":{"properties":{"plan_id":{"type":"string","title":"Plan Id"},"plan_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Plan Name"},"is_free_plan":{"type":"boolean","title":"Is Free Plan","default":false},"status":{"type":"string","title":"Status"},"current_period_start":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Current Period Start"},"current_period_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Current Period End"},"cancel_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Cancel At"},"retention_offer_used_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Retention Offer Used At"},"next_invoice_amount_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Invoice Amount Cents"},"next_invoice_currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Invoice Currency"},"provider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider"},"auto_renews":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Auto Renews"}},"type":"object","required":["plan_id","status"],"title":"SubscriptionInfo"},"SubscriptionStatus":{"type":"string","enum":["active","canceled","past_due","incomplete","incomplete_expired","trialing","unpaid"],"title":"SubscriptionStatus"},"SupportedFormatsResponse":{"properties":{"input_formats":{"additionalProperties":{"items":{"type":"string"},"type":"array"},"type":"object","title":"Input Formats"},"output_formats":{"additionalProperties":{"items":{"type":"string"},"type":"array"},"type":"object","title":"Output Formats"},"audio_quality_options":{"items":{"type":"string"},"type":"array","title":"Audio Quality Options"},"video_quality_options":{"items":{"type":"string"},"type":"array","title":"Video Quality Options"},"max_file_size":{"type":"integer","title":"Max File Size"},"max_duration":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Duration"},"supported_codecs":{"additionalProperties":{"items":{"type":"string"},"type":"array"},"type":"object","title":"Supported Codecs"},"features":{"items":{"type":"string"},"type":"array","title":"Features"}},"type":"object","required":["input_formats","output_formats","audio_quality_options","video_quality_options","max_file_size","max_duration","supported_codecs","features"],"title":"SupportedFormatsResponse","description":"Response listing supported formats and capabilities"},"SupportedLanguage":{"type":"string","enum":["auto","en","es","fr","de","it","pt","ru","ja","ko","zh","ar","hi","ar-EG","de-DE","en-US","es-US","fr-FR","hi-IN","id-ID","it-IT","ja-JP","ko-KR","pt-BR","ru-RU","nl-NL","pl-PL","th-TH","tr-TR","vi-VN","ro-RO","uk-UA","bn-BD","en-IN","mr-IN","ta-IN","te-IN","af","hy","az","be","bs","bg","ca","hr","cs","da","nl","et","fi","gl","el","he","hu","is","id","kn","kk","lv","lt","mk","ms","mr","mi","ne","no","fa","pl","ro","sr","sk","sl","sw","sv","tl","ta","th","tr","uk","ur","vi","cy"],"title":"SupportedLanguage","description":"Languages supported by our TTS engines (50+ languages)"},"TTSProvider":{"type":"string","enum":["AUDIOPOD_SONIC"],"title":"TTSProvider","description":"Text-to-Speech providers for standard voices"},"TemplateApplyResponse":{"properties":{"slug":{"type":"string","title":"Slug"},"tool_slug":{"type":"string","title":"Tool Slug"},"params":{"additionalProperties":true,"type":"object","title":"Params"},"input_spec":{"items":{"$ref":"#/components/schemas/TemplateInput"},"type":"array","title":"Input Spec"},"target_route":{"type":"string","title":"Target Route","description":"Dashboard route that runs this tool."},"required_tier":{"type":"string","title":"Required Tier"},"public_tier":{"type":"string","title":"Public Tier"},"allowed":{"type":"boolean","title":"Allowed","description":"Whether your plan can run this template. False still returns the params — the runner shows them read-only behind an upgrade prompt."},"usage_count":{"type":"integer","title":"Usage Count","default":0}},"type":"object","required":["slug","tool_slug","target_route","required_tier","public_tier","allowed"],"title":"TemplateApplyResponse","description":"What the runner needs to start a job from this template.\n\nStarts NOTHING. The frontend runner submits through the same job-create\nservice the tool page uses, so the existing credit and entitlement path is\nuntouched and templates never introduce a second billing lane."},"TemplateCreateRequest":{"properties":{"name":{"type":"string","maxLength":200,"minLength":1,"title":"Name"},"description":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Description"},"source_job_type":{"type":"string","maxLength":80,"title":"Source Job Type","description":"Which tool produced the job — the tool's slug, e.g. stem-splitter."},"source_job_id":{"type":"integer","exclusiveMinimum":0.0,"title":"Source Job Id"}},"type":"object","required":["name","source_job_type","source_job_id"],"title":"TemplateCreateRequest","description":"Save one of your own completed jobs as a reusable template.\n\nNote what is NOT here: params. The server reads them off the job you name,\nafter checking you own it, and keeps only the keys that tool's runner\nunderstands. Sending your own params bag is not supported by design."},"TemplateInput":{"properties":{"key":{"type":"string","maxLength":64,"title":"Key"},"kind":{"type":"string","title":"Kind","description":"file, url, text, select, voice or consent."},"label":{"type":"string","maxLength":120,"title":"Label"},"accept":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Accept","description":"Media kinds this field accepts: audio, video, text, url, midi."},"help":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Help"},"multiline":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Multiline"},"options":{"anyOf":[{"items":{"additionalProperties":{"type":"string"},"type":"object"},"type":"array"},{"type":"null"}],"title":"Options"},"default":{"anyOf":[{},{"type":"null"}],"title":"Default"},"example":{"anyOf":[{},{"type":"null"}],"title":"Example"}},"type":"object","required":["key","kind","label"],"title":"TemplateInput","description":"One field the runner renders for the user.\n\nThe kinds are listed in ``TEMPLATE_INPUT_KINDS``. ``example`` powers the\nreference's \"Use this example\" affordance — a first-time user can produce a\nreal result without owning suitable material."},"TemplateResponse":{"properties":{"id":{"type":"integer","title":"Id"},"slug":{"type":"string","title":"Slug"},"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"category":{"type":"string","title":"Category"},"tool_slug":{"type":"string","title":"Tool Slug"},"params":{"additionalProperties":true,"type":"object","title":"Params"},"input_spec":{"items":{"$ref":"#/components/schemas/TemplateInput"},"type":"array","title":"Input Spec"},"steps":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Steps"},"preview_audio_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Preview Audio Url"},"preview_image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Preview Image Url"},"out_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Out Label","description":"Short word for what the template produces, for the card's outcome graphic."},"preview_example":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Preview Example","description":"Worked example: the source, every output, and the transcript when there is one."},"required_tier":{"type":"string","title":"Required Tier"},"public_tier":{"type":"string","title":"Public Tier","description":"Lowest plan a customer can buy to run this."},"allowed":{"type":"boolean","title":"Allowed","description":"Whether your plan can run this template."},"is_curated":{"type":"boolean","title":"Is Curated","default":false},"is_mine":{"type":"boolean","title":"Is Mine","default":false},"source_job":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Job"},"usage_count":{"type":"integer","title":"Usage Count","default":0},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["id","slug","name","category","tool_slug","required_tier","public_tier","allowed"],"title":"TemplateResponse","description":"A template as the gallery and the runner see it.\n\n``required_tier`` / ``public_tier`` / ``allowed`` are emitted on every row,\nthe same triple ``stem_catalog.serialize_catalog`` emits: gate on\n``required_tier``, DISPLAY ``public_tier`` (a hidden or grandfathered tier\nmust never surface as an upgrade target), and disable the button on\n``allowed=False``. Locked templates are shown, not filtered out — that is\nthe whole point of a gallery."},"TemplateUpdateRequest":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":200,"minLength":1},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Description"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"}},"type":"object","title":"TemplateUpdateRequest","description":"Rename or re-file one of your own templates.\n\n``params`` is intentionally not editable: it was derived from a real job\nthrough the allowlist, and a free-form edit is exactly the hole that\nderivation exists to close."},"TestEmailRequest":{"properties":{"user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"},"campaign_type":{"type":"string","title":"Campaign Type","description":"Type of campaign to test"}},"type":"object","required":["campaign_type"],"title":"TestEmailRequest","description":"Request model for testing email generation"},"Text2MusicRequest":{"properties":{"duration":{"type":"number","maximum":600.0,"minimum":-1.0,"title":"Duration","description":"Audio duration in seconds (-1 for auto-detection based on lyrics, max 600s/10min)","default":-1.0},"audio_duration":{"type":"number","maximum":600.0,"minimum":-1.0,"title":"Audio Duration","description":"Alias for duration (legacy)"},"format":{"$ref":"#/components/schemas/app__schemas__music__AudioFormat","description":"Output audio format (flac recommended for quality)","default":"flac"},"model_version":{"anyOf":[{"$ref":"#/components/schemas/ModelVersion"},{"type":"null"}],"description":"Model version: audiomusic-v2 (default) or audiomusic-v1.5","default":"audiomusic-v2"},"quality":{"anyOf":[{"$ref":"#/components/schemas/MusicQuality"},{"type":"null"}],"description":"Deprecated and ignored. Every plan generates with AudioPod's highest-quality music model at the same rate; both values are accepted for compatibility and behave identically."},"bpm":{"anyOf":[{"type":"integer","maximum":300.0,"minimum":30.0},{"type":"null"}],"title":"Bpm","description":"Beats per minute (30-300). None for auto-detection via LM."},"keyscale":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Keyscale","description":"Musical key (e.g. 'C Major', 'Am', 'F# minor'). Empty for auto-detection."},"timesignature":{"anyOf":[{"type":"string","maxLength":10},{"type":"null"}],"title":"Timesignature","description":"Time signature (2='2/4', 3='3/4', 4='4/4', 6='6/8'). Empty for auto-detection."},"vocal_language":{"type":"string","maxLength":20,"title":"Vocal Language","description":"Language code for vocals (ISO 639-1: 'en', 'zh', 'ja', etc.). 'unknown' for auto-detection.","default":"unknown"},"inference_steps":{"type":"integer","maximum":200.0,"minimum":1.0,"title":"Inference Steps","description":"Diffusion steps. SFT/Base: 64 for best quality (32-100 range). Turbo: 8.","default":64},"infer_step":{"type":"integer","maximum":200.0,"minimum":1.0,"title":"Infer Step","description":"Alias for inference_steps (legacy)"},"guidance_scale":{"type":"number","maximum":15.0,"minimum":1.0,"title":"Guidance Scale","description":"CFG scale (1.0-15.0). Higher = more adherence to prompt.","default":7.0},"seed":{"type":"integer","title":"Seed","description":"Random seed (-1 for random, positive for fixed)","default":-1},"shift":{"type":"number","maximum":5.0,"minimum":1.0,"title":"Shift","description":"Timestep shift factor (1.0-5.0). 3.0 recommended for all models.","default":3.0},"infer_method":{"$ref":"#/components/schemas/InferMethod","description":"Inference method: 'ode' (Euler, fast) or 'sde' (stochastic)","default":"ode"},"use_adg":{"type":"boolean","title":"Use Adg","description":"Adaptive Dual Guidance (base model only). Improves quality at the cost of speed.","default":false},"cfg_interval_start":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Cfg Interval Start","description":"CFG application start ratio (0.0-1.0)","default":0.0},"cfg_interval_end":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Cfg Interval End","description":"CFG application end ratio (0.0-1.0)","default":1.0},"timesteps":{"anyOf":[{"items":{"type":"number"},"type":"array"},{"type":"null"}],"title":"Timesteps","description":"Custom timesteps list from 1.0 to 0.0. Overrides inference_steps and shift if provided."},"thinking":{"type":"boolean","title":"Thinking","description":"Enable LM Chain-of-Thought reasoning for semantic planning","default":true},"lm_temperature":{"type":"number","maximum":2.0,"minimum":0.0,"title":"Lm Temperature","description":"LM sampling temperature. Higher = more creative.","default":0.85},"lm_cfg_scale":{"type":"number","maximum":10.0,"minimum":0.0,"title":"Lm Cfg Scale","description":"LM classifier-free guidance scale","default":2.0},"lm_top_k":{"type":"integer","maximum":100.0,"minimum":0.0,"title":"Lm Top K","description":"LM top-k sampling. 0 disables.","default":0},"lm_top_p":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Lm Top P","description":"LM nucleus sampling. 1.0 disables.","default":0.9},"lm_negative_prompt":{"type":"string","maxLength":512,"title":"Lm Negative Prompt","description":"Negative prompt for LM classifier-free guidance","default":"NO USER INPUT"},"use_cot_metas":{"type":"boolean","title":"Use Cot Metas","description":"Generate metadata using LM CoT reasoning","default":true},"use_cot_caption":{"type":"boolean","title":"Use Cot Caption","description":"Refine caption using LM CoT reasoning","default":true},"use_cot_lyrics":{"type":"boolean","title":"Use Cot Lyrics","description":"Generate/refine lyrics using LM CoT reasoning (reserved)","default":false},"use_cot_language":{"type":"boolean","title":"Use Cot Language","description":"Detect vocal language using LM CoT reasoning","default":true},"use_constrained_decoding":{"type":"boolean","title":"Use Constrained Decoding","description":"Enable constrained decoding for structured LM output","default":true},"lora_name_or_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lora Name Or Path","description":"LoRA adapter path for custom styles"},"lora_weight":{"type":"number","maximum":3.0,"minimum":-3.0,"title":"Lora Weight","description":"LoRA weight","default":1.0},"batch_size":{"type":"integer","maximum":8.0,"minimum":1.0,"title":"Batch Size","description":"Number of variations to generate (1-8)","default":1},"thumbnail_url":{"anyOf":[{"type":"string","maxLength":1024},{"type":"null"}],"title":"Thumbnail Url","description":"URL for the music thumbnail"},"manual_seeds":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Manual Seeds","description":"Manual seeds for batch generation (legacy)"},"scheduler_type":{"anyOf":[{"$ref":"#/components/schemas/SchedulerType"},{"type":"null"}],"description":"Legacy scheduler type (use infer_method instead)"},"cfg_type":{"anyOf":[{"$ref":"#/components/schemas/CFGType"},{"type":"null"}],"description":"Legacy CFG type"},"use_sde":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Use Sde","description":"Legacy SDE flag (use infer_method='sde' instead)"},"debug":{"type":"boolean","title":"Debug","description":"Enable debug mode","default":false},"display_name":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Display Name","description":"Display name for the music track"},"caption":{"type":"string","maxLength":2048,"minLength":0,"title":"Caption","description":"Text description of desired music (tags, genre, mood, instruments)","default":""},"prompt":{"type":"string","maxLength":8000,"minLength":0,"title":"Prompt","description":"Alias for caption (legacy)","default":""},"lyrics":{"type":"string","maxLength":4096,"title":"Lyrics","description":"Lyrics with structure tags like [verse], [chorus]. Use '[Instrumental]' for instrumental tracks.","default":""},"instrumental":{"type":"boolean","title":"Instrumental","description":"If True, generate instrumental music regardless of lyrics","default":false},"genre_preset":{"anyOf":[{"$ref":"#/components/schemas/GenrePreset"},{"type":"null"}],"description":"Genre preset to use"},"template_slug":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Template Slug"}},"type":"object","title":"Text2MusicRequest","description":"Request for text-to-music generation.\n\nThe language model will:\n- Auto-detect BPM, key, time signature if not provided\n- Refine and expand your caption for better results\n- Detect vocal language from lyrics\n- Generate music semantic codes for rendering\n\nExample request:\n{\n    \"caption\": \"upbeat pop, female vocals, catchy melody, summer vibes\",\n    \"lyrics\": \"[verse]\\nSun is shining bright today\\n[chorus]\\nLet's dance the night away\",\n    \"duration\": 60,\n    \"thinking\": true\n}"},"Text2RapRequest":{"properties":{"duration":{"type":"number","maximum":600.0,"minimum":-1.0,"title":"Duration","description":"Audio duration in seconds (-1 for auto-detection based on lyrics, max 600s/10min)","default":-1.0},"audio_duration":{"type":"number","maximum":600.0,"minimum":-1.0,"title":"Audio Duration","description":"Alias for duration (legacy)"},"format":{"$ref":"#/components/schemas/app__schemas__music__AudioFormat","description":"Output audio format (flac recommended for quality)","default":"flac"},"model_version":{"anyOf":[{"$ref":"#/components/schemas/ModelVersion"},{"type":"null"}],"description":"Model version: audiomusic-v2 (default) or audiomusic-v1.5","default":"audiomusic-v2"},"quality":{"anyOf":[{"$ref":"#/components/schemas/MusicQuality"},{"type":"null"}],"description":"Deprecated and ignored. Every plan generates with AudioPod's highest-quality music model at the same rate; both values are accepted for compatibility and behave identically."},"bpm":{"anyOf":[{"type":"integer","maximum":300.0,"minimum":30.0},{"type":"null"}],"title":"Bpm","description":"Beats per minute (30-300). None for auto-detection via LM."},"keyscale":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Keyscale","description":"Musical key (e.g. 'C Major', 'Am', 'F# minor'). Empty for auto-detection."},"timesignature":{"anyOf":[{"type":"string","maxLength":10},{"type":"null"}],"title":"Timesignature","description":"Time signature (2='2/4', 3='3/4', 4='4/4', 6='6/8'). Empty for auto-detection."},"vocal_language":{"type":"string","maxLength":20,"title":"Vocal Language","description":"Language code for vocals (ISO 639-1: 'en', 'zh', 'ja', etc.). 'unknown' for auto-detection.","default":"unknown"},"inference_steps":{"type":"integer","maximum":200.0,"minimum":1.0,"title":"Inference Steps","description":"Diffusion steps. SFT/Base: 64 for best quality (32-100 range). Turbo: 8.","default":64},"infer_step":{"type":"integer","maximum":200.0,"minimum":1.0,"title":"Infer Step","description":"Alias for inference_steps (legacy)"},"guidance_scale":{"type":"number","maximum":15.0,"minimum":1.0,"title":"Guidance Scale","description":"CFG scale (1.0-15.0). Higher = more adherence to prompt.","default":7.0},"seed":{"type":"integer","title":"Seed","description":"Random seed (-1 for random, positive for fixed)","default":-1},"shift":{"type":"number","maximum":5.0,"minimum":1.0,"title":"Shift","description":"Timestep shift factor (1.0-5.0). 3.0 recommended for all models.","default":3.0},"infer_method":{"$ref":"#/components/schemas/InferMethod","description":"Inference method: 'ode' (Euler, fast) or 'sde' (stochastic)","default":"ode"},"use_adg":{"type":"boolean","title":"Use Adg","description":"Adaptive Dual Guidance (base model only). Improves quality at the cost of speed.","default":false},"cfg_interval_start":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Cfg Interval Start","description":"CFG application start ratio (0.0-1.0)","default":0.0},"cfg_interval_end":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Cfg Interval End","description":"CFG application end ratio (0.0-1.0)","default":1.0},"timesteps":{"anyOf":[{"items":{"type":"number"},"type":"array"},{"type":"null"}],"title":"Timesteps","description":"Custom timesteps list from 1.0 to 0.0. Overrides inference_steps and shift if provided."},"thinking":{"type":"boolean","title":"Thinking","description":"Enable LM Chain-of-Thought reasoning for semantic planning","default":true},"lm_temperature":{"type":"number","maximum":2.0,"minimum":0.0,"title":"Lm Temperature","description":"LM sampling temperature. Higher = more creative.","default":0.85},"lm_cfg_scale":{"type":"number","maximum":10.0,"minimum":0.0,"title":"Lm Cfg Scale","description":"LM classifier-free guidance scale","default":2.0},"lm_top_k":{"type":"integer","maximum":100.0,"minimum":0.0,"title":"Lm Top K","description":"LM top-k sampling. 0 disables.","default":0},"lm_top_p":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Lm Top P","description":"LM nucleus sampling. 1.0 disables.","default":0.9},"lm_negative_prompt":{"type":"string","maxLength":512,"title":"Lm Negative Prompt","description":"Negative prompt for LM classifier-free guidance","default":"NO USER INPUT"},"use_cot_metas":{"type":"boolean","title":"Use Cot Metas","description":"Generate metadata using LM CoT reasoning","default":true},"use_cot_caption":{"type":"boolean","title":"Use Cot Caption","description":"Refine caption using LM CoT reasoning","default":true},"use_cot_lyrics":{"type":"boolean","title":"Use Cot Lyrics","description":"Generate/refine lyrics using LM CoT reasoning (reserved)","default":false},"use_cot_language":{"type":"boolean","title":"Use Cot Language","description":"Detect vocal language using LM CoT reasoning","default":true},"use_constrained_decoding":{"type":"boolean","title":"Use Constrained Decoding","description":"Enable constrained decoding for structured LM output","default":true},"lora_name_or_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lora Name Or Path","description":"LoRA adapter path for custom styles"},"lora_weight":{"type":"number","maximum":3.0,"minimum":-3.0,"title":"Lora Weight","description":"LoRA weight","default":1.0},"batch_size":{"type":"integer","maximum":8.0,"minimum":1.0,"title":"Batch Size","description":"Number of variations to generate (1-8)","default":1},"thumbnail_url":{"anyOf":[{"type":"string","maxLength":1024},{"type":"null"}],"title":"Thumbnail Url","description":"URL for the music thumbnail"},"manual_seeds":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Manual Seeds","description":"Manual seeds for batch generation (legacy)"},"scheduler_type":{"anyOf":[{"$ref":"#/components/schemas/SchedulerType"},{"type":"null"}],"description":"Legacy scheduler type (use infer_method instead)"},"cfg_type":{"anyOf":[{"$ref":"#/components/schemas/CFGType"},{"type":"null"}],"description":"Legacy CFG type"},"use_sde":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Use Sde","description":"Legacy SDE flag (use infer_method='sde' instead)"},"debug":{"type":"boolean","title":"Debug","description":"Enable debug mode","default":false},"display_name":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Display Name","description":"Display name for the rap track"},"prompt":{"type":"string","maxLength":2000,"minLength":1,"title":"Prompt","description":"Rap style description"},"lyrics":{"type":"string","maxLength":10000,"minLength":1,"title":"Lyrics","description":"Rap lyrics"}},"type":"object","required":["prompt","lyrics"],"title":"Text2RapRequest","description":"Request for text-to-rap generation"},"Text2SamplesRequest":{"properties":{"duration":{"type":"number","maximum":600.0,"minimum":-1.0,"title":"Duration","description":"Audio duration in seconds (-1 for auto-detection based on lyrics, max 600s/10min)","default":-1.0},"audio_duration":{"type":"number","maximum":120.0,"minimum":-1.0,"title":"Audio Duration","description":"Sample duration in seconds (-1 for auto duration)","default":-1.0},"format":{"$ref":"#/components/schemas/app__schemas__music__AudioFormat","description":"Output audio format (flac recommended for quality)","default":"flac"},"model_version":{"anyOf":[{"$ref":"#/components/schemas/ModelVersion"},{"type":"null"}],"description":"Model version: audiomusic-v2 (default) or audiomusic-v1.5","default":"audiomusic-v2"},"quality":{"anyOf":[{"$ref":"#/components/schemas/MusicQuality"},{"type":"null"}],"description":"Deprecated and ignored. Every plan generates with AudioPod's highest-quality music model at the same rate; both values are accepted for compatibility and behave identically."},"bpm":{"anyOf":[{"type":"integer","maximum":300.0,"minimum":30.0},{"type":"null"}],"title":"Bpm","description":"Beats per minute (30-300). None for auto-detection via LM."},"keyscale":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Keyscale","description":"Musical key (e.g. 'C Major', 'Am', 'F# minor'). Empty for auto-detection."},"timesignature":{"anyOf":[{"type":"string","maxLength":10},{"type":"null"}],"title":"Timesignature","description":"Time signature (2='2/4', 3='3/4', 4='4/4', 6='6/8'). Empty for auto-detection."},"vocal_language":{"type":"string","maxLength":20,"title":"Vocal Language","description":"Language code for vocals (ISO 639-1: 'en', 'zh', 'ja', etc.). 'unknown' for auto-detection.","default":"unknown"},"inference_steps":{"type":"integer","maximum":200.0,"minimum":1.0,"title":"Inference Steps","description":"Diffusion steps. SFT/Base: 64 for best quality (32-100 range). Turbo: 8.","default":64},"infer_step":{"type":"integer","maximum":200.0,"minimum":1.0,"title":"Infer Step","description":"Alias for inference_steps (legacy)"},"guidance_scale":{"type":"number","maximum":15.0,"minimum":1.0,"title":"Guidance Scale","description":"CFG scale (1.0-15.0). Higher = more adherence to prompt.","default":7.0},"seed":{"type":"integer","title":"Seed","description":"Random seed (-1 for random, positive for fixed)","default":-1},"shift":{"type":"number","maximum":5.0,"minimum":1.0,"title":"Shift","description":"Timestep shift factor (1.0-5.0). 3.0 recommended for all models.","default":3.0},"infer_method":{"$ref":"#/components/schemas/InferMethod","description":"Inference method: 'ode' (Euler, fast) or 'sde' (stochastic)","default":"ode"},"use_adg":{"type":"boolean","title":"Use Adg","description":"Adaptive Dual Guidance (base model only). Improves quality at the cost of speed.","default":false},"cfg_interval_start":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Cfg Interval Start","description":"CFG application start ratio (0.0-1.0)","default":0.0},"cfg_interval_end":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Cfg Interval End","description":"CFG application end ratio (0.0-1.0)","default":1.0},"timesteps":{"anyOf":[{"items":{"type":"number"},"type":"array"},{"type":"null"}],"title":"Timesteps","description":"Custom timesteps list from 1.0 to 0.0. Overrides inference_steps and shift if provided."},"thinking":{"type":"boolean","title":"Thinking","description":"Enable LM Chain-of-Thought reasoning for semantic planning","default":true},"lm_temperature":{"type":"number","maximum":2.0,"minimum":0.0,"title":"Lm Temperature","description":"LM sampling temperature. Higher = more creative.","default":0.85},"lm_cfg_scale":{"type":"number","maximum":10.0,"minimum":0.0,"title":"Lm Cfg Scale","description":"LM classifier-free guidance scale","default":2.0},"lm_top_k":{"type":"integer","maximum":100.0,"minimum":0.0,"title":"Lm Top K","description":"LM top-k sampling. 0 disables.","default":0},"lm_top_p":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Lm Top P","description":"LM nucleus sampling. 1.0 disables.","default":0.9},"lm_negative_prompt":{"type":"string","maxLength":512,"title":"Lm Negative Prompt","description":"Negative prompt for LM classifier-free guidance","default":"NO USER INPUT"},"use_cot_metas":{"type":"boolean","title":"Use Cot Metas","description":"Generate metadata using LM CoT reasoning","default":true},"use_cot_caption":{"type":"boolean","title":"Use Cot Caption","description":"Refine caption using LM CoT reasoning","default":true},"use_cot_lyrics":{"type":"boolean","title":"Use Cot Lyrics","description":"Generate/refine lyrics using LM CoT reasoning (reserved)","default":false},"use_cot_language":{"type":"boolean","title":"Use Cot Language","description":"Detect vocal language using LM CoT reasoning","default":true},"use_constrained_decoding":{"type":"boolean","title":"Use Constrained Decoding","description":"Enable constrained decoding for structured LM output","default":true},"lora_name_or_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lora Name Or Path","description":"LoRA adapter path for custom styles"},"lora_weight":{"type":"number","maximum":3.0,"minimum":-3.0,"title":"Lora Weight","description":"LoRA weight","default":1.0},"batch_size":{"type":"integer","maximum":8.0,"minimum":1.0,"title":"Batch Size","description":"Number of variations to generate (1-8)","default":1},"thumbnail_url":{"anyOf":[{"type":"string","maxLength":1024},{"type":"null"}],"title":"Thumbnail Url","description":"URL for the music thumbnail"},"manual_seeds":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Manual Seeds","description":"Manual seeds for batch generation (legacy)"},"scheduler_type":{"anyOf":[{"$ref":"#/components/schemas/SchedulerType"},{"type":"null"}],"description":"Legacy scheduler type (use infer_method instead)"},"cfg_type":{"anyOf":[{"$ref":"#/components/schemas/CFGType"},{"type":"null"}],"description":"Legacy CFG type"},"use_sde":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Use Sde","description":"Legacy SDE flag (use infer_method='sde' instead)"},"debug":{"type":"boolean","title":"Debug","description":"Enable debug mode","default":false},"display_name":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Display Name","description":"Display name for the audio sample"},"prompt":{"type":"string","maxLength":1000,"minLength":1,"title":"Prompt","description":"Sample description"},"sample_type":{"type":"string","title":"Sample Type","description":"Type of sample (loop, one-shot, etc.)","default":"loop"},"tempo":{"anyOf":[{"type":"integer","maximum":200.0,"minimum":60.0},{"type":"null"}],"title":"Tempo","description":"Target tempo in BPM","default":128}},"type":"object","required":["prompt"],"title":"Text2SamplesRequest","description":"Request for text-to-samples generation"},"TierCatalogResponse":{"properties":{"tiers":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Tiers"}},"type":"object","required":["tiers"],"title":"TierCatalogResponse"},"Token":{"properties":{"access_token":{"type":"string","title":"Access Token"},"refresh_token":{"type":"string","title":"Refresh Token"},"token_type":{"type":"string","title":"Token Type"},"expires_in":{"type":"integer","title":"Expires In"}},"type":"object","required":["access_token","refresh_token","token_type","expires_in"],"title":"Token"},"TopService":{"properties":{"service_type":{"type":"string","title":"Service Type"},"credits_used":{"type":"integer","title":"Credits Used"}},"type":"object","required":["service_type","credits_used"],"title":"TopService"},"TopupCheckoutResponse":{"properties":{"session_id":{"type":"string","title":"Session Id"},"url":{"type":"string","title":"Url"},"amount_cents":{"type":"integer","title":"Amount Cents"},"amount_usd":{"type":"string","title":"Amount Usd"}},"type":"object","required":["session_id","url","amount_cents","amount_usd"],"title":"TopupCheckoutResponse","description":"Response with Stripe Checkout session"},"TopupHistoryItem":{"properties":{"id":{"type":"string","title":"Id"},"amount_cents":{"type":"integer","title":"Amount Cents"},"amount_usd":{"type":"string","title":"Amount Usd"},"status":{"type":"string","title":"Status"},"stripe_payment_intent_id":{"type":"string","title":"Stripe Payment Intent Id"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"processed_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Processed At"},"source":{"type":"string","title":"Source","default":"manual"}},"type":"object","required":["id","amount_cents","amount_usd","status","stripe_payment_intent_id","created_at","processed_at"],"title":"TopupHistoryItem","description":"Single top-up record"},"TopupHistoryResponse":{"properties":{"page":{"type":"integer","title":"Page"},"limit":{"type":"integer","title":"Limit"},"topups":{"items":{"$ref":"#/components/schemas/TopupHistoryItem"},"type":"array","title":"Topups"}},"type":"object","required":["page","limit","topups"],"title":"TopupHistoryResponse","description":"Response for top-up history"},"TopupPaymentIntentResponse":{"properties":{"client_secret":{"type":"string","title":"Client Secret"},"payment_intent_id":{"type":"string","title":"Payment Intent Id"},"amount_cents":{"type":"integer","title":"Amount Cents"},"amount_usd":{"type":"string","title":"Amount Usd"}},"type":"object","required":["client_secret","payment_intent_id","amount_cents","amount_usd"],"title":"TopupPaymentIntentResponse","description":"Response with Stripe PaymentIntent details"},"TopupRequest":{"properties":{"amount_cents":{"type":"integer","maximum":1000000.0,"minimum":100.0,"title":"Amount Cents","description":"Amount in cents (min $1.00, max $10000.00)"}},"type":"object","required":["amount_cents"],"title":"TopupRequest","description":"Request for wallet top-up"},"TrackDescriptor":{"properties":{"source_type":{"type":"string","title":"Source Type","description":"library | upload | youtube"},"source_ref":{"type":"string","title":"Source Ref","description":"library: MusicGenerationJob id · upload: R2 key · youtube: URL"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"}},"type":"object","required":["source_type","source_ref"],"title":"TrackDescriptor","description":"A single track the user/agent adds to the queue.\n\n``source_type`` ∈ {library, upload, youtube}. For MVP only ``library`` is\nanalysable (``source_ref`` = a completed ``MusicGenerationJob`` id);\n``upload`` / ``youtube`` are accepted structurally but report\n``analysis_status=\"unsupported\"``."},"TrackingEventResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"event_type":{"$ref":"#/components/schemas/TrackingEventTypeEnum"},"tracking_id":{"type":"string","title":"Tracking Id"},"user_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"User Id"},"ip_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ip Address"},"referrer_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Referrer Url"},"landing_page":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Landing Page"},"utm_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Utm Source"},"utm_medium":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Utm Medium"},"utm_campaign":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Utm Campaign"},"revenue_amount":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Revenue Amount"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","event_type","tracking_id","created_at"],"title":"TrackingEventResponse","description":"Schema for tracking event responses"},"TrackingEventTypeEnum":{"type":"string","enum":["click","signup","conversion","renewal","upgrade","cancellation"],"title":"TrackingEventTypeEnum"},"TrackingLinkCreate":{"properties":{"destination_url":{"type":"string","title":"Destination Url","description":"URL to redirect to after tracking"},"campaign":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Campaign"},"medium":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Medium"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"},"content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content"},"term":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Term"}},"type":"object","required":["destination_url"],"title":"TrackingLinkCreate","description":"Schema for creating tracking links"},"TrackingLinkResponse":{"properties":{"tracking_url":{"type":"string","title":"Tracking Url"},"tracking_code":{"type":"string","title":"Tracking Code"},"destination_url":{"type":"string","title":"Destination Url"},"campaign":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Campaign"},"medium":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Medium"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"},"content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content"},"term":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Term"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["tracking_url","tracking_code","destination_url","created_at"],"title":"TrackingLinkResponse","description":"Schema for tracking link responses"},"Transcript":{"properties":{"dialogues":{"items":{"$ref":"#/components/schemas/Dialogue"},"type":"array","title":"Dialogues","description":"Ordered dialogue list"},"id":{"type":"string","title":"Id","description":"Unique transcript ID"},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"Creation timestamp"},"updated_at":{"type":"string","format":"date-time","title":"Updated At","description":"Last update timestamp"}},"type":"object","required":["id","created_at","updated_at"],"title":"Transcript","description":"Transcript response model."},"TranscriptCreate":{"properties":{"dialogues":{"items":{"$ref":"#/components/schemas/DialogueCreate"},"type":"array","minItems":1,"title":"Dialogues","description":"Dialogues to create"}},"type":"object","required":["dialogues"],"title":"TranscriptCreate","description":"Transcript creation/update request."},"TranscriptEditRequest":{"properties":{"segments":{"items":{"$ref":"#/components/schemas/EditableSegment"},"type":"array","title":"Segments","description":"Updated transcript segments"},"edit_notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Edit Notes","description":"Notes about the edits made"}},"type":"object","required":["segments"],"title":"TranscriptEditRequest","description":"Request to edit transcript segments"},"TranscriptEditResponse":{"properties":{"job_id":{"type":"integer","title":"Job Id","description":"Job ID"},"version":{"type":"integer","title":"Version","description":"Transcript version number"},"updated_at":{"type":"string","format":"date-time","title":"Updated At","description":"Last update time"},"transcript_path":{"type":"string","title":"Transcript Path","description":"Path to updated transcript"},"changes_count":{"type":"integer","title":"Changes Count","description":"Number of segments changed"},"message":{"type":"string","title":"Message","description":"Success message"}},"type":"object","required":["job_id","version","updated_at","transcript_path","changes_count","message"],"title":"TranscriptEditResponse","description":"Response after editing transcript"},"TranscriptGenerateRequest":{"properties":{},"type":"object","title":"TranscriptGenerateRequest","description":"Request to AI-generate a transcript from outline."},"TranscriptGenerateResponse":{"properties":{"transcript":{"$ref":"#/components/schemas/Transcript"},"word_count":{"type":"integer","title":"Word Count","description":"Total word count"},"estimated_duration_minutes":{"type":"number","title":"Estimated Duration Minutes","description":"Estimated audio duration"}},"type":"object","required":["transcript","word_count","estimated_duration_minutes"],"title":"TranscriptGenerateResponse","description":"Response from transcript generation."},"TranscriptionJobResponse":{"properties":{"id":{"type":"integer","title":"Id","description":"Job ID"},"user_id":{"type":"string","title":"User Id","description":"User ID"},"source_urls":{"items":{"type":"string"},"type":"array","title":"Source Urls","description":"Source URLs"},"original_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Original Filename","description":"Original filename for uploads"},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language","description":"Language setting"},"model_type":{"type":"string","title":"Model Type","description":"Model type used"},"chunk_duration":{"type":"integer","title":"Chunk Duration","description":"Chunk duration setting"},"enable_speaker_diarization":{"type":"boolean","title":"Enable Speaker Diarization","description":"Speaker diarization enabled"},"min_speakers":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Min Speakers","description":"Minimum speakers setting"},"max_speakers":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Speakers","description":"Maximum speakers setting"},"enable_word_timestamps":{"type":"boolean","title":"Enable Word Timestamps","description":"Word timestamps enabled"},"enable_confidence_scores":{"type":"boolean","title":"Enable Confidence Scores","description":"Confidence scores enabled"},"status":{"type":"string","title":"Status","description":"Current job status"},"progress":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Progress","description":"Progress percentage (0-100)"},"transcript_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transcript Path","description":"Path to transcript file"},"audio_paths":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Audio Paths","description":"Storage paths of the extracted audio files"},"total_duration":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Total Duration","description":"Total duration in seconds"},"detected_language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Detected Language","description":"Detected language"},"confidence_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Confidence Score","description":"Average confidence score"},"estimated_duration":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Estimated Duration","description":"Estimated duration"},"estimated_credits":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Estimated Credits","description":"Estimated credits"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message","description":"Error message if failed"},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"Job creation time"},"started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started At","description":"Processing start time"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At","description":"Job completion time"},"task_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Task Id","description":"the job queue task ID"},"task_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Task Status","description":"Current task status"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name","description":"User-friendly display name"},"billing_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Billing Status","description":"Billing status: PAID, DEFERRED, or REFUNDED"},"deferred_credits":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Deferred Credits","description":"Credits required to unlock this job (for deferred jobs)"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At","description":"When deferred job results expire"},"r2_purged_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"R2 Purged At"}},"type":"object","required":["id","user_id","source_urls","model_type","chunk_duration","enable_speaker_diarization","enable_word_timestamps","enable_confidence_scores","status","created_at"],"title":"TranscriptionJobResponse"},"TranscriptionModelType":{"type":"string","enum":["cloudflare-whisper","cloudflare-whisper-diarized","premium","premium-diarized","faster-whisper","whisper-timestamped"],"title":"TranscriptionModelType","description":"Transcription engine tiers for AudioTranscribe, AudioPod's speech-to-text engine.\n\n- Standard: fast transcription with word-level timestamps.\n- Standard + diarization: adds speaker labels.\n- Premium: highest accuracy, and the tier that supports realtime streaming."},"TranscriptionQuoteRequest":{"properties":{"duration_seconds":{"anyOf":[{"type":"number","maximum":810000.0,"exclusiveMinimum":0.0},{"type":"null"}],"title":"Duration Seconds","description":"Length of a single audio file in seconds. For a job with several files or links, send `durations_seconds` instead."},"durations_seconds":{"anyOf":[{"items":{"type":"number","maximum":54000.0,"exclusiveMinimum":0.0},"type":"array","maxItems":15,"minItems":1},{"type":"null"}],"title":"Durations Seconds","description":"Length in seconds of each file or link in the job, one entry per source. Each source is billed in whole seconds, rounded up."}},"type":"object","title":"TranscriptionQuoteRequest","description":"Request body for a Speech to Text quote.\n\nSend exactly one of ``duration_seconds`` (a single file) or\n``durations_seconds`` (one entry per file or link)."},"TranscriptionRequest":{"properties":{"source_urls":{"items":{"type":"string","maxLength":2083,"minLength":1,"format":"uri"},"type":"array","maxItems":15,"minItems":1,"title":"Source Urls","description":"YouTube URLs to transcribe (max 15)"},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language","description":"Force specific language (ISO 639-1 code, e.g., 'en', 'es', 'fr', 'de', 'ja', 'zh'). Auto-detect if not provided. Specifying language improves accuracy via better prompt conditioning."},"model_type":{"$ref":"#/components/schemas/TranscriptionModelType","description":"Accuracy tier to transcribe with. Omit it for the default standard tier: the fastest option, with word-level timestamps. 'premium' - highest accuracy, with punctuation, per-word confidence scores and automatic language detection. 'premium-diarized' - the premium tier plus speaker labels, recommended for multi-speaker audio. Both premium tiers require a paid plan: a free or Basic caller asking for one is refused with 402 PREMIUM_TIER_REQUIRED, while the standard tier is available on every plan. The remaining values are accepted for backwards compatibility and are not recommended for new integrations.","default":"cloudflare-whisper"},"chunk_duration":{"type":"integer","maximum":7200.0,"minimum":300.0,"title":"Chunk Duration","description":"Chunk duration in seconds for long videos (5 minutes to 2 hours). Smaller chunks (e.g., 600s) may improve accuracy for long content.","default":1800},"enable_speaker_diarization":{"type":"boolean","title":"Enable Speaker Diarization","description":"Label each segment with the speaker who said it (SPEAKER_00, SPEAKER_01, ...). Requires no extra credentials; adds some processing time. Turning this on automatically routes the job to a speaker-aware accuracy tier, so you do not also have to set 'model_type'.","default":false},"min_speakers":{"anyOf":[{"type":"integer","maximum":20.0,"minimum":1.0},{"type":"null"}],"title":"Min Speakers","description":"Minimum number of speakers for diarization (1-20). Auto-detect if not specified. Setting this can improve diarization accuracy when speaker count is known."},"max_speakers":{"anyOf":[{"type":"integer","maximum":20.0,"minimum":1.0},{"type":"null"}],"title":"Max Speakers","description":"Maximum number of speakers for diarization (1-20). Auto-detect if not specified. Setting this prevents over-segmentation when speaker count is known."},"enable_word_timestamps":{"type":"boolean","title":"Enable Word Timestamps","description":"Include word-level timestamps. Disable to speed up processing.","default":true},"enable_confidence_scores":{"type":"boolean","title":"Enable Confidence Scores","description":"Include confidence scores for segments and words. Helps identify low-confidence transcriptions.","default":true},"estimated_duration":{"anyOf":[{"type":"number","maximum":54000.0,"minimum":0.0},{"type":"null"}],"title":"Estimated Duration","description":"Estimated total duration in seconds (max 15 hours). Used for credit calculation."},"template_slug":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Template Slug"}},"type":"object","required":["source_urls"],"title":"TranscriptionRequest"},"TranscriptionResponse":{"properties":{"job_id":{"type":"integer","title":"Job Id","description":"Job ID"},"task_id":{"type":"string","title":"Task Id","description":"the job queue task ID"},"status":{"type":"string","title":"Status","description":"Current job status"},"message":{"type":"string","title":"Message","description":"Status message"},"estimated_credits":{"type":"integer","title":"Estimated Credits","description":"Estimated credits needed"},"estimated_duration":{"type":"number","title":"Estimated Duration","description":"Estimated duration in seconds"},"source_urls":{"items":{"type":"string"},"type":"array","title":"Source Urls","description":"List of source URLs being processed"}},"type":"object","required":["job_id","task_id","status","message","estimated_credits","estimated_duration","source_urls"],"title":"TranscriptionResponse"},"TrialCountsResponse":{"properties":{"trial_counts":{"additionalProperties":{"type":"integer"},"type":"object","title":"Trial Counts"},"trial_limit":{"type":"integer","title":"Trial Limit"},"feature_enabled":{"type":"boolean","title":"Feature Enabled"}},"type":"object","required":["trial_counts","trial_limit","feature_enabled"],"title":"TrialCountsResponse","description":"Response model for trial counts per service type"},"UnsubscribeAnalyticsResponse":{"properties":{"period_days":{"type":"integer","title":"Period Days"},"total_unsubscribes":{"type":"integer","title":"Total Unsubscribes"},"recent_unsubscribes":{"type":"integer","title":"Recent Unsubscribes"},"unsubscribe_reasons":{"additionalProperties":{"type":"integer"},"type":"object","title":"Unsubscribe Reasons"},"daily_trend":{"additionalProperties":{"type":"integer"},"type":"object","title":"Daily Trend"}},"type":"object","required":["period_days","total_unsubscribes","recent_unsubscribes","unsubscribe_reasons","daily_trend"],"title":"UnsubscribeAnalyticsResponse","description":"Response model for unsubscribe analytics"},"UnsubscribeRequest":{"properties":{"user_id":{"type":"string","title":"User Id","description":"User ID to unsubscribe"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason","description":"Reason for unsubscribing"},"feedback":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Feedback","description":"Additional feedback"},"unsubscribe_types":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Unsubscribe Types","description":"Specific email types to unsubscribe from"},"token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Token","description":"Token from the unsubscribe link in the email"},"engagement_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Engagement Id","description":"Deprecated and ignored"}},"type":"object","required":["user_id"],"title":"UnsubscribeRequest","description":"Request model for unsubscribe operations"},"UnsubscribeResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"message":{"type":"string","title":"Message"},"user_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Email"},"unsubscribe_types":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Unsubscribe Types"},"complete_unsubscribe":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Complete Unsubscribe"}},"type":"object","required":["success","message"],"title":"UnsubscribeResponse","description":"Response model for unsubscribe operations"},"UpdateSubscriptionCouponRequest":{"properties":{"coupon_code":{"type":"string","title":"Coupon Code"}},"type":"object","required":["coupon_code"],"title":"UpdateSubscriptionCouponRequest","description":"Request to update subscription with a coupon code"},"UpgradeSubscriptionRequest":{"properties":{"price_id":{"type":"string","title":"Price Id"}},"type":"object","required":["price_id"],"title":"UpgradeSubscriptionRequest","description":"Request model for upgrading subscription"},"UpgradeSubscriptionResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"message":{"type":"string","title":"Message"},"subscription_id":{"type":"string","title":"Subscription Id"},"old_plan":{"type":"string","title":"Old Plan"},"new_plan":{"type":"string","title":"New Plan"},"old_credits":{"type":"integer","title":"Old Credits"},"new_credits_allocated":{"type":"integer","title":"New Credits Allocated"},"total_credits":{"type":"integer","title":"Total Credits"},"amount_charged":{"type":"integer","title":"Amount Charged"}},"type":"object","required":["success","message","subscription_id","old_plan","new_plan","old_credits","new_credits_allocated","total_credits","amount_charged"],"title":"UpgradeSubscriptionResponse","description":"Response model for subscription upgrade"},"UploadLimitsResponse":{"properties":{"service":{"type":"string","title":"Service"},"plan":{"type":"string","title":"Plan"},"max_upload_bytes":{"type":"integer","title":"Max Upload Bytes"},"max_duration_s":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Duration S"},"multipart_threshold_bytes":{"type":"integer","title":"Multipart Threshold Bytes"}},"type":"object","required":["service","plan","max_upload_bytes","multipart_threshold_bytes"],"title":"UploadLimitsResponse"},"UsageHistoryResponse":{"properties":{"page":{"type":"integer","title":"Page"},"limit":{"type":"integer","title":"Limit"},"logs":{"items":{"$ref":"#/components/schemas/UsageLogItem"},"type":"array","title":"Logs"}},"type":"object","required":["page","limit","logs"],"title":"UsageHistoryResponse","description":"Response for usage history"},"UsageLogItem":{"properties":{"id":{"type":"string","title":"Id"},"service_type":{"type":"string","title":"Service Type"},"duration_seconds":{"type":"integer","title":"Duration Seconds"},"duration_minutes":{"type":"number","title":"Duration Minutes"},"characters":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Characters","description":"Billable characters, for services priced per 1,000 characters."},"amount_cents":{"type":"integer","title":"Amount Cents"},"amount_usd":{"type":"string","title":"Amount Usd"},"job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Id"},"api_key_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key Id"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"}},"type":"object","required":["id","service_type","duration_seconds","duration_minutes","amount_cents","amount_usd","job_id","api_key_id","created_at"],"title":"UsageLogItem","description":"Single usage log item"},"UsageSummary":{"properties":{"this_month_usage":{"type":"integer","title":"This Month Usage","default":0},"this_month_subscription_usage":{"type":"integer","title":"This Month Subscription Usage","default":0},"this_month_payg_usage":{"type":"integer","title":"This Month Payg Usage","default":0},"last_month_usage":{"type":"integer","title":"Last Month Usage","default":0},"total_jobs":{"type":"integer","title":"Total Jobs","default":0},"completed_jobs_lifetime":{"type":"integer","title":"Completed Jobs Lifetime","default":0},"top_services":{"items":{"$ref":"#/components/schemas/TopService"},"type":"array","title":"Top Services"},"timezone":{"type":"string","title":"Timezone","default":"UTC"}},"type":"object","title":"UsageSummary","description":"Pre-aggregated usage stats for the usage-logs dashboard."},"User":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name"},"is_active":{"type":"boolean","title":"Is Active","default":true},"is_superuser":{"type":"boolean","title":"Is Superuser","default":false},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"image":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image"},"id":{"type":"string","format":"uuid4","title":"Id"},"google_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Google Id"},"stripe_customer_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stripe Customer Id"},"is_verified":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Verified"},"user_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Type"},"audio_usage":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Audio Usage"},"onboarding_completed":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Onboarding Completed"},"referral_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Referral Source"},"phone_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone Number"},"country_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country Code"},"phone_verified":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Phone Verified"},"referral_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Referral Code"},"referred_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Referred By"},"onboarding_stage":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Onboarding Stage"},"onboarding_stage_updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Onboarding Stage Updated At"},"onboarding_started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Onboarding Started At"},"phone_added_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Phone Added At"},"payment_method_added_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Payment Method Added At"},"first_subscription_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"First Subscription At"},"credits":{"anyOf":[{"$ref":"#/components/schemas/CreditInfo"},{"type":"null"}]},"subscription":{"anyOf":[{"$ref":"#/components/schemas/SubscriptionInfo"},{"type":"null"}]},"payment_recovery":{"anyOf":[{"$ref":"#/components/schemas/PaymentRecoveryInfo"},{"type":"null"}]},"entitlement":{"anyOf":[{"$ref":"#/components/schemas/EntitlementInfo"},{"type":"null"}]},"plan_tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Plan Tier"}},"type":"object","required":["email","created_at","id"],"title":"User"},"UserAccountProvider":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"user_id":{"type":"string","format":"uuid","title":"User Id"},"provider":{"type":"string","title":"Provider"},"provider_account_id":{"type":"string","title":"Provider Account Id"},"type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type"},"expires_at":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Expires At"},"refresh_token_expires_at":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Refresh Token Expires At"},"token_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Token Type"},"scope":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scope"}},"type":"object","required":["id","user_id","provider","provider_account_id"],"title":"UserAccountProvider","description":"A sign-in provider linked to your account."},"UserAccountProviderCreate":{"properties":{"provider":{"type":"string","title":"Provider"},"provider_account_id":{"type":"string","title":"Provider Account Id"},"type":{"type":"string","title":"Type","default":"oauth"},"user_id":{"type":"string","format":"uuid4","title":"User Id"},"access_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"},"refresh_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Refresh Token"},"expires_at":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Expires At"},"refresh_token_expires_at":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Refresh Token Expires At"},"token_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Token Type"},"scope":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scope"},"id_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id Token"}},"type":"object","required":["provider","provider_account_id","user_id"],"title":"UserAccountProviderCreate"},"UserCreate":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name"},"is_active":{"type":"boolean","title":"Is Active","default":true},"is_superuser":{"type":"boolean","title":"Is Superuser","default":false},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"image":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image"},"password":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Password"},"google_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Google Id"},"browser_fingerprint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Browser Fingerprint"},"referral_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Referral Code"},"referral_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Referral Source"}},"type":"object","required":["email"],"title":"UserCreate"},"UserFeedback":{"properties":{"feedback":{"type":"string","title":"Feedback"},"category":{"type":"string","title":"Category"},"rating":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rating"},"id":{"type":"string","format":"uuid4","title":"Id"},"user_id":{"type":"string","format":"uuid4","title":"User Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["feedback","category","id","user_id","created_at","updated_at"],"title":"UserFeedback"},"UserFeedbackCreate":{"properties":{"feedback":{"type":"string","title":"Feedback"},"category":{"type":"string","title":"Category"},"rating":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rating"}},"type":"object","required":["feedback","category"],"title":"UserFeedbackCreate"},"UserMusicInteractionStatus":{"properties":{"job_id":{"type":"integer","title":"Job Id"},"user_has_liked":{"type":"boolean","title":"User Has Liked"},"user_has_disliked":{"type":"boolean","title":"User Has Disliked"},"can_interact":{"type":"boolean","title":"Can Interact"}},"type":"object","required":["job_id","user_has_liked","user_has_disliked","can_interact"],"title":"UserMusicInteractionStatus","description":"Response for user's interaction status with a music track"},"UserType":{"type":"string","enum":["individual","company"],"title":"UserType"},"UserUpdate":{"properties":{"full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name"},"image":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image"},"user_type":{"anyOf":[{"$ref":"#/components/schemas/UserType"},{"type":"null"}]},"audio_usage":{"anyOf":[{"$ref":"#/components/schemas/AudioUsage"},{"type":"null"}]},"onboarding_completed":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Onboarding Completed"},"referral_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Referral Source"},"phone_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone Number"},"country_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country Code"},"onboarding_stage":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Onboarding Stage"},"referred_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Referred By"}},"type":"object","title":"UserUpdate","description":"Schema for updating user profile"},"ValidateCouponRequest":{"properties":{"coupon_code":{"type":"string","title":"Coupon Code"},"price_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Price Id"}},"type":"object","required":["coupon_code"],"title":"ValidateCouponRequest","description":"Request to validate a coupon code."},"ValidateCouponResponse":{"properties":{"valid":{"type":"boolean","title":"Valid"},"coupon_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coupon Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"percent_off":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Percent Off"},"amount_off":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Amount Off"},"currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currency"},"duration":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Duration"},"duration_in_months":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration In Months"},"message":{"type":"string","title":"Message"}},"type":"object","required":["valid","message"],"title":"ValidateCouponResponse","description":"Response from coupon validation."},"ValidateReferralCodeRequest":{"properties":{"referral_code":{"type":"string","maxLength":12,"minLength":6,"title":"Referral Code","description":"Referral code to validate"}},"type":"object","required":["referral_code"],"title":"ValidateReferralCodeRequest","description":"Request to validate a referral code"},"ValidateReferralCodeResponse":{"properties":{"is_valid":{"type":"boolean","title":"Is Valid","description":"Whether the referral code is valid"},"referrer_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Referrer Name","description":"Name of the user who owns the referral code"},"message":{"type":"string","title":"Message","description":"Validation message"}},"type":"object","required":["is_valid","message"],"title":"ValidateReferralCodeResponse","description":"Response for referral code validation"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"VerifyPaymentRequest":{"properties":{"razorpay_payment_id":{"type":"string","title":"Razorpay Payment Id"},"razorpay_order_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Razorpay Order Id"},"razorpay_subscription_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Razorpay Subscription Id"},"razorpay_signature":{"type":"string","title":"Razorpay Signature"}},"type":"object","required":["razorpay_payment_id","razorpay_signature"],"title":"VerifyPaymentRequest"},"VerifyReceiptRequest":{"properties":{"platform":{"type":"string","enum":["ios","android"],"title":"Platform"},"product_id":{"type":"string","maxLength":120,"minLength":1,"title":"Product Id"},"receipt":{"type":"string","minLength":1,"title":"Receipt"}},"type":"object","required":["platform","product_id","receipt"],"title":"VerifyReceiptRequest"},"VerifyReceiptResponse":{"properties":{"plan_tier":{"type":"string","enum":["free","pro","studio","pro_family"],"title":"Plan Tier"},"status":{"type":"string","enum":["active","expired","in_grace","on_hold","paused","canceled","refunded","consumed"],"title":"Status"},"product_id":{"type":"string","title":"Product Id"},"original_transaction_id":{"type":"string","title":"Original Transaction Id"},"expires_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expires At"},"credits_granted":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Credits Granted"},"environment":{"type":"string","enum":["production","sandbox"],"title":"Environment"}},"type":"object","required":["plan_tier","status","product_id","original_transaction_id","environment"],"title":"VerifyReceiptResponse"},"VerifyRegistrationRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"verification_code":{"type":"string","title":"Verification Code"}},"type":"object","required":["email","verification_code"],"title":"VerifyRegistrationRequest"},"VideoFormat":{"type":"string","enum":["mp4","webm","avi","mkv","mov","wmv","flv","m4v","3gp","ogv"],"title":"VideoFormat","description":"Supported video output formats"},"VideoQuality":{"type":"string","enum":["240p","360p","480p","720p","1080p","1440p","2160p","original"],"title":"VideoQuality","description":"Video quality presets"},"Voice":{"properties":{"id":{"type":"integer","title":"Id"},"uuid":{"type":"string","format":"uuid","title":"Uuid"},"slug":{"type":"string","title":"Slug","description":"URL-safe form of `uuid`.","default":""},"display_name":{"type":"string","title":"Display Name","description":"The voice's human label. Always present, never empty."},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Voice description."},"gender":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gender"},"accent":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accent"},"age_group":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Age Group"},"voice_style":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Voice Style"},"language_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language Code","description":"Primary BCP-47 code for this voice."},"language_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language Name"},"supported_languages":{"items":{"type":"string"},"type":"array","title":"Supported Languages","description":"BCP-47 codes this voice can speak."},"language_codes":{"items":{"type":"string"},"type":"array","title":"Language Codes","description":"Alias of `supported_languages`, kept for existing clients."},"best_suited_languages":{"items":{"type":"string"},"type":"array","title":"Best Suited Languages","description":"BCP-47 codes this specific voice is best suited for. May be empty, which means 'not characterised', not 'no languages'."},"language_filter_codes":{"items":{"type":"string"},"type":"array","title":"Language Filter Codes","description":"The codes a voice picker should FILTER this voice under. Resolved server-side; prefer it over deriving one from the language lists. Empty means 'not characterised' — keep your own fallback."},"cross_lingual_capable":{"type":"boolean","title":"Cross Lingual Capable","description":"True when the engine can synthesize this voice well beyond its best-suited languages. Display fact only — nothing is gated on it.","default":false},"use_case":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Use Case","description":"Derived filter axis: narration | conversational | character | explainer. Filter voice pickers on this rather than on `voice_style`."},"use_cases":{"items":{"type":"string"},"type":"array","title":"Use Cases","description":"Marketing-curated tags. Populated on no catalog row today; use the singular `use_case` above."},"tags":{"items":{"type":"string"},"type":"array","title":"Tags","description":"Voice descriptors."},"categories":{"items":{"type":"string"},"type":"array","title":"Categories","description":"Voice categories."},"sample_audio_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sample Audio Url","description":"A URL the player can use directly. Present whenever this voice has any preview audio at all."},"can_be_conversion_target":{"type":"boolean","title":"Can Be Conversion Target","description":"Whether this voice can be the TARGET of a voice conversion. Conversion needs a stored reference clip; a catalog voice synthesized on demand has a preview but no clip, so it is a valid TTS speaker and an invalid conversion target.","default":false},"sample_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sample Text","description":"The line spoken in the preview."},"is_public":{"type":"boolean","title":"Is Public","description":"Whether this voice is visible to other accounts.","default":false},"voice_type":{"anyOf":[{"$ref":"#/components/schemas/app__schemas__enums__VoiceType"},{"type":"null"}],"description":"STANDARD for catalog voices, CUSTOM for cloned ones."},"featured_rank":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Featured Rank","description":"Curated 'Start here' position, 1-based, or null."},"popularity_score":{"type":"integer","title":"Popularity Score","description":"Distinct accounts that used this voice in the last 30 days.","default":0},"is_premium_engine":{"type":"boolean","title":"Is Premium Engine","description":"Whether this voice renders on the premium engine.","default":false},"is_designed":{"type":"boolean","title":"Is Designed","description":"Whether this voice was created with Design a Voice.","default":false},"is_owner":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Owner"},"tier":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Tier"},"relevance_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Relevance Score"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"status":{"anyOf":[{"$ref":"#/components/schemas/ProcessingStatus"},{"type":"null"}]},"processed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Processed At"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"needs_reprocessing":{"type":"boolean","title":"Needs Reprocessing","description":"Whether this voice must be re-saved before it can narrate stories or audiobooks.","default":false}},"type":"object","required":["id","uuid","display_name"],"title":"Voice","description":"A voice as returned to a signed-in caller.\n\nAdds the requester-relative `is_owner` flag, the ranking annotations, and\nthe processing state of a voice the caller is cloning."},"VoiceCollection":{"properties":{"name":{"type":"string","maxLength":100,"minLength":1,"title":"Name","description":"Collection name"},"description":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Description","description":"Collection description"},"is_public":{"type":"boolean","title":"Is Public","description":"Whether collection is publicly visible","default":false},"color":{"anyOf":[{"type":"string","pattern":"^#[0-9A-Fa-f]{6}$"},{"type":"null"}],"title":"Color","description":"Hex color code for UI"},"icon":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Icon","description":"Icon identifier for UI"},"id":{"type":"integer","title":"Id"},"user_id":{"type":"string","title":"User Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"voice_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Voice Count","description":"Number of voices in collection"},"voices":{"anyOf":[{"items":{"$ref":"#/components/schemas/Voice"},"type":"array"},{"type":"null"}],"title":"Voices","description":"Voices in collection (when requested)"}},"type":"object","required":["name","id","user_id","created_at","updated_at"],"title":"VoiceCollection","description":"Schema for voice collection response","example":{"color":"#FF5722","created_at":"2023-01-01T12:00:00Z","description":"A collection of my most-used voices","icon":"star","id":1,"is_public":false,"name":"My Favorite Voices","updated_at":"2023-01-01T12:00:00Z","user_id":"123e4567-e89b-12d3-a456-426614174000","voice_count":5,"voices":[]}},"VoiceCollectionAddVoices":{"properties":{"voice_ids":{"items":{"type":"integer"},"type":"array","minItems":1,"title":"Voice Ids","description":"Voice IDs to add to collection"}},"type":"object","required":["voice_ids"],"title":"VoiceCollectionAddVoices","description":"Schema for adding voices to a collection","example":{"voice_ids":[1,2,3,4]}},"VoiceCollectionCreate":{"properties":{"name":{"type":"string","maxLength":100,"minLength":1,"title":"Name","description":"Collection name"},"description":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Description","description":"Collection description"},"is_public":{"type":"boolean","title":"Is Public","description":"Whether collection is publicly visible","default":false},"color":{"anyOf":[{"type":"string","pattern":"^#[0-9A-Fa-f]{6}$"},{"type":"null"}],"title":"Color","description":"Hex color code for UI"},"icon":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Icon","description":"Icon identifier for UI"},"voice_ids":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Voice Ids","description":"Initial voice IDs to add to collection","default":[]}},"type":"object","required":["name"],"title":"VoiceCollectionCreate","description":"Schema for creating a voice collection","example":{"color":"#FF5722","description":"A collection of my most-used voices","icon":"star","is_public":false,"name":"My Favorite Voices","voice_ids":[1,2,3]}},"VoiceCollectionRemoveVoices":{"properties":{"voice_ids":{"items":{"type":"integer"},"type":"array","minItems":1,"title":"Voice Ids","description":"Voice IDs to remove from collection"}},"type":"object","required":["voice_ids"],"title":"VoiceCollectionRemoveVoices","description":"Schema for removing voices from a collection","example":{"voice_ids":[2,3]}},"VoiceCollectionResponse":{"properties":{"collection":{"$ref":"#/components/schemas/VoiceCollection"},"message":{"type":"string","title":"Message","default":"Collection operation successful"}},"type":"object","required":["collection"],"title":"VoiceCollectionResponse","description":"Response wrapper for collection operations","example":{"collection":{"color":"#FF5722","created_at":"2023-01-01T12:00:00Z","description":"A collection of my most-used voices","icon":"star","id":1,"is_public":false,"name":"My Favorite Voices","updated_at":"2023-01-01T12:00:00Z","user_id":"123e4567-e89b-12d3-a456-426614174000","voice_count":5},"message":"Collection created successfully"}},"VoiceCollectionUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":100,"minLength":1},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Description"},"is_public":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Public"},"color":{"anyOf":[{"type":"string","pattern":"^#[0-9A-Fa-f]{6}$"},{"type":"null"}],"title":"Color"},"icon":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Icon"}},"type":"object","title":"VoiceCollectionUpdate","description":"Schema for updating a voice collection"},"VoiceConversion":{"properties":{"id":{"type":"integer","title":"Id"},"status":{"$ref":"#/components/schemas/ProcessingStatus"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"},"output_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Output Path"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"task_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Task Id"},"source_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Path"},"original_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Original Filename"},"conversion_metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Conversion Metadata"}},"type":"object","required":["id","status","created_at","updated_at"],"title":"VoiceConversion","example":{"conversion_metadata":{"voice_ids":[1,2]},"created_at":"2024-02-20T10:00:00Z","id":1,"original_filename":"my_audio_file.wav","output_path":"outputs/converted/uuid/voice.wav","source_path":"temp/uploads/uuid/source.wav","status":"pending","updated_at":"2024-02-20T10:00:00Z"}},"VoiceCreateStandard":{"properties":{"name":{"type":"string","maxLength":100,"minLength":1,"title":"Name"},"display_name":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Display Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"voice_type":{"$ref":"#/components/schemas/app__schemas__enums__VoiceType","default":"STANDARD"},"provider":{"$ref":"#/components/schemas/TTSProvider"},"provider_voice_id":{"type":"string","maxLength":100,"minLength":1,"title":"Provider Voice Id"},"language_code":{"type":"string","maxLength":10,"minLength":2,"title":"Language Code"},"language_name":{"type":"string","maxLength":50,"minLength":1,"title":"Language Name"},"gender":{"anyOf":[{"type":"string","pattern":"^(male|female|neutral)$"},{"type":"null"}],"title":"Gender"},"accent":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Accent"},"age_group":{"anyOf":[{"type":"string","pattern":"^(young|middle-aged|mature|elderly)$"},{"type":"null"}],"title":"Age Group"},"voice_style":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Voice Style"},"sample_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sample Text"},"sample_audio_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sample Audio Url"},"is_public":{"type":"boolean","title":"Is Public","default":true}},"type":"object","required":["name","provider","provider_voice_id","language_code","language_name"],"title":"VoiceCreateStandard","description":"Create a standard voice from provider catalog"},"VoiceDescriptorResponse":{"properties":{"detailed_description":{"type":"string","title":"Detailed Description","default":""},"personality_traits":{"items":{"type":"string"},"type":"array","title":"Personality Traits"},"recommended_content_types":{"items":{"type":"string"},"type":"array","title":"Recommended Content Types"}},"type":"object","title":"VoiceDescriptorResponse","description":"Generated descriptor profile for a voice: a prose description,\npersonality traits and recommended content types."},"VoiceDesignPreview":{"properties":{"preview_id":{"type":"string","title":"Preview Id"},"audio_url":{"type":"string","title":"Audio Url"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"preview_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Preview Text"}},"type":"object","required":["preview_id","audio_url"],"title":"VoiceDesignPreview"},"VoiceDesignPublishRequest":{"properties":{"preview_id":{"type":"string","title":"Preview Id"},"name":{"type":"string","maxLength":100,"minLength":1,"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"}},"type":"object","required":["preview_id","name"],"title":"VoiceDesignPublishRequest"},"VoiceDesignRequest":{"properties":{"design_prompt":{"type":"string","maxLength":250,"minLength":30,"title":"Design Prompt"},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language"},"preview_text":{"type":"string","maxLength":300,"minLength":20,"title":"Preview Text","default":"Welcome to AudioPod! Here's a preview of the voice you designed."},"num_samples":{"type":"integer","maximum":3.0,"minimum":1.0,"title":"Num Samples","default":3}},"type":"object","required":["design_prompt"],"title":"VoiceDesignRequest"},"VoiceDesignResponse":{"properties":{"previews":{"items":{"$ref":"#/components/schemas/VoiceDesignPreview"},"type":"array","title":"Previews"},"credits_charged":{"type":"integer","title":"Credits Charged","default":0}},"type":"object","title":"VoiceDesignResponse"},"VoiceMetadataResponse":{"properties":{"quality_metrics":{"anyOf":[{"$ref":"#/components/schemas/VoiceQualityMetrics"},{"type":"null"}]},"suggested_use_cases":{"items":{"type":"string"},"type":"array","title":"Suggested Use Cases"}},"type":"object","title":"VoiceMetadataResponse","description":"Voice metadata: quality signals plus suggested use cases."},"VoiceOption":{"properties":{"id":{"type":"integer","title":"Id"},"display_name":{"type":"string","title":"Display Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"language_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language Code"},"supported_languages":{"items":{"type":"string"},"type":"array","title":"Supported Languages","default":[]},"best_suited_languages":{"items":{"type":"string"},"type":"array","title":"Best Suited Languages","default":[]},"cross_lingual_capable":{"type":"boolean","title":"Cross Lingual Capable","default":false},"gender":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gender"},"accent":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accent"},"voice_style":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Voice Style"},"sample_audio_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sample Audio Url"},"is_premium":{"type":"boolean","title":"Is Premium","default":false},"language_filter_codes":{"items":{"type":"string"},"type":"array","title":"Language Filter Codes","default":[]},"age_group":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Age Group"},"use_case":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Use Case"}},"type":"object","required":["id","display_name","description","language_code","gender","accent","voice_style","sample_audio_url"],"title":"VoiceOption"},"VoicePreviewRequest":{"properties":{"text":{"type":"string","minLength":1,"title":"Text"},"language":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Language"}},"type":"object","required":["text"],"title":"VoicePreviewRequest"},"VoicePublicItem":{"properties":{"id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Id","description":"Numeric voice identifier."},"uuid":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Uuid","description":"Stable voice identifier."},"slug":{"type":"string","title":"Slug","description":"URL-safe form of `uuid`.","default":""},"display_name":{"type":"string","title":"Display Name","description":"The voice's human label. Always present, never empty."},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Voice description."},"gender":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gender"},"accent":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accent"},"age_group":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Age Group"},"voice_style":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Voice Style"},"language_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language Code","description":"Primary BCP-47 code for this voice."},"language_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language Name"},"supported_languages":{"items":{"type":"string"},"type":"array","title":"Supported Languages","description":"BCP-47 codes this voice can speak."},"language_codes":{"items":{"type":"string"},"type":"array","title":"Language Codes","description":"Alias of `supported_languages`, kept for existing clients."},"best_suited_languages":{"items":{"type":"string"},"type":"array","title":"Best Suited Languages","description":"BCP-47 codes this specific voice is best suited for. May be empty, which means 'not characterised', not 'no languages'."},"language_filter_codes":{"items":{"type":"string"},"type":"array","title":"Language Filter Codes","description":"The codes a voice picker should FILTER this voice under. Resolved server-side; prefer it over deriving one from the language lists. Empty means 'not characterised' — keep your own fallback."},"cross_lingual_capable":{"type":"boolean","title":"Cross Lingual Capable","description":"True when the engine can synthesize this voice well beyond its best-suited languages. Display fact only — nothing is gated on it.","default":false},"use_case":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Use Case","description":"Derived filter axis: narration | conversational | character | explainer. Filter voice pickers on this rather than on `voice_style`."},"use_cases":{"items":{"type":"string"},"type":"array","title":"Use Cases","description":"Marketing-curated tags. Populated on no catalog row today; use the singular `use_case` above."},"tags":{"items":{"type":"string"},"type":"array","title":"Tags","description":"Voice descriptors."},"categories":{"items":{"type":"string"},"type":"array","title":"Categories","description":"Voice categories."},"sample_audio_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sample Audio Url","description":"A URL the player can use directly. Present whenever this voice has any preview audio at all."},"can_be_conversion_target":{"type":"boolean","title":"Can Be Conversion Target","description":"Whether this voice can be the TARGET of a voice conversion. Conversion needs a stored reference clip; a catalog voice synthesized on demand has a preview but no clip, so it is a valid TTS speaker and an invalid conversion target.","default":false},"sample_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sample Text","description":"The line spoken in the preview."},"is_public":{"type":"boolean","title":"Is Public","description":"Whether this voice is visible to other accounts.","default":false},"voice_type":{"anyOf":[{"$ref":"#/components/schemas/app__schemas__enums__VoiceType"},{"type":"null"}],"description":"STANDARD for catalog voices, CUSTOM for cloned ones."},"featured_rank":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Featured Rank","description":"Curated 'Start here' position, 1-based, or null."},"popularity_score":{"type":"integer","title":"Popularity Score","description":"Distinct accounts that used this voice in the last 30 days.","default":0}},"type":"object","required":["display_name"],"title":"VoicePublicItem","description":"A voice, as served to any caller.\n\nCarries the human label, the descriptive axes a picker filters on, the\nlanguages the voice speaks and a preview URL. Identify a voice by `uuid`\n(or the equivalent `slug`) or by `id`."},"VoiceQualityMetrics":{"properties":{"clarity_score":{"type":"number","title":"Clarity Score"},"naturalness_score":{"type":"number","title":"Naturalness Score"},"emotion_range_score":{"type":"number","title":"Emotion Range Score"}},"type":"object","required":["clarity_score","naturalness_score","emotion_range_score"],"title":"VoiceQualityMetrics","description":"Per-voice quality signals, each scored 0-1."},"VoiceSample":{"properties":{"original_filename":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Original Filename"},"upload_order":{"type":"integer","maximum":5.0,"minimum":1.0,"title":"Upload Order","description":"Upload order (1-5)"},"id":{"type":"integer","title":"Id"},"voice_id":{"type":"integer","title":"Voice Id"},"file_size":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"File Size"},"duration":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Duration"},"quality_score":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Quality Score"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"sample_metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Sample Metadata"}},"type":"object","required":["upload_order","id","voice_id","created_at"],"title":"VoiceSample","description":"Voice sample response schema"},"VoiceSelectionResponse":{"properties":{"available_voices":{"items":{"$ref":"#/components/schemas/VoiceOption"},"type":"array","title":"Available Voices"},"recommended_voices":{"items":{"$ref":"#/components/schemas/VoiceOption"},"type":"array","title":"Recommended Voices"},"user_custom_voices":{"items":{"$ref":"#/components/schemas/VoiceOption"},"type":"array","title":"User Custom Voices"}},"type":"object","required":["available_voices","recommended_voices","user_custom_voices"],"title":"VoiceSelectionResponse"},"VoiceUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":100,"minLength":1},{"type":"null"}],"title":"Name"},"display_name":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Display Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"is_public":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Public"},"gender":{"anyOf":[{"type":"string","pattern":"^(male|female|neutral)$"},{"type":"null"}],"title":"Gender"},"accent":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Accent"},"age_group":{"anyOf":[{"type":"string","pattern":"^(young|middle-aged|mature|elderly)$"},{"type":"null"}],"title":"Age Group"},"voice_style":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Voice Style"},"sample_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sample Text"}},"type":"object","title":"VoiceUpdate","description":"Update voice metadata"},"VoiceWithSamples":{"properties":{"id":{"type":"integer","title":"Id"},"uuid":{"type":"string","format":"uuid","title":"Uuid"},"slug":{"type":"string","title":"Slug","description":"URL-safe form of `uuid`.","default":""},"display_name":{"type":"string","title":"Display Name","description":"The voice's human label. Always present, never empty."},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Voice description."},"gender":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gender"},"accent":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accent"},"age_group":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Age Group"},"voice_style":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Voice Style"},"language_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language Code","description":"Primary BCP-47 code for this voice."},"language_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language Name"},"supported_languages":{"items":{"type":"string"},"type":"array","title":"Supported Languages","description":"BCP-47 codes this voice can speak."},"language_codes":{"items":{"type":"string"},"type":"array","title":"Language Codes","description":"Alias of `supported_languages`, kept for existing clients."},"best_suited_languages":{"items":{"type":"string"},"type":"array","title":"Best Suited Languages","description":"BCP-47 codes this specific voice is best suited for. May be empty, which means 'not characterised', not 'no languages'."},"language_filter_codes":{"items":{"type":"string"},"type":"array","title":"Language Filter Codes","description":"The codes a voice picker should FILTER this voice under. Resolved server-side; prefer it over deriving one from the language lists. Empty means 'not characterised' — keep your own fallback."},"cross_lingual_capable":{"type":"boolean","title":"Cross Lingual Capable","description":"True when the engine can synthesize this voice well beyond its best-suited languages. Display fact only — nothing is gated on it.","default":false},"use_case":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Use Case","description":"Derived filter axis: narration | conversational | character | explainer. Filter voice pickers on this rather than on `voice_style`."},"use_cases":{"items":{"type":"string"},"type":"array","title":"Use Cases","description":"Marketing-curated tags. Populated on no catalog row today; use the singular `use_case` above."},"tags":{"items":{"type":"string"},"type":"array","title":"Tags","description":"Voice descriptors."},"categories":{"items":{"type":"string"},"type":"array","title":"Categories","description":"Voice categories."},"sample_audio_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sample Audio Url","description":"A URL the player can use directly. Present whenever this voice has any preview audio at all."},"can_be_conversion_target":{"type":"boolean","title":"Can Be Conversion Target","description":"Whether this voice can be the TARGET of a voice conversion. Conversion needs a stored reference clip; a catalog voice synthesized on demand has a preview but no clip, so it is a valid TTS speaker and an invalid conversion target.","default":false},"sample_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sample Text","description":"The line spoken in the preview."},"is_public":{"type":"boolean","title":"Is Public","description":"Whether this voice is visible to other accounts.","default":false},"voice_type":{"anyOf":[{"$ref":"#/components/schemas/app__schemas__enums__VoiceType"},{"type":"null"}],"description":"STANDARD for catalog voices, CUSTOM for cloned ones."},"featured_rank":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Featured Rank","description":"Curated 'Start here' position, 1-based, or null."},"popularity_score":{"type":"integer","title":"Popularity Score","description":"Distinct accounts that used this voice in the last 30 days.","default":0},"is_premium_engine":{"type":"boolean","title":"Is Premium Engine","description":"Whether this voice renders on the premium engine.","default":false},"is_designed":{"type":"boolean","title":"Is Designed","description":"Whether this voice was created with Design a Voice.","default":false},"is_owner":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Owner"},"tier":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Tier"},"relevance_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Relevance Score"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"status":{"anyOf":[{"$ref":"#/components/schemas/ProcessingStatus"},{"type":"null"}]},"processed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Processed At"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"needs_reprocessing":{"type":"boolean","title":"Needs Reprocessing","description":"Whether this voice must be re-saved before it can narrate stories or audiobooks.","default":false},"voice_samples":{"items":{"$ref":"#/components/schemas/VoiceSample"},"type":"array","title":"Voice Samples"}},"type":"object","required":["id","uuid","display_name"],"title":"VoiceWithSamples","description":"Voice schema with associated samples"},"VoicesApplyRequest":{"properties":{"narration_style":{"anyOf":[{"type":"string","enum":["single","characters"]},{"type":"null"}],"title":"Narration Style","description":"'single': one narrator reads every line. 'characters': each character gets their own voice. Omit to keep the current style."},"narrator_voice_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Narrator Voice Id","description":"The book's new narrator. Omit to keep the narrator."},"reset_line_voices":{"type":"boolean","title":"Reset Line Voices","description":"Also clear the voices chosen for single lines, so those lines follow the narrator or their character again. Locked lines are never changed.","default":false},"preview_hash":{"type":"string","maxLength":128,"minLength":1,"title":"Preview Hash","description":"`preview_hash` from the preview of this same change."},"renarrate":{"type":"boolean","title":"Renarrate","description":"Also re-narrate the lines the preview listed in `paragraph_ids`, at the price it quoted.","default":false}},"type":"object","required":["preview_hash"],"title":"VoicesApplyRequest","description":"``POST /projects/{id}/voices/apply`` (WEB-1095)."},"VoicesApplyResponse":{"properties":{"narration_style":{"type":"string","enum":["single","characters"],"title":"Narration Style"},"narrator_voice_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Narrator Voice Id"},"drift_lines":{"type":"integer","title":"Drift Lines","description":"Narrated lines whose audio is in a different voice from the one they would be read in after this change."},"own_voice_lines":{"type":"integer","title":"Own Voice Lines","description":"Unlocked lines with a voice chosen for that line alone."},"by_voice":{"items":{"$ref":"#/components/schemas/VoicesByVoice"},"type":"array","title":"By Voice","description":"The drifting lines by the voice they would take."},"paragraph_ids":{"items":{"type":"string"},"type":"array","title":"Paragraph Ids","description":"The drifting lines, in reading order."},"renarrate":{"$ref":"#/components/schemas/VoicesRenarrate"},"cast_preview":{"anyOf":[{"items":{"$ref":"#/components/schemas/VoicesCastPreview"},"type":"array"},{"type":"null"}],"title":"Cast Preview","description":"With narration_style 'characters': each visible character and the voice they would have."},"preview_hash":{"type":"string","title":"Preview Hash"},"renarration":{"anyOf":[{"$ref":"#/components/schemas/BatchNarrationResponse"},{"type":"null"}],"description":"The narration run started when `renarrate` was true."}},"type":"object","required":["narration_style","drift_lines","own_voice_lines","renarrate","preview_hash"],"title":"VoicesApplyResponse"},"VoicesByVoice":{"properties":{"voice_id":{"type":"integer","title":"Voice Id"},"lines":{"type":"integer","title":"Lines"}},"type":"object","required":["voice_id","lines"],"title":"VoicesByVoice"},"VoicesCastPreview":{"properties":{"key":{"type":"string","title":"Key"},"display_name":{"type":"string","title":"Display Name"},"voice_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Voice Id"},"voice_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Voice Source"}},"type":"object","required":["key","display_name"],"title":"VoicesCastPreview"},"VoicesChangeRequest":{"properties":{"narration_style":{"anyOf":[{"type":"string","enum":["single","characters"]},{"type":"null"}],"title":"Narration Style","description":"'single': one narrator reads every line. 'characters': each character gets their own voice. Omit to keep the current style."},"narrator_voice_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Narrator Voice Id","description":"The book's new narrator. Omit to keep the narrator."},"reset_line_voices":{"type":"boolean","title":"Reset Line Voices","description":"Also clear the voices chosen for single lines, so those lines follow the narrator or their character again. Locked lines are never changed.","default":false}},"type":"object","title":"VoicesChangeRequest","description":"``POST /projects/{id}/voices/preview`` (WEB-1095)."},"VoicesPreviewResponse":{"properties":{"narration_style":{"type":"string","enum":["single","characters"],"title":"Narration Style"},"narrator_voice_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Narrator Voice Id"},"drift_lines":{"type":"integer","title":"Drift Lines","description":"Narrated lines whose audio is in a different voice from the one they would be read in after this change."},"own_voice_lines":{"type":"integer","title":"Own Voice Lines","description":"Unlocked lines with a voice chosen for that line alone."},"by_voice":{"items":{"$ref":"#/components/schemas/VoicesByVoice"},"type":"array","title":"By Voice","description":"The drifting lines by the voice they would take."},"paragraph_ids":{"items":{"type":"string"},"type":"array","title":"Paragraph Ids","description":"The drifting lines, in reading order."},"renarrate":{"$ref":"#/components/schemas/VoicesRenarrate"},"cast_preview":{"anyOf":[{"items":{"$ref":"#/components/schemas/VoicesCastPreview"},"type":"array"},{"type":"null"}],"title":"Cast Preview","description":"With narration_style 'characters': each visible character and the voice they would have."},"preview_hash":{"type":"string","title":"Preview Hash"}},"type":"object","required":["narration_style","drift_lines","own_voice_lines","renarrate","preview_hash"],"title":"VoicesPreviewResponse"},"VoicesRenarrate":{"properties":{"lines":{"type":"integer","title":"Lines","description":"Lines that would be re-narrated."},"credits":{"type":"integer","title":"Credits","description":"Credits re-narrating them costs (0 when included)."},"included":{"type":"boolean","title":"Included","description":"True when the re-narration is covered by the whole-book voice swap included with a book bought per finished hour.","default":false},"swap_available":{"type":"boolean","title":"Swap Available","description":"The book's included voice swap is still unused.","default":false},"balance":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Balance","description":"Your credit balance now (subscription + pay as you go)."}},"type":"object","required":["lines","credits"],"title":"VoicesRenarrate"},"WalletBalanceResponse":{"properties":{"balance_cents":{"type":"integer","title":"Balance Cents"},"balance_usd":{"type":"string","title":"Balance Usd"},"total_topup_cents":{"type":"integer","title":"Total Topup Cents"},"total_topup_usd":{"type":"string","title":"Total Topup Usd"},"total_spent_cents":{"type":"integer","title":"Total Spent Cents"},"total_spent_usd":{"type":"string","title":"Total Spent Usd"},"low_balance_warning":{"type":"boolean","title":"Low Balance Warning"},"warning_threshold_cents":{"type":"integer","title":"Warning Threshold Cents"}},"type":"object","required":["balance_cents","balance_usd","total_topup_cents","total_topup_usd","total_spent_cents","total_spent_usd","low_balance_warning","warning_threshold_cents"],"title":"WalletBalanceResponse","description":"Response for wallet balance endpoint"},"WalletConfig":{"properties":{"minimum_topup_cents":{"type":"integer","title":"Minimum Topup Cents"},"minimum_topup_usd":{"type":"string","title":"Minimum Topup Usd"},"maximum_topup_cents":{"type":"integer","title":"Maximum Topup Cents"},"maximum_topup_usd":{"type":"string","title":"Maximum Topup Usd"},"low_balance_warning_cents":{"type":"integer","title":"Low Balance Warning Cents"},"currency":{"type":"string","title":"Currency"}},"type":"object","required":["minimum_topup_cents","minimum_topup_usd","maximum_topup_cents","maximum_topup_usd","low_balance_warning_cents","currency"],"title":"WalletConfig","description":"Wallet configuration"},"WebhookDeliveryResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"event_id":{"type":"string","format":"uuid","title":"Event Id"},"event_type":{"type":"string","title":"Event Type"},"status":{"type":"string","title":"Status"},"attempts":{"type":"integer","title":"Attempts"},"last_response_code":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Last Response Code"},"last_error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Error"},"next_retry_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Next Retry At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"delivered_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Delivered At"}},"type":"object","required":["id","event_id","event_type","status","attempts","created_at"],"title":"WebhookDeliveryResponse"},"WebhookEndpointCreate":{"properties":{"url":{"type":"string","title":"Url","description":"https URL we POST events to"},"events":{"items":{"type":"string"},"type":"array","title":"Events","description":"Event types to subscribe to (job.completed, job.failed, job.cancelled, narration.review_required, audiobook.cast.detected)"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"}},"type":"object","required":["url"],"title":"WebhookEndpointCreate"},"WebhookEndpointCreateResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"url":{"type":"string","title":"Url"},"events":{"items":{"type":"string"},"type":"array","title":"Events"},"active":{"type":"boolean","title":"Active"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"secret":{"type":"string","title":"Secret","description":"Signing secret — shown once, store it now"}},"type":"object","required":["id","url","events","active","created_at","secret"],"title":"WebhookEndpointCreateResponse","description":"Returned ONLY at creation — carries the raw signing secret exactly once."},"WebhookEndpointResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"url":{"type":"string","title":"Url"},"events":{"items":{"type":"string"},"type":"array","title":"Events"},"active":{"type":"boolean","title":"Active"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","url","events","active","created_at"],"title":"WebhookEndpointResponse"},"WebhookEndpointUpdate":{"properties":{"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"events":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Events"},"active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Active"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"}},"type":"object","title":"WebhookEndpointUpdate"},"_BatchStatusItem":{"properties":{"job_id":{"type":"string","title":"Job Id"},"tool":{"type":"string","title":"Tool"}},"type":"object","required":["job_id","tool"],"title":"_BatchStatusItem"},"app__api__v1__customer_feedback__FeedbackSubmission":{"properties":{"primary_use_case":{"type":"string","title":"Primary Use Case","description":"Primary use case for the product"},"usage_frequency":{"type":"string","title":"Usage Frequency","description":"How often they use the product"},"features_used":{"items":{"type":"string"},"type":"array","title":"Features Used","description":"Features they use regularly"},"most_valuable_feature":{"type":"string","title":"Most Valuable Feature","description":"Most valuable feature"},"unused_features":{"items":{"type":"string"},"type":"array","title":"Unused Features","description":"Features tried but don't use","default":[]},"unused_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unused Reason","description":"Why they don't use certain features"},"satisfaction_score":{"type":"integer","maximum":10.0,"minimum":1.0,"title":"Satisfaction Score","description":"Satisfaction score 1-10"},"likes_most":{"type":"string","title":"Likes Most","description":"What they like most"},"likes_least":{"type":"string","title":"Likes Least","description":"What they like least"},"nps_score":{"type":"integer","maximum":10.0,"minimum":0.0,"title":"Nps Score","description":"Net Promoter Score 0-10"},"top_feature_request":{"type":"string","title":"Top Feature Request","description":"Top feature they wish existed"},"top_improvement":{"type":"string","title":"Top Improvement","description":"Top thing to improve"},"beta_tester":{"type":"boolean","title":"Beta Tester","description":"Willing to beta test","default":false},"allow_follow_up":{"type":"boolean","title":"Allow Follow Up","description":"Allow follow-up contact","default":false},"preferred_contact_method":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Preferred Contact Method","description":"Preferred contact method"},"additional_comments":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Additional Comments","description":"Any additional comments"}},"type":"object","required":["primary_use_case","usage_frequency","features_used","most_valuable_feature","satisfaction_score","likes_most","likes_least","nps_score","top_feature_request","top_improvement"],"title":"FeedbackSubmission","description":"Customer feedback submission"},"app__api__v1__feedback_tracking__FeedbackSubmission":{"properties":{"user_id":{"type":"string","title":"User Id"},"user_email":{"type":"string","title":"User Email"},"use_case":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Use Case"},"satisfaction":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Satisfaction"},"nps":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Nps"},"additional_feedback":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Additional Feedback"}},"type":"object","required":["user_id","user_email"],"title":"FeedbackSubmission","description":"Model for unified feedback submission"},"app__schemas__enums__AudioFormat":{"type":"string","enum":["mp3","opus","aac","flac","wav","pcm"],"title":"AudioFormat","description":"Supported audio output formats for TTS"},"app__schemas__enums__VoiceType":{"type":"string","enum":["CUSTOM","STANDARD"],"title":"VoiceType","description":"Type of voice: custom (user-uploaded) or standard (public/provider)"},"app__schemas__media_converter__AudioFormat":{"type":"string","enum":["mp3","wav","aac","flac","ogg","opus","m4a","wma","aiff"],"title":"AudioFormat","description":"Supported audio output formats"},"app__schemas__music__AudioFormat":{"type":"string","enum":["wav","mp3","flac","ogg"],"title":"AudioFormat","description":"Supported audio output formats"},"app__schemas__podcast__VoiceType":{"type":"string","enum":["preset","cloned","standard"],"title":"VoiceType","description":"Type of voice for TTS."},"ErrorResponse":{"type":"object","title":"ErrorResponse","description":"Standard error envelope. Every 4xx and 5xx response from the AudioPod AI API carries `code`, `message` and `status`. Branch on `code` — a stable machine-readable string — rather than parsing `message`, which is human-facing prose and may be reworded at any time. `detail` and `error` are retained for backward compatibility with older integrations, and their shapes vary by endpoint.","properties":{"code":{"type":"string","description":"Stable machine-readable error code, present on every error response. **Branch on this field.** Values are additive and existing codes are not renamed.","examples":["NOT_FOUND","AUTHENTICATION_REQUIRED","RATE_LIMIT_EXCEEDED"]},"error":{"description":"Legacy error field. Usually the same string as `code`, but a few older endpoints emit an object here instead (`code` / `message` / `details`). Prefer `code`, which is always a string.","examples":["NOT_FOUND","AUTHENTICATION_REQUIRED"]},"message":{"type":"string","description":"Human-readable explanation. Do not parse.","examples":["The requested resource was not found."]},"status":{"type":"integer","description":"HTTP status code, repeated in the body for convenience.","examples":[404]},"detail":{"description":"Legacy detail payload, preserved verbatim for backward compatibility. A string for most errors, an array of field errors for validation failures, an object for auth failures."}},"required":["code","message","status"]},"InsufficientCreditsDetail":{"type":"object","title":"InsufficientCreditsDetail","description":"Everything needed to resolve a credit shortfall: what the job costs, what the account holds, and the ways to add more.","properties":{"error":{"type":"string","description":"Always `INSUFFICIENT_CREDITS` on this response.","examples":["INSUFFICIENT_CREDITS"]},"message":{"type":"string","description":"Human-readable explanation. Do not parse."},"credits_required":{"type":["integer","null"],"description":"Credits this job needs. Null when the shortfall was detected without a priced estimate — show no figure rather than a wrong one."},"credits_available":{"type":"integer","description":"Total spendable credits: subscription plus pay-as-you-go."},"subscription_credits":{"type":"integer","description":"Plan credits remaining in the current cycle."},"payg_credits":{"type":"integer","description":"Pay-as-you-go credits, which never expire."},"current_plan":{"type":"string","examples":["Basic"]},"upgrade_options":{"type":"array","description":"Plans above the current one, cheapest first.","items":{"type":"object","properties":{"plan":{"type":"string"},"price":{"type":"string"},"credits":{"type":"string"},"annual":{"type":"string"}}}},"payg_option":{"type":"object","description":"Where to buy credits that never expire.","properties":{"description":{"type":"string"},"url":{"type":"string"}}},"upgrade_url":{"type":"string","examples":["/pricing"]},"auto_refill":{"type":"object","description":"Whether an automatic top-up is handling this shortfall. `off` means none is running and the caller should top up or upgrade; `pending` means one is in flight, so poll the balance and retry the same request; `failed` means one was attempted and did not complete; `ineligible` means automatic top-up cannot run for this account.","properties":{"state":{"type":"string","enum":["off","pending","failed","ineligible"]}},"required":["state"]},"upload_ref":{"type":["string","null"],"description":"Reference to the input already uploaded for this request, when there was one, so a retry after topping up does not have to send the file again. Null when the request carried no upload."}},"required":["error","message","credits_available","current_plan"]},"InsufficientCreditsResponse":{"type":"object","title":"InsufficientCreditsResponse","description":"Error envelope for a credit shortfall. Identical to ErrorResponse except that `detail` is the typed InsufficientCreditsDetail object.","properties":{"code":{"type":"string","description":"Stable machine-readable code. **Branch on this field.**","examples":["PAYMENT_REQUIRED"]},"error":{"type":"string","examples":["PAYMENT_REQUIRED"]},"message":{"type":"string","description":"Human-readable explanation. Do not parse."},"status":{"type":"integer","examples":[402]},"detail":{"$ref":"#/components/schemas/InsufficientCreditsDetail"}},"required":["code","message","status"]},"BulkMediaDownloadRequest":{"properties":{"media_files":{"items":{"type":"string"},"type":"array","maxItems":20,"title":"Media Files","description":"List of media file URLs to download"},"format":{"anyOf":[{"$ref":"#/components/schemas/MediaExtractionVideoFormat"},{"type":"null"}],"description":"Target format for conversion (optional)"},"quality":{"anyOf":[{"$ref":"#/components/schemas/MediaExtractionVideoQuality"},{"type":"null"}],"description":"Target quality","default":"best"},"create_playlist":{"type":"boolean","title":"Create Playlist","description":"Create a playlist file for audio files","default":false}},"type":"object","required":["media_files"],"title":"BulkMediaDownloadRequest","description":"Request to download multiple media files from discovered list"},"BulkVideoDownloadRequest":{"properties":{"urls":{"items":{"anyOf":[{"type":"string","maxLength":2083,"minLength":1,"format":"uri"},{"type":"string"}]},"type":"array","maxItems":10,"title":"Urls","description":"List of video URLs"},"format":{"anyOf":[{"$ref":"#/components/schemas/MediaExtractionVideoFormat"},{"type":"null"}],"description":"Desired output format","default":"mp4"},"quality":{"anyOf":[{"$ref":"#/components/schemas/MediaExtractionVideoQuality"},{"type":"null"}],"description":"Video quality","default":"best"},"audio_only":{"type":"boolean","title":"Audio Only","description":"Extract audio only","default":false},"include_thumbnail":{"type":"boolean","title":"Include Thumbnail","description":"Download video thumbnails","default":true}},"type":"object","required":["urls"],"title":"BulkVideoDownloadRequest","description":"Request to download multiple videos"},"BulkVideoDownloadResponse":{"properties":{"jobs":{"items":{"$ref":"#/components/schemas/VideoDownloadJob"},"type":"array","title":"Jobs","description":"Created download jobs"},"successful":{"type":"integer","title":"Successful","description":"Number of successfully created jobs"},"failed":{"type":"integer","title":"Failed","description":"Number of failed job creations"},"errors":{"items":{"type":"string"},"type":"array","title":"Errors","description":"Error messages for failed jobs"},"message":{"type":"string","title":"Message","description":"Overall response message"}},"type":"object","required":["jobs","successful","failed","errors","message"],"title":"BulkVideoDownloadResponse","description":"Response for bulk video download request"},"DiscoveredMediaFile":{"properties":{"url":{"type":"string","title":"Url","description":"Direct URL to the media file"},"file_type":{"type":"string","title":"File Type","description":"Type of media file (audio/video)"},"title":{"type":"string","title":"Title","description":"Title or name of the media file"},"format":{"type":"string","title":"Format","description":"File format/extension"},"size":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Size","description":"File size in bytes"},"estimated_size_mb":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Estimated Size Mb","description":"Estimated file size in MB"},"duration":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Duration","description":"Duration if available"}},"type":"object","required":["url","file_type","title","format"],"title":"DiscoveredMediaFile","description":"Information about a discovered media file"},"HTMLMediaDiscoveryRequest":{"properties":{"url":{"anyOf":[{"type":"string","maxLength":2083,"minLength":1,"format":"uri"},{"type":"string"}],"title":"Url","description":"URL of HTML page to parse for media files"},"max_files":{"type":"integer","maximum":100.0,"minimum":1.0,"title":"Max Files","description":"Maximum number of media files to discover","default":50},"validate_files":{"type":"boolean","title":"Validate Files","description":"Whether to validate that URLs actually point to media files","default":true},"include_audio":{"type":"boolean","title":"Include Audio","description":"Include audio files in discovery","default":true},"include_video":{"type":"boolean","title":"Include Video","description":"Include video files in discovery","default":true}},"type":"object","required":["url"],"title":"HTMLMediaDiscoveryRequest","description":"Request to discover media files from HTML pages"},"HTMLMediaDiscoveryResponse":{"properties":{"source_url":{"type":"string","title":"Source Url","description":"Original URL that was parsed"},"page_title":{"type":"string","title":"Page Title","description":"Title of the HTML page"},"page_description":{"type":"string","title":"Page Description","description":"Description of the HTML page"},"total_files":{"type":"integer","title":"Total Files","description":"Total number of media files discovered"},"audio_files":{"items":{"$ref":"#/components/schemas/DiscoveredMediaFile"},"type":"array","title":"Audio Files","description":"List of discovered audio files"},"video_files":{"items":{"$ref":"#/components/schemas/DiscoveredMediaFile"},"type":"array","title":"Video Files","description":"List of discovered video files"},"audio_count":{"type":"integer","title":"Audio Count","description":"Number of audio files found"},"video_count":{"type":"integer","title":"Video Count","description":"Number of video files found"},"discovery_method":{"type":"string","title":"Discovery Method","description":"Method used for discovery"}},"type":"object","required":["source_url","page_title","page_description","total_files","audio_files","video_files","audio_count","video_count","discovery_method"],"title":"HTMLMediaDiscoveryResponse","description":"Response containing discovered media files from HTML page"},"VideoDownloadJob":{"properties":{"id":{"type":"integer","title":"Id","description":"Job ID (0 while only the fast-poll id exists)"},"redis_job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fast-poll job id","description":"Fast-poll job id for public downloads (use for polling)"},"user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id","description":"User ID"},"source_url":{"type":"string","title":"Source Url","description":"Source video URL"},"video_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Video Id","description":"Platform video ID"},"platform":{"$ref":"#/components/schemas/VideoPlatform","description":"Video platform"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title","description":"Video title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Video description"},"uploader":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Uploader","description":"Uploader name"},"duration":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Duration","description":"Duration in seconds"},"upload_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Upload Date","description":"Upload date (YYYYMMDD)"},"view_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"View Count","description":"View count"},"thumbnail_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail Url","description":"Thumbnail URL"},"requested_format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Requested Format","description":"Requested format"},"requested_quality":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Requested Quality","description":"Requested quality"},"audio_only":{"type":"boolean","title":"Audio Only","description":"Audio only download","default":false},"status":{"$ref":"#/components/schemas/ProcessingStatus","description":"Job status"},"progress":{"type":"number","title":"Progress","description":"Progress percentage (0-100)","default":0.0},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"Creation timestamp"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At","description":"Last update timestamp"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At","description":"Completion timestamp"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message","description":"Error message if failed"},"output_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Output Path","description":"Storage path of the downloaded file"},"audio_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Audio Path","description":"Storage path of the extracted audio"},"thumbnail_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail Path","description":"Storage path of the thumbnail image"},"file_size":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"File Size","description":"File size in bytes"},"actual_format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Actual Format","description":"Actual format downloaded"},"estimated_credits":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Estimated Credits","description":"Estimated credits"},"actual_credits":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Actual Credits","description":"Actual credits used"},"parameters":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Parameters","description":"Job parameters"},"result":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Result","description":"Job result with download URLs"},"billing_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Billing Status","description":"Billing status: PAID, DEFERRED, or REFUNDED"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At","description":"When deferred job results expire"},"r2_purged_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"R2 Purged At"}},"type":"object","required":["id","source_url","platform","status","created_at"],"title":"VideoDownloadJob","description":"Video download job information"},"VideoDownloadJobUpdate":{"properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title","description":"Custom title"}},"type":"object","title":"VideoDownloadJobUpdate","description":"Request to update job metadata"},"VideoDownloadListResponse":{"properties":{"jobs":{"items":{"$ref":"#/components/schemas/VideoDownloadJob"},"type":"array","title":"Jobs","description":"List of download jobs"},"total":{"type":"integer","title":"Total","description":"Total number of jobs"},"page":{"type":"integer","title":"Page","description":"Current page number"},"per_page":{"type":"integer","title":"Per Page","description":"Jobs per page"},"total_pages":{"type":"integer","title":"Total Pages","description":"Total number of pages"}},"type":"object","required":["jobs","total","page","per_page","total_pages"],"title":"VideoDownloadListResponse","description":"Response for listing video download jobs"},"VideoDownloadRequest":{"properties":{"url":{"anyOf":[{"type":"string","maxLength":2083,"minLength":1,"format":"uri"},{"type":"string"}],"title":"Url","description":"YouTube video URL to download. Supported hosts: youtube.com, youtu.be, youtube-nocookie.com."},"format":{"anyOf":[{"$ref":"#/components/schemas/MediaExtractionVideoFormat"},{"type":"null"}],"description":"Desired output format","default":"mp4"},"quality":{"anyOf":[{"$ref":"#/components/schemas/MediaExtractionVideoQuality"},{"type":"null"}],"description":"Video quality","default":"best"},"audio_only":{"type":"boolean","title":"Audio Only","description":"Extract audio only","default":false},"include_thumbnail":{"type":"boolean","title":"Include Thumbnail","description":"Download video thumbnail","default":true},"template_slug":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Template Slug"}},"type":"object","required":["url"],"title":"VideoDownloadRequest","description":"Request to download a video in a specific format"},"VideoDownloadResponse":{"properties":{"job":{"$ref":"#/components/schemas/VideoDownloadJob","description":"Download job information"},"message":{"type":"string","title":"Message","description":"Response message"}},"type":"object","required":["job","message"],"title":"VideoDownloadResponse","description":"Response for video download request"},"VideoDownloadStatsResponse":{"properties":{"total_downloads":{"type":"integer","title":"Total Downloads","description":"Total downloads by user"},"total_duration":{"type":"number","title":"Total Duration","description":"Total duration downloaded (seconds)"},"total_credits_used":{"type":"integer","title":"Total Credits Used","description":"Total credits used"},"downloads_by_platform":{"additionalProperties":{"type":"integer"},"type":"object","title":"Downloads By Platform","description":"Downloads by platform"},"downloads_by_format":{"additionalProperties":{"type":"integer"},"type":"object","title":"Downloads By Format","description":"Downloads by format"},"recent_downloads":{"items":{"$ref":"#/components/schemas/VideoDownloadJob"},"type":"array","title":"Recent Downloads","description":"Recent downloads"}},"type":"object","required":["total_downloads","total_duration","total_credits_used","downloads_by_platform","downloads_by_format","recent_downloads"],"title":"VideoDownloadStatsResponse","description":"Response for download statistics"},"VideoFormatInfo":{"properties":{"format_id":{"type":"string","title":"Format Id","description":"Identifier for this format, as returned in the format list"},"format_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format Note","description":"Human readable format description"},"ext":{"type":"string","title":"Ext","description":"File extension"},"resolution":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resolution","description":"Video resolution (e.g., 1920x1080)"},"fps":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Fps","description":"Frames per second"},"tbr":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Tbr","description":"Total bitrate"},"vbr":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Vbr","description":"Video bitrate"},"abr":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Abr","description":"Audio bitrate"},"asr":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Asr","description":"Audio sample rate"},"vcodec":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vcodec","description":"Video codec"},"acodec":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Acodec","description":"Audio codec"},"filesize":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Filesize","description":"File size in bytes"},"quality":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Quality","description":"Quality score"},"has_video":{"type":"boolean","title":"Has Video","description":"Has video stream","default":false},"has_audio":{"type":"boolean","title":"Has Audio","description":"Has audio stream","default":false}},"type":"object","required":["format_id","ext"],"title":"VideoFormatInfo","description":"Information about a specific video format"},"VideoInfoRequest":{"properties":{"url":{"anyOf":[{"type":"string","maxLength":2083,"minLength":1,"format":"uri"},{"type":"string"}],"title":"Url","description":"YouTube video URL. Supported hosts: youtube.com, youtu.be, youtube-nocookie.com. Other platforms are not currently supported."},"include_formats":{"type":"boolean","title":"Include Formats","description":"Include available formats information","default":true}},"type":"object","required":["url"],"title":"VideoInfoRequest","description":"Request to get video information without downloading"},"VideoInfoResponse":{"properties":{"id":{"type":"string","title":"Id","description":"Video ID"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title","description":"Video title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Video description"},"uploader":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Uploader","description":"Channel name or username"},"duration":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Duration","description":"Duration in seconds"},"is_live":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Live","description":"True when the source is a live stream"},"upload_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Upload Date","description":"Upload date (YYYYMMDD)"},"view_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"View Count","description":"View count"},"thumbnail_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail Url","description":"Thumbnail URL"},"platform":{"$ref":"#/components/schemas/VideoPlatform","description":"Video platform"},"webpage_url":{"type":"string","title":"Webpage Url","description":"Original webpage URL"},"available_formats":{"anyOf":[{"items":{"$ref":"#/components/schemas/VideoFormatInfo"},"type":"array"},{"type":"null"}],"title":"Available Formats","description":"Available formats"},"estimated_credits":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Estimated Credits","description":"Estimated credits for download"}},"type":"object","required":["id","platform","webpage_url"],"title":"VideoInfoResponse","description":"Response with video information"},"VideoPlatform":{"type":"string","enum":["youtube","tiktok","instagram","vimeo","spotify","twitter","facebook","twitch","dailymotion","other"],"title":"VideoPlatform","description":"Supported video platforms"},"MediaExtractionVideoFormat":{"type":"string","enum":["mp4","webm","mkv","flv","avi","mov","mp3","wav","aac","m4a","ogg","opus"],"title":"MediaExtractionVideoFormat","description":"Video format options"},"MediaExtractionVideoQuality":{"type":"string","enum":["best","worst","bestvideo","worstvideo","144p","240p","360p","480p","720p","1080p","1440p","2160p"],"title":"MediaExtractionVideoQuality","description":"Video quality options"}},"securitySchemes":{"OAuth2PasswordBearer":{"type":"oauth2","flows":{"password":{"scopes":{},"tokenUrl":"/api/v1/auth/token"}}},"OptionalOAuth2Scheme":{"type":"oauth2","flows":{"password":{"scopes":{},"tokenUrl":"/api/v1/auth/token"}}},"apiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key","description":"AudioPod API key. Create one in the dashboard under API Keys and send it as `X-API-Key: ap_...`. This is the recommended method for server-to-server and agent integrations."},"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Session token obtained from `/api/v1/auth/token`. Intended for first-party web sessions; prefer an API key for integrations."}},"responses":{"BadRequest":{"description":"Bad request — malformed syntax or an invalid parameter combination.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"Unauthorized":{"description":"Authentication required or the supplied credential is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"PaymentRequired":{"description":"Not enough credits to run this job. `detail` carries the typed InsufficientCreditsDetail object: what the job costs, what the account holds, and how to add more.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InsufficientCreditsResponse"}}}},"Forbidden":{"description":"Authenticated, but not permitted (wrong scope, or a plan-gated feature).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"NotFound":{"description":"The requested resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"Conflict":{"description":"Conflict with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"ValidationFailed":{"description":"Request validation failed. `detail` lists the offending fields.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"RateLimited":{"description":"Rate limit exceeded. Honour `Retry-After` before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"InternalError":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"ServiceUnavailable":{"description":"Temporarily unavailable. Safe to retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"headers":{"RateLimitLimit":{"description":"Request quota for the current window on this route.","schema":{"type":"integer"}},"RateLimitRemaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"RateLimitReset":{"description":"Seconds until the current window resets.","schema":{"type":"integer"}},"RateLimitPolicy":{"description":"Quota policy for this route, e.g. `100;w=60`. Limits scale with subscription tier.","schema":{"type":"string"}},"RetryAfter":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"tags":[{"name":"auth","description":"Authentication and user management"},{"name":"voice","description":"Voice cloning and synthesis"},{"name":"music","description":"AI music generation and editing"},{"name":"speaker","description":"Speaker analysis and extraction"},{"name":"denoiser","description":"Audio noise reduction"},{"name":"stem-extraction","description":"Music stem separation"},{"name":"transcription","description":"Speech-to-text conversion"},{"name":"video","description":"Video download and processing"},{"name":"media-extraction","description":"Pull audio and video in from a source URL: read its metadata, queue a download, and track the job."},{"name":"subscriptions","description":"Subscription management"},{"name":"credits","description":"Credits and billing"},{"name":"dashboard","description":"User dashboard and analytics"},{"name":"feedback","description":"User feedback system"},{"name":"newsletter","description":"Newsletter subscription"},{"name":"contact","description":"Contact forms and inquiries"},{"name":"health","description":"Health checks and monitoring"},{"name":"streaming","description":"Real-time streaming services"},{"name":"dev","description":"Development utilities (non-production)"}],"servers":[{"url":"https://api.audiopod.ai","description":"Production"}],"security":[{"apiKeyAuth":[]},{"bearerAuth":[]}]}