--- category: SDK title: Getting Started description: "Install and start using the openstatus Node.js SDK" --- ## Get Your API Key Before using the SDK, you need an API key: 1. Log in to the [openstatus dashboard](https://app.openstatus.dev/login) 2. Go to **Settings** > **General** and find the **API Keys** card 3. Click **Create** and copy the key ## Installation ### npm ```bash npm install @openstatus/sdk-node ``` ### JSR ```bash npx jsr add @openstatus/sdk-node ``` ### Deno ```typescript import { createOpenStatusClient } from "jsr:@openstatus/sdk-node"; ``` ### Bun ```bash bun add @openstatus/sdk-node ``` ## Quick Start ```typescript import { createOpenStatusClient, Periodicity, Region, } from "@openstatus/sdk-node"; const client = createOpenStatusClient({ apiKey: process.env.OPENSTATUS_API_KEY, }); // Create an HTTP monitor const { monitor } = await client.monitor.v1.MonitorService.createHTTPMonitor({ monitor: { name: "My API", url: "https://api.example.com/health", periodicity: Periodicity.PERIODICITY_1M, regions: [Region.FLY_AMS, Region.FLY_IAD, Region.FLY_SYD], active: true, }, }); console.log(`Monitor created: ${monitor?.id}`); // List all monitors const { httpMonitors, tcpMonitors, dnsMonitors, totalSize } = await client.monitor.v1.MonitorService.listMonitors({}); console.log(`Found ${totalSize} monitors`); ``` ## Runtime Support The SDK talks to the API over a fetch-based Connect transport (`@connectrpc/connect-web`), so it runs on any runtime with a global `fetch`: | Runtime | Version | Module Format | |--------------------|---------|---------------| | Node.js | 18+ | ESM and CJS | | Deno | 2+ | ESM (native) | | Bun | Latest | ESM | | Cloudflare Workers | — | ESM (edge) | ### Cloudflare Workers and edge runtimes `@connectrpc/connect-web` sets `redirect: "error"` on every request. Node, Deno, and Bun's `fetch` support that mode, so they need no setup — but Cloudflare Workers (`workerd`) doesn't, so **every** request there fails with `The redirect mode 'error' is not supported`. On Workers, pass a transport with a redirect-normalizing `fetch` (the SDK re-exports `createAuthInterceptor` and the service descriptors for this): ```typescript import { createConnectTransport } from "@connectrpc/connect-web"; import { createAuthInterceptor, createOpenStatusClient, } from "@openstatus/sdk-node"; const client = createOpenStatusClient({ transport: createConnectTransport({ baseUrl: "https://api.openstatus.dev/rpc", interceptors: [createAuthInterceptor(env.OPENSTATUS_API_KEY)], // workerd does not implement fetch's `redirect: "error"`; normalise it. fetch: (input, init) => fetch( input, init?.redirect === "error" ? { ...init, redirect: "manual" } : init, ), }), }); ``` ## Full Workflow Example A complete example: create a monitor, set up a status page, add the monitor as a component, configure a Slack notification, and check overall status. ```typescript import { createOpenStatusClient, NotificationProvider, Periodicity, Region, } from "@openstatus/sdk-node"; const client = createOpenStatusClient({ apiKey: process.env.OPENSTATUS_API_KEY, }); // 1. Check API health const health = await client.health.v1.HealthService.check({}); console.log(`API status: ${health.status}`); // 2. Create an HTTP monitor const { monitor } = await client.monitor.v1.MonitorService.createHTTPMonitor({ monitor: { name: "Production API", url: "https://api.example.com/health", periodicity: Periodicity.PERIODICITY_1M, regions: [Region.FLY_AMS, Region.FLY_IAD, Region.FLY_SYD], active: true, }, }); // 3. Create a status page const { statusPage } = await client.statusPage.v1.StatusPageService .createStatusPage({ title: "Example Status", slug: "example-status", description: "Status page for Example services", }); // 4. Add the monitor as a component const { component } = await client.statusPage.v1.StatusPageService .addMonitorComponent({ pageId: statusPage!.id, monitorId: monitor!.id, name: "Production API", }); // 5. Set up Slack notifications const { notification } = await client.notification.v1.NotificationService .createNotification({ name: "Slack Alerts", provider: NotificationProvider.SLACK, data: { data: { case: "slack", value: { webhookUrl: "https://hooks.slack.com/services/..." }, }, }, monitorIds: [monitor!.id], }); // 6. Check overall status const { overallStatus } = await client.statusPage.v1.StatusPageService .getOverallStatus({ identifier: { case: "id", value: statusPage!.id }, }); console.log(`Overall status: ${overallStatus}`); ```