Ref: Error Codes
The API uses standard HTTP status codes and returns a JSON body with a message describing the error.
| Status | Message Example | Description |
|---|---|---|
| 400 | Missing required parameter: q | A required parameter is missing or the input is invalid. |
| 401 | Invalid token | The Bearer token is missing, expired, or incorrect. |
| 402 | OpenAPI requires Pro or Enterprise plan / Insufficient credits | Open API access requires a Pro or Enterprise plan, or the account has insufficient transcribe credits. |
| 404 | Episode not found | The requested resource does not exist. The error field will be not_found. |
| 404 | Episode has not been transcribed yet | The episode exists but has no processed content. The error field will be not_transcribed. |
| 404 | Translation is not available yet | The episode is transcribed but the requested translation is not available yet. The error field will be not_translated. |
| 404 | Clip is not ready | The Clip exists but has not completed generation. The error field will be not_ready. |
| 429 | Rate limit exceeded | Too many requests. Hourly limits are Pro 3,000 and Enterprise 10,000 requests per user. |
| 429 | Rate limit exceeded / Weekly rate limit exceeded | A summary or transcripts content quota is used up. The error field will be rate_limited. See Summary, Transcripts and Exports. |
| 500 | Internal server error | An unexpected server error occurred. Please retry later. |
Additional Error Codes by Endpoint
Some endpoints return specific error codes:
Summary, Transcripts and Exports
Fetching summaries and transcripts is also limited per user, on top of the hourly request limit. These limits exist to prevent abuse and are set well above normal usage, so most integrations never reach them. Each plan has a short-term and a longer-term allowance, and there are two separate quotas:
- Summary: Get Episode Summary.
- Transcripts: Get Episode Transcripts, Export Episode as Markdown and Export Episode as SRT share one quota.
Only successful responses count. A request uses the quota only when it returns the summary, transcript or export; requests that fail with an invalid seq, not_found, copyright_denied, not_transcribed or not_translated do not use it.
When a quota is used up, the API returns HTTP 429 and tells you when it resets:
{
"success": false,
"error": "rate_limited",
"message": "Weekly rate limit exceeded",
"scope": "week",
"retryAt": 1791849600000
}scope names the allowance that was exceeded. Wait until retryAt (Unix timestamp in milliseconds) or for the number of seconds in the Retry-After header before retrying; earlier retries keep returning 429.
not_transcribed and not_translated responses carry a Retry-After header with the minimum number of seconds to wait. To wait for an episode to finish processing, poll Get Episode Status and fetch the content once its status is done.
Import Episode
| Status | Error | Description |
|---|---|---|
| 400 | — | Missing or invalid url, unsupported URL format, or podcast/channel URL provided. |
| 403 | private_episode | The Xiaoyuzhou episode is private and cannot be imported. |
| 404 | not_found | The YouTube video was not found. |
| 409 | conflict | A conflict was detected during import. Please contact support. |
| 502 | fetch_error | Failed to fetch data from the source. Please try again later. |
Upload Audio
| Status | Error | Description |
|---|---|---|
| 402 | feature_not_available | Upload audio is not available for current plan. |
Process Episode
| Status | Error | Description |
|---|---|---|
| 402 | out_of_quota | Insufficient transcribe credits. |
Ask a Question
| Status | Error | Description |
|---|---|---|
| 429 | out_of_limit | Daily ask limit exceeded for your plan. |
Clips
| Status | Error | Description |
|---|---|---|
| 400 | — | Invalid Clip ID, Episode sequence number, or playback point. |
| 404 | not_found | Clip or Episode does not exist, or the Clip is not owned by the authenticated user. |
| 404 | not_transcribed | A Clip cannot be created because the Episode has not been transcribed. |
| 404 | not_ready | A single Clip is not ready to export. |
| 404 | no_ready_clips | An Episode has no ready Clips for a batch export. |
Send to Notion
| Status | Error | Description |
|---|---|---|
| 400 | not_connected | Notion is not connected. Connect via Podwise settings. |
| 400 | not_configured | Notion database is not configured. Configure via Podwise settings. |
| 400 | property_not_exists | A required property is missing from the Notion database. |
| 401 | unauthorized | Notion API token is invalid or expired. Reconnect via Podwise settings. |
| 404 | database_not_found | Notion database not found. Reconfigure via Podwise settings. |
| 429 | rate_limited | Notion API rate limited. Retry later. |
| 502 | notion_error | Unexpected Notion API error. |
| 504 | timeout | Notion API request timed out. |
Send to Readwise Reader
| Status | Error | Description |
|---|---|---|
| 400 | not_connected | Readwise is not connected. Configure API token via Podwise settings. |
| 401 | unauthorized | Readwise API token is invalid or expired. Reconfigure via Podwise settings. |
| 502 | readwise_error | Unexpected Readwise API error. |