Explorar la API permite ejecutar cada endpoint desde el navegador y ver la petición, la respuesta y los errores exactos. Nada de esta página está escrito a mano: las rutas se leen del propio documento OpenAPI del servidor y las tablas de la base de datos.
Lo que verá aquí es un prototipo funcional en un entorno de revisión, construido sobre la arquitectura y las pantallas que usted definió. No es un producto terminado y no debe evaluarse como tal.
Está deliberadamente incompleto, y decirlo por adelantado es parte del trabajo. Lo que aún no está construido, y por qué:
Lo que sí está terminado y comprobable es lo que aparece más abajo: el esquema de datos, la autenticación, los roles y permisos, los negocios y sucursales, los profesionales y los servicios — con las direcciones para comprobarlo usted mismo.
Cada afirmación de esta página tiene una dirección que la comprueba. Ábralas, o entrégueselas a quien le asesore técnicamente: devuelven datos del sistema en ejecución, no de un documento.
/health/openapi.json/v1/catalog/categories/v1/businesses?lat=25.7617&lng=-80.1918&radius_miles/v1/directory/search?lat=25.7617&lng=-80.1918&radius/v1/promotions?lat=25.7617&lng=-80.1918&limit=3/v1/catalog/discovery/distinguished-businesses?limit/v1/catalog/discovery/popular-services?limit=3Si estas direcciones devolvieran datos, la plataforma estaría abierta. Devuelven 401 sin sesión y 403 con una sesión que no corresponde.
/v1/me/v1/admin/businesses?limit=1Usted pidió que no existan «Professional 2» ni «Business Owner 2»: una persona debe poder trabajar con varios negocios con una sola cuenta.
La base de datos lo impide, no lo recomienda:
professionals.user_id tiene una restricción
UNIQUE, por lo que un segundo perfil para la misma
persona no puede crearse — ni por error ni a propósito. Contratar a alguien
que ya trabaja en otro negocio añade un vínculo de sucursal, nunca una
identidad nueva.
Comprobado en ejecución: un negocio contrató a una profesional que ya
trabajaba en otro, propiedad de una cuenta distinta, y el perfil devuelto fue
el mismo. Los roles son owner,
manager, professional y
front_desk, y se otorgan POR NEGOCIO.
Cada sección nombra las tablas que la sostienen y los endpoints que la exponen.
PostgreSQL 16 · SQLAlchemy 2.0 async · Redis 7 · Docker Compose. El esquema se aplica con migraciones numeradas, cada una en su propia transacción y registrada una sola vez.
//healthTokens de acceso y de refresco, sesiones por dispositivo, verificación de correo y recuperación de contraseña. Límite de intentos por IP en Redis.
users13user_sessions10user_tokens9/v1/admin/staff/2fa/v1/admin/staff/{user_id}/2fa/disable/v1/admin/staff/{user_id}/2fa/events/v1/auth/forgot-password/v1/auth/login/v1/auth/logout/v1/auth/logout-all/v1/auth/refresh/v1/auth/register/v1/auth/resend-verification/v1/auth/reset-password/v1/auth/verify-email/v1/me/v1/me/2fa/v1/me/2fa/confirm/v1/me/2fa/disable/v1/me/2fa/recovery-codes/v1/me/2fa/start/v1/me/2fa/verify/v1/me/sessionsNO existe un rol global por usuario. La autorización se resuelve SIEMPRE por contexto. Los permisos de negocio viven en business_members (owner · manager · professional · front_desk) y se otorgan POR NEGOCIO, de modo que una persona puede trabajar con varios negocios sin duplicar su cuenta: identidad única → negocio → membresía → rol → permiso. El personal de MyLook vive en una tabla aparte (platform_staff), nunca en el perfil del usuario. Puede comprobarse: no hay ninguna columna primary_role en el esquema.
users13platform_staff5business_members14audit_log9verification_events11/v1/admin/businesses/v1/admin/businesses/{business_id}/history/v1/admin/businesses/{business_id}/hold/v1/admin/businesses/{business_id}/reinstate/v1/admin/businesses/{business_id}/suspend/v1/admin/businesses/{business_id}/unverify/v1/admin/businesses/{business_id}/verify/v1/admin/directory/claims/v1/admin/directory/claims/{claim_id}/approve/v1/admin/directory/claims/{claim_id}/reject/v1/admin/overview/v1/admin/professionals/v1/admin/professionals/{professional_id}/history/v1/admin/professionals/{professional_id}/unverify/v1/admin/professionals/{professional_id}/verify/v1/admin/staff/2fa/v1/admin/staff/{user_id}/2fa/disable/v1/admin/staff/{user_id}/2fa/events/v1/businesses/{business_id}/members/v1/businesses/{business_id}/my-access/v1/meUna organización agrupa negocios; cada negocio tiene una o más sucursales con su propio horario y su propia zona horaria. Toda hora se resuelve en la zona de la sucursal.
organizations8businesses15branches17branch_hours5branch_hour_overrides7/v1/admin/businesses/v1/admin/businesses/{business_id}/history/v1/admin/businesses/{business_id}/hold/v1/admin/businesses/{business_id}/reinstate/v1/admin/businesses/{business_id}/suspend/v1/admin/businesses/{business_id}/unverify/v1/admin/businesses/{business_id}/verify/v1/admin/overview/v1/businesses/v1/businesses/mine/v1/businesses/{business_id}/v1/businesses/{business_id}/branches/v1/businesses/{business_id}/branches/{branch_id}/v1/businesses/{business_id}/branches/{branch_id}/hours/v1/businesses/{business_id}/members/v1/businesses/{business_id}/members/{member_id}/v1/businesses/{business_id}/members/{member_id}/history/v1/businesses/{business_id}/members/{member_id}/reactivate/v1/businesses/{business_id}/members/{member_id}/revoke/v1/businesses/{business_id}/members/{member_id}/suspend/v1/businesses/{business_id}/my-accessEl perfil pertenece a la PERSONA: professionals.user_id es UNIQUE en la base de datos, por lo que un profesional que trabaja en varios negocios tiene un solo perfil. La tabla NO tiene business_id: se llega a un negocio por professional_branches → branches → businesses, y por eso las rutas cuelgan de /businesses/{business_id}/ — el negocio es el ámbito de permisos, no el dueño de la identidad. Tres modelos de colaboración: independiente, porcentaje de salón y renta de silla. Dos operaciones sobre un profesional pertenecen a otros dominios y aparecen allí: las habilidades (professional_services) en Servicios, y el horario (availability_rules) en Reservas.
professionals13professional_branches7compensation_agreements17chair_rent_cycles10chair_rent_collections5/v1/admin/professionals/v1/admin/professionals/{professional_id}/history/v1/admin/professionals/{professional_id}/unverify/v1/admin/professionals/{professional_id}/verify/v1/businesses/{business_id}/professionals/v1/businesses/{business_id}/professionals/{professional_id}/v1/businesses/{business_id}/professionals/{professional_id}/agreements/v1/businesses/{business_id}/professionals/{professional_id}/rent-cycles/v1/professionalsPrecio y duración se congelan en la cita al reservar, de modo que un cambio de precio no altera una cita ya acordada. professional_services —qué sabe hacer cada profesional— vive aquí: es el catálogo el que dice qué servicios existen y quién puede prestarlos.
services14service_options7branch_services5professional_services6categories9/v1/businesses/{business_id}/branches/{branch_id}/services/{service_id}/v1/businesses/{business_id}/branches/{branch_id}/services/{service_id}/price/v1/businesses/{business_id}/membership-plans/v1/businesses/{business_id}/membership-plans/manage/v1/businesses/{business_id}/membership-plans/{plan_id}/v1/businesses/{business_id}/memberships/v1/businesses/{business_id}/products/v1/businesses/{business_id}/products/{product_id}/v1/businesses/{business_id}/professionals/{professional_id}/skills/v1/businesses/{business_id}/services/v1/businesses/{business_id}/services/{service_id}/v1/catalog/categories/v1/catalog/discovery/distinguished-businesses/v1/catalog/discovery/popular-servicesappointments23appointment_events7availability_rules7time_blocks8waitlist_entries10/v1/booking/appointments/v1/booking/appointments/mine/v1/booking/appointments/{appointment_id}/v1/booking/appointments/{appointment_id}/cancel/v1/booking/appointments/{appointment_id}/checkout/v1/booking/appointments/{appointment_id}/reschedule/v1/booking/appointments/{appointment_id}/status/v1/booking/availability/v1/booking/professionals/{professional_id}/availability/v1/booking/time-blocks/v1/businesses/{business_id}/branches/{branch_id}/agenda/v1/businesses/{business_id}/branches/{branch_id}/hourspayments20payment_lines7ledger_entries11refunds20payouts12wallet_movements6money_settings10/v1/businesses/{business_id}/earnings/v1/businesses/{business_id}/payouts/v1/businesses/{business_id}/payouts/account/v1/businesses/{business_id}/payouts/account/link/v1/money/disputes/v1/money/disputes/{dispute_id}/accept-liability/v1/money/disputes/{dispute_id}/liability/v1/money/earnings/mine/v1/money/owed/mine/v1/money/payments/{payment_id}/refund/v1/money/payments/{payment_id}/refund-preview/v1/money/payments/{payment_id}/refunds/v1/money/payouts/mine/v1/money/penalties/held/v1/money/quote/v1/money/receipts/{payment_id}/v1/money/wallet/v1/money/wallet/movements/v1/money/webhooks/events/v1/webhooks/stripeplans15subscriptions12/v1/businesses/{business_id}/membership-plans/v1/businesses/{business_id}/membership-plans/manage/v1/businesses/{business_id}/membership-plans/{plan_id}/v1/businesses/{business_id}/memberships/v1/me/membership/v1/me/memberships/v1/me/subscription/v1/plans/v1/subscriptions/v1/subscriptions/{subscription_id}/v1/subscriptions/{subscription_id}/cancelproducts11carts8cart_items6product_orders22product_order_items10branch_inventory5/v1/businesses/{business_id}/orders/v1/businesses/{business_id}/orders/{order_id}/v1/cart/v1/cart/items/v1/cart/items/{item_id}/v1/cart/{cart_id}/v1/cart/{cart_id}/checkout/v1/orders/mine/v1/orders/{order_id}/v1/productsreviews15review_responses6favorites5referrals10conversations8messages7notifications13device_tokens6/v1/businesses/{business_id}/rating/v1/businesses/{business_id}/reviews/v1/conversations/v1/conversations/mine/v1/conversations/{conversation_id}/messages/v1/device-tokens/v1/favorites/v1/favorites/{kind}/{target_id}/v1/notifications/v1/notifications/read-all/v1/notifications/{notification_id}/read/v1/referrals/v1/referrals/mine/v1/reviews/v1/reviews/mine/v1/reviews/{review_id}/responddirectory_listings22directory_claims16claim_evidence7/v1/admin/directory/claims/v1/admin/directory/claims/{claim_id}/approve/v1/admin/directory/claims/{claim_id}/reject/v1/directory/ingest/v1/directory/search/v1/directory/{listing_id}/v1/directory/{listing_id}/claimpromotions23promotion_services3promotion_redemptions7/v1/businesses/{business_id}/promotions/v1/businesses/{business_id}/promotions/manage/v1/businesses/{business_id}/promotions/{promotion_id}/v1/promotions/v1/promotions/{promotion_id}/v1/promotions/{promotion_id}/quotemedia_assets9/v1/businesses/{business_id}/media/v1/media/v1/media/{key}2565 comprobaciones se ejecutan contra la plataforma antes de cada entrega, y deben pasar todas. No son pruebas de código aisladas: cada una llama a la API real —crear un negocio, reservar, cobrar, repartir el dinero, negar un acceso— y comprueba la respuesta.
De ésas, 1218 pueden ejecutarse contra este mismo entorno de revisión a través de HTTP. Las restantes leen la base de datos directamente, que un despliegue no expone, y por eso se ejecutan aparte en lugar de omitirse en silencio.
La suite falla también cuando una comprobación se omite. Una prueba que se salta porque falta una variable de entorno es una luz verde con la bombilla quitada.
38 migraciones numeradas. Cada una se ejecuta una sola vez,
dentro de su propia transacción, y queda registrada en schema_migrations.
Un archivo modificado después de haberse aplicado detiene el despliegue: la base
de datos y el repositorio no pueden discrepar en silencio.
001_identity.sql002_organization.sql003_professionals.sql004_catalog.sql005_booking.sql006_money.sql007_engagement.sql008_directory.sql009_seed_taxonomy.sql010_media.sql011_branch_cover.sql012_account_recovery.sql013_notification_delivery.sql014_ledger_beneficiary_consistency.sql015_seed_plans.sql016_promotions.sql017_commerce.sql018_service_stats.sql019_verification.sql020_connect.sql021_membership_lifecycle.sql022_subscription_domains.sql023_ledger_immutable.sql024_refunds.sql025_admin_2fa.sql026_owner_decisions_v1.sql027_reconcile_fee_distribution.sql028_drop_cleanup_scratch.sql029_business_memberships.sql030_owner_decisions_v2.sql031_penalty_backfill_to_professional.sql033_membership_scope.sql034_financial_rules_registry.sql035_tax_engine.sql036_dispute_liability.sql037_owner_decisions_v3.sql038_commission_chargeback_reversal.sql039_commission_standing_single_rule.sql