# SDKs

Choose a server library or browser SDK, check release status and find the HTTP API alternative.

Choose the integration that fits where your code runs. Server libraries and browser or app SDKs use different credentials:

- **Server libraries** run on your server. They call the `/v1` API at `https://api.kirora.io` with an API key, as a thin layer over the same operations.
- **App and web SDKs** run in your users' browsers and apps. They record what each signed-in user does, with a public client key and a user token your server signs. They never use an API key.

## Server libraries

| Library | Language | Package | Status |
| --- | --- | --- | --- |
| [Node.js](/docs/sdks/node) | TypeScript | `@kirora/node` (not yet published) | Preview (reference implementation) |
| [React builders](/docs/sdks/react) | React | `@kirora/react` (not yet published) | Preview, partner accounts only |
| [CLI](/docs/sdks/cli) | Shell | `@kirora/cli` (not yet published) | Preview |
| [Python](/docs/sdks/python) | Python | To be announced | Planned |
| [Go](/docs/sdks/go) | Go | To be announced | Planned |
| [.NET](/docs/sdks/dotnet) | C# | To be announced | Planned |
| [PHP](/docs/sdks/php) | PHP | To be announced | Planned |
| [Java](/docs/sdks/java) | Java | To be announced | Planned |

## App and web SDKs

| SDK | Platform | Package | Status |
| --- | --- | --- | --- |
| [Web](/docs/sdks/web) | Browsers | `@kirora/web` (not yet published) | Preview |
| iOS | Swift | To be announced | Planned |
| Android | Kotlin | To be announced | Planned |
| React Native | TypeScript | To be announced | Planned |
| Flutter | Dart | To be announced | Planned |

The app SDKs share the web SDK's interface: the same options, methods and behaviour in each language.

## What to use today

None of the server libraries is on a package registry yet, so for production code today, call the HTTP API directly. Every request is JSON over HTTPS to `https://api.kirora.io`, with your key as `Authorization: Bearer $KIRORA_API_KEY`. See [Authentication](/docs/api/authentication), [Errors](/docs/api/errors), [Pagination](/docs/api/pagination) and [Idempotency](/docs/api/idempotency). To track an event with curl:

```bash
curl https://api.kirora.io/v1/events/track \
  -H "Authorization: Bearer $KIRORA_API_KEY" \
  -H "Idempotency-Key: order-1042-completed" \
  -H "Content-Type: application/json" \
  -d '{"externalId":"cust_1042","eventName":"Order Completed","properties":{"total":42.5,"currency":"USD"}}'
```

Without a library, handle these yourself: retry a 429 always, and a 5xx or connection failure only when the call is [safe to repeat](/docs/api/idempotency#what-is-safe-to-retry), with jittered backoff; fix each `Idempotency-Key` before the first attempt; stop paginating when `nextCursor` is `null`; and verify webhook signatures against the raw body.

## The server library contract

The Node.js library is the reference implementation, and every official server library copies its shape: one namespace per API tag and one method per `operationId`, a single error type carrying the API's `code`, bounded retries with jitter, auto-paginating iterators, caller-supplied idempotency keys, and a constant-time webhook verifier. The full list is in [SDK conformance](/docs/api/sdk-conformance).

For AI assistants rather than code, connect to the hosted MCP server instead; see [Agents](/docs/api/agents).