--- title: 'SDK (TypeScript)' description: 'Use the bknd SDK in TypeScript' --- To start using the bknd API, start by creating a new API instance: ```ts import { Api } from "bknd/client"; const api = new Api(); // always make sure to verify auth await api.verifyAuth(); ``` The `Api` class is the main entry point for interacting with the bknd API. It provides methods for all available modules described below. ## Setup You can initialize an API instance by providing the `Request` object, or manually specifying the details such as `host` and `token`. ### Using the `Request` object The recommended way to create an API instance is by passing the current `Request` object. This will automatically point the API to your current instance and extract the token from the headers (either from cookies or `Authorization` header): ```ts import { Api } from "bknd/client"; // replace this with the actual request let request: Request; const api = new Api({ request }); ``` If the authentication details are contained in the current request, but you're hosting your bknd instance somewhere else, you can specify a `host` option: ```ts import { Api } from "bknd/client"; // replace this with the actual request let request: Request; const api = new Api({ host: "https://", request, }); ``` ### Using the `token` option If you want to have an API instance that is using a different token, e.g. an admin token, you can create it by specifying the `host` and `token` option: ```ts import { Api } from "bknd/client"; const api = new Api({ host: "https://", token: "" }); ``` ### Using a local API In case the place where you're using the API is the same as your bknd instance (e.g. when using it embedded in a React framework), you can specify a `fetcher` option to point to your bknd app. This way, requests won't travel over the network and instead processed locally: ```ts import type { App } from "bknd"; import { Api } from "bknd/client"; // replace this with your actual `App` instance let app: App; const api = new Api({ fetcher: app.server.request as typeof fetch, // specify `host` and `token` or `request` }); ``` ## Data (`api.data`) Access the `Data` specific API methods at `api.data`. ### `data.readMany([entity], [query])` To retrieve a list of records from an entity, use the `readMany` method: ```ts const { data } = await api.data.readMany("posts"); ``` You can also add additional query instructions: ```ts const { data } = await api.data.readMany("posts", { limit: 10, offset: 0, select: ["id", "title", "views"], with: { // join last 2 comments comments: { with: { // along with the comments' user users: {} }, limit: 2, sort: "-id" }, // also get the first 2 images, but only the path images: { select: ["path"], limit: 2 } }, where: { // same as '{ title: { $eg: "Hello, World!" } }' title: "Hello, World!", // only with views greater than 100 views: { $gt: 100 } }, // sort by views descending (without "-" would be ascending) sort: "-views" }); ``` The `with` property automatically adds the related entries to the response. ### `data.readOne([entity], [id])` To retrieve a single record from an entity, use the `readOne` method: ```ts const { data } = await api.data.readOne("posts", 1); ``` ### `data.createOne([entity], [data])` To create a single record of an entity, use the `createOne` method: ```ts const { data } = await api.data.createOne("posts", { title: "Hello, World!", content: "This is a test post.", views: 0 }); ``` ### `data.createMany([entity], [data])` To create many records of an entity, use the `createMany` method: ```ts const { data } = await api.data.createMany("posts", [ { title: "Hello, World!" }, { title: "Again, Hello." }, ]); ``` ### `data.updateOne([entity], [id], [data])` To update a single record of an entity, use the `updateOne` method: ```ts const { data } = await api.data.updateOne("posts", 1, { views: 1 }); ``` ### `data.updateMany([entity], [where], [update])` To update many records of an entity, use the `updateMany` method: ```ts const { data } = await api.data.updateMany("posts", { views: { $gt: 1 } }, { title: "viewed more than once" }); ``` ### `data.deleteOne([entity], [id])` To delete a single record of an entity, use the `deleteOne` method: ```ts const { data } = await api.data.deleteOne("posts", 1); ``` ### `data.deleteMany([entity], [where])` To delete many records of an entity, use the `deleteMany` method: ```ts const { data } = await api.data.deleteMany("posts", { views: { $lte: 1 } }); ``` ## Auth (`api.auth`) Access the `Auth` specific API methods at `api.auth`. If there is successful authentication, the API will automatically save the token and use it for subsequent requests. ### `auth.strategies()` To retrieve the available authentication strategies, use the `strategies` method: ```ts const { data } = await api.auth.strategies(); ``` ### `auth.login([strategy], [input])` To log in with a password, use the `login` method: ```ts const { data } = await api.auth.login("password", { email: "...", password: "..." }); ``` ### `auth.register([strategy], [input])` To register with a password, use the `register` method: ```ts const { data } = await api.auth.register("password", { email: "...", password: "..." }); ``` ### `auth.me()` To retrieve the current user, use the `me` method: ```ts const { data } = await api.auth.me(); ```