SDK (Python / TypeScript) y REST
Los SDK son una capa delgada sobre REST (cada método corresponde a un endpoint). Comportamiento común:
Idempotency-Keyautomático en toda llamada de mutación (reintentos seguros)- 429 / 5xx se reintentan automáticamente con backoff exponencial. 409 (bloqueo optimista) no se reintenta — el contrato es releer y reaplicar
- Los errores se convierten en excepciones con el
suggested_fixdel problem+json incluido (un LLM puede leerlas tal cual) - Helpers prácticos:
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-applyRecursos: workbooks / sources / tables / query / transforms / versions / jobs / reviews / sheets / charts / export / webhooks.
TypeScript
Sección titulada «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");Dónde están los paquetes
Sección titulada «Dónde están los paquetes»| Paquete | Código fuente e issues | |
|---|---|---|
| Python + CLI | d2b-sdk en PyPI | github.com/600/d2b-sdk (python/) |
| TypeScript | d2b-sdk en npm | github.com/600/d2b-sdk (typescript/) |
La distribución se llama d2b-sdk en ambos registros. El paquete de import de Python y el comando son d2b (el d2b de PyPI es un proyecto sin relación), así que con uvx se escribe uvx --from d2b-sdk d2b …. El repositorio de GitHub es un espejo de solo lectura (los SDK se desarrollan en el repositorio principal de D2B): los pull requests no pueden fusionarse allí; los issues son bienvenidos. Cada release sincroniza la misma etiqueta (sdk-py-v* / sdk-ts-v*) al espejo, que publica en ambos registros (npm con provenance).
REST directo
Sección titulada «REST directo»- URL base:
https://d2b.dev(las rutas van bajo/api/v1/...; la administración de tenants, bajo/api/control/...) - Autenticación:
Authorization: Bearer <PAT>(/api/v1), Account API key (/api/control) - Las mutaciones aceptan el header
Idempotency-Key(la misma clave + el mismo body reproducen la respuesta original) - OpenAPI 3.1: openapi.json — la Referencia de la API se genera desde ahí