{"version":"1","count":44,"errors":[{"code":"MISSING_API_KEY","httpStatus":401,"description":"No Authorization header was provided.","resolution":"Include 'Authorization: Bearer sk_live_xxx' in your request."},{"code":"INVALID_API_KEY_FORMAT","httpStatus":401,"description":"API key does not start with 'sk_live_'.","resolution":"Keys must start with 'sk_live_'. Create one under Settings, API."},{"code":"INVALID_API_KEY","httpStatus":401,"description":"The provided API key does not exist or has been deleted.","resolution":"Check the key value or generate a new one in your dashboard."},{"code":"API_KEY_REVOKED","httpStatus":403,"description":"The API key has been manually revoked.","resolution":"Generate a new API key in your dashboard."},{"code":"API_KEY_EXPIRED","httpStatus":403,"description":"The API key passed its expiry date.","resolution":"Create a new API key. Expired keys cannot be renewed."},{"code":"EMAIL_NOT_VERIFIED","httpStatus":403,"description":"The account's email address has not been verified.","resolution":"Check your inbox and click the verification link."},{"code":"ACCOUNT_SUSPENDED","httpStatus":403,"description":"The account has been suspended.","resolution":"Contact support to appeal."},{"code":"REGION_BLOCKED","httpStatus":451,"description":"The service is not available in the region the request came from.","resolution":"The API is not offered in this region."},{"code":"RATE_LIMIT_EXCEEDED","httpStatus":429,"description":"You have exceeded the rate limit (60 requests/minute by default).","resolution":"Wait until the Retry-After header interval has elapsed before retrying."},{"code":"INSUFFICIENT_CREDITS","httpStatus":402,"description":"Not enough credits in the account balance for this operation.","resolution":"Buy credits at the purchaseUrl in the response. The body includes requiredCredits and balance."},{"code":"BILLING_HOLD","httpStatus":402,"description":"The account balance is negative after a refund or dispute, so priced calls are paused.","resolution":"Buy credits to bring the balance back to zero or above."},{"code":"INVALID_JSON","httpStatus":400,"description":"Request body is not valid JSON.","resolution":"Ensure you send valid JSON and set Content-Type: application/json."},{"code":"INVALID_STATUS","httpStatus":400,"description":"The status filter is not a valid job status.","resolution":"Valid values: UPLOADED, IDENTIFYING, IDENTIFIED, HELD, PENDING, PROCESSING, COMPLETED, FAILED, REFUSED, EXPIRED."},{"code":"INVALID_TIER","httpStatus":400,"description":"The tier is not QUICK or GPU.","resolution":"Send tier: 'QUICK' or 'GPU'."},{"code":"ATTESTATION_REQUIRED","httpStatus":400,"description":"rightsAttested was not true.","resolution":"Send rightsAttested: true to confirm the image is yours or you have the right to edit it."},{"code":"MISSING_FILENAME","httpStatus":400,"description":"No filename was provided in the upload request.","resolution":"Include 'filename' in the POST /upload request body."},{"code":"UNSUPPORTED_FORMAT","httpStatus":400,"description":"The file extension is not a supported image format.","resolution":"Supported formats: PNG, JPG, WebP, AVIF. Convert HEIC to JPEG or PNG."},{"code":"STORAGE_NOT_CONFIGURED","httpStatus":503,"description":"Server-side storage is not configured.","resolution":"Contact support. This is a server configuration issue."},{"code":"MISSING_UPLOAD_KEY","httpStatus":400,"description":"No uploadKey was provided.","resolution":"Pass the uploadKey returned by POST /upload."},{"code":"UPLOAD_NOT_FOUND","httpStatus":404,"description":"The uploadKey is unknown, expired, already used, or was issued to another account.","resolution":"Request a new upload URL with POST /upload. Upload URLs expire after 15 minutes and a key can be used once."},{"code":"FILE_NOT_FOUND","httpStatus":400,"description":"No file was found at the uploadKey. The PUT may not have completed.","resolution":"PUT the image to the uploadUrl, then call POST /identify."},{"code":"FILE_TOO_LARGE","httpStatus":400,"description":"File exceeds the size limit.","resolution":"Use an image under 120 MB."},{"code":"UNREADABLE_IMAGE","httpStatus":400,"description":"The file could not be read as an image.","resolution":"Check the file is a valid PNG, JPG, WebP or AVIF."},{"code":"OVER_MAX_MEGAPIXELS","httpStatus":422,"description":"The image is over 25 megapixels. It can be identified but not processed.","resolution":"Downscale the image to 25 MP or less."},{"code":"JOB_NOT_FOUND","httpStatus":404,"description":"Job not found or does not belong to your account.","resolution":"Verify the job ID. Jobs are scoped to the authenticated user."},{"code":"JOB_NOT_IDENTIFIED","httpStatus":409,"description":"The job is not in the IDENTIFIED state, so it cannot be processed.","resolution":"Wait for identify to finish, or do not process the same job twice."},{"code":"JOB_PROCESSING","httpStatus":409,"description":"The job is running and cannot be deleted until this run ends.","resolution":"Delete it after it finishes."},{"code":"REFUSED","httpStatus":422,"description":"Identify refused this image. The status is REFUSED and refusalReason says why.","resolution":"Nothing was charged and the file has been deleted."},{"code":"OFFER_NOT_AVAILABLE","httpStatus":422,"description":"The tier and keepResolution combination is not one of the job's offers.","resolution":"Pick one of the entries in the job's offers array."},{"code":"NO_INVISIBLE_TARGET","httpStatus":422,"description":"The GPU tier needs a hidden-watermark target, and identify found none.","resolution":"Send vendorHint, or use the QUICK tier."},{"code":"FORCE_REFUSED","httpStatus":422,"description":"force was set but identify found no AI signal in this image.","resolution":"Only images with an AI signal can be forced."},{"code":"SECOND_ATTESTATION_REQUIRED","httpStatus":422,"description":"No AI signal was found, so a vendor hint needs a second attestation.","resolution":"Add secondAttestation: 'vendor:<name>' confirming the image came from that generator."},{"code":"NOT_IMPLEMENTED","httpStatus":501,"description":"This endpoint is not available yet.","resolution":"Use POST /identify then POST /jobs/{id}/process."},{"code":"NOTHING_REMOVED","httpStatus":200,"description":"The run found nothing to remove. It is not charged and the free slot is returned."},{"code":"QUEUE_TIMEOUT","httpStatus":200,"description":"No worker picked the job up in time. Credits are refunded. Appears as a job errorCode, never as an HTTP error."},{"code":"WEBHOOK_LIMIT_REACHED","httpStatus":400,"description":"Account has reached the maximum of 5 webhooks.","resolution":"Delete an existing webhook before creating a new one."},{"code":"MISSING_URL","httpStatus":400,"description":"No webhook url was provided.","resolution":"Include 'url' in the request body."},{"code":"INVALID_URL","httpStatus":400,"description":"The webhook URL is malformed.","resolution":"Use a valid absolute https:// URL."},{"code":"INVALID_URL_PROTOCOL","httpStatus":400,"description":"Webhook URL must use HTTPS.","resolution":"Use an https:// URL for your webhook endpoint."},{"code":"PRIVATE_URL_NOT_ALLOWED","httpStatus":400,"description":"Webhook URL points at a private or local address.","resolution":"Use a publicly reachable URL."},{"code":"INVALID_EVENT","httpStatus":400,"description":"One or more event types in the events array are not valid.","resolution":"Valid events: job.identified, job.refused, job.process_blocked, job.completed, job.failed."},{"code":"WEBHOOK_NOT_FOUND","httpStatus":404,"description":"Webhook not found or does not belong to your account.","resolution":"Verify the webhook ID belongs to your account."},{"code":"INTERNAL_ERROR","httpStatus":500,"description":"An unexpected server-side error occurred.","resolution":"Retry with exponential backoff. Contact support if it persists."},{"code":"NOT_FOUND","httpStatus":404,"description":"No API endpoint exists at this path.","resolution":"Check the path against GET /api/v1/openapi. Endpoints are under /api/v1/ (e.g. /api/v1/identify)."}]}