Colaboradores
API de Colaboradores
Endpoints para gestionar los miembros de tu equipo. Los propietarios pueden invitar colaboradores por correo electrónico, activarlos o desactivarlos, y reenviar invitaciones.
Listar Colaboradores
GET /api/collaborators
Permiso: collaborators:manage (solo Owner)
Lista todos los colaboradores del tenant actual.
Parámetros de consulta:
| Parameter | Type | Required | Description |
|---|---|---|---|
| search | string | No | Busca por nombre o correo electrónico (sin distinguir mayúsculas) |
Respuesta 200 OK:
{
"data": [
{
"id": "clxyz...",
"email": "ana@empresa.mx",
"name": "Ana Rodríguez",
"isActive": true,
"confirmedAt": "2026-03-15T10:00:00.000Z",
"inviteExpiresAt": null,
"createdAt": "2026-03-10T08:00:00.000Z"
}
]
}Un colaborador con confirmedAt: null fue invitado pero aún no ha aceptado la invitación.
Invitar Colaborador
POST /api/collaborators
Permiso: collaborators:manage | Se aplican los límites del plan (el plan FREE tiene un máximo de colaboradores)
Envía una invitación por correo electrónico a un nuevo colaborador. Crea un registro de usuario con rol COLLABORATOR y una contraseña temporal. El invitado debe aceptar la invitación para establecer su contraseña y activar su cuenta.
Cuerpo de la solicitud:
{
"email": "nuevo@empresa.mx",
"name": "Jorge Hernández"
}| Field | Type | Required | Description |
|---|---|---|---|
| string | Yes | Correo electrónico válido (no debe existir en el tenant ni globalmente) | |
| name | string | Yes | Nombre del colaborador (mínimo 2 caracteres) |
Respuesta 201 Created:
{
"id": "clxyz...",
"email": "nuevo@empresa.mx",
"name": "Jorge Hernández",
"isActive": true,
"confirmedAt": null,
"inviteExpiresAt": "2026-04-03T10:00:00.000Z",
"createdAt": "2026-03-31T10:00:00.000Z",
"inviteUrl": "https://cotizera.com/invite/abc-123-def"
}Errores:
| Status | Error | When |
|---|---|---|
| 403 | "Límite de colaboradores alcanzado. Actualiza a Pro para invitar más." | Se alcanzó el límite de colaboradores del plan FREE |
| 409 | "Ya existe un colaborador con ese correo en este negocio" | El correo ya existe en el tenant |
| 409 | "Este correo ya está registrado en la plataforma" | El correo ya existe a nivel global |
Efectos secundarios:
- Envía un correo de invitación a través de Resend
- El token de invitación expira en 72 horas
- Registra una entrada de auditoría con la acción
invite
Activar / Desactivar Colaborador
PUT /api/collaborators/:id
Permiso: collaborators:manage
Cambia el estado activo de un colaborador.
Cuerpo de la solicitud:
{
"isActive": false
}| Field | Type | Required | Description |
|---|---|---|---|
| isActive | boolean | Yes | true para activar, false para desactivar |
Respuesta 200 OK: Devuelve el objeto del colaborador actualizado.
Errores:
| Status | Error | When |
|---|---|---|
| 404 | "Colaborador no encontrado" | El colaborador no se encontró en el tenant |
Reenviar Invitación
PATCH /api/collaborators/:id
Permiso: collaborators:manage
Regenera el token de invitación (extiende la expiración 72 horas más) y reenvía el correo de invitación. Solo funciona para colaboradores que aún no han aceptado.
Cuerpo de la solicitud: No se requiere.
Respuesta 200 OK:
{
"inviteUrl": "https://cotizera.com/invite/new-token-xyz"
}Errores:
| Status | Error | When |
|---|---|---|
| 400 | "Este colaborador ya aceptó la invitación" | El colaborador ya confirmó |
| 404 | "Colaborador no encontrado" | No se encontró en el tenant |
Validar Token de Invitación
GET /api/collaborators/accept
No requiere autenticación — endpoint público.
Valida un token de invitación y devuelve la información del invitado. Lo usa la página de aceptación de invitaciones.
Parámetros de consulta:
| Parameter | Type | Required | Description |
|---|---|---|---|
| token | string | Yes | El token de invitación de la URL |
Respuesta 200 OK:
{
"name": "Jorge Hernández",
"email": "nuevo@empresa.mx",
"companyName": "Acme Solutions S.A. de C.V."
}Errores:
| Status | Error | When |
|---|---|---|
| 400 | "Token requerido" | Falta el parámetro token |
| 400 | "Esta invitación ya fue aceptada" | Ya fue confirmada |
| 404 | "Invitación inválida o ya utilizada" | No se encontró el token |
| 410 | "La invitación ha expirado" | El token expiró (72 horas) |
Aceptar Invitación
POST /api/collaborators/accept
No requiere autenticación — endpoint público.
Acepta una invitación proporcionando el token y estableciendo una contraseña.
Cuerpo de la solicitud:
{
"token": "abc-123-def",
"password": "MiContraseña123"
}| Field | Type | Required | Description |
|---|---|---|---|
| token | string | Yes | Token de invitación |
| password | string | Yes | Nueva contraseña (mínimo 6 caracteres) |
Respuesta 200 OK:
{
"success": true
}Errores:
| Status | Error | When |
|---|---|---|
| 400 | "Esta invitación ya fue aceptada" | Ya fue confirmada |
| 404 | "Invitación inválida o ya utilizada" | No se encontró el token |
| 410 | "La invitación ha expirado. Solicita una nueva al administrador." | Token expirado |