Ir al artículo
Aniq-UI

E-CommerceReferencia de la API

Referencia de la API

Cada ruta que sirve la API, quién puede llamarla y cómo funcionan el inicio de sesión, los permisos, los errores y la paginación.

Para el paquete Full Stack

URL base y formato de respuesta

Todas las rutas se sirven con el prefijo /api. En local, la URL base es http://localhost:8000/api. En un servidor es la dirección de tu API seguida de /api, el mismo valor que ambos frontends leen de NEXT_PUBLIC_API_BASE_URL (Variables de entorno).

La API sirve a dos públicos que nunca comparten un token: los clientes, que usan las rutas de la tienda, y el personal, que usa las del panel de administración. Los cuerpos de las solicitudes son JSON, salvo las subidas de archivos. Cada respuesta llega en el mismo envoltorio:

Envoltorio
{
  "success": true,
  "data": { },
  "message": ""
}

data contiene el resultado. message es una frase corta que rellenan algunas escrituras, traducida al idioma de la solicitud, y vacía en los demás casos.

La comprobación de estado es la única ruta fuera del envoltorio. No necesita token:

Terminal
curl http://localhost:8000/api/health
Respuesta
{"status":"ok"}

Responde 503 con {"status":"unavailable"} mientras no se puede acceder a la base de datos o esta no tiene tablas, así que un balanceador de carga puede usarla como sonda de disponibilidad.

Errores

Una solicitud fallida responde con el estado HTTP correspondiente y el mismo envoltorio, con success: false, data: null y, en la validación, los problemas por campo:

Respuesta (400)
{
  "success": false,
  "data": null,
  "message": "<the first field's problem>",
  "errors": {
    "email": ["<the problem with email>"]
  }
}
EstadoCuándo
400Un campo no superó la validación, o el cuerpo contiene un campo que la ruta no acepta. Los campos desconocidos se rechazan, no se ignoran.
401El token falta, ha caducado o pertenece al otro público. También un inicio de sesión fallido, tanto si el email no tiene cuenta como si la contraseña es incorrecta.
402El probador en una demostración pública, cuando el comprador no envió una clave propia.
403Los roles del administrador no conceden el permiso de la ruta: "You do not have permission to perform this action".
404No existe ese registro.
409La escritura choca con un registro existente, como un correo, un slug o un SKU que ya están en uso.
429Demasiados intentos desde una dirección en una ruta de inicio de sesión, registro, contraseña o seguimiento, o demasiadas pruebas en el probador. En las rutas de inicio de sesión, la cabecera Retry-After indica cuántos segundos esperar.
503Una función que no está configurada: las subidas sin bucket, una función de IA sin su clave, o la comprobación de estado antes de que existan las tablas.
500Un fallo inesperado. El mensaje sigue siendo genérico y los detalles van al registro de la API.

Las escrituras correctas responden 201 para POST y 200 para los demás métodos.

Paginación y ordenación

Las listas reciben page, desde 1, y page_count, el tamaño de página. Una página contiene como máximo 100 filas: un tamaño mayor se lee como 100, uno menor como 1, y uno ausente o ilegible recurre al valor por defecto de la lista. Una lista responde siempre con la misma forma:

Respuesta
{
  "success": true,
  "data": { "data": [ ], "page": 1, "limit": 15, "total": 35, "totalPages": 3 },
  "message": ""
}
ListaTamaño de página por defecto
Productos, categorías, clientes, pedidos de administración15
Personal, roles, ajustes, reseñas, los pedidos propios de un cliente10
/api/products/featured (limit)8
/api/products/:id/related (limit)4
  • order=asc u order=desc fija el sentido en productos, categorías, clientes y pedidos. Las categorías van por defecto en orden ascendente, y las demás de más reciente a más antiguo.
  • Los productos también se ordenan con sort: created_at, updated_at, price, rating o best_selling. Un valor desconocido recurre al orden por defecto, de actualización más reciente a más antigua, con los empates resueltos por id. order_by_featured=true pone primero los productos destacados y los más vendidos.
  • La lista de productos filtra por search (nombre en cualquiera de los dos idiomas, o SKU), category_id, is_active, is_featured, is_best_seller, min_price, max_price, tag y on_sale.

Idioma

Envía el idioma del lector en la cabecera Accept-Language: en o ar tal como se entrega. ar-SA cuenta como árabe, y cualquier idioma que la API no tenga se responde en inglés. No hay ningún parámetro de consulta para el idioma.

  • Los mensajes de error y el message de una escritura correcta se traducen.
  • El texto guardado en ambos idiomas, como los nombres de productos y categorías, vuelve como { "en": "...", "ar": "..." } y el cliente elige uno.

Autenticación

Los clientes y el personal inician sesión en endpoints distintos, contra tablas distintas, y reciben tokens que solo aceptan sus propias rutas.

PúblicoInicio de sesiónToken en la respuestaAceptado en
ClientePOST /api/auth/customer/logindata.token, con data.userRutas de clientes
PersonalPOST /api/auth/logindata.access_token, con data.admin (roles y permisos)Rutas de administración
  • Ambos son JWT firmados con JWT_SECRET. Envíalos como Authorization: Bearer <token>.
  • Un token dura JWT_EXPIRATION, 7d por defecto (Variables de entorno). El inicio de sesión del personal indica el mismo valor como expires_in.
  • No hay endpoint de renovación. Cuando un token caduca, la siguiente solicitud responde 401 y el cliente vuelve a iniciar sesión.
  • Un token de cliente se rechaza en las rutas de administración y un token de personal en las rutas de clientes, aunque ambos usan el mismo secreto.
  • Un inicio de sesión fallido responde 401 con un único mensaje, tanto si el correo no tiene cuenta como si la contraseña es incorrecta.
  • Las rutas de inicio de sesión, registro, contraseña y seguimiento de pedidos aceptan 10 intentos por minuto desde una misma dirección, contados por ruta. Pasado ese límite responden 429 con una cabecera Retry-After. El recuento se guarda en la memoria de la API, así que vuelve a empezar con un reinicio y cada instancia lo cuenta por separado. Detrás de un proxy, consulta TRUST_PROXY (Solución de problemas).
  1. Inicia sesión como el Super Admin de los datos iniciales

    Terminal
    curl -X POST http://localhost:8000/api/auth/login \
      -H "Content-Type: application/json" \
      -d '{"email":"admin@example.com","password":"Admin@123"}'
    Respuesta
    {
      "success": true,
      "data": {
        "access_token": "eyJhbGciOiJIUzI1NiIs...",
        "token_type": "Bearer",
        "expires_in": "7d",
        "admin": {
          "id": 1,
          "email": "admin@example.com",
          "roles": [{ "id": 1, "name": "Super Admin", "guard_name": "web" }],
          "permissions": ["admins.view", "admins.create", "..."]
        }
      },
      "message": "..."
    }
  2. Llama a una ruta protegida con el token

    Terminal
    curl "http://localhost:8000/api/orders?page=1&page_count=5" \
      -H "Authorization: Bearer <access_token>"

    Resultado esperado: Los cinco pedidos más recientes, con la forma de lista.

  3. Inicia sesión como un cliente de los datos iniciales

    La tienda de demostración también incluye clientes, como john.doe@example.com con la contraseña password123:

    Terminal
    curl -X POST http://localhost:8000/api/auth/customer/login \
      -H "Content-Type: application/json" \
      -d '{"email":"john.doe@example.com","password":"password123"}'

    Después pasa data.token de la misma forma, por ejemplo a GET /api/orders/my.

Cambia las contraseñas de los datos iniciales

Las cuentas de la tienda de demostración usan contraseñas publicadas: Admin@123 para el Super Admin, admin123 para el resto del personal y password123 para los clientes. Cámbialas, o empieza con tablas vacías, antes de poner un sitio en producción.

Permisos

Cada ruta de administración comprueba primero el token y luego el permiso que indica. Un administrador tiene todos los permisos de todos sus roles; cuando una ruta indica varios, basta con uno de ellos. En las tablas de administración de abajo, un nombre de permiso en la columna Quién puede llamarla significa un administrador cuyos roles lo conceden.

MóduloPermisos
Personaladmins.view, admins.create, admins.edit, admins.delete, admins.assign_roles
Rolesroles.view, roles.create, roles.edit, roles.delete, roles.assign_permissions
Ajustessettings.view, settings.edit
Clientesusers.view, users.create, users.update, users.delete, users.restore, users.verify
Categoríascategories.view, categories.create, categories.edit, categories.delete, categories.restore
Productosproducts.view, products.create, products.edit, products.delete, products.restore
Pedidosorders.view, orders.edit
Asistente de IAai_chat.use, ai_chat.view_models

Las secciones de la página de inicio y el estudio de IA usan los permisos de productos. Las reseñas no tienen permiso propio: el panel las lee a través de los productos.

Rol de los datos inicialesConcede
Super AdminTodos los permisos
ViewerTodos los permisos que terminan en .view
Admin, Manager, EditorNinguno hasta que los concedas

Volver a ejecutar la carga de datos crea lo que falta y deja los permisos de los roles existentes tal como los configuraste.

Catálogo público

No se necesita token. Los compradores solo ven productos activos: sin un token de administrador, un producto inactivo o eliminado no existe.

MétodoRutaQuién puede llamarlaQué hace
GET/api/productsCualquieraLa lista de productos, con los filtros y la ordenación de arriba. Sin un token de administrador solo muestra productos activos, pida lo que pida is_active; con uno, cada filtro funciona tal como se envía, incluidos los productos inactivos.
GET/api/products/featuredCualquieraProductos destacados activos (limit, 8 por defecto).
GET/api/products/slug/:slugCualquieraUn producto por su slug, con imágenes, variantes y categoría. Un producto inactivo o eliminado responde 404 sin un token de administrador.
GET/api/products/:idCualquieraUn producto por id, con la misma regla del 404.
GET/api/products/:id/relatedCualquieraProductos activos relacionados con él (limit, 4 por defecto); 404 para un producto inactivo sin un token de administrador.
GET/api/categoriesCualquieraLa lista de categorías (search, is_active, parent_id, order).
GET/api/categories/rootsCualquieraCategorías sin categoría padre.
GET/api/categories/slug/:slugCualquieraUna categoría por su slug.
GET/api/categories/:idCualquieraUna categoría por id.
GET/api/homepage-sections/:key/productsCualquieraLos productos elegidos para una sección de la página de inicio, como best-sellers.
GET/api/reviews/product/:productIdCualquieraLas reseñas de un producto, 10 por página.
GET/api/reviews/product/:productId/summaryCualquieraSu valoración media y el recuento por estrella.
GET/api/helpers/countriesCualquieraPaíses para un selector, en el idioma de la solicitud.

Registro y cuentas de clientes

MétodoRutaQuién puede llamarlaQué hace
POST/api/auth/customer/registerCualquieraCrea un cliente (first_name, last_name, email, password, phone opcional) e inicia su sesión. Con límite de frecuencia.
POST/api/auth/customer/loginCualquieraInicia la sesión de un cliente. Con límite de frecuencia.
GET/api/auth/customer/meClienteEl cliente con sesión iniciada.
PATCH/api/auth/customer/meClienteActualiza sus datos.
PATCH/api/auth/customer/me/passwordClienteCambia su contraseña.
POST/api/auth/customer/forgot-passwordCualquieraEmite un token de restablecimiento de un solo uso, válido durante una hora. Fuera de producción se escribe en el registro de la API; no se envía ningún correo. Con límite de frecuencia.
POST/api/auth/customer/reset-passwordCualquieraFija una contraseña nueva con ese token. Con límite de frecuencia.
GET/api/addressesClienteSus direcciones guardadas.
GET/api/addresses/:idClienteUna de ellas.
POST/api/addressesClienteGuarda una dirección.
PATCH/api/addresses/:idClienteLa edita.
PATCH/api/addresses/:id/defaultClienteLa marca como predeterminada.
DELETE/api/addresses/:idClienteLa elimina.
POST/api/reviewsClienteReseña un producto, una reseña por cliente y producto: volver a enviarla la actualiza.
PATCH/api/reviews/:idClienteEdita su reseña.
DELETE/api/reviews/:idClienteElimina su reseña.

Los clientes con sesión iniciada también tienen disponible un carrito en el servidor. La tienda incluida guarda su carrito en el navegador y no lo llama.

MétodoRutaQuién puede llamarlaQué hace
GET/api/cartClienteEl carrito del cliente.
POST/api/cart/itemsClienteAñade product_id, variant_id opcional y quantity.
PATCH/api/cart/items/:idClienteCambia la cantidad de una línea.
DELETE/api/cart/items/:idClienteQuita una línea.
DELETE/api/cartClienteVacía el carrito.

Pedidos, pago y seguimiento

MétodoRutaQuién puede llamarlaQué hace
POST/api/ordersCualquiera; si se envía un token de cliente, se leeRealiza un pedido. Un invitado envía items, email y la dirección; un cliente con sesión iniciada puede no enviar items para pedir el contenido de su carrito del servidor. payment_method es stripe o cod (paypal se acepta, pero nada lo procesa). Los precios vienen del catálogo, no de la solicitud.
GET/api/orders/trackCualquieraEl progreso de un pedido por order_number y email juntos. Con límite de frecuencia.
GET/api/orders/myClienteLos pedidos del cliente, 10 por página.
GET/api/orders/number/:orderNumberClienteUno de sus pedidos por su número.
POST/api/payments/webhookStripe, firmado con STRIPE_WEBHOOK_SECRETMarca un pedido con tarjeta como pagado (payment_intent.succeeded) o fallido (payment_intent.payment_failed).

Con payment_method: "stripe" y Stripe configurado, la respuesta incluye un client_secret que la tienda confirma con Stripe. El envío es gratis a partir de un subtotal de 75 y cuesta 9.99 por debajo; el impuesto es 0. Un promo_code se guarda en el pedido, pero no se aplica.

Inicio de sesión y cuentas del personal

MétodoRutaQuién puede llamarlaQué hace
POST/api/auth/loginCualquieraInicia la sesión de un miembro del personal. Con límite de frecuencia.
GET/api/auth/meCualquier administrador con sesión iniciadaEl administrador con sesión iniciada, con sus roles y permisos.
GET/api/adminsadmins.viewLa lista del personal.
GET/api/admins/statisticsadmins.viewRecuentos del personal.
GET/api/admins/:idadmins.viewUn administrador.
POST/api/adminsadmins.createCrea un administrador.
PATCH/api/admins/:idadmins.editEdita un administrador.
PATCH/api/admins/:id/rolesadmins.assign_rolesFija los roles de un administrador.
DELETE/api/admins/:idadmins.deleteElimina un administrador.
PATCH/api/admins/profileadmins.editEdita el perfil propio del administrador con sesión iniciada.
PATCH/api/admins/profile/passwordCualquier administrador con sesión iniciadaCambia la contraseña propia del administrador con sesión iniciada.

Roles

MétodoRutaQuién puede llamarlaQué hace
GET/api/rolesroles.viewLos roles. Sin parámetros de página, todos.
GET/api/roles/statisticsroles.viewRecuentos de roles.
GET/api/roles/selectroles.viewRoles para un selector.
GET/api/roles/permissionsroles.viewTodos los permisos, agrupados por módulo.
GET/api/roles/:idroles.viewUn rol con sus permisos.
POST/api/rolesroles.createCrea un rol.
PUT/api/roles/:idroles.editRenombra o edita un rol.
POST/api/roles/:id/permissionsroles.assign_permissionsFija los permisos de un rol. Los administradores con sesión iniciada que lo tienen reciben el cambio en directo.
DELETE/api/roles/:idroles.deleteElimina un rol.

Clientes

A los clientes se les identifica por su nombre de usuario. La lista filtra por search, email, phone, country_id, username, first_name, last_name, verified, from_date y to_date.

MétodoRutaQuién puede llamarlaQué hace
GET/api/usersusers.viewLa lista de clientes.
GET/api/users/statisticusers.viewRecuentos de clientes.
GET/api/users/deletedusers.viewClientes eliminados.
GET/api/users/deleted/:usernameusers.viewUn cliente eliminado.
GET/api/users/:usernameusers.viewUn cliente.
POST/api/usersusers.createCrea un cliente.
PATCH/api/users/:usernameusers.updateEdita un cliente.
PATCH/api/users/:username/change-passwordusers.updateFija la contraseña de un cliente.
POST/api/users/:username/resend-verification-emailusers.updateResponde con éxito y no envía nada: la plantilla no incluye ningún sistema de envío de correo. Conecta aquí tu sistema de envío.
POST/api/users/:username/make-verifiedusers.verifyMarca el correo como verificado.
POST/api/users/:username/make-unverifiedusers.verifyLo marca como no verificado.
DELETE/api/users/:usernameusers.deleteMueve un cliente a la lista de eliminados.
POST/api/users/deleted/:username/restoreusers.restoreRestaura un cliente eliminado.

Productos y categorías

MétodoRutaQuién puede llamarlaQué hace
POST/api/productsproducts.createCrea un producto con sus imágenes y variantes.
PATCH/api/products/:idproducts.editEdita un producto.
DELETE/api/products/:idproducts.deleteLo mueve a la lista de eliminados.
GET/api/products/deletedproducts.deleteProductos eliminados.
POST/api/products/deleted/:id/restoreproducts.restoreRestaura uno.
GET/api/products/statisticproducts.viewRecuentos de productos.
GET/api/products/draftsCualquier administrador con sesión iniciadaEl borrador sin guardar del formulario de producto del administrador (product_id para un producto existente).
PUT/api/products/draftsCualquier administrador con sesión iniciadaGuarda ese borrador.
DELETE/api/products/draftsCualquier administrador con sesión iniciadaLo descarta.
POST/api/categoriescategories.createCrea una categoría.
PATCH/api/categories/:idcategories.editEdita una categoría, incluido su orden.
DELETE/api/categories/:idcategories.deleteLo mueve a la lista de eliminados.
GET/api/categories/deletedcategories.deleteCategorías eliminadas.
POST/api/categories/deleted/:id/restorecategories.restoreRestaura uno.
GET/api/categories/statisticcategories.viewRecuentos de categorías.
GET/api/homepage-sections/:keyproducts.viewLos ajustes y los productos de una sección de la página de inicio.
PUT/api/homepage-sections/:keyproducts.editLos fija.

Las claves de las secciones son style-pillars, editorial-split, new-drops, best-sellers, spotlight, lux-difference y editorial-slider.

Pedidos

MétodoRutaQuién puede llamarlaQué hace
GET/api/ordersorders.viewLa lista de pedidos: search, status (uno o varios, separados por comas), payment_status, from_date, to_date, order.
GET/api/orders/statisticorders.viewRecuentos por estado e ingresos.
GET/api/orders/:idorders.viewUn pedido con sus artículos.
PATCH/api/orders/:id/statusorders.editFija el estado (pending, confirmed, processing, shipped, delivered, cancelled, refunded) y el número de seguimiento.

La API acepta cualquier cambio de estado; el panel solo ofrece el paso siguiente o una cancelación.

Ajustes

MétodoRutaQuién puede llamarlaQué hace
GET/api/settingssettings.viewLos ajustes de la aplicación, 10 por página.
GET/api/settings/:keysettings.viewUn ajuste.
PATCH/api/settings/:keysettings.editCambia su valor.
DELETE/api/settings/:keysettings.editLa elimina.

No hay ninguna ruta para crear un ajuste: los crea la carga de datos. Nada en el código incluido lee sus valores.

Subida de archivos multimedia

MétodoRutaQuién puede llamarlaQué hace
POST/api/helpers/uploadCualquier administrador con sesión iniciadaSube un archivo al bucket.
  • Formulario multipart: el archivo en file, la carpeta en path (uploads por defecto) y, de forma opcional, un tamaño predefinido en for.
  • Hasta 150 MB. Los videos (MP4, WebM, MOV, M4V) se guardan tal cual y responden { "original": url }.
  • Las imágenes se vuelven a codificar en JPEG, con 1920 píxeles de ancho como máximo, más el tamaño predefinido, y responden con cada URL, como { "original": url, "250x250": url }.
  • Sin las cinco variables R2_* responde 503: "File uploads are not set up yet."

Notificaciones

MétodoRutaQuién puede llamarlaQué hace
GET/api/notificationsCualquier administrador con sesión iniciadaLas 30 notificaciones más recientes del administrador, que se guardan durante 30 días.
PATCH/api/notifications/read-allCualquier administrador con sesión iniciadaLas marca todas como leídas.
PATCH/api/notifications/:id/readCualquier administrador con sesión iniciadaMarca una como leída.
DELETE/api/notifications/:idCualquier administrador con sesión iniciadaElimina una.
  • Las notificaciones en directo usan Socket.IO en el espacio de nombres /notifications, en la dirección de la API sin /api. Envía el token del personal en auth.token del handshake; los tokens de clientes se desconectan.
  • Cada una nueva llega como notification:created. Los tipos son order_created, para todos los administradores que pueden ver pedidos, y studio_generation_completed y studio_generation_failed, para el administrador que inició la generación.
  • Un segundo espacio de nombres, /auth, envía permissions-updated cuando cambian los roles o los permisos de un administrador.
  • El socket solo acepta conexiones desde FRONTEND_URL.

Asistente de IA

Incluido con tu compra. Inicia sesión para leerlo o ábrelo en tu descarga.

Las rutas de chat, de modelos y de historial de chat del asistente.

Estudio de IA

Incluido con tu compra. Inicia sesión para leerlo o ábrelo en tu descarga.

Las rutas de generación y de archivos multimedia del estudio de productos con IA.

Probador

Incluido con tu compra. Inicia sesión para leerlo o ábrelo en tu descarga.

Las rutas públicas del probador de la tienda y sus límites.

Rutas del modo demostración

Incluido con tu compra. Inicia sesión para leerlo o ábrelo en tu descarga.

La ruta que usa una demostración pública para dar una cuenta a cada visitante.

¿Te atascaste en un paso?

Busca una solución antes de empezar de nuevo.

Solución de problemas

Preferencias de Cookies

Utilizamos cookies para mejorar tu experiencia de navegación, analizar el tráfico del sitio y personalizar el contenido. Al hacer clic en "Aceptar Todo", consientes nuestro uso de cookies para análisis y publicidad personalizada.