SDK (Python / TypeScript) und REST
Die SDKs sind eine dünne Schicht über REST (jede Methode entspricht genau einem Endpunkt). Gemeinsames Verhalten:
- Automatischer
Idempotency-Keybei jedem mutierenden Aufruf (Retry-sicher) - Automatische Retries mit exponentiellem Backoff bei 429 / 5xx. Bei 409 (optimistisches Locking) gibt es keinen Retry — der Vertrag lautet: neu lesen und erneut anwenden
- Fehler werden als Exceptions inklusive
suggested_fixaus problem+json geworfen (ein LLM kann sie direkt lesen) - Praxis-Helfer:
jobs.wait()/tables.iter_rows()/webhooks.verify_signature()
pip install d2b-sdkfrom d2b import D2BClient, ConflictError
client = D2BClient(api_key="d2b_pat_...", base_url="https://d2b.dev")wb = client.workbooks.create(title="monthly")["id"]client.sources.upload(wb, "sales.xlsx", wait=True)
page = client.tables.rows(wb, "sales")try: client.tables.upsert_rows(wb, "sales", rows=[{"product": "apple", "qty": 3}], expected_version=page["edit_version"])except ConflictError: page = client.tables.rows(wb, "sales") # re-read → re-applyRessourcen: workbooks / sources / tables / query / transforms / versions / jobs / reviews / sheets / charts / export / webhooks.
TypeScript
Abschnitt betitelt „TypeScript“npm install d2b-sdkimport { D2BClient } from "d2b-sdk";
const client = new D2BClient({ apiKey: "d2b_pat_...", baseUrl: "https://d2b.dev" });const wb = (await client.workbooks.create({ title: "monthly" })).id as string;await client.sources.upload(wb, fileBlob, { filename: "sales.xlsx", wait: true });const grid = await client.tables.a1(wb, "sales", "A1:D10"); // read in Excel coordinatesawait client.sheets.put(wb, "summary", [ { kind: "heading", text: "Monthly summary" }, { kind: "table_view", table: "sales" },]);const xlsx = await client.sheets.render(wb, "summary");Wo die Pakete liegen
Abschnitt betitelt „Wo die Pakete liegen“| Paket | Quellcode und Issues | |
|---|---|---|
| Python + CLI | d2b-sdk auf PyPI | github.com/600/d2b-sdk (python/) |
| TypeScript | d2b-sdk auf npm | github.com/600/d2b-sdk (typescript/) |
Die Distribution heißt in beiden Registries d2b-sdk. Das Python-Importpaket und der Befehl heißen d2b (d2b auf PyPI ist ein fremdes Projekt), mit uvx also uvx --from d2b-sdk d2b …. Das GitHub-Repository ist ein schreibgeschützter Spiegel (entwickelt werden die SDKs im Hauptrepository von D2B): Pull Requests können dort nicht gemergt werden, Issues sind willkommen. Jedes Release synchronisiert denselben Tag (sdk-py-v* / sdk-ts-v*) in den Spiegel, der in beide Registries veröffentlicht (npm mit Provenance).
REST direkt
Abschnitt betitelt „REST direkt“- Basis-URL:
https://d2b.dev(Pfade unter/api/v1/..., Tenant-Verwaltung unter/api/control/...) - Authentifizierung:
Authorization: Bearer <PAT>(/api/v1), Account API key (/api/control) - Mutierende Endpunkte unterstützen den
Idempotency-Key-Header (gleicher Key + gleicher Body spielt die erste Antwort erneut aus) - OpenAPI 3.1: openapi.json — daraus wird die API-Referenz generiert