Frappe v14, v15, v16
Default { apiVersion: 2 } uses Frappe v15+ /api/v2. Pass { apiVersion: 1 } for classic /api/method and /api/resource (v14-safe).
Never /api/v1
This client never calls /api/v1/.... That prefix 404s on v14. Classic unversioned paths still work on v15 and v16.
TypeScript first
Zero runtime dependencies. Transport is fetch. Use FrappeDoc<T> to type documents.
Typed DocTypes
frappe-codegen reads a live v15+ site and emits GeneratedDocTypes so db.getDoc infers the row.