SDK (Python / TypeScript) et REST
Les SDK sont une fine couche sur REST (chaque méthode correspond à un endpoint). Comportements communs :
Idempotency-Keyajoutée automatiquement à tout appel de mutation (retry sûr)- Retry automatique en backoff exponentiel sur 429 / 5xx. Pas de retry sur 409 (verrouillage optimiste) — le contrat est de relire puis réappliquer
- Les erreurs deviennent des exceptions portant le
suggested_fixdu problem+json (lisible tel quel par un LLM) - Helpers pratiques :
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-applyRessources : workbooks / sources / tables / query / transforms / versions / jobs / reviews / sheets / charts / export / webhooks.
TypeScript
Section intitulée « 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");Où trouver les paquets
Section intitulée « Où trouver les paquets »| Paquet | Sources et issues | |
|---|---|---|
| Python + CLI | d2b-sdk sur PyPI | github.com/600/d2b-sdk (python/) |
| TypeScript | d2b-sdk sur npm | github.com/600/d2b-sdk (typescript/) |
La distribution s’appelle d2b-sdk sur les deux registres. Le paquet d’import Python et la commande s’appellent d2b (le d2b de PyPI est un projet sans rapport) ; avec uvx, on écrit donc uvx --from d2b-sdk d2b …. Le dépôt GitHub est un miroir en lecture seule (les SDK sont développés dans le dépôt principal de D2B) : les pull requests n’y sont pas fusionnées, les issues sont bienvenues. Chaque release synchronise le même tag (sdk-py-v* / sdk-ts-v*) vers le miroir, qui publie sur les deux registres (npm avec provenance).
REST en direct
Section intitulée « REST en direct »- URL de base :
https://d2b.dev(les chemins sous/api/v1/..., la gestion des tenants sous/api/control/...) - Authentification :
Authorization: Bearer <PAT>(/api/v1), Account API key (/api/control) - Les mutations acceptent le header
Idempotency-Key(même clé + même corps = rejeu de la première réponse) - OpenAPI 3.1 : openapi.json — la Référence API en est générée