Get API key

Error Codes

Every error response includes a machine-readable code, a human-readable message, and a unique requestId for support.

Error Response Format

{
  "success": false,
  "error": {
    "code": "INVALID_URL",
    "message": "URL not allowed: private IP range detected.",
    "details": [{ "path": "url", "message": "Must be a public URL" }]
  },
  "meta": {
    "requestId": "req_abc123",
    "timestamp": "2026-04-07T12:00:00Z"
  }
}

Authentication Errors

CodeHTTPCauseFix
MISSING_API_KEY401No API key in requestAdd Authorization: Bearer YOUR_KEY header
INVALID_API_KEY401API key not recognizedCheck your key at Dashboard → Keys
KEY_DISABLED403API key has been revokedCreate a new key in the dashboard
FORBIDDEN403Access denied (e.g., invalid image signature)Verify the signed URL has not expired or been tampered with

Validation Errors

CodeHTTPCauseFix
VALIDATION_ERROR400Invalid request parametersCheck the details array for specific field errors
INVALID_URL400URL failed validation (private IP, malformed, etc.)Use a publicly-accessible HTTP/HTTPS URL
INVALID_JSON400Request body is not valid JSONSet Content-Type: application/json and validate your JSON
UNSAFE_URL400URL flagged by Google Safe Browsing as malware/phishingThe target URL has been flagged as unsafe. Use a different URL.
INVALID_WEBHOOK_URL400Webhook URL failed SSRF validationUse a publicly-accessible HTTPS URL for webhooks

Rate Limit & Usage Errors

CodeHTTPCauseFix
RATE_LIMITED429Too many requests per minuteCheck Retry-After and wait, or upgrade for higher throughput (Free 3 → Basic 20 → Starter 60 → Pro 300 req/min)
USAGE_EXCEEDED429Monthly credit limit reachedUpgrade your plan or wait for monthly reset
QUEUE_LIMIT_REACHED429Too many concurrent async jobsWait for active jobs to complete, or upgrade for higher limits
BATCH_LIMIT_EXCEEDED400Batch size exceeds plan limitBasic: 10, Starter: 25, Pro: 100, Enterprise: 500 URLs per batch (batch is a paid-plan feature)

Plan & Feature Errors

CodeHTTPCauseFix
PLAN_UPGRADE_REQUIRED403Feature requires a higher plan (e.g., geo-targeting needs Pro)Upgrade your plan
GEO_FEATURE_UNAVAILABLE422Unsupported parameters used with geo-targetingRemove unsupported params (see error message for specifics)

Capture Errors

CodeHTTPCauseFix
TIMEOUT408Page load exceeded the timeoutIncrease timeout (max 60s) or set bestAttempt: true
CAPTURE_FAILED500Screenshot or PDF capture failedCheck the URL is accessible, try different parameters, or retry
EXTRACTION_FAILED422No article-like content found to extract (POST /v1/extract)Use a URL with readable article content, or capture an image/PDF instead
PAYLOAD_TOO_LARGE413Rendered or extracted output exceeds the size cap (large templated HTML, Markdown, or article content)Reduce the template data or content size; for extraction, target a smaller page
NOT_FOUND404Route, job, batch, or image not foundCheck the endpoint path and resource ID

Watch Errors

CodeHTTPCauseFix
WATCH_NOT_FOUND404Watch not found, or not owned by your accountCheck the watch ID; list yours with GET /v1/watches
WATCH_PAUSED409Ran a paused watch (POST /v1/watches/:id/run)Resume it first (PATCH /v1/watches/:id with paused: false)
WATCH_LIMIT_REACHED403Watch count (active + paused) exceeds your plan's limitDelete a watch, or upgrade your plan
WATCH_HOST_LIMIT_REACHED403More than 10 active watches aimed at one website (a separate anti-abuse cap, distinct from your plan's watch limit)Pause/delete a watch on that host, or watch a different host
WATCH_INTERVAL_TOO_FAST403intervalMinutes is below your plan's floor (Free 1440, Basic 180, Starter 60, Pro 30, Enterprise 5)Use a slower interval, or upgrade your plan

Server Errors

CodeHTTPCauseFix
CONFIGURATION_ERROR503Server-side configuration issue (e.g., geo service unavailable)Retry after a few minutes. If persistent, contact support.
INTERNAL_ERROR500Unexpected server errorRetry the request. If persistent, contact support with the requestId.

Handling Errors in Code

Both SDKs throw typed error objects with the error code, message, HTTP status, and request ID.

JavaScript
import { Rendex, RendexApiError } from "@copperline/rendex";

const rendex = new Rendex("YOUR_API_KEY");

try {
  const { image } = await rendex.screenshot({ url: "https://example.com" });
} catch (err) {
  if (err instanceof RendexApiError) {
    console.error(`[${err.errorCode}] ${err.message}`);
    console.error(`HTTP ${err.statusCode}, Request: ${err.requestId}`);
  }
}
Python
from rendex import Rendex, RendexApiError

rendex = Rendex("YOUR_API_KEY")

try:
    result = rendex.screenshot("https://example.com")
except RendexApiError as err:
    print(f"[{err.error_code}] {err.message}")
    print(f"HTTP {err.status_code}, Request: {err.request_id}")
Was this page helpful?