API de equipo
Tu equipo es todo aquel que trabaja dentro de tu cuenta además de ti (administradores, agentes y espectadores de solo lectura), además de las invitaciones que has enviado y los departamentos en los que los organizas. La API de equipo es la versión programática de Configuración → Equipo: añade y elimina personas, establece lo que cada una puede ver y hacer, envía y gestiona invitaciones, y administra departamentos.
Todos los endpoints a continuación son relativos a la URL base https://api.youraiconnector.com/v1. Para la versión del panel de control de todo lo que aparece en esta página, consulta Gestión de equipo.
Autenticación: estos endpoints requieren una persona que haya iniciado sesión
Esta es la única parte de la API que no puede utilizar una clave de API. Todos los endpoints /team, excepto los de departamento, deben llamarse con un token de ID de Firebase de una sesión iniciada:
Authorization: Bearer <Firebase ID token>
Si envías una clave de API, la solicitud será rechazada con un 401:
{
"success": false,
"error_code": 401,
"error": "This endpoint requires a Firebase ID token (Authorization: Bearer <token>)."
}
La razón es que estos endpoints deciden qué hacer basándose en quién ha iniciado sesión: tu rol, el límite de lo que tienes permitido conceder a otra persona y si actualmente estás trabajando dentro de otra cuenta. Una clave de API es una integración, no una persona, por lo que no hay nadie a quien aplicar esas reglas.
En la práctica, esto significa que la API de equipo es para una aplicación propia con un usuario Your AI Connector que haya iniciado sesión (consulta Autenticación → Token de ID de Firebase). Una integración servidor a servidor no puede gestionar miembros del equipo; no hay forma de generar uno de estos tokens desde fuera de la aplicación.
La excepción: los cuatro endpoints de departamento son endpoints de API ordinarios. Aceptan tu clave de API exactamente igual que el resto de la API, así como una sesión iniciada.
Cada respuesta en esta página sigue el sobre habitual: success: true más los campos del endpoint en el nivel superior, o success: false con error y error_code cuando algo sale mal.
Roles y permisos
Cada miembro del equipo tiene un rol, que establece su acceso predeterminado en 12 áreas de la aplicación. Luego puedes anular áreas individuales.
| Rol | Valor | Resumen |
|---|---|---|
| Admin | admin |
Todo excepto las acciones de nivel de facturación del propietario. |
| Editor | editor |
Puede crear y cambiar cosas. Se muestra como Agente en la aplicación. |
| Viewer | viewer |
Solo lectura. |
Cada área se establece en uno de cuatro niveles: none (oculto), view (solo lectura), edit (crear y cambiar), full (incluyendo eliminar).
| Área | Admin | Editor | Viewer |
|---|---|---|---|
campaigns |
full | edit | view |
contacts |
full | edit | view |
messages |
full | edit | view |
appointments |
full | edit | view |
settings |
edit | view | none |
billing |
edit | none | none |
team_management |
edit | none | none |
analytics |
full | view | view |
phone_numbers |
edit | none | none |
integrations |
edit | none | none |
faqs |
full | edit | view |
daily_summaries |
full | view | view |
Para apartarse de los valores predeterminados del rol, envíe permission_overrides: una matriz de objetos { "area": ..., "level": ... }. Cada entrada reemplaza el valor predeterminado del rol para esa área específica; todo lo que no incluya en la lista mantendrá el valor predeterminado del rol.
"permission_overrides": [
{ "area": "analytics", "level": "full" },
{ "area": "billing", "level": "none" }
]
Quién puede llamar a estos endpoints
- El propietario de la cuenta siempre puede hacerlo todo.
- Un miembro del equipo necesita
team_managementenviewpara leer la lista de miembros y la lista de invitaciones, y eneditpara añadir, cambiar, suspender, eliminar, invitar, cancelar o reenviar. Los administradores tieneneditde forma predeterminada; los editores y los visores tienennone, por lo que, de forma predeterminada, solo los administradores pueden gestionar el equipo. - Nadie puede conceder un acceso superior al suyo propio. Si intenta asignar a alguien un nivel que usted mismo no posee, o editar, suspender o eliminar a alguien cuyo acceso ya es más amplio que el suyo, la solicitud será rechazada con
403y un mensaje indicando el área.
El objeto de miembro del equipo
GET /team/members devuelve uno de estos por miembro:
| Campo | Tipo | Descripción |
|---|---|---|
member_uid |
string | El ID de usuario del propio miembro. Este es el {memberUid} en las rutas a continuación. |
account_owner_uid |
string | La cuenta de la que son miembros. |
member_email |
string | Su dirección de correo electrónico. |
member_display_name |
string | El nombre que se muestra para ellos en la aplicación. |
role |
string | admin, editor o viewer. |
permission_overrides |
array | Sus excepciones por área. [] cuando se basan puramente en los valores predeterminados del rol. |
status |
string | active o suspended. |
auto_assign_enabled |
boolean | null | Si los nuevos contactos pueden asignárseles automáticamente. null significa que nunca se ha cambiado, lo cual se comporta como true. |
created_by |
string | Quién los añadió. |
created_at |
string | null | Marca de tiempo ISO 8601. |
updated_at |
string | null | Marca de tiempo ISO 8601. |
Los miembros eliminados no se devuelven; la lista solo incluye a los miembros activos y suspendidos.
Los límites de visibilidad son de solo escritura aquí.
contact_scope,contact_scope_axesysub_account_access(consulte Limitar lo que un miembro puede ver) se pueden establecer al crear, actualizar e invitar, pero este endpoint no los devuelve.
Listar miembros del equipo
GET /team/members
Devuelve la lista de miembros junto con el recuento de plazas de su plan, para que pueda mostrar “3 de 5 plazas” y saber cuándo se rechazará una invitación.
cURL
curl "https://api.youraiconnector.com/v1/team/members" \
-H "Authorization: Bearer FIREBASE_ID_TOKEN"
JavaScript
const res = await fetch("https://api.youraiconnector.com/v1/team/members", {
headers: { Authorization: `Bearer ${idToken}` },
});
const { members, seat_limit, seats_used } = await res.json();
Python
import requests
res = requests.get(
"https://api.youraiconnector.com/v1/team/members",
headers={"Authorization": f"Bearer {id_token}"},
)
data = res.json()
Respuesta
{
"success": true,
"members": [
{
"account_owner_uid": "owner_uid_123",
"member_uid": "uid_alice",
"member_email": "alice@example.com",
"member_display_name": "Alice Chen",
"role": "admin",
"permission_overrides": [],
"status": "active",
"auto_assign_enabled": true,
"created_by": "owner_uid_123",
"created_at": "2026-05-01T10:00:00.000Z",
"updated_at": "2026-06-02T09:15:00.000Z"
}
],
"seat_limit": 5,
"seats_used": 3
}
seat_limit es null cuando su plan no tiene límite de plazas. seats_used cuenta solo a los miembros activos; suspender o eliminar a alguien libera su plaza inmediatamente.
Añadir un miembro del equipo directamente
POST /team/members
Incorpora a alguien a su equipo de inmediato, sin necesidad de una invitación.
Esto no envía ningún correo electrónico. Nadie recibe aviso de que ha sido añadido y, si aún no tenían un inicio de sesión en Your AI Connector, la cuenta creada para ellos no tiene contraseña, por lo que no podrán iniciar sesión hasta que la restablezcan. Utilice Enviar una invitación a menos que tenga su propia forma de informar a la persona y ayudarla a iniciar sesión.
Campos de la solicitud
| Campo | Obligatorio | Descripción |
|---|---|---|
email |
Sí | La dirección de correo electrónico del miembro del equipo. |
display_name |
Sí | El nombre que se muestra para ellos en la aplicación. |
role |
Sí | admin, editor o viewer. |
permission_overrides |
No | Excepciones por área a los valores predeterminados del rol. |
contact_scope |
No | all o assigned — consulte Limitar lo que puede ver un miembro. |
contact_scope_unassigned |
No | Con assigned, también permite que vean contactos que aún no tienen propietario. |
contact_scope_axes |
No | Limítelos a agentes, canales o departamentos específicos. |
sub_account_access |
No | Solo agencias: qué subcuentas de cliente pueden abrir. |
cURL
curl -X POST "https://api.youraiconnector.com/v1/team/members" \
-H "Authorization: Bearer FIREBASE_ID_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"email": "sam@example.com",
"display_name": "Sam Rivera",
"role": "editor"
}'
JavaScript
const res = await fetch("https://api.youraiconnector.com/v1/team/members", {
method: "POST",
headers: {
Authorization: `Bearer ${idToken}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
email: "sam@example.com",
display_name: "Sam Rivera",
role: "editor",
}),
});
const { member_uid } = await res.json();
Respuesta — 201 Created
{
"success": true,
"team_member_id": "owner_uid_123_uid_sam",
"member_uid": "uid_sam",
"message": "Team member created successfully."
}
| Estado | Cuándo |
|---|---|
400 |
Falta email, display_name o role, el rol no es uno de los tres, o intentó añadirse a sí mismo. |
403 |
No tiene permiso para gestionar el equipo, o intentó otorgar un acceso superior al suyo. |
409 |
Esa persona ya es un miembro activo de su equipo. |
429 |
Las plazas de equipo de su plan están llenas. |
Añadir a alguien que fue suspendido o eliminado anteriormente los restablece en lugar de fallar.
Actualizar un miembro del equipo
PATCH /team/members/{memberUid}
Cambia el rol, los permisos, la visibilidad, el acceso a clientes o la participación en la asignación automática de contactos de un miembro. Envíe solo los campos que desea cambiar; todo lo que omita mantendrá su valor actual.
Campos de la solicitud
| Campo | Descripción |
|---|---|
role |
admin, editor o viewer. |
permission_overrides |
Reemplaza toda su lista de excepciones. Envíe [] para devolverlos a los valores predeterminados del rol. |
status |
Solo se acepta active para reactivar a un miembro suspendido. Para suspender a alguien, utilice el endpoint de suspensión. |
auto_assign_enabled |
true o false. |
contact_scope |
all o assigned. |
contact_scope_unassigned |
true o false. |
contact_scope_axes |
Consulte Limitar lo que puede ver un miembro. |
sub_account_access |
Solo agencias. |
Este es el único endpoint donde
nullsignifica “borrar”. Enviar"contact_scope": null,"contact_scope_axes": nullo"sub_account_access": nullelimina ese límite por completo y hace que el miembro vuelva a verlo todo. Al crear e invitar,nullsimplemente significa “no suministrado”.
cURL
curl -X PATCH "https://api.youraiconnector.com/v1/team/members/uid_sam" \
-H "Authorization: Bearer FIREBASE_ID_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"role": "admin",
"permission_overrides": [{ "area": "billing", "level": "none" }]
}'
Respuesta
{
"success": true,
"message": "Team member updated successfully."
}
| Estado | Cuándo |
|---|---|
400 |
Un valor status o auto_assign_enabled no válido, o intentó reactivar a un miembro que fue eliminado (los miembros eliminados deben ser invitados de nuevo). |
403 |
No tiene permiso, o el cambio editaría o crearía un acceso más amplio que el suyo. |
404 |
No existe tal miembro del equipo. |
Suspender a un miembro del equipo
POST /team/members/{memberUid}/suspend
Suspende a alguien: mantienen su lugar en el equipo pero pierden el acceso. Utilice esto en lugar de eliminar cuando la pausa sea temporal; devuélvalos con PATCH /team/members/{memberUid} y {"status": "active"}.
cURL
curl -X POST "https://api.youraiconnector.com/v1/team/members/uid_sam/suspend" \
-H "Authorization: Bearer FIREBASE_ID_TOKEN"
Respuesta
{
"success": true,
"message": "Team member suspended successfully."
}
Un miembro suspendido libera su plaza, por lo que puede invitar a otra persona en su lugar. Su acceso finaliza cuando su token de sesión actual se actualice, lo que puede tardar hasta una hora; elimínelos si necesita que sea inmediato.
| Estado | Cuándo |
|---|---|
400 |
Intentó suspender al propietario de la cuenta, o a un miembro que ya está suspendido o eliminado. |
403 |
Su acceso es más amplio que el suyo. |
404 |
No existe tal miembro del equipo. |
Eliminar a un miembro del equipo
DELETE /team/members/{memberUid}
Elimina a alguien de tu equipo y libera su puesto. Se cierra su sesión y pierde el acceso a tu cuenta; su propio inicio de sesión permanece intacto.
cURL
curl -X DELETE "https://api.youraiconnector.com/v1/team/members/uid_sam" \
-H "Authorization: Bearer FIREBASE_ID_TOKEN"
Respuesta
{
"success": true,
"message": "Team member removed successfully."
}
La eliminación es permanente por tu parte: un miembro eliminado no puede ser reactivado con el endpoint de actualización; invítalo de nuevo si cambias de opinión. Su correo electrónico también se elimina de la lista de notificaciones de tu cuenta.
| Estado | Cuándo |
|---|---|
400 |
Intentaste eliminar al propietario de la cuenta. |
403 |
Su acceso es más amplio que el tuyo. |
404 |
No existe tal miembro del equipo. |
Limitar lo que un miembro puede ver
Tres campos opcionales, aceptados en agregar, actualizar e invitar, deciden cuánto de la cuenta puede ver una persona. Se acumulan: un miembro limitado en más de uno está limitado por todos ellos.
contact_scope — all (el valor predeterminado: todos los contactos y conversaciones) o assigned (solo los que tienen asignados). Con assigned, añade "contact_scope_unassigned": true para permitirles también ver los contactos que aún no tienen propietario.
contact_scope_axes — los limita a agentes, canales o departamentos específicos:
| Campo | Tipo | Descripción |
|---|---|---|
agents |
string[] | IDs de agente. Solo ven los chats dirigidos a uno de estos agentes. Máx. 200. |
channels |
string[] | Nombres de canal — whatsapp, whatsapp_web, sms, instagram, instagram_private, messenger, facebook, chat_widget, telegram, line, viber, tiktok, imessage, email, linkedin, skool, custom, custom_channel. Máx. 200. |
departments |
string[] | IDs de departamento (consulta Departamentos). Solo ven los leads registrados bajo ellos. Máx. 200. |
include_unrouted |
boolean | Con agents activado, también muestra los chats que ningún agente gestiona. Desactivado por defecto. Se ignora cuando agents está vacío. |
include_undepartmented |
boolean | Con departments activado, también muestra los chats que no están en ningún departamento. Desactivado por defecto. Se ignora cuando departments está vacío. |
Los IDs de agente y departamento no se verifican al guardarlos; un ID que no existe simplemente no coincide con nada, lo que se muestra como una bandeja de entrada vacía en lugar de un error. Los nombres de canal sí se verifican: uno no reconocido se rechaza con 400.
Ninguno de estos tres puede configurarse para el propietario de la cuenta; esa solicitud se rechaza con 400.
Listar invitaciones
GET /team/invites
Las invitaciones que has enviado, de la más reciente a la más antigua, para que puedas ver quién aún no ha aceptado.
Parámetros de consulta
| Parámetro | Requerido | Descripción |
|---|---|---|
status |
No | Solo devuelve invitaciones en este estado: pending, accepted, declined, cancelled o expired. |
cURL
curl "https://api.youraiconnector.com/v1/team/invites?status=pending" \
-H "Authorization: Bearer FIREBASE_ID_TOKEN"
Respuesta
{
"success": true,
"invites": [
{
"id": "inv_abc123",
"account_owner_uid": "owner_uid_123",
"account_owner_display_name": "Acme Ltd",
"invitee_email": "sam@example.com",
"invitee_uid": null,
"role": "editor",
"permission_overrides": [],
"status": "pending",
"created_by": "owner_uid_123",
"created_at": "2026-06-10T12:00:00.000Z",
"expires_at": "2026-06-17T12:00:00.000Z",
"responded_at": null
}
]
}
El token de invitación nunca se devuelve; solo existe en el correo electrónico que se envió.
Enviar una invitación
POST /team/invites
Envía por correo electrónico una invitación a alguien para que se una a tu equipo. Esta es la forma habitual de añadir a un compañero de equipo: hacen clic en el enlace, inician sesión con su propia cuenta y aceptan. Si aún no tienen una cuenta de Your AI Connector, se crea una para ellos y el correo electrónico los guía para establecer una contraseña.
Campos de la solicitud
| Campo | Requerido | Descripción |
|---|---|---|
email |
Sí | A dónde enviar la invitación. |
role |
Sí | admin, editor o viewer. |
permission_overrides |
No | Excepciones por área, aplicadas en el momento en que aceptan. |
contact_scope |
No | Aplicado cuando aceptan. |
contact_scope_unassigned |
No | Aplicado cuando aceptan. |
contact_scope_axes |
No | Aplicado cuando aceptan. |
sub_account_access |
No | Solo agencias. Aplicado cuando aceptan. |
Configurar los permisos por adelantado significa que no tienes que editar al miembro después; todo se copia en su membresía cuando aceptan.
cURL
curl -X POST "https://api.youraiconnector.com/v1/team/invites" \
-H "Authorization: Bearer FIREBASE_ID_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "email": "sam@example.com", "role": "editor" }'
JavaScript
const res = await fetch("https://api.youraiconnector.com/v1/team/invites", {
method: "POST",
headers: {
Authorization: `Bearer ${idToken}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ email: "sam@example.com", role: "editor" }),
});
const { invite_id } = await res.json();
Respuesta — 201 Created
{
"success": true,
"invite_id": "inv_abc123",
"message": "Team invite sent successfully."
}
Cosas a tener en cuenta
- Las invitaciones caducan después de 7 días. Una invitación caducada puede volver a enviarse, lo que inicia un nuevo periodo de 7 días.
- Las invitaciones pendientes ocupan un asiento. A diferencia de añadir a un miembro directamente, el recuento de asientos aquí incluye a los miembros activos más las invitaciones pendientes, por lo que se rechazará una cuenta con todos los asientos ocupados antes de que se envíe el correo electrónico.
- 20 invitaciones por día, contadas por cuenta tanto al enviar como al reenviar.
| Estado | Cuándo |
|---|---|
400 |
Falta email o el rol no es válido. |
403 |
No tienes permiso para gestionar el equipo, o intentaste otorgar un acceso superior al tuyo. |
409 |
Ya existe una invitación pendiente para ese correo electrónico, o esa persona ya está en tu equipo. |
429 |
Los asientos de equipo de tu plan están llenos, o has alcanzado el límite de 20 invitaciones al día. El mensaje error indica cuál es el caso. |
Cancelar una invitación
DELETE /team/invites/{inviteId}
Retira una invitación antes de que sea aceptada. El enlace en el correo electrónico deja de funcionar.
cURL
curl -X DELETE "https://api.youraiconnector.com/v1/team/invites/inv_abc123" \
-H "Authorization: Bearer FIREBASE_ID_TOKEN"
Respuesta
{
"success": true,
"message": "Team invite cancelled."
}
Tanto las invitaciones pending como las expired pueden cancelarse. Una invitación que ya fue aceptada, rechazada o cancelada devuelve 400; una que no es tuya devuelve 403; un ID desconocido devuelve 404.
Reenviar una invitación
POST /team/invites/{inviteId}/resend
Envía de nuevo el correo electrónico de invitación, para cuando se perdió o fue a la carpeta de spam. Funciona en invitaciones pending y expired, y restablece la fecha de caducidad a 7 días a partir de ahora.
cURL
curl -X POST "https://api.youraiconnector.com/v1/team/invites/inv_abc123/resend" \
-H "Authorization: Bearer FIREBASE_ID_TOKEN"
Respuesta
{
"success": true,
"message": "Team invite resent successfully."
}
El nuevo correo electrónico contiene un nuevo enlace, y el enlace antiguo también sigue funcionando, por lo que una persona que encuentre el primer correo electrónico más tarde no tendrá problemas. El reenvío cuenta para el mismo límite de 20 al día que el envío, y reactivar una invitación caducada vuelve a comprobar tus plazas: un plan completo se rechaza con 429.
Aceptar una invitación
POST /team/invites/accept
Acepta una invitación con el token del correo electrónico de invitación, uniendo a la persona que ha iniciado sesión al equipo de esa cuenta.
Este es un acto de tu propia identidad. Inicia sesión como tú mismo; se rechaza deliberadamente con
403mientras trabajas dentro de la cuenta de otra persona.
Campos de la solicitud
| Campo | Obligatorio | Descripción |
|---|---|---|
invite_token |
Sí | El token del enlace del correo electrónico de invitación. |
cURL
curl -X POST "https://api.youraiconnector.com/v1/team/invites/accept" \
-H "Authorization: Bearer FIREBASE_ID_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "invite_token": "1f4c…" }'
Respuesta
{
"success": true,
"team_member_id": "owner_uid_123_uid_sam",
"account_owner_uid": "owner_uid_123",
"message": "Team invite accepted successfully."
}
| Estado | Cuándo |
|---|---|
400 |
Falta invite_token, o la invitación es para tu propia cuenta. |
403 |
La sesión está trabajando dentro de otra cuenta, o la invitación se envió a una dirección de correo electrónico diferente a la que utilizas para iniciar sesión. |
404 |
La invitación no existe o ya se ha utilizado. |
429 |
Las plazas de la cuenta se llenaron entre la invitación y tu aceptación. |
504 |
La invitación ha caducado. Pide al remitente que la reenvíe. |
Rechazar una invitación
POST /team/invites/decline
Rechaza una invitación con el token del correo electrónico. Al igual que al aceptar, este es un acto de tu propia identidad y se rechaza mientras trabajas dentro de otra cuenta.
cURL
curl -X POST "https://api.youraiconnector.com/v1/team/invites/decline" \
-H "Authorization: Bearer FIREBASE_ID_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "invite_token": "1f4c…" }'
Respuesta
{
"success": true,
"message": "Team invite declined."
}
Departamentos
Un departamento es un grupo con nombre dentro de tu equipo: Ventas, Atención al cliente, RR. HH. Asigna un equipo responsable a un cliente potencial, puede reclamar nuevas conversaciones por sí mismo y se puede utilizar para limitar lo que ve un miembro.
Estos cuatro endpoints requieren una clave API. A diferencia del resto de esta página, se autentican como cualquier otro endpoint de la API (consulta Autenticación). Una sesión iniciada también funciona: la lectura requiere
contactsenview, y la creación, modificación o eliminación requiereteam_managementenedit.
El objeto departamento
| Campo | Tipo | Descripción |
|---|---|---|
id |
string | El ID del departamento. Úsalo en contact_scope_axes.departments y en las rutas a continuación. |
name |
string | Cómo se llama el equipo. Hasta 60 caracteres, único en la cuenta. |
color |
string | null | Color de acento como #rrggbb, o null. |
member_uids |
string[] | Los miembros del equipo en este departamento. Puede incluir al propietario de la cuenta. |
auto_assign_enabled |
boolean | Si un cliente potencial registrado en este departamento también se asigna a alguien del mismo. false significa que el departamento trabaja desde una cola compartida. |
routing_agents |
string[] | Las nuevas conversaciones gestionadas por estos agentes de IA se registran automáticamente en este departamento. Vacío significa que no hay regla de agente. |
routing_channels |
string[] | Las nuevas conversaciones en estos canales se registran aquí automáticamente. Vacío significa que no hay regla de canal. |
created_by |
string | null | Quién lo creó. |
Cuando se establecen tanto routing_agents como routing_channels, una conversación debe coincidir con ambos para registrarse aquí; así es como le das a un equipo “el agente de soporte, pero solo en WhatsApp”.
Una cuenta puede tener hasta 50 departamentos.
Listar departamentos
GET /team/departments
curl "https://api.youraiconnector.com/v1/team/departments?apiKey=YOUR_API_KEY"
Respuesta
{
"success": true,
"departments": [
{
"id": "dep_abc123",
"name": "Sales",
"color": "#2f6fed",
"member_uids": ["uid_alice", "uid_bob"],
"auto_assign_enabled": true,
"routing_agents": [],
"routing_channels": ["whatsapp"],
"created_by": "owner_uid_123"
}
]
}
Crear un departamento
POST /team/departments
Campos de la solicitud
| Campo | Requerido | Descripción |
|---|---|---|
name |
Sí | Hasta 60 caracteres. No debe coincidir con un departamento existente. |
color |
No | #rrggbb hex, o null. |
member_uids |
No | Quién forma parte de él. Cada UID debe ser el propietario de la cuenta o un miembro del equipo activo. |
auto_assign_enabled |
No | Por defecto es true. |
routing_agents |
No | IDs de agentes cuyos nuevos chats llegan aquí. |
routing_channels |
No | Nombres de canales cuyos nuevos chats llegan aquí: mismo vocabulario que contact_scope_axes.channels. |
cURL
curl -X POST "https://api.youraiconnector.com/v1/team/departments?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Sales",
"color": "#2f6fed",
"member_uids": ["uid_alice", "uid_bob"],
"routing_channels": ["whatsapp"]
}'
JavaScript
const res = await fetch("https://api.youraiconnector.com/v1/team/departments", {
method: "POST",
headers: {
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
name: "Sales",
color: "#2f6fed",
member_uids: ["uid_alice", "uid_bob"],
routing_channels: ["whatsapp"],
}),
});
const { department } = await res.json();
Python
import requests
res = requests.post(
"https://api.youraiconnector.com/v1/team/departments",
headers={"X-API-Key": "YOUR_API_KEY"},
json={
"name": "Sales",
"color": "#2f6fed",
"member_uids": ["uid_alice", "uid_bob"],
"routing_channels": ["whatsapp"],
},
)
department = res.json()["department"]
Respuesta — 201 Created
{
"success": true,
"department": {
"id": "dep_abc123",
"name": "Sales",
"color": "#2f6fed",
"member_uids": ["uid_alice", "uid_bob"],
"auto_assign_enabled": true,
"routing_agents": [],
"routing_channels": ["whatsapp"],
"created_by": "owner_uid_123"
}
}
| Estado | Cuándo |
|---|---|
400 |
name falta o es demasiado largo, color no es #rrggbb, un nombre de canal no se reconoce, un UID listado no es un miembro activo de este equipo, o ya tienes 50 departamentos. |
409 |
Ya existe un departamento con ese nombre. |
Actualizar un departamento
PATCH /team/departments/{departmentId}
Modifica un departamento. Solo se cambian los campos que envíes.
curl -X PATCH "https://api.youraiconnector.com/v1/team/departments/dep_abc123?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "member_uids": ["uid_alice"], "auto_assign_enabled": false }'
Respuesta
{
"success": true,
"department": {
"id": "dep_abc123",
"name": "Sales",
"color": "#2f6fed",
"member_uids": ["uid_alice"],
"auto_assign_enabled": false,
"routing_agents": [],
"routing_channels": ["whatsapp"],
"created_by": "owner_uid_123"
}
}
Si no se envían campos reconocidos, se devuelve 400; un departamento desconocido devuelve 404; un nombre que entra en conflicto con otro departamento devuelve 409.
Eliminar un departamento
DELETE /team/departments/{departmentId}
curl -X DELETE "https://api.youraiconnector.com/v1/team/departments/dep_abc123?apiKey=YOUR_API_KEY"
Respuesta
{
"success": true,
"deleted": "dep_abc123"
}
Se rechaza la eliminación de un departamento al que alguien está limitado. La respuesta
400indica los miembros cuya visibilidad está restringida a dicho departamento, para que pueda cambiar su alcance primero. Esto es deliberado: eliminar la limitación de forma silenciosa les daría acceso a toda su base de clientes sin que quedara constancia de ello.
Los contactos archivados bajo un departamento eliminado no se modifican; simplemente dejan de mostrar un departamento, y la próxima vez que los archive, se guardarán correctamente.
Comprobar sus propios permisos
GET /team/permissions
Devuelve lo que la persona que ha iniciado sesión tiene permitido hacer en la cuenta en la que está trabajando actualmente. Úselo para ocultar botones que un miembro no puede utilizar, en lugar de dejar que descubran la limitación a través de un error.
cURL
curl "https://api.youraiconnector.com/v1/team/permissions" \
-H "Authorization: Bearer FIREBASE_ID_TOKEN"
Respuesta: el propietario de la cuenta
{
"success": true,
"role": "owner",
"is_team_mode": false,
"permissions": {
"campaigns": "full",
"contacts": "full",
"messages": "full",
"appointments": "full",
"settings": "full",
"billing": "full",
"team_management": "full",
"analytics": "full",
"phone_numbers": "full",
"integrations": "full",
"faqs": "full",
"daily_summaries": "full"
}
}
Respuesta: un miembro del equipo trabajando dentro de una cuenta
{
"success": true,
"role": "editor",
"is_team_mode": true,
"permissions": { "campaigns": "edit", "billing": "none", "…": "…" },
"member": {
"uid": "uid_sam",
"email": "sam@example.com",
"display_name": "Sam Rivera",
"account_owner_uid": "owner_uid_123"
}
}
role es owner cuando la persona que ha iniciado sesión es el propietario de la cuenta; de lo contrario, es su rol en el equipo. member solo está presente en el modo de equipo y contiene contact_scope, contact_scope_unassigned y contact_scope_axes cuando su membresía los incluye.
Tokens de sesión
Cinco endpoints generan un token de inicio de sesión de un solo uso para cambiar entre cuentas. Todos responden de la misma manera:
{
"success": true,
"customToken": "eyJhbGciOi…"
}
El token se intercambia por una sesión con el SDK de cliente de Firebase. No es una clave de API y no puede enviarse como tal, por lo que estos endpoints solo son útiles dentro de una aplicación propia.
| Endpoint | Qué hace | Cuerpo |
|---|---|---|
POST /team/tokens/team-member |
Permite que un miembro del equipo comience a trabajar dentro de una cuenta a la que pertenece. | account_owner_uid (obligatorio) |
POST /team/tokens/return-from-team |
Los devuelve a su propia cuenta. | — |
POST /team/tokens/assist |
Permite al personal de Your AI Connector abrir la cuenta de un cliente para ayudar. Solo para el personal. | customerUid |
POST /team/tokens/return-to-admin |
Finaliza una sesión de asistencia y devuelve al personal a su propia cuenta. | — |
POST /team/tokens/agency-assist |
Permite que una agencia abra una de sus subcuentas de cliente o, si se llama sin una, volver a la cuenta de la agencia. | subAccountUid (opcional) |
Cada uno rechaza con 403 cuando la sesión no tiene derecho a ello: no es miembro de esa cuenta, no es personal, esa subcuenta no pertenece a su agencia o no se le ha concedido, o la sesión no se encuentra actualmente en el modo en que termina el endpoint.
Asignar un rol de plataforma
POST /team/users/{targetUid}/role
Establece el rol de plataforma de un usuario: User, Dev, Support o Agency. Esto no es la pertenencia a un equipo: es el tipo de cuenta Your AI Connector que tiene alguien.
Este endpoint está restringido al personal de Your AI Connector, y el último Dev restante no puede ser degradado. Se enumera por completitud; no forma parte de la gestión de su propio equipo.
{
"success": true,
"targetUid": "uid_sam",
"role": "Agency",
"claimUpdated": true
}
| Estado | Cuándo |
|---|---|
400 |
role falta o no es uno de los cuatro, o esto eliminaría al último Dev. |
403 |
Usted no es personal, o la sesión está trabajando dentro de otra cuenta. |
404 |
No existe tal usuario. |
Errores de la API de equipos
Los endpoints de equipos devuelven el sobre de error estándar, siempre con error_code junto al estado HTTP:
{
"success": false,
"error_code": 403,
"error": "Cannot grant \"full\" access to \"billing\" — exceeds your own permissions."
}
| Estado | Cuándo ocurre en un endpoint de equipo |
|---|---|
400 |
Falta un campo obligatorio o no es válido, o la acción no está permitida en este estado (reactivar a un miembro eliminado, suspender al propietario, eliminar un departamento al que alguien está limitado). |
401 |
Envió una clave de API a un endpoint que requiere una persona con sesión iniciada; consulte Autenticación. |
403 |
No tiene el permiso team_management, el cambio excede su propio acceso, o la acción es rechazada mientras trabaja dentro de otra cuenta. |
404 |
No existe tal miembro, invitación, departamento o usuario. |
409 |
Ya es miembro del equipo, ya existe una invitación pendiente, o ya existe un departamento con ese nombre. |
429 |
Los puestos del equipo están llenos, se alcanzó el límite de 20 invitaciones al día, o alcanzó el límite de tasa de la API. |
504 |
La invitación que intentó aceptar ha caducado. |
Los códigos compartidos que puede devolver cualquier endpoint — 429 (límite de tasa) y 500 — se enumeran con orientación sobre reintentos en Errores y paginación.
Relacionado
- Gestión de equipos — las mismas funciones en el panel de control, con capturas de pantalla.
- Autenticación — cómo enviar un token de ID de Firebase en lugar de una clave de API.
- API de contactos — los contactos a los que se aplican los límites de visibilidad de un miembro.