# SDKs

> The official Node.js and TypeScript SDK, and how to generate a client for any other language from openapi.json.

## Node.js and TypeScript

```bash
npm install justonair
```

[`justonair`](https://www.npmjs.com/package/justonair) is the official SDK: typed from the OpenAPI spec, no dependencies, ESM and CommonJS, Node 20 or newer. It also runs on Bun, Deno, edge runtimes and, for the public chat calls, in browsers.

```ts
import JustOnAir from 'justonair';

const joa = new JustOnAir(); // reads JOA_API_KEY
const stream = await joa.streams.create({ name: 'Town hall' });
console.log(stream.rtmp_url, stream.stream_key, stream.embed_url);
```

It covers the whole API:

| | |
|---|---|
| `joa.streams` | Create (with an automatic `Idempotency-Key`), get, list, `listAll`, update, end, replace the key, playback tokens, viewers |
| `joa.recordings` | Download link, delete, `waitUntilReady` |
| `joa.webhooks` | Endpoints, deliveries, and `verify` for incoming webhooks (Standard Webhooks) |
| `joa.usage`, `joa.account` | Balance, usage per day, email settings |
| `joa.chat` | The feed, `watch` (an async iterator over new messages), posts, deletes, bans, slow mode, word lists, moderator links |
| `joa.embed` | The public calls, no key needed: the embed read, viewer sessions, the chat read, posting, reactions |

Errors are typed (`RateLimitError`, `InsufficientCreditError`, …) and carry the API's stable `code`. Network errors, 5xx and `rate_limited` are retried with backoff.

Source, README and examples: [github.com/justonair/justonair-node](https://github.com/justonair/justonair-node). What changed: its [changelog](https://github.com/justonair/justonair-node/blob/main/CHANGELOG.md).

## Other languages

There is no other official SDK. The API is plain JSON over HTTPS, so any HTTP client works; the [Quickstart](/quickstart) does everything with curl.

To generate a typed client, use [openapi.json](/openapi.json): OpenAPI 3.1, with an `operationId` on every endpoint (`createStream`, `getStream`, `getChatFeed`, …), the required fields of every response, an example for every request and response, and `x-error-codes` on every error. For example, with [OpenAPI Generator](https://openapi-generator.tech):

```bash
npx @openapitools/openapi-generator-cli generate \
  -i https://docs.justonair.com/openapi.json -g python -o justonair-python
```

`info.version` in the spec is the API version; the [Changelog](/changelog) says what each version added.

## Agents

Agent frameworks can turn `openapi.json` into tools, or use the ready-made tool definitions at [/agents/tools.json](/agents/tools.json). See [For AI agents](/agents).
