Referencia de la API REST
La API pública está bajo:
https://api.requiply.com/api/public/v1
Cada petición se autentica con Authorization: Bearer <api-key>; consulta Autenticación y claves de API. Los cuerpos de las peticiones y de las respuestas son JSON. El SDK de TypeScript envuelve todos los endpoints de abajo, y sus guías de recursos describen los campos en detalle.
Endpoints
Los endpoints publicables aceptan los dos tipos de clave. Los endpoints secretos rechazan una clave publicable con un 403.
Organización y catálogo
| Método y ruta | Claves | Método del SDK |
|---|---|---|
GET /org/info | Publicable | org.info() |
GET /org/summary | Secreta | org.summary() |
GET /categories/list | Publicable | categories.list() |
GET /services/list | Publicable | services.list() |
GET /inventory/list | Publicable | inventory.list() |
GET /inventory/groups/{id} | Publicable | inventory.getGroup() |
GET /inventory/status | Secreta | inventory.status() |
GET /bundles/list | Publicable | bundles.list() |
GET /bundles/{id} | Publicable | bundles.get() |
Los packs son conjuntos fijos de productos con un único descuento. Los dos endpoints de packs admiten los parámetros de consulta opcionales startDate y endDate; con los dos, cada pack indica availableQuantity, los packs completos libres en ese periodo. Solo listan packs completos y activos. Una clave secreta ve los packs siempre que la función de packs esté activada; una clave publicable, solo si además están activadas las recomendaciones External (externas). Si no, la lista está vacía y bundles/{id} responde 404. GET /inventory/groups/{id} también devuelve los bundles que contienen el grupo.
Disponibilidad, precios y reservas
| Método y ruta | Claves | Método del SDK |
|---|---|---|
POST /availability/calendar | Publicable | availability.calendar() |
POST /availability/items | Publicable | availability.items() |
POST /pricing/quote | Publicable | pricing.quote() |
POST /bookings/create | Publicable, solo solicitudes de reserva | bookings.create() |
GET /bookings/list | Secreta | bookings.list() |
GET /bookings/{id} | Secreta | bookings.get() |
POST /bookings/{id}/notes | Secreta | bookings.addNote() |
Una clave publicable debe enviar "asRequest": true a POST /bookings/create; cualquier otra cosa recibe un 403 con data.reason: "request_only".
POST /pricing/quote y POST /bookings/create aceptan bundles: [{ bundleId, quantity }] junto a items; en ese caso, items puede estar vacío. Los presupuestos devuelven bundleDiscountAmount (ya incluido en total) y lineBundles, una entrada por cada pack con su precio para el periodo. Enviar packs cuando la función de packs está desactivada responde 403.
Clientes
| Método y ruta | Claves | Método del SDK |
|---|---|---|
POST /clients/lookup | Secreta | clients.lookup() |
POST /clients/create | Secreta | clients.create() |
Productos en venta y ventas
| Método y ruta | Claves | Método del SDK |
|---|---|---|
GET /sale-items/list | Secreta; publicable mientras la organización vende a los clientes | saleItems.list() |
GET /sale-items/{id} | Secreta; publicable mientras la organización vende a los clientes | saleItems.get() |
GET /sales/list | Secreta | sales.list() |
GET /sales/{id} | Secreta | sales.get() |
POST /sales/create | Secreta | sales.create() |
Estos endpoints responden 403 con data.reason: "feature_disabled" mientras Enable sales (activar ventas) está desactivado en Funciones o la organización no tiene el plan Advanced. Lo que ve una clave publicable, y cuándo recibe selling_disabled en su lugar, se explica en Ventas y productos en venta.
Informes
Todos los informes necesitan una clave secreta y reciben sus parámetros como parámetros de consulta.
| Método y ruta | Método del SDK |
|---|---|
GET /reports/revenue | reports.revenue() |
GET /reports/bookings-summary | reports.bookingsSummary() |
GET /reports/utilization | reports.utilization() |
GET /reports/top-items | reports.topItems() |
GET /reports/top-clients | reports.topClients() |
GET /reports/outstanding | reports.outstanding() |
GET /reports/overdue | reports.overdue() |
GET /reports/pipeline | reports.pipeline() |
Convenciones
| Tema | Regla |
|---|---|
| Parámetros | Los endpoints GET reciben parámetros de consulta. Los endpoints POST reciben un cuerpo JSON. |
| Paginación | Los endpoints de lista devuelven nextCursor. Vuelve a enviarlo como cursor para obtener la página siguiente; null significa que no hay más páginas. limit va de 1 a 100 (por defecto 25) en las listas de catálogo, disponibilidad y ventas, de 1 a 200 (por defecto 50) en bookings/list y de 1 a 500 (por defecto 100) en inventory/status. |
| Fechas y horas | ISO 8601. En los presupuestos, la creación de reservas y availability/items, una fecha y hora sin desfase horario (2026-07-01T10:00:00) se interpreta en la zona horaria de la organización, con el horario de verano incluido. Un valor con Z o con desfase se usa tal cual. Una fecha sin hora es medianoche. |
| ID | Los productos, las categorías, los servicios, los productos en venta y las ventas usan UUID. Las reservas y los clientes usan números. Las reservas y las ventas también tienen el número que ve el personal en la app: pásalo con ?idKind=org. |
| Dinero | Los importes están en la unidad principal de la moneda de la organización (por ejemplo 1250.5), con el código de currency al lado. |
| Subalquileres | Los productos de proveedores nunca se devuelven a una clave publicable ni se aceptan de ella. Una clave secreta los ve cuando los subalquileres están activados. |
Errores
Una petición fallida responde con un estado HTTP de error y un cuerpo JSON:
{
"statusCode": 409,
"message": "Only 2 × Memory card 128 GB left",
"data": { "reason": "out_of_stock", "saleItemId": "3f6c…", "availableQuantity": 2 }
}
message está pensado para las personas. Cuando la API da un motivo legible por máquina, está en data.reason, a veces con más campos en data. Toma las decisiones según data.reason, nunca según el texto del mensaje. Los motivos se listan en Gestión de errores.
| Estado | Causa habitual |
|---|---|
400 | Un campo que falta o está mal formado, como una fecha no válida o una lista items vacía. |
401 | Falta la cabecera Authorization, o la clave es desconocida o está revocada. |
403 | El tipo de clave no puede usar el endpoint, o hay una función o un permiso desactivados. |
404 | La reserva, el producto, el cliente o la venta no existe en esta organización. |
409 | La petición choca con el estado actual, por ejemplo un producto está archivado o agotado. |
429 | La clave ha superado su límite de peticiones. Espera los segundos que indica Retry-After. |
Una reserva que la organización no puede aceptar, por ejemplo porque los artículos están ocupados o la recogida queda fuera del horario, no es un error: POST /bookings/create responde 200 con success: false. Consulta Reservas.
Registrar una venta por REST
POST /sales/create recibe:
{
"lines": [{ "saleItemId": "3f6c…", "quantity": 2 }],
"clientId": 23,
"paymentMethod": "payOnPickup",
"soldAt": "2026-09-29T14:00:00Z",
"note": "Counter sale"
}
Responde 201 con la sale, stockWarnings (los productos cuyo stock queda por debajo de cero; la venta se registra igualmente) y el payment con su enlace para un método online. Las reglas de los campos están en sales.create().
Informes
Obtén los informes de ingresos, reservas, tasa de uso, clientes, saldos, reservas con retraso y previsión.
Ejemplos
Patrones del SDK listos para copiar para una tienda online de alquiler y una integración de servidor, como un catálogo por fechas, un formulario de solicitud de reserva, productos en venta, la sincronización de reservas nuevas y la gestión de los límites de peticiones.