Introducción y autenticación
El plugin Notiwoo publica una API REST en el espacio de nombres notiwoo/v1. La app NOTIWOO la usa para pedidos, catálogo, extras, operación, mesas y fidelización, y puedes usarla para tus propias integraciones.
Esta referencia corresponde a notiwoo-plugin 1.29.0. Consulta la versión instalada con GET /status o en Notiwoo → Dashboard.
Todos los ejemplos usan https://tienda.example.test y datos inventados. Para probar sin tocar una tienda real, usa el entorno de pruebas local, con URL base http://127.0.0.1:8096/wp-json/notiwoo/v1.
URL base
https://tienda.example.test/wp-json/notiwoo/v1
Si el sitio usa enlaces permanentes simples, usa https://tienda.example.test/?rest_route=/notiwoo/v1/....
La versión forma parte de la ruta (v1). No hay cabecera ni negociación de versión.
Comprobar la instalación
GET /status es público y no requiere autenticación. Úsalo antes de otras llamadas para comprobar la versión del plugin y si la tienda acepta pedidos.
curl https://tienda.example.test/wp-json/notiwoo/v1/status
{
"success": true,
"data": {
"plugin": "notiwoo-plugin",
"version": "1.29.0",
"namespace": "notiwoo/v1",
"coexistence_mode": false,
"accepting_orders": true,
"time": "2026-09-30T12:15:00-05:00"
}
}
| Campo | Significado |
|---|---|
version | Versión instalada del plugin. Compárala con la tabla de compatibilidad. |
coexistence_mode | true mientras siga activo un plugin WooFood. Ver modo coexistencia. |
accepting_orders | Si es false, no llames a POST /orders. |
time | Hora del sitio en ISO 8601, según la zona horaria de WordPress. |
Autenticación
Los permisos se basan en los usuarios y las capacidades de WordPress, así que funciona cualquier método que identifique al usuario ante WordPress.
| Método | Cómo se envía | Cuándo usarlo |
|---|---|---|
| Token Bearer de Notiwoo | Authorization: Bearer <token> | Apps móviles y clientes propios. Recomendado. |
| Contraseña de aplicación de WordPress | Authorization: Basic base64(usuario:contraseña-de-aplicación) | Integraciones de servidor y la conexión con la app NOTIWOO. |
| Cookie + nonce | Sesión iniciada y cabecera X-WP-Nonce | JavaScript dentro de wp-admin (lo usan las pantallas del plugin). |
Las antiguas cabeceras Username y Password de WooFood ya no se admiten.
Token Bearer
Solicita un token con el usuario (o el correo) y la contraseña de WordPress:
curl -X POST https://tienda.example.test/wp-json/notiwoo/v1/auth/token \
-H "Content-Type: application/json" \
-d '{"username": "gerente@example.test", "password": "contraseña-de-ejemplo"}'
{
"success": true,
"data": {
"token": "Q3xY7mV2nB8kL1pZ5rT9wE4uI6oA0sD2fG7hJ3kL8zX1cV5bN9mQ2wE6rT4yU0iO",
"token_type": "Bearer",
"expires_at": 1793793600,
"user": { "id": 7, "username": "gerente", "roles": ["shop_manager"], "capabilities": { "manage_woocommerce": true } }
}
}
- El token tiene 64 caracteres y dura 30 días desde que se emite. No se renueva con el uso ni hay ruta de renovación: cuando caduque, solicita uno nuevo.
expires_ates una marca de tiempo Unix en segundos.- Cada inicio de sesión crea un token nuevo, así que un mismo usuario puede tener varios dispositivos conectados.
- El token solo se muestra una vez. El plugin guarda un hash, nunca el valor original.
DELETE /auth/tokenrevoca el token con el que se hace la petición. Úsalo al cerrar sesión.- Si la petición llega con una sesión de cookie, la cookie tiene prioridad sobre el token.
Algunos servidores Apache o CGI no pasan la cabecera Authorization a PHP. Si recibes 401 con un token válido, añade al .htaccess la regla SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1, o pide a tu proveedor de hosting que la configure.
Contraseña de aplicación
Créala en Usuarios → Perfil → Contraseñas de aplicación para una cuenta de administrador o gestor de tienda. WordPress exige HTTPS para usarlas, salvo en entornos locales.
curl -u "gerente:abcd efgh ijkl mnop qrst uvwx" \
https://tienda.example.test/wp-json/notiwoo/v1/auth/me
Permisos
Cada ruta exige uno de estos niveles:
| Nivel | Quién |
|---|---|
| Público | Cualquiera, sin autenticación. |
| Sesión iniciada | Cualquier usuario autenticado, incluidos los clientes. |
| Gestión | Usuarios con la capacidad manage_woocommerce: administrador y gestor de tienda. |
| Gestión o tienda | manage_woocommerce o el rol multistore_user (complemento multitienda heredado). |
Sin autenticación, las rutas protegidas responden 401 notiwoo_unauthorized. Con un usuario sin permiso, responden 403 notiwoo_forbidden. Cada página de esta sección indica el nivel de cada ruta.
Formato de respuesta
Las respuestas correctas usan este sobre:
{ "success": true, "data": {}, "meta": {} }
datacontiene el recurso o la lista.metasolo aparece cuando tiene contenido, por ejemplo la paginación.- El código HTTP es
200, o201al crear un recurso.
Los errores tienen dos formatos posibles. Consulta Errores.
Paginación
Las listas aceptan page (desde 1) y per_page (20 por defecto, máximo 100). La información de páginas llega en meta:
"meta": { "page": 1, "per_page": 20, "total": 57, "total_pages": 3 }
La API no envía las cabeceras X-WP-Total, X-WP-TotalPages ni Link. Lee siempre meta. Las excepciones se indican en cada recurso.
Cabeceras
| Cabecera | Dirección | Uso |
|---|---|---|
Authorization | Petición | Token Bearer o contraseña de aplicación. |
X-WP-Nonce | Petición | Autenticación por cookie. |
X-Notiwoo-Actor: notifier:<id> | Petición, opcional | Registra quién hizo un cambio en el historial de fidelización. Solo se acepta de usuarios con manage_woocommerce. |
Cache-Control: private, no-store | Respuesta | En todas las rutas de mesas y fidelización. |
Idempotencia y concurrencia
Algunas operaciones aceptan una clave para que un reintento no duplique el cambio:
| Operación | Campo | Formato |
|---|---|---|
| Cambios masivos | request_id | 8 a 64 caracteres A-Z a-z 0-9 _ - |
| Canjear puntos | idempotency | 8 a 80 caracteres A-Z a-z 0-9 _ : - |
| Ajustar puntos | idempotency | 8 a 64 caracteres A-Z a-z 0-9 _ - |
Si repites la petición con la misma clave, obtienes el resultado original. Las operaciones que no pueden ejecutarse en paralelo (una mesa, una cuenta de puntos, un cambio masivo) responden 409 cuando otra ya está en curso. Espera y reintenta.
Límites y CORS
- El plugin no aplica límites de peticiones. Protege las rutas públicas de acceso (
/auth/token,/auth/register,/auth/reset-password) con el firewall o el hosting. - Solo hay un límite propio: los correos de verificación de fidelización, uno por minuto por cuenta.
- El plugin no cambia la política CORS de WordPress. Si llamas a la API desde un navegador en otro dominio, configura CORS en el servidor.
Idioma de los mensajes
Los mensajes (message) se devuelven en el idioma del sitio: español o inglés desde 1.29.0. Nunca programes lógica según el texto: usa el campo code.
Modo coexistencia
Mientras siga activo un plugin WooFood:
- Todas las rutas siguen registradas.
POST /ordersresponde409 notiwoo_cutover_pending.- Mesas y fidelización aparecen desactivadas.
- Las rutas antiguas
woofood/*las sigue atendiendo el plugin anterior.
Consulta Migrar desde WooFood.
Recursos
| Recurso | Página |
|---|---|
| Acceso, cuenta del cliente y direcciones | Cuentas y clientes |
| Pedidos y estados | Pedidos |
| Modalidades, horarios, domicilio y validación del carrito | Horarios, domicilio y carrito |
| Productos, disponibilidad y categorías | Catálogo |
| Extras, categorías de extras y asignaciones | Extras |
| Cambios masivos con vista previa y deshacer | Cambios masivos |
| Operación, apariencia y menú de categorías | Ajustes |
| Servicio en mesa y QR | Mesas |
| Puntos, recompensas y programa | Fidelización |
| Repartidores, pagos y envíos | Operación de la tienda |
| Estados propios, webhooks, metadatos y checkout | Integración con WooCommerce |