---
title: "SDKs"
description: "The official SDKs for TypeScript and Python: generated from the frozen spec, with idempotency, backoff, paging and webhook verification. A download with checksum during the preview."
lang: en
url: https://developers.bodo-app.com/en/sdks/
apiVersion: 2026-11-01
---

# SDKs

The official SDKs for TypeScript and Python: generated from the frozen spec, with idempotency, backoff, paging and webhook verification. A download with checksum during the preview.

> **Preview** During the preview the SDKs are only available here as a download. They appear on npm and PyPI once the API becomes stable; the download then stays as a second way.

## TypeScript

Node 20 and newer, Bun, Deno, edge runtimes. No runtime dependencies, it only needs `fetch` and WebCrypto.

[Download bodo-api-1.0.0.tgz](/sdk/1.0.0/bodo-api-1.0.0.tgz)

SHA-256: `b391653b2dbc9e0a465e62107f2dedac3cbdfaab10ae05a28025ae3cf2eb6927`

```bash
npm install ./bodo-api-1.0.0.tgz
```

```typescript
// Portal D11 · SDKs — the TypeScript card: pages without hand-written cursor code, one task done.
// Run: BODO_API_KEY=bodo_uk_test_… bun examples/sdk-overview.ts
import { Bodo } from "@bodo/api";

const bodo = new Bodo({ apiKey: process.env.BODO_API_KEY, preview: true });

// walks nextCursor by itself
for await (const contact of bodo.contacts.list({ updatedSince: "2026-11-03T09:00:00Z" })) {
  if ("deleted" in contact) continue;
  console.log(contact.lastName);
}

const task = await bodo.tasks.create({ title: "Angebot nachfassen" });
const done = await bodo.tasks.complete(task.id);
console.log(done.id, done.status);
```

## Python

Python 3.11 and newer, synchronous over `httpx`. Typed, with generated `attrs` models.

[Download bodo_api-1.0.0-py3-none-any.whl](/sdk/1.0.0/bodo_api-1.0.0-py3-none-any.whl)

SHA-256: `07675907708e4d05d829be8c39c41996ba635fefacc9071b1232ff58f2878539`

```bash
pip install ./bodo_api-1.0.0-py3-none-any.whl
```

```python
# Pages without hand-written cursor code, one task done.
# Run: BODO_API_KEY=bodo_uk_test_… python examples/sdk_overview.py
import os

from bodo_api import Bodo

bodo = Bodo(api_key=os.environ["BODO_API_KEY"], preview=True)

# walks next_cursor by itself
for contact in bodo.contacts.list(updated_since="2026-11-03T09:00:00Z"):
    print(contact.id)

task = bodo.tasks.create(title="Angebot nachfassen")
done = bodo.tasks.complete(task.id)
print(done.id, done.status)
```

## What the SDK does for you

- **Idempotency-Key**: on every POST and DELETE, the same across retries
- **Backoff**: after 429 and 503 with `Retry-After`, at most 3 attempts
- **Paging**: over `nextCursor`, as a loop instead of hand-written code
- **Webhooks and errors**: signature check, error class with `code` and `requestId`, warning on deprecation

## Versioning of the SDK

Semantic versions. Every SDK version belongs to exactly one API version and sends it in the `Bodo-Version` header.

| SDK version | API version | Supported until |
| --- | --- | --- |
| 1.x | 2026-11-01 | Sunset of this API version, 12 months after its successor |
| 2.x (example) | 2027-05-01 | Sunset of its API version |

Major: new API version with breaking changes. Minor: new operations, fields or events. Patch: bug fixes. Preview operations sit behind `preview: true` and may change in a minor release too.

## How an SDK is made

1. `openapi.2026-11-01.json` from the repository
2. open generators: `openapi-typescript` with `openapi-fetch` and `openapi-python-client`
3. the examples run as tests against the sandbox
4. CI puts the archives here into the portal; once stable also on npm and PyPI, with provenance (Trusted Publishing)

No third-party service in the build path. Only the thin wrappers for retry, paging and webhooks are hand-written.
