---
title: SDK de TypeScript
description: Cliente tipado para la API, generado desde la especificación OpenAPI.
---

`@moodinary/sdk` es un cliente para servidor basado en [`openapi-fetch`](https://openapi-ts.dev/openapi-fetch/). Los tipos de rutas, parámetros, cuerpos y respuestas salen directo de la [especificación OpenAPI](/openapi.json), así que si algo no existe en la API, no compila.

:::note\[Todavía no está en npm]
Por ahora el SDK vive en el monorepo de Moodinary (`packages/sdk`, versión 0.1.0) y no hay un paquete publicado. Cuando esté en npm lo anunciamos en el [changelog](/blog/).
:::

## Primeros pasos

1. **Creá una API key** desde el panel. Ver [API keys](/desarrollador/api-keys/).

2. **Guardala en el servidor**, como variable de entorno. Nunca en el navegador, en el bundle del frontend ni en logs.

3. **Creá el cliente y hacé tu primera llamada:**

   ```ts
   import { createMoodinaryClient } from "@moodinary/sdk";

   const token = process.env.MOODINARY_API_KEY;
   if (!token) throw new Error("Falta MOODINARY_API_KEY");

   const moodinary = createMoodinaryClient({ token });

   const { data, error, response } = await moodinary.GET("/org");
   if (error) throw new Error(`Moodinary respondió ${response.status}`);
   ```

La URL base por defecto es `https://api.moodinary.com/v1`. Las rutas van **sin** el prefijo de versión: `/org`, no `/v1/org`. Podés cambiar `baseUrl` (por ejemplo, para un servidor local) o pasar tu propio `fetch` para tests.

## Leer datos

`GET` cubre `/org`, `/teams`, `/pulses`, `/stats`, `/stats/daily`, `/alerts`, `/actions` y `/comments`.

```ts
const page = await moodinary.GET("/pulses", {
	params: { query: { limit: 50 } },
});

// Paginación por cursor
if (page.data?.nextCursor) {
	const next = await moodinary.GET("/pulses", {
		params: { query: { limit: 50, cursor: page.data.nextCursor } },
	});
}
```

## Crear y modificar

:::caution\[Los POST exigen Idempotency-Key]
Cada `POST` necesita un header `Idempotency-Key` que generás vos. Si falta o está vacío, el SDK corta **antes** de mandar la request.
:::

Generá un UUID por cada operación lógica y guardalo junto con la operación **antes** de enviarla. Si después reintentás o reconciliás esa misma operación, reusá la misma key y exactamente el mismo body. Nunca reintentes una mutación con una key nueva: así es como se duplican equipos o acciones.

```ts
const actionKey = crypto.randomUUID();
// guardá actionKey con tu registro antes de llamar

const action = await moodinary.POST("/actions", {
	params: { header: { "Idempotency-Key": actionKey } },
	body: { title: "Agendar charlas semanales" },
});
```

`PATCH` no lleva key:

```ts
await moodinary.PATCH("/actions/{id}", {
	params: { path: { id: "id-de-la-accion" } },
	body: { title: "Agendar charlas mensuales" },
});
```

## Errores y reintentos

El SDK **no reintenta nada** por su cuenta.

| Caso | Qué pasa |
| --- | --- |
| Respuesta no 2xx | `error` trae el error de la API y `response` la respuesta HTTP original. |
| Falla de red | La promesa se rechaza. |
| Rate limit | Los headers (incluido el de rate limit) están en `response.headers`. |

La lista completa de endpoints y esquemas está en la [referencia de la API](/desarrollador/referencia/).