Skip to content

Usuarios

CRUD del equipo de la empresa asociada a tu API key. Cubre identidad básica, el slug de agendas (booking_slug) y la personalización del fondo de la landing pública (settings_preferences.booking_branding) para que puedas montar todo el flujo de agenda desde tu integración.

La creación de usuarios está limitada por Company.max_team_size. Cuando la empresa ya está en el tope, POST /users responde 422 con error: "team_limit_reached".

El objeto User

json
{
  "id":           "65a1b2c3d4e5f6789012abcd",
  "first_name":   "Fabián",
  "last_name":    "García",
  "full_name":    "Fabián García",
  "email":        "fabian@example.com",
  "phone":        "+52 656 1234567",
  "username":     "fabian-garcia",
  "booking_slug": "fabian",
  "booking_url":  "https://book.fi-nova.com/fabian",
  "avatar_url":   "https://cdn.finova.com/v1/avatar/fabian-garcia/avatar-...",
  "is_owner":     true,
  "settings_preferences": {
    "theme":                       "light",
    "block_overlapping_bookings":  true,
    "booking_branding": {
      "theme": "dark",
      "light": { "bg_mode": "solid",  "bg_color_from": "#f9fafb", "bg_color_to": "#e5e7eb", "bg_angle": 135 },
      "dark":  { "bg_mode": "linear", "bg_color_from": "#0080ff", "bg_color_to": "#001a33", "bg_angle": 135 }
    }
  },
  "created_at": "2026-02-08T11:00:00Z",
  "updated_at": "2026-05-17T14:30:21Z"
}

Campos editables

CampoTipoDescripción
first_name, last_namestringNombre del usuario.
emailstringCorreo único en Finova. Si ya existe, POST devuelve 409 email_taken.
phonestringTeléfono de contacto (formato libre).
usernamestringIdentificador interno.
birthdatestring (YYYY-MM-DD)Opcional.
booking_slugstringSlug público del usuario en book.fi-nova.com/<slug>/<liga>. Sólo [a-z0-9-], 3–64 caracteres. Único globalmente.
is_ownerbooleanSi es true, el usuario recibe todos los permisos de la empresa.
settings_preferences.theme"light" | "dark" | "schedule"Tema del dashboard.
settings_preferences.block_overlapping_bookingsbooleanSi la liga debe bloquear horarios ocupados en Google/Finova.
settings_preferences.booking_branding.theme"light" | "dark"Solo es un hint del dashboard para saber qué paleta está editando el host. No controla la landing pública — la landing elige el modo por la hora local del visitante (oscuro de 7pm a 7am) y el visitante puede alternar con un botón en pantalla.
settings_preferences.booking_branding.light.bg_mode"solid" | "linear" | "radial"Tipo de fondo cuando la landing se ve en modo claro.
settings_preferences.booking_branding.light.bg_color_fromstring hexColor sólido / inicial del gradiente del modo claro.
settings_preferences.booking_branding.light.bg_color_tostring hexColor final del gradiente del modo claro (sólo linear/radial).
settings_preferences.booking_branding.light.bg_angleinteger 0-360Ángulo del gradiente lineal en modo claro.
settings_preferences.booking_branding.dark.bg_mode"solid" | "linear" | "radial"Mismo concepto que light.bg_mode, pero para modo oscuro.
settings_preferences.booking_branding.dark.bg_color_fromstring hexColor sólido / inicial del gradiente del modo oscuro.
settings_preferences.booking_branding.dark.bg_color_tostring hexColor final del gradiente del modo oscuro.
settings_preferences.booking_branding.dark.bg_angleinteger 0-360Ángulo del gradiente lineal en modo oscuro.

Devise-managed columns (encrypted_password, jti, tokens de reseteo, etc.) nunca se exponen ni se aceptan en el payload.

Scopes requeridos

AcciónScope
GET /users, GET /users/:idread-users
POST /userscreate-users
PUT /users/:id, POST /users/:id/avatarupdate-users
DELETE /users/:iddelete-users

Listar usuarios

http
GET /api/v1/users

Paginación cursor / offset estándar (?starting_after=, ?ending_before=, ?page=, ?limit=). Solo regresa usuarios miembros de la empresa de la API key.

Crear un usuario

http
POST /api/v1/users
Content-Type: application/json

{
  "data": {
    "first_name": "Carla",
    "last_name":  "Pineda",
    "email":      "carla@example.com",
    "phone":      "+52 656 9876543",
    "booking_slug": "carla",
    "is_owner": false,
    "settings_preferences": {
      "theme": "light",
      "block_overlapping_bookings": true,
      "booking_branding": {
        "bg_mode":       "radial",
        "bg_color_from": "#0080ff",
        "bg_color_to":   "#001a33"
      }
    }
  }
}

El usuario se crea con una contraseña aleatoria; usa el flujo de recuperación estándar de Finova si necesitas acceso interactivo.

Errores comunes

StatuserrorCuándo
422team_limit_reachedLa empresa alcanzó max_team_size.
409email_takenYa existe un usuario con ese correo.
422validation_failedSlug duplicado o con formato inválido, etc.

Actualizar un usuario

http
PUT /api/v1/users/:id
Content-Type: application/json

{
  "data": {
    "booking_slug": "carla-pineda",
    "settings_preferences": {
      "booking_branding": { "bg_mode": "solid", "bg_color_from": "#1f2937" }
    }
  }
}

Cualquier subconjunto del payload de create es aceptado. is_owner se aplica sobre el CompanyMembership del usuario en la empresa de la API key.

Subir foto de perfil

http
POST /api/v1/users/:id/avatar
Content-Type: multipart/form-data

avatar: <archivo JPG/PNG>

Regresa el objeto User con avatar_url actualizado. La misma URL se usa como fallback del logo en la landing pública cuando la empresa no tiene logo.

Eliminar un usuario

http
DELETE /api/v1/users/:id

Quita al usuario de la membresía de la empresa. Si era su única empresa, el registro se soft-deletea (Paranoia) para conservar referencias de auditoría.

No puedes eliminar al usuario dueño de la API key — el servidor responde 403 self_delete_forbidden.

Hecho con cuidado por Finova.