Lista, añade y quita a las personas de tu organización, cambia sus roles y gestiona las invitaciones.
Los miembros son las personas con acceso a la organización, cada una con un rol . Los admins añaden miembros directamente o los invitan por correo; una invitación vale 7 días.
# Listar miembros
GET /v1/orgs/{org}/members
Lista los miembros de la organización con su rol y, si están limitados a un cliente, su client_id.
Rol necesario: readonly o superior. De toda la organización.
# Parámetros
Nombre En Tipo Obligatorio Descripción orgruta string (uuid) Sí Id de la organización. Cada ruta comprueba que es la del token (si no, 404).
# Respuesta
Campo Tipo Descripción items[].idstring (uuid) Id. items[].emailstring Correo electrónico. items[].namestring Nombre. items[].created_atstring (date-time) Fecha de creación. items[].rolestring Rol. Uno de owner, admin, tech, readonly. items[].joined_atstring (date-time) Cuándo entró el miembro. items[].client_idstring (uuid) o null Cliente al que se limita el miembro (solo roles tech y readonly); null = toda la organización.
# Errores
Estado Descripción 403El rol o los límites del token no lo permiten (forbidden).
# Ejemplo
curl TypeScript Python
curl "https://dash.openwaf.dev/v1/orgs/$OPENWAF_ORG/members" \
-H "Authorization: Bearer $OPENWAF_TOKEN" import { OpenWAF } from "./openwaf" ;
const owf = new OpenWAF({ baseUrl: "https://dash.openwaf.dev" }); // token de OPENWAF_TOKEN
const result = await owf.listMembers();from openwaf import OpenWAF
owf = OpenWAF(base_url="https://dash.openwaf.dev" ) # token de OPENWAF_TOKEN
result = owf.list_members()
200
{
"items" : [
{
"id" : "5b8e2a1c-7d3f-4a9e-b6c2-1e4d7f0a3b9c" ,
"email" : "[email protected] " ,
"name" : "Dev team" ,
"created_at" : "2026-04-10T12:00:00Z" ,
"role" : "tech" ,
"joined_at" : "2026-04-10T12:00:00Z" ,
"client_id" : null
}
]
}
# Añadir un miembro
POST /v1/orgs/{org}/members
Añade una persona a la organización directamente por su correo, sin invitación. client_id limita el miembro a las zonas de un cliente (solo roles tech y readonly).
Rol necesario: admin o superior. Solo un owner puede dar el rol owner.
# Parámetros
Nombre En Tipo Obligatorio Descripción orgruta string (uuid) Sí Id de la organización. Cada ruta comprueba que es la del token (si no, 404).
# Cuerpo de la petición
Tipo de contenido application/json.
Campo Tipo Obligatorio Descripción emailstring (email) Sí Correo electrónico. namestring No Nombre. rolestring Sí Rol. Uno de owner, admin, tech, readonly. client_idstring (uuid) No Limita el miembro a las zonas de un cliente (solo roles tech y readonly).
# Respuesta
201: Añadido. Devuelve Member .
Campo Tipo Descripción idstring (uuid) Id. emailstring Correo electrónico. namestring Nombre. created_atstring (date-time) Fecha de creación. rolestring Rol. Uno de owner, admin, tech, readonly. joined_atstring (date-time) Cuándo entró el miembro. client_idstring (uuid) o null Cliente al que se limita el miembro (solo roles tech y readonly); null = toda la organización.
# Errores
Estado Descripción 403El rol o los límites del token no lo permiten (forbidden). 409already_member: la persona ya es miembro.
# Ejemplo
curl TypeScript Python
curl -X POST "https://dash.openwaf.dev/v1/orgs/$OPENWAF_ORG/members" \
-H "Authorization: Bearer $OPENWAF_TOKEN" \
-H "Content-Type: application/json" \
--data '{
"email" : "[email protected] " ,
"role" : "tech"
}'import { OpenWAF } from "./openwaf" ;
const owf = new OpenWAF({ baseUrl: "https://dash.openwaf.dev" }); // token de OPENWAF_TOKEN
const result = await owf.addMember({
body: {
email: "[email protected] " ,
role: "tech"
}
});from openwaf import OpenWAF
owf = OpenWAF(base_url="https://dash.openwaf.dev" ) # token de OPENWAF_TOKEN
result = owf.add_member(
body={
"email" : "[email protected] " ,
"role" : "tech"
},
)
201
{
"id" : "5b8e2a1c-7d3f-4a9e-b6c2-1e4d7f0a3b9c" ,
"email" : "[email protected] " ,
"name" : "Dev team" ,
"created_at" : "2026-04-10T12:00:00Z" ,
"role" : "tech" ,
"joined_at" : "2026-04-10T12:00:00Z" ,
"client_id" : null
}
# Cambiar el rol de un miembro
PATCH /v1/orgs/{org}/members/{user}
Cambia el rol de un miembro. La organización siempre conserva al menos un owner. Los tokens del miembro siguen el nuevo rol al instante, porque un token nunca actúa por encima de su miembro.
Rol necesario: admin o superior. Cambiar a un owner o dar el rol owner exige el rol owner.
# Parámetros
Nombre En Tipo Obligatorio Descripción orgruta string (uuid) Sí Id de la organización. Cada ruta comprueba que es la del token (si no, 404). userruta string (uuid) Sí Id de usuario del miembro.
# Cuerpo de la petición
Tipo de contenido application/json.
Campo Tipo Obligatorio Descripción rolestring Sí Rol. Uno de owner, admin, tech, readonly.
# Respuesta
Campo Tipo Descripción idstring (uuid) Id. emailstring Correo electrónico. namestring Nombre. created_atstring (date-time) Fecha de creación. rolestring Rol. Uno de owner, admin, tech, readonly. joined_atstring (date-time) Cuándo entró el miembro. client_idstring (uuid) o null Cliente al que se limita el miembro (solo roles tech y readonly); null = toda la organización.
# Errores
Estado Descripción 403El rol o los límites del token no lo permiten (forbidden). 409conflict: el cambio dejaría la organización sin owner.
# Ejemplo
curl TypeScript Python
curl -X PATCH "https://dash.openwaf.dev/v1/orgs/$OPENWAF_ORG/members/5b8e2a1c-7d3f-4a9e-b6c2-1e4d7f0a3b9c" \
-H "Authorization: Bearer $OPENWAF_TOKEN" \
-H "Content-Type: application/json" \
--data '{
"role" : "admin"
}'import { OpenWAF } from "./openwaf" ;
const owf = new OpenWAF({ baseUrl: "https://dash.openwaf.dev" }); // token de OPENWAF_TOKEN
const result = await owf.updateMember({
user: "5b8e2a1c-7d3f-4a9e-b6c2-1e4d7f0a3b9c" ,
body: {
role: "admin"
}
});from openwaf import OpenWAF
owf = OpenWAF(base_url="https://dash.openwaf.dev" ) # token de OPENWAF_TOKEN
result = owf.update_member(
user="5b8e2a1c-7d3f-4a9e-b6c2-1e4d7f0a3b9c" ,
body={
"role" : "admin"
},
)
200
{
"id" : "5b8e2a1c-7d3f-4a9e-b6c2-1e4d7f0a3b9c" ,
"email" : "[email protected] " ,
"name" : "Dev team" ,
"created_at" : "2026-04-10T12:00:00Z" ,
"role" : "tech" ,
"joined_at" : "2026-04-10T12:00:00Z" ,
"client_id" : null
}
# Quitar un miembro
DELETE /v1/orgs/{org}/members/{user}
Quita un miembro de la organización. Sus tokens de API dejan de valer al momento. No se puede quitar al último owner.
Rol necesario: admin o superior. Quitar a un owner exige el rol owner.
# Parámetros
Nombre En Tipo Obligatorio Descripción orgruta string (uuid) Sí Id de la organización. Cada ruta comprueba que es la del token (si no, 404). userruta string (uuid) Sí Id de usuario del miembro.
# Respuesta
204: Quitado. Sin cuerpo.
# Errores
Estado Descripción 403El rol o los límites del token no lo permiten (forbidden). 409conflict: el miembro es el último owner.
# Ejemplo
curl TypeScript Python
curl -X DELETE "https://dash.openwaf.dev/v1/orgs/$OPENWAF_ORG/members/5b8e2a1c-7d3f-4a9e-b6c2-1e4d7f0a3b9c" \
-H "Authorization: Bearer $OPENWAF_TOKEN" import { OpenWAF } from "./openwaf" ;
const owf = new OpenWAF({ baseUrl: "https://dash.openwaf.dev" }); // token de OPENWAF_TOKEN
const result = await owf.removeMember({
user: "5b8e2a1c-7d3f-4a9e-b6c2-1e4d7f0a3b9c"
});from openwaf import OpenWAF
owf = OpenWAF(base_url="https://dash.openwaf.dev" ) # token de OPENWAF_TOKEN
result = owf.remove_member(user="5b8e2a1c-7d3f-4a9e-b6c2-1e4d7f0a3b9c" )
# Listar invitaciones
GET /v1/orgs/{org}/invitations
Lista las invitaciones abiertas de la organización.
Rol necesario: admin o superior. De toda la organización.
# Parámetros
Nombre En Tipo Obligatorio Descripción orgruta string (uuid) Sí Id de la organización. Cada ruta comprueba que es la del token (si no, 404).
# Respuesta
Campo Tipo Descripción items[].idstring (uuid) Id. items[].org_idstring (uuid) Id de la organización. items[].emailstring Correo electrónico. items[].rolestring Rol. Uno de owner, admin, tech, readonly. items[].invited_bystring Quién envió la invitación. items[].created_atstring (date-time) Fecha de creación. items[].expires_atstring (date-time) Fecha de caducidad. items[].client_idstring (uuid) o null Cliente al que se limitará el miembro invitado; null = toda la organización.
# Ejemplo
curl TypeScript Python
curl "https://dash.openwaf.dev/v1/orgs/$OPENWAF_ORG/invitations" \
-H "Authorization: Bearer $OPENWAF_TOKEN" import { OpenWAF } from "./openwaf" ;
const owf = new OpenWAF({ baseUrl: "https://dash.openwaf.dev" }); // token de OPENWAF_TOKEN
const result = await owf.listInvitations();from openwaf import OpenWAF
owf = OpenWAF(base_url="https://dash.openwaf.dev" ) # token de OPENWAF_TOKEN
result = owf.list_invitations()
200
{
"items" : [
{
"id" : "a5614527-0ce6-43be-ad1d-d012b7394867" ,
"org_id" : "1e7c9a3b-5d2f-4b8a-9c6e-0f2a4b6c8d1e" ,
"email" : "[email protected] " ,
"role" : "owner" ,
"invited_by" : "user:5b8e2a1c-7d3f-4a9e-b6c2-1e4d7f0a3b9c" ,
"created_at" : "2026-10-27T09:30:00Z" ,
"expires_at" : "2026-10-27T09:30:00Z" ,
"client_id" : "65904271-c7f4-4ee6-a8a6-84f55f76a92a"
}
]
}
# Crear una invitación
POST /v1/orgs/{org}/invitations
Invita a una persona por correo con un rol. La invitación vale 7 días. La respuesta incluye su secret, que solo se muestra una vez; la persona invitada la acepta desde el enlace del correo.
Rol necesario: admin o superior. Solo un owner puede invitar con el rol owner.
# Parámetros
Nombre En Tipo Obligatorio Descripción orgruta string (uuid) Sí Id de la organización. Cada ruta comprueba que es la del token (si no, 404).
# Cuerpo de la petición
Tipo de contenido application/json.
Campo Tipo Obligatorio Descripción emailstring (email) Sí Correo electrónico. rolestring Sí Rol. Uno de owner, admin, tech, readonly. client_idstring (uuid) No Limita el miembro invitado a las zonas de un cliente (solo roles tech y readonly).
# Respuesta
201: Creada. Devuelve un objeto con los campos de abajo.
Campo Tipo Descripción idstring (uuid) Id. org_idstring (uuid) Id de la organización. emailstring Correo electrónico. rolestring Rol. Uno de owner, admin, tech, readonly. invited_bystring Quién envió la invitación. created_atstring (date-time) Fecha de creación. expires_atstring (date-time) Fecha de caducidad. client_idstring (uuid) o null Cliente al que se limitará el miembro invitado; null = toda la organización. secretstring
# Errores
Estado Descripción 409already_member o una invitación abierta para el mismo correo.
# Ejemplo
curl TypeScript Python
curl -X POST "https://dash.openwaf.dev/v1/orgs/$OPENWAF_ORG/invitations" \
-H "Authorization: Bearer $OPENWAF_TOKEN" \
-H "Content-Type: application/json" \
--data '{
"email" : "[email protected] " ,
"role" : "readonly"
}'import { OpenWAF } from "./openwaf" ;
const owf = new OpenWAF({ baseUrl: "https://dash.openwaf.dev" }); // token de OPENWAF_TOKEN
const result = await owf.createInvitation({
body: {
email: "[email protected] " ,
role: "readonly"
}
});from openwaf import OpenWAF
owf = OpenWAF(base_url="https://dash.openwaf.dev" ) # token de OPENWAF_TOKEN
result = owf.create_invitation(
body={
"email" : "[email protected] " ,
"role" : "readonly"
},
)
201
{
"id" : "a5614527-0ce6-43be-ad1d-d012b7394867" ,
"org_id" : "1e7c9a3b-5d2f-4b8a-9c6e-0f2a4b6c8d1e" ,
"email" : "[email protected] " ,
"role" : "owner" ,
"invited_by" : "user:5b8e2a1c-7d3f-4a9e-b6c2-1e4d7f0a3b9c" ,
"created_at" : "2026-10-27T09:30:00Z" ,
"expires_at" : "2026-10-27T09:30:00Z" ,
"client_id" : "65904271-c7f4-4ee6-a8a6-84f55f76a92a" ,
"secret" : "owf_8Jx2…"
}
# Retirar una invitación
DELETE /v1/orgs/{org}/invitations/{id}
Retira una invitación abierta; su enlace deja de valer.
Rol necesario: admin o superior. De toda la organización.
# Parámetros
Nombre En Tipo Obligatorio Descripción orgruta string (uuid) Sí Id de la organización. Cada ruta comprueba que es la del token (si no, 404). idruta string (uuid) Sí Id del recurso.
# Respuesta
204: Retirada. Sin cuerpo.
# Errores
Estado Descripción 404No existe o el token no lo ve (not_found).
# Ejemplo
curl TypeScript Python
curl -X DELETE "https://dash.openwaf.dev/v1/orgs/$OPENWAF_ORG/invitations/11111111-2222-4333-8444-555555555555" \
-H "Authorization: Bearer $OPENWAF_TOKEN" import { OpenWAF } from "./openwaf" ;
const owf = new OpenWAF({ baseUrl: "https://dash.openwaf.dev" }); // token de OPENWAF_TOKEN
const result = await owf.deleteInvitation({
id: "11111111-2222-4333-8444-555555555555"
});from openwaf import OpenWAF
owf = OpenWAF(base_url="https://dash.openwaf.dev" ) # token de OPENWAF_TOKEN
result = owf.delete_invitation(id="11111111-2222-4333-8444-555555555555" )