> For the complete documentation index, see [llms.txt](https://prometheo.gitbook.io/prometheo-api/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://prometheo.gitbook.io/prometheo-api/moderators.md).

# Moderators

## Obtener moderadores de la organización

> Retorna los moderadores de la organización (sin el admin). Nunca incluye password ni otros campos sensibles. Usar el \`id\` de cada moderador en el filtro \`moderator\` de GET /leads.

```json
{"openapi":"3.0.3","info":{"title":"Prometheo External API","version":"1.0.0"},"tags":[{"name":"Moderators"}],"servers":[{"url":"https://api.prometheo.ai/public/v1"}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"API Key"}},"schemas":{"ModeratorListResponse":{"type":"object","required":["success","moderators"],"properties":{"success":{"type":"boolean"},"moderators":{"type":"array","items":{"$ref":"#/components/schemas/Moderator"}}}},"Moderator":{"type":"object","description":"Moderador de la organización. Nunca incluye password ni al admin.","properties":{"id":{"type":"string","description":"ID del usuario"},"first_name":{"type":"string","nullable":true},"last_name":{"type":"string","nullable":true},"email":{"type":"string","nullable":true},"phone":{"type":"string","nullable":true},"active":{"type":"boolean"}}},"ApiError":{"type":"object","required":["success","message"],"properties":{"success":{"type":"boolean"},"message":{"type":"string"},"error":{"type":"string"}}}}},"paths":{"/moderators":{"get":{"tags":["Moderators"],"summary":"Obtener moderadores de la organización","description":"Retorna los moderadores de la organización (sin el admin). Nunca incluye password ni otros campos sensibles. Usar el `id` de cada moderador en el filtro `moderator` de GET /leads.","parameters":[{"name":"active","in":"query","description":"Filtrar por estado activo (`true` o `false`)","schema":{"type":"boolean"}}],"responses":{"200":{"description":"Lista de moderadores obtenida exitosamente","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModeratorListResponse"}}}},"400":{"description":"Error de validación (`active` inválido)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"No autorizado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Error interno","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}}}}
```

## Crear un moderador

> Crea un usuario moderador que puede iniciar sesión con el email y la contraseña enviados. El administrador de la organización no se crea por esta ruta. La contraseña tiene al menos 6 caracteres y no se devuelve en la respuesta.

```json
{"openapi":"3.0.3","info":{"title":"Prometheo External API","version":"1.0.0"},"tags":[{"name":"Moderators"}],"servers":[{"url":"https://api.prometheo.ai/public/v1"}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"API Key"}},"schemas":{"CreateModeratorRequest":{"type":"object","required":["email","password"],"properties":{"email":{"type":"string","format":"email"},"password":{"type":"string","minLength":6},"first_name":{"type":"string"},"last_name":{"type":"string"},"permissions":{"$ref":"#/components/schemas/ModeratorPermissions"}}},"ModeratorPermissions":{"type":"object","properties":{"modify_assistants":{"type":"boolean","default":true},"modify_smart_tags":{"type":"boolean","default":true},"view_database":{"type":"boolean","default":true},"manage_connections":{"type":"boolean","default":true},"billing":{"type":"object","additionalProperties":true},"checkouts":{"type":"object","additionalProperties":true},"only_view_own_leads":{"type":"boolean","default":false,"description":"Si es true, el moderador solo ve sus contactos."}}},"CreateModeratorResponse":{"type":"object","required":["success","moderator"],"properties":{"success":{"type":"boolean"},"moderator":{"type":"object","properties":{"id":{"type":"string"},"first_name":{"type":"string","nullable":true},"last_name":{"type":"string","nullable":true},"email":{"type":"string","format":"email"},"active":{"type":"boolean"},"permissions":{"$ref":"#/components/schemas/ModeratorPermissions"},"restrictions":{"type":"object","properties":{"only_view_own_leads":{"type":"boolean"}}}}}}},"ApiError":{"type":"object","required":["success","message"],"properties":{"success":{"type":"boolean"},"message":{"type":"string"},"error":{"type":"string"}}}},"responses":{"BadRequest":{"description":"Datos inválidos","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"Unauthorized":{"description":"No autorizado (API Key ausente o inválida)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"InternalError":{"description":"Error interno","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}},"paths":{"/moderators":{"post":{"tags":["Moderators"],"summary":"Crear un moderador","description":"Crea un usuario moderador que puede iniciar sesión con el email y la contraseña enviados. El administrador de la organización no se crea por esta ruta. La contraseña tiene al menos 6 caracteres y no se devuelve en la respuesta.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateModeratorRequest"}}}},"responses":{"201":{"description":"Moderador creado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateModeratorResponse"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"500":{"$ref":"#/components/responses/InternalError"}}}}}}
```

## Cambiar el acceso de un moderador a Mi Prometheo

> Habilita o bloquea funciones del asistente interno para un moderador. \`grant\` y \`deny\` reciben las claves de función. \`reset: true\` vuelve a los permisos por defecto. No aplica al administrador de la organización.

```json
{"openapi":"3.0.3","info":{"title":"Prometheo External API","version":"1.0.0"},"tags":[{"name":"Moderators"}],"servers":[{"url":"https://api.prometheo.ai/public/v1"}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"API Key"}},"parameters":{"ResourceId":{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Id del recurso."}},"schemas":{"ModeratorAssistantAccessRequest":{"type":"object","properties":{"grant":{"type":"array","items":{"type":"string"},"description":"Claves de función a habilitar."},"deny":{"type":"array","items":{"type":"string"},"description":"Claves de función a bloquear."},"reset":{"type":"boolean","description":"Vuelve al acceso por defecto."}}},"ModeratorAssistantAccessResponse":{"type":"object","required":["success"],"properties":{"success":{"type":"boolean"},"moderator":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"email":{"type":"string"}}},"assistant_access":{"type":"object","properties":{"grants":{"type":"array","items":{"type":"string"}},"denies":{"type":"array","items":{"type":"string"}}}},"effective_functions":{"type":"array","items":{"type":"string"}}}},"ApiError":{"type":"object","required":["success","message"],"properties":{"success":{"type":"boolean"},"message":{"type":"string"},"error":{"type":"string"}}}},"responses":{"BadRequest":{"description":"Datos inválidos","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"Unauthorized":{"description":"No autorizado (API Key ausente o inválida)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"Forbidden":{"description":"La API key o el recurso no permiten esta operación","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"InternalError":{"description":"Error interno","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}},"paths":{"/moderators/{id}/assistant-access":{"patch":{"tags":["Moderators"],"summary":"Cambiar el acceso de un moderador a Mi Prometheo","description":"Habilita o bloquea funciones del asistente interno para un moderador. `grant` y `deny` reciben las claves de función. `reset: true` vuelve a los permisos por defecto. No aplica al administrador de la organización.","parameters":[{"$ref":"#/components/parameters/ResourceId"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModeratorAssistantAccessRequest"}}}},"responses":{"200":{"description":"Acceso actualizado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModeratorAssistantAccessResponse"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"500":{"$ref":"#/components/responses/InternalError"}}}}}}
```

## Reasignar los contactos de un moderador a otro

> Mueve todos los contactos de \`from\_moderator\_id\` a \`to\_moderator\_id\`. Con \`dry\_run: true\` solo devuelve cuántos se moverían.

```json
{"openapi":"3.0.3","info":{"title":"Prometheo External API","version":"1.0.0"},"tags":[{"name":"Moderators"}],"servers":[{"url":"https://api.prometheo.ai/public/v1"}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"API Key"}},"schemas":{"ReassignModeratorsRequest":{"type":"object","required":["from_moderator_id","to_moderator_id"],"properties":{"from_moderator_id":{"type":"string"},"to_moderator_id":{"type":"string"},"dry_run":{"type":"boolean","description":"true cuenta sin mover contactos."}}},"ReassignModeratorsResponse":{"type":"object","properties":{"success":{"type":"boolean"},"dry_run":{"type":"boolean"},"from_moderator":{"$ref":"#/components/schemas/ModeratorRef"},"to_moderator":{"$ref":"#/components/schemas/ModeratorRef"},"total":{"type":"integer"},"reassigned":{"type":"integer"},"failed":{"type":"integer"}}},"ModeratorRef":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"email":{"type":"string"},"exists":{"type":"boolean"}}},"ApiError":{"type":"object","required":["success","message"],"properties":{"success":{"type":"boolean"},"message":{"type":"string"},"error":{"type":"string"}}}},"responses":{"BadRequest":{"description":"Datos inválidos","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"Unauthorized":{"description":"No autorizado (API Key ausente o inválida)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"InternalError":{"description":"Error interno","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}},"paths":{"/moderators/reassign":{"post":{"tags":["Moderators"],"summary":"Reasignar los contactos de un moderador a otro","description":"Mueve todos los contactos de `from_moderator_id` a `to_moderator_id`. Con `dry_run: true` solo devuelve cuántos se moverían.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReassignModeratorsRequest"}}}},"responses":{"200":{"description":"Reasignación ejecutada o vista previa","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReassignModeratorsResponse"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"500":{"$ref":"#/components/responses/InternalError"}}}}}}
```

## Asignar un moderador a contactos filtrados

> Asigna \`moderator\_id\` a los contactos que cumplen el filtro de etiqueta y de fechas. \`tag\_mode\` puede ser \`has\`, \`has\_not\` o \`no\_tags\`. Con \`no\_tags\` hace falta un rango de fechas. \`to\_tag\_id\` agrega una etiqueta sin quitar las actuales. \`dry\_run: true\` solo cuenta.

```json
{"openapi":"3.0.3","info":{"title":"Prometheo External API","version":"1.0.0"},"tags":[{"name":"Moderators"}],"servers":[{"url":"https://api.prometheo.ai/public/v1"}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"API Key"}},"schemas":{"AssignModeratorRequest":{"type":"object","required":["moderator_id"],"properties":{"moderator_id":{"type":"string"},"tag_id":{"type":"string","description":"Id de etiqueta, o `no_tags` para contactos sin etiqueta."},"tag_mode":{"type":"string","enum":["has","has_not","no_tags"]},"to_tag_id":{"type":"string","description":"Etiqueta que se agrega. Vacío no cambia las etiquetas."},"date_range":{"$ref":"#/components/schemas/DateRangeInput"},"dry_run":{"type":"boolean"}}},"DateRangeInput":{"type":"object","description":"Rango usado por las acciones masivas. Las fechas son AAAA-MM-DD o ISO 8601.","properties":{"start_date":{"type":"string"},"end_date":{"type":"string"},"start_time":{"type":"string"},"end_time":{"type":"string"}}},"AssignModeratorResponse":{"type":"object","properties":{"success":{"type":"boolean"},"dry_run":{"type":"boolean"},"matching":{"type":"integer"},"already_assigned":{"type":"integer"},"assigned":{"type":"integer"}}},"ApiError":{"type":"object","required":["success","message"],"properties":{"success":{"type":"boolean"},"message":{"type":"string"},"error":{"type":"string"}}}},"responses":{"BadRequest":{"description":"Datos inválidos","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"Unauthorized":{"description":"No autorizado (API Key ausente o inválida)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"InternalError":{"description":"Error interno","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}},"paths":{"/moderators/assign":{"post":{"tags":["Moderators"],"summary":"Asignar un moderador a contactos filtrados","description":"Asigna `moderator_id` a los contactos que cumplen el filtro de etiqueta y de fechas. `tag_mode` puede ser `has`, `has_not` o `no_tags`. Con `no_tags` hace falta un rango de fechas. `to_tag_id` agrega una etiqueta sin quitar las actuales. `dry_run: true` solo cuenta.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssignModeratorRequest"}}}},"responses":{"200":{"description":"Asignación ejecutada o vista previa","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssignModeratorResponse"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"500":{"$ref":"#/components/responses/InternalError"}}}}}}
```
