statusas docs
SdkNodejs

Error Handling

Handle errors and implement retry strategies with the statusas Node.js SDK

The SDK uses ConnectRPC. Errors are thrown as ConnectError instances from the @connectrpc/connect package.

import { ConnectError } from "@connectrpc/connect";

try {
  await client.monitor.v1.MonitorService.deleteMonitor({ id: "invalid" });
} catch (error) {
  if (error instanceof ConnectError) {
    console.error(`Code: ${error.code}`);
    console.error(`Message: ${error.message}`);
  }
}

Common Error Codes

CodeDescription
unauthenticatedMissing or invalid API key
not_foundResource does not exist
invalid_argumentValidation failure (e.g., missing required field, value out of range)
permission_deniedNo access to this workspace or resource
already_existsDuplicate resource (e.g., slug already taken)
resource_exhaustedRate limited (HTTP 429); wait for the Retry-After header, see API rate limits
unavailableThe server is shedding load (HTTP 503); retry with backoff

Retry Strategy

ConnectRPC does not retry by default. For transient failures (resource_exhausted, unavailable, deadline_exceeded), implement your own retry logic. The response headers, including Retry-After, are available on error.metadata; keep the delay at or above that value when it is present:

import { Code, ConnectError } from "@connectrpc/connect";

async function withRetry<T>(fn: () => Promise<T>, maxRetries = 3): Promise<T> {
  for (let attempt = 0; attempt <= maxRetries; attempt++) {
    try {
      return await fn();
    } catch (error) {
      if (
        error instanceof ConnectError &&
        (error.code === Code.ResourceExhausted ||
          error.code === Code.Unavailable ||
          error.code === Code.DeadlineExceeded) &&
        attempt < maxRetries
      ) {
        const retryAfter = Number(error.metadata.get("retry-after")) * 1000;
        const backoff = 1000 * 2 ** attempt;
        await new Promise((resolve) =>
          setTimeout(resolve, Math.max(retryAfter || 0, backoff)),
        );
        continue;
      }
      throw error;
    }
  }
  throw new Error("Unreachable");
}

const { httpMonitors } = await withRetry(() =>
  client.monitor.v1.MonitorService.listMonitors({})
);

On this page