SDK(Python / TypeScript)와 REST
SDK는 REST의 얇은 껍질입니다(모든 메서드가 1개의 엔드포인트에 대응). 공통 동작:
- 모든 변이 호출에
Idempotency-Key를 자동 부여(재시도 안전) - 429 / 5xx는 지수 백오프로 자동 재시도. 409(낙관적 잠금)는 재시도하지 않습니다 — 다시 읽어 재적용하는 것이 컨트랙트입니다
- 에러는 problem+json의
suggested_fix를 포함해 예외화됩니다(LLM이 그대로 읽을 수 있음) - 실무 헬퍼:
jobs.wait()/tables.iter_rows()/webhooks.verify_signature()
Python
섹션 제목: “Python”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-apply리소스: workbooks / sources / tables / query / transforms / versions / jobs / reviews / sheets / charts / export / webhooks.
TypeScript
섹션 제목: “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");패키지 배포처와 소스
섹션 제목: “패키지 배포처와 소스”| 패키지 | 소스 · 이슈 | |
|---|---|---|
| Python + CLI | PyPI의 d2b-sdk | github.com/600/d2b-sdk(python/) |
| TypeScript | npm의 d2b-sdk | github.com/600/d2b-sdk(typescript/) |
배포 이름은 두 레지스트리 모두 d2b-sdk입니다. Python의 import 패키지와 커맨드는 d2b(PyPI의 d2b는 무관한 프로젝트)이므로 uvx에서는 uvx --from d2b-sdk d2b …로 씁니다. GitHub 저장소는 읽기 전용 미러(SDK는 D2B 본 저장소에서 개발)라서 Pull Request는 머지되지 않지만 Issue는 환영합니다. 릴리스마다 같은 태그(sdk-py-v* / sdk-ts-v*)가 미러로 동기화되고, 거기서 두 레지스트리로 배포됩니다(npm은 provenance 포함).
REST를 직접
섹션 제목: “REST를 직접”- 베이스 URL:
https://d2b.dev(경로는/api/v1/..., 테넌트 관리는/api/control/...) - 인증:
Authorization: Bearer <PAT>(/api/v1), Account API key(/api/control) - 변이 계열은
Idempotency-Key헤더 지원(동일 키 + 동일 바디로 최초 응답을 재생) - OpenAPI 3.1: openapi.json — API 레퍼런스는 여기에서 생성됩니다