Error Reference
All errors return a consistent JSON body with error and message fields.
Error response shape
Every non-2xx response from the API includes a JSON body in the following format.
The request_id field uniquely identifies the failed request — include it
when contacting support.
{
"error": "not_found",
"message": "Briefing not found",
"request_id": "req_01abc123"
}
HTTP status codes
| Code | Status | Meaning |
|---|---|---|
| 200 | OK | Request succeeded. |
| 201 | Created | Resource was successfully created. |
| 202 | Accepted | Async job has been queued. Poll or use a webhook for the result. |
| 400 | Bad Request | Validation error — invalid JSON, missing required fields, or invalid field values. |
| 401 | Unauthorized | Missing or invalid API key. Check your Authorization header. |
| 403 | Forbidden | Valid key but insufficient scope; or the action requires an active subscription. |
| 404 | Not Found | Resource doesn't exist, or doesn't belong to your account. |
| 409 | Conflict | Duplicate request — e.g. a briefing is already running for this profile. |
| 429 | Too Many Requests | Rate limit exceeded. Check Retry-After header and back off. |
| 500 | Internal Server Error | Unexpected server-side error. Retry with exponential backoff; report if persistent. |
Error codes
The error field in the JSON body contains a machine-readable slug that tells
you exactly what went wrong and how to fix it:
| Error code | HTTP | What to do |
|---|---|---|
validation_error |
400 | Fix the request body — check required fields and data types in the error message. |
unauthorized |
401 | Check your API key. Ensure the Authorization: Bearer lb_api_... header is present and correct. |
forbidden |
403 | Check that your key has the required scope, or that your account has an active subscription. |
not_found |
404 | The resource ID is wrong, was deleted, or belongs to a different account. |
conflict |
409 | A duplicate resource or concurrent operation conflict. Wait and retry, or check your request for duplicates. |
rate_limited |
429 | Wait for Retry-After seconds before retrying. See the Rate Limits guide. |
not_ready |
404 | The briefing has not completed yet. Poll again later or use a webhook to be notified when it's ready. |
internal_error |
500 | Retry with exponential backoff. If the error persists, contact api@listenbrief.com with the request_id. |
Debugging tips
Every response — including error responses — includes an X-Request-Id header
containing a unique identifier for that request. When submitting a bug report or support
request, always include this value so the team can locate the exact request in the logs.
# Capture the request ID from any response
curl -i https://listenbrief.com/api/v1/briefings/job_abc123 \
-H "Authorization: Bearer lb_api_YOUR_KEY" \
| grep -i x-request-id
# Example output:
# X-Request-Id: req_01abc123
-
Check your audit log at
GET /api/v1/usagefor a record of recent API activity, including failed requests. -
For
403 forbiddenerrors, cross-check the scopes on your key against the Scopes table in the Auth guide. -
For
401 unauthorized, confirm the raw value of your key starts withlb_api_and has not been revoked in Settings → API Keys. -
For persistent
500errors, retry with exponential backoff and report therequest_idto api@listenbrief.com.