Miembros e invitaciones
Todas estas operaciones, incluida la lectura, requieren que el creador de la API key siga siendo administrador de la organización. REST exige Starter o Pro activo. La organización se determina por la clave.
Endpoints y permisos
| Método y ruta | Scope | Parámetros | Éxito |
|---|---|---|---|
GET /api/v1/members |
members:read |
Ninguno; sin paginación ni filtros | 200 miembros e invitaciones pendientes |
POST /api/v1/invitations |
members:write |
JSON email string obligatorio |
201 invitación; envía correo |
PATCH /api/v1/members/:id |
members:write |
ID de membresía positivo obligatorio; JSON role obligatorio |
200 membresía actualizada |
DELETE /api/v1/members/:id |
members:write |
ID de membresía positivo obligatorio, sin cuerpo | 200 membresía retirada |
DELETE /api/v1/invitations/:id |
members:write |
ID de invitación positivo obligatorio, sin cuerpo | 200 invitación revocada |
members:write incluye members:read. El ID de miembro es ID de membresía, no user_id. role solo puede ser admin o member. Invitar solo admite email, no role: se invita como miembro. No se aceptan attrs, IDs de organización, parámetros extra ni PUT. Los cuerpos de invite/role no admiten no-op vacío.
Listar
GET /api/v1/members
Authorization: Bearer <API_KEY>
Respuesta 200 de ejemplo:
{"data":{"members":[{"id":12,"user_id":8,"role":"admin"}],"invitations":[]}}
No hay meta. Una membresía tiene id, user_id enteros y role string; no incluye email o nombre del usuario. Una invitación tiene id, email, role, expires_at timestamp ISO 8601 y revoked_at timestamp ISO o null. No se expone token de aceptación.
Invitar, cambiar rol, retirar y revocar
POST /api/v1/invitations
Authorization: Bearer <API_KEY>
Content-Type: application/json
{"email":"persona\u0040example.org"}
201 {"data": invitación}. La persona debe aceptar el correo; crear una invitación no crea inmediatamente una membresía. No reintentes a ciegas tras un timeout: listar pendientes permite comprobar si se creó.
PATCH /api/v1/members/14
Authorization: Bearer <API_KEY>
Content-Type: application/json
{"role":"member"}
200 {"data":{"id":14,"user_id":9,"role":"member"}} como ejemplo. Cambiar a un rol ya asignado no implica crear otra membresía; siguen aplicándose las protecciones de administración.
DELETE /api/v1/members/14
Authorization: Bearer <API_KEY>
200 {"data": membresía} retirada; no elimina la cuenta personal del usuario ni devuelve 204.
DELETE /api/v1/invitations/20
Authorization: Bearer <API_KEY>
200 {"data": invitación} con revoked_at informado. Retirar una membresía no equivale a revocar una invitación.
Protecciones y errores
No puedes retirarte a ti mismo, cambiar tu propio rol ni dejar la organización sin administrador. Los scopes no eluden estas reglas. Una clave cuyo creador dejó de ser administrador pierde acceso a estas operaciones aunque conserve scopes.
| HTTP / código | Causa |
|---|---|
400 invalid_params |
ID, email o role ausente/inválido; parámetros desconocidos |
403 forbidden |
Scope insuficiente o creador no administrador actual |
404 not_found |
Membresía/invitación inexistente o ajena |
409 conflict |
cannot_remove_self, cannot_change_own_role, last_admin, already_member, invitation_already_pending |
422 validation_error |
Email o datos de invitación inválidos |
422 operation_failed |
No se pudo completar la operación |
Ejemplo: {"errors":{"code":"conflict","detail":"cannot_remove_self"}}. Se aplican también 401 y suscripción 403.
MCP
En Pro activo, una sola herramienta kordia_manage_members agrupa action: "list", "invite", "update_role", "remove", "revoke_invitation". Usa los campos correspondientes de la tabla (id, email, role), no todos a la vez. Solo list es lectura de negocio, aunque la herramienta agregada se anuncie como potencialmente destructiva y con efectos externos. Confirma la intención de invitar antes de enviar correo desde un agente.
Relacionado: organización, autenticación, conexión MCP.