# Get started with the SDKs

> Download the TypeScript or Python SDK from the OpenWAF API, configure an API token and list your zones.

1. **Download the SDK** into your project. The files are public and need no token.

**TypeScript**

   ```sh
   curl -fsSLO https://dash.openwaf.dev/v1/sdk/openwaf.ts
   ```
**Python**

   ```sh
   curl -fsSLO https://dash.openwaf.dev/v1/sdk/openwaf.py
   ```


   Commit the file with your code. To update it, download it again; see [How the SDKs are generated](https://developers.openwaf.dev/sdk/how-the-sdks-are-generated/#updates).

2. **Create an API token** in the dashboard under **API tokens**. **Read only** is enough for this guide; use **Tech** to make changes. Tokens start with `owf_`.

3. **Configure the client** through the environment, so the token stays out of your code:

   ```sh
   export OPENWAF_API_URL=https://dash.openwaf.dev
   read -rs OPENWAF_TOKEN && export OPENWAF_TOKEN
   ```

> **Caution**
>
>    Always set `OPENWAF_API_URL` (or pass the base URL to the constructor). The SDKs' built-in default address does not serve the API.


4. **List your zones.**

**TypeScript**

   ```ts
   import { OpenWAF } from "./openwaf.ts";

   const owf = new OpenWAF();
   const { items = [] } = await owf.listZones();
   for (const z of items) {
     console.log([z.name, z.status, "v" + z.config_version].join("\t"));
   }
   ```
   ```sh
   bun list-zones.ts        # or: node --experimental-strip-types list-zones.ts
   ```
**Python**

   ```py
   from openwaf import OpenWAF

   owf = OpenWAF()
   for z in owf.list_zones()["items"]:
       print(z["name"], z["status"], "v%d" % z["config_version"], sep="\t")
   ```
   ```sh
   python3 list_zones.py
   ```



The client finds your organisation from the token. Every zone has an `id`: zone methods take that id, not the domain name. Next: [Create a DNS record](https://developers.openwaf.dev/sdk/create-a-record/).
