# JavaScript-SDK

> Der Client, den die API unter /sdk.js und /sdk.mjs veröffentlicht, erzeugt aus der Spezifikation selbst. Wie du ihn im Browser und in Node lädst, die Methoden nach Thema, wie du Parameter und Body übergibst, die Fehlerbehandlung und die Client-Optionen.

Die API veröffentlicht ein **JavaScript-SDK**, das aus ihrer eigenen OpenAPI-Spezifikation erzeugt wird. Es deckt alle Operationen ab, schickt die Header für dich mit, packt den Umschlag der Antworten aus und macht aus Fehlern Exceptions.

| Datei | Verwendung |
|---|---|
| [`/sdk.js`](https://api.memberfy.net/sdk.js) | UMD: `<script src>` (stellt `Memberfy` bereit) oder `require()` in Node |
| [`/sdk.mjs`](https://api.memberfy.net/sdk.mjs) | ESM: `import { createClient } from '…/sdk.mjs'` |

## Start im Browser

```html
<script src="https://api.memberfy.net/sdk.js"></script>
<script>
  const api = Memberfy.createClient({ baseUrl: 'https://api.memberfy.net' });

  const session = await api.auth.login({ email, password });
  api.setToken(session.token).setCommunity(communityId);

  const me = await api.auth.getMe();
</script>
```

**Übergib `baseUrl` immer mit `https://`.**

## Start in Node

Lade die Datei ins Projekt und importiere sie lokal (Node 18 oder neuer, das `fetch` schon mitbringt):

```bash
curl -s https://api.memberfy.net/sdk.mjs -o memberfy-sdk.mjs
```

```js
import { createClient } from './memberfy-sdk.mjs';

const api = createClient({ baseUrl: 'https://api.memberfy.net' });
const session = await api.auth.login({ email: process.env.MEMBERFY_EMAIL, password: process.env.MEMBERFY_PASSWORD });
api.setToken(session.token).setCommunity(process.env.MEMBERFY_COMMUNITY_ID);
```

Lade sie neu herunter, wenn du aktualisieren willst.

## Was es dir abnimmt

| | |
|---|---|
| **Header** | `Authorization`, `X-CommunityId`, `X-ProfileId` und `Accept-Language`, aus `setToken`, `setCommunity`, `setProfile` und `setLanguage` |
| **Umschlag** | Gibt `data` direkt zurück; Listen geben `{ data, pagination }` zurück |
| **Fehler** | Wirft `MemberfyError` mit `.status`, `.body` und `.errors` |
| **Sitzung** | `onUnauthorized` wird bei einem `401` aufgerufen, damit du dich neu anmelden kannst |

## Die Methoden

Die Methoden sind nach Thema gruppiert (wie in der [Referenz](/api/referencia)): `api.auth`, `api.products`, `api.subscriptions`, `api.coupons`, `api.sectionsSpaces`, `api.events` … Der Methodenname kommt aus der `operationId` der Operation: `api.products.postCommunitiesByCommunityIdProducts`, `api.profiles.getList`, `api.auth.login`.

Manche Namen tragen noch `CommunitiesByCommunityId` aus der Zeit, als die Route die Community im Pfad hatte. Seit dem 6. Oktober 2026 trägt keine Route die Community mehr im Pfad, aber die Namen sind geblieben, damit in deinem Code nichts bricht. Die Community geht immer über `setCommunity`. Siehe [X-CommunityId](/api/x-community-id#die-geanderten-pfade).

Auf der Seite jedes Endpunkts in der Referenz steht die `operationId`.

## Parameter und Body

Pfad- und Query-Parameter werden über ihren Namen übergeben; **der Rest wird zum Body**:

```js
api.setCommunity(communityId); // die Community geht in den Header X-CommunityId

await api.products.putCommunitiesByCommunityIdProductsById({
  id: productId,               // geht in den Pfad
  type: 'SUBSCRIPTION',        // Body
  title: 'Aluno · Mensal',     // Body
  price: 49,                   // Body
  billingInterval: 'MONTHLY',  // Body
  allowedPaymentMethods: ['PIX', 'CREDIT_CARD', 'BOLETO'],
});
```

Du kannst auch trennen: `{ id, body: { … } }`. **Übergib `communityId` nicht in den Argumenten**: Da es kein Pfadparameter mehr ist, würde es im Body landen. Weitere Optionen pro Aufruf: `headers` (zusätzliche Header), `query` (zusätzliche Query-Parameter) und `signal` (ein `AbortController`).

Für jede beliebige Route gibt es `api.request({ httpMethod, path, pathParams, queryParams, hasBody }, args)`.

## Fehler behandeln

```js
try {
  await api.coupons.postCommunitiesByCommunityIdCouponsValidate({ code: 'LANCAMENTO20' });
} catch (error) {
  if (error.name === 'MemberfyError') {
    console.log(error.status);  // 400
    console.log(error.errors);  // [{ param: 'code', message: 'Gutschein ist abgelaufen' }]
  }
}
```

## Client-Optionen

| Option | Wofür |
|---|---|
| `baseUrl` | Die Adresse der API. Nutze `https://api.memberfy.net` |
| `token`, `communityId`, `profileId`, `language` | Anfangswerte der Header |
| `raw: true` | Gibt den rohen Body mit Umschlag zurück |
| `onUnauthorized` | Funktion, die bei einem `401` aufgerufen wird |
| `fetch` | Eine `fetch`-Implementierung für Umgebungen ohne native |

## Immer aktuell

Das SDK wird bei jeder Auslieferung aus den Routen der API erzeugt. Neu herunterladen heißt aktualisieren.

## Für KI

Damit ein Assistent korrekte Aufrufe erzeugt, gib ihm auch [`/docs.txt`](https://api.memberfy.net/docs.txt): Das SDK sagt, **wie** aufgerufen wird; `/docs.txt` sagt, **was** geschickt wird.

## Verwandte Artikel

- [Authentifizierung](/api/autenticacao)
- [Antworten und Fehler](/api/respostas-e-erros)
- [API-Referenz](/api/referencia)
