<!-- https://cutedyno.com/docs/sdks -->

# SDKs

The official Node.js client, and what to do when there is not one for your language.

## Node.js

```bash
npm install @cutedyno/node
```

```typescript
import { CuteDyno } from '@cutedyno/node';

const cutedyno = new CuteDyno(); // reads CUTEDYNO_API_KEY
```

Built in:

- Retries on `429` and `5xx` (honours `Retry-After`)
- Idempotency keys on writes
- `onRateLimit` callback
- `media.upload` (presign + PUT) and `media.createUploadSession` (browser upload for agents)
- `analytics.get` and `analytics.history`
- Webhook signature verify
- Async iterators for pagination

```typescript
const cutedyno = new CuteDyno({
  apiKey: process.env.CUTEDYNO_API_KEY,
  profileId: 'prof_customer_42',
  onRateLimit: ({ remaining }) => {
    metrics.gauge('cutedyno.rate_limit.remaining', remaining);
  },
});
```

Errors are `CuteDynoError` with a stable `code`. See [Errors](/docs/errors).

## Other languages

Node.js is the only client we publish and support. For anything else, call the
REST API directly, or generate a client from the OpenAPI document with the
generator for your language:

```
https://cutedyno.com/docs/api/openapi.json
```

A generated client is yours to maintain, so whichever route you take:

1. Send `Idempotency-Key` on writes
2. Retry only `429` and `5xx`
3. Branch on `error.code`, not `error.message`
4. Log `requestId` from failures

## Agents

Prefer [MCP](/docs/mcp) or the [CLI](/docs/cli) instead of hand-rolling HTTP in an agent loop.
