El cliente necesita tres cosas. Cada una sale del constructor o, si no la indicas, de una variable de entorno.
| Ajuste | Opción de TypeScript | Argumento de Python | Entorno | Por defecto |
|---|---|---|---|---|
| Token de API | token | token= | OPENWAF_TOKEN | ninguno: las llamadas fallan con no_token |
| Dirección de la API | baseUrl | base_url= | OPENWAF_API_URL | una dirección integrada que no sirve la API: defínela siempre |
| Id de la organización | org | org= | OPENWAF_ORG | la organización del token, que se pide una vez con GET /v1/orgs |
Pon como dirección de la API https://dash.openwaf.dev; el SDK añade las rutas /v1/….
import { OpenWAF } from "./openwaf.ts";
// Desde el entorno: OPENWAF_API_URL, OPENWAF_TOKEN, OPENWAF_ORG.
const owf = new OpenWAF();
// O explícitamente, por ejemplo en una extensión de navegador o un worker sin process.env.
const other = new OpenWAF({ baseUrl: "https://dash.openwaf.dev", token: myToken });El cliente de TypeScript lee el entorno en Node.js, Bun y Deno. En los demás casos, pasa las opciones. También puedes pasar tu propia implementación de fetch en fetch.
from openwaf import OpenWAF
# Desde el entorno: OPENWAF_API_URL, OPENWAF_TOKEN, OPENWAF_ORG.
owf = OpenWAF()
# O explícitamente, con un plazo mayor (segundos, 60 por defecto).
other = OpenWAF(base_url="https://dash.openwaf.dev", token=my_token, timeout=120)El token
Crea los tokens en el panel, en Tokens de API. Un token tiene un rol (Solo lectura, Técnico, Admin) y un alcance (toda la organización, un cliente o una zona); la API aplica los dos en cada llamada, uses el método del SDK que uses. Da a cada script el token más restringido que le sirva y guárdalo en un almacén de secretos o en una variable de entorno, nunca en el código.
El cliente lo envía como Authorization: Bearer owf_… en todas las llamadas salvo las públicas (las CA de TLS hacia el origen).
La organización
Todos los métodos bajo /v1/orgs/{org} reciben un org opcional. Sin él, el cliente usa la suya: el org que configuraste o la organización del token, que pide a la API una vez y recuerda. orgId() (TypeScript) u org_id() (Python) la devuelven.
Las zonas se nombran por id
Los métodos de zona reciben el id de la zona, no su dominio. Búscalo una vez con listZones / list_zones:
const { items = [] } = await owf.listZones();
const zone = items.find((z) => z.name === "example.com");zone = next(z for z in owf.list_zones()["items"] if z["name"] == "example.com")