Group admin¶
Gestión de grupos WhatsApp desde la API HTTP — rename, miembros, configuración. Disponible desde v0.48.0.
Cuándo usarlo¶
- Test E2E de v0.47.0: dispara un cambio desde la API → llega
*events.GroupInfo→ qrsgen postea activity msg en la conv del grupo en Chatwoot. Loop verificable sin tocar el phone. - Producción: un agente desde un panel custom (o n8n) gestiona grupos sin abrir WhatsApp. Útil para soporte que kickea miembros problemáticos o renombra grupos por sector.
Endpoints v0.48.0 (mínimos)¶
Todos protegidos por QRSGEN_API_TOKEN (mismo middleware que el resto
de /api/instances/*).
GET /api/instances/:n/groups/:jid¶
Info del grupo (subject, topic, settings, participantes con roles). Round-trip al server WhatsApp.
Response 200:
{
"jid": "120363111222333444@g.us",
"subject": "IA LA CASA",
"topic": "Grupo de coordinación del proyecto",
"is_locked": false,
"is_announce": false,
"is_ephemeral": false,
"participants": [
{
"jid": "34604021705@s.whatsapp.net",
"phone_number": "+34604021705",
"is_admin": true,
"is_super_admin": true
},
{
"jid": "1234567890@lid",
"phone_number": "+34611111111",
"is_admin": false,
"is_super_admin": false
}
]
}
Si el participante es un LID, qrsgen resuelve phone_number cuando
puede (vía PNForLID). Si no hay resolución conocida, queda vacío.
POST /api/instances/:n/groups/:jid/name¶
Renombra el grupo (cambia el subject visible). Requiere que el bot sea admin del grupo.
curl -X POST -H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"name": "IA LA CASA — Renovado"}' \
"$BASE/api/instances/ATC/groups/120363111222333444@g.us/name"
Response 200:
Errores:
- 400 body inválido o name vacío
- 500 WA rechaza (típicamente bot no es admin): error del peer en
el campo error
Side effect (con QRSGEN_GROUP_EVENTS_ENABLED=true): qrsgen postea
un activity msg en la conv del grupo:
POST /api/instances/:n/groups/:jid/participants¶
Añadir, expulsar, promover o degradar miembros. Body:
curl -X POST -H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"action": "add", "jids": ["34611111111@s.whatsapp.net"]}' \
"$BASE/api/instances/ATC/groups/120363111222333444@g.us/participants"
Campos:
- action (requerido): add | remove | promote | demote
- jids (requerido): array de JIDs a procesar
Response 200:
Errores:
- 400 action no válido, jids vacío, jid malformado
- 500 WA rechaza (bot no es admin, número bloqueó al bot, etc.)
Side effects (con GROUP_EVENTS_ENABLED=true):
- add → ➕ **Bot** añadió a NombreDelAñadido
- remove → ➖ NombreDelExpulsado salió/fueron expulsados del grupo
- promote → ⭐ **Bot** promovió a admin: NombrePromovido
- demote → ⭐ **Bot** quitó admin a: NombreDegradado
Requisitos¶
Bot debe ser admin¶
Para cualquier operación de escritura (name, participants) el
bot debe ser admin del grupo. WhatsApp rechaza con 403 forbidden
si no — qrsgen devuelve 500 con el mensaje del peer:
Workaround: añadir el número del bot como admin desde el phone del owner del grupo antes de gestionar via API.
events.GroupInfo activado para activity msgs¶
Sin QRSGEN_GROUP_EVENTS_ENABLED=true, las operaciones funcionan
pero no se reflejan como activity msgs en Chatwoot. El cambio sí
se aplica en WhatsApp, simplemente el agente no lo ve en la conv.
Limitaciones v0.48.0 (planeadas para v0.50.0)¶
- No expuesto:
topic(descripción),locked,announce,ephemeral,create(crear grupo nuevo),leave(bot abandona).
Receta n8n¶
Workflow para promover automáticamente a un agente cuando llega un mensaje de "/promoteme" en un grupo:
[Webhook qrsgen incoming]
↓ filter: content == "/promoteme"
[Function: extract sender JID + chat JID]
↓
[HTTP Request: POST /groups/{chat}/participants
{ "action": "promote", "jids": [{sender}] }]
↓
[HTTP Request: POST /chatwoot/messages
{ "content": "✅ Promovido a admin del grupo" }]
Testing local¶
Sin un grupo real puedes verificar el plumbing:
# JID inválido → 400 (validación)
curl -H "Auth: Bearer $TOKEN" \
"$BASE/api/instances/ATC/groups/noesunjid"
# → {"error":"invalid jid: ..."}
# JID válido pero no-grupo → 400
curl -H "Auth: Bearer $TOKEN" \
"$BASE/api/instances/ATC/groups/34604021705@s.whatsapp.net"
# → {"error":"jid must be a group (@g.us)"}
# JID grupo no existente → 500 (peer WA rechaza)
curl -H "Auth: Bearer $TOKEN" \
"$BASE/api/instances/ATC/groups/999999999999@g.us"
# → {"error":"get group info: info query returned status 400: bad-request"}
Glosario¶
Admin: rol en un grupo WhatsApp con permisos de gestión (renombrar,
añadir/expulsar miembros, cambiar settings). Hay 2 niveles: admin y
super_admin (creador del grupo, no se le puede quitar admin).
LID participants: usuarios en el grupo que aparecen como
<id>@lid en lugar de <phone>@s.whatsapp.net. qrsgen resuelve a PN
vía whatsmeow's PNForLID cuando puede.
ParticipantChange: tipo de operación. WA usa el string raw
(add / remove / promote / demote); qrsgen valida y reenvía.