# Bygga en klient

KiiOn levererar inget eget SDK för API-flödet. Det behövs inte heller — specen är publik, så ni genererar en typad klient på en minut.

## Generera ur specen

Portalen serverar OpenAPI-dokumentet på [`https://developers.kiion.io/openapi.json`](/openapi.json). Peka valfri generator på den.

_TypeScript_

```bash
npx @hey-api/openapi-ts \
  -i https://developers.kiion.io/openapi.json \
  -o src/kiion \
  -c @hey-api/client-fetch
```

_Swift_

```bash
npx @openapitools/openapi-generator-cli generate \
  -i https://developers.kiion.io/openapi.json \
  -g swift5 \
  -o Sources/KiiOnAPI
```

_Rust_

```bash
npx @openapitools/openapi-generator-cli generate \
  -i https://developers.kiion.io/openapi.json \
  -g rust \
  -o kiion-api
```

> **Pinna dokumentet i CI** — `/openapi.json` följer den levande källan. Vill ni att bygget ska vara reproducerbart, generera från `/openapi.pinned.json` i stället — den ändras bara när KiiOn medvetet uppdaterar den fastlåsta kopian.

```bash
# The pinned document never changes under you, which is what a build wants.
curl -fsSL https://developers.kiion.io/openapi.pinned.json -o openapi.pinned.json
npx @hey-api/openapi-ts -i openapi.pinned.json -o src/kiion
```

## Vad kodgenereringen ger — och inte ger

| Ingår i den genererade klienten | Måste ni lägga till själva |
| --- | --- |
| Typade request- och responsmodeller | Server-side singleton per API-konto |
| Rätt HTTP-metod och sökväg per operation | Proaktiv token-förnyelse med single-flight-lås |
| Bas-URL:er för STAGE och PROD | Atomisk lagring av det roterade tokenparet |
| Bearer-headern som parameter | 401-fallback som gör om anropet en gång |
|  | Cachelagrad mappning från era dörrar till `{deviceId}` |
|  | Regeln att unlock aldrig retry:as automatiskt |

> **En genererad klient är transport, inte sessionshantering** — Alla fallgropar i den här integrationen ligger i lagret ovanför. Wrappa den genererade klienten med tokenhanteraren från [Kodexempel](/docs/code-examples#get-valid-access-token) — annars loggar den in per anrop.

## Om ni hellre skriver klienten för hand

API:t är vanlig JSON över HTTPS — vilket HTTP-bibliotek som helst duger. Beprövade val:

| Språk | Bibliotek | Installation |
| --- | --- | --- |
| Node.js | [undici](https://undici.nodejs.org/) | `npm i undici` (eller inbyggda `fetch`) |
| Python | [requests](https://requests.readthedocs.io/) | `pip install requests` |
| Rust | [reqwest](https://docs.rs/reqwest/) + [serde_json](https://docs.rs/serde_json/) | `cargo add reqwest serde_json tokio` |
| Swift | URLSession + `Codable` | Ingår i Foundation |
| PHP | [Guzzle](https://docs.guzzlephp.org/) | `composer require guzzlehttp/guzzle` |
| Ruby | [Faraday](https://lostisland.github.io/faraday/) | `gem install faraday` |

**Vidare**
- [Kodexempel — de fyra funktionerna, färdiga att kopiera](/docs/code-examples)
- [API-referens — alla operationer](/docs/api-reference)
