WebUplink

Error Reference

Complete reference for all WebUplink API error codes with resolution steps.

Error Reference

All errors return a consistent JSON shape:

{
  "error": "QUOTA_EXCEEDED",
  "message": "Monthly action quota exceeded. Upgrade your plan.",
  "request_id": "req-abc-123",
  "retry_after": 0
}

Use error for programmatic handling and request_id for support tickets.

Error Codes

CodeHTTPRetryableResolution
UNAUTHORIZED401NoCheck API key format and validity
VALIDATION_ERROR400NoCheck request body against the schema
DOMAIN_BLOCKED403NoURL is on the restricted list (banking, streaming, ticketing)
SESSION_NOT_FOUND404NoSession may have expired — create a new one
SESSION_BUSY409YesWait for the current request to complete
SESSION_EXPIRED410NoSession timed out (2min idle or 15min total) — create a new one
PLAN_RESTRICTED402NoFeature requires a higher plan — upgrade
NO_SUBSCRIPTION402NoSubscribe to access billing features
QUOTA_EXCEEDED429NoMonthly action limit reached — upgrade or wait for reset
RATE_LIMITED429YesToo many requests — check retry_after field
PERCEPTION_FAILED502YesPage extraction failed — retry the request
LLM_ERROR502YesAI processing failed — retry with backoff
BROWSER_ERROR503YesBrowser infrastructure unavailable — retry after 5s
INTERNAL_ERROR500YesUnexpected server error — retry with exponential backoff

Handling Errors in the SDK

import { WebUplink, WebUplinkError } from 'webuplink';

const client = new WebUplink({
  apiKey: process.env.WEBUPLINK_API_KEY!,
  baseUrl: 'https://api.webuplink.ai',
});

try {
  const page = await client.browse('https://example.com');
} catch (err) {
  if (err instanceof WebUplinkError) {
    console.log(err.code);       // 'QUOTA_EXCEEDED'
    console.log(err.statusCode); // 429
    console.log(err.requestId);  // 'req-abc-123'
    console.log(err.retryable);  // false
    console.log(err.retryAfter); // undefined

    if (err.retryable && err.retryAfter) {
      // Wait and retry
      await new Promise(r => setTimeout(r, err.retryAfter! * 1000));
    }
  }
}

Retry Behavior

The SDK automatically retries retryable errors with the following rules:

  • Connection errors (network failures) are always retried with linear backoff
  • Server errors with retry_after are retried after the specified wait time
  • Tool execution requests are never automatically retried (non-idempotent)
  • Maximum retry attempts: 3 (configurable via maxRetries option)
// Disable retries entirely
const client = new WebUplink({
  apiKey: '...',
  baseUrl: '...',
  retry: false,
});

Rate Limits

Rate limits are per-tenant, per-minute:

PlanRequests/minute
Free10
Builder60
Pro120

When rate limited, the response includes a retry_after field with the number of seconds to wait.

On this page