---
title: "Referencia de la API REST"
description: "Todos los endpoints de la API REST pública v1 de Requiply con su método HTTP, los tipos de clave que aceptan y el método del SDK que los envuelve, además de las convenciones de las peticiones, la paginación, las fechas y los errores."
canonical_url: "https://requiply.com/docs/es/developers/api-reference"
---
# Referencia de la API REST

> Todos los endpoints de la API REST pública v1 de Requiply con su método HTTP, los tipos de clave que aceptan y el método del SDK que los envuelve, además de las convenciones de las peticiones, la paginación, las fechas y los errores.

La API pública está bajo:

```text
https://api.requiply.com/api/public/v1
```

Cada petición se autentica con `Authorization: Bearer <api-key>`; consulta [Autenticación y claves de API](https://requiply.com/docs/es/developers/authentication-and-api-keys). Los cuerpos de las peticiones y de las respuestas son JSON. El [SDK de TypeScript](https://requiply.com/docs/es/developers/typescript-sdk) envuelve todos los endpoints de abajo, y sus guías de recursos describen los campos en detalle.

<note>

Todavía no se ha publicado ningún documento OpenAPI. Los tipos de TypeScript del SDK son la descripción más precisa de cada petición y cada respuesta.

</note>

## 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

<table>
<thead>
  <tr>
    <th>
      Método y ruta
    </th>
    
    <th>
      Claves
    </th>
    
    <th>
      Método del SDK
    </th>
  </tr>
</thead>

<tbody>
  <tr>
    <td>
      <code>
        GET /org/info
      </code>
    </td>
    
    <td>
      Publicable
    </td>
    
    <td>
      <a href="https://requiply.com/docs/es/developers/typescript-sdk/organization#orginfo">
        <code>
          org.info()
        </code>
      </a>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        GET /org/summary
      </code>
    </td>
    
    <td>
      Secreta
    </td>
    
    <td>
      <a href="https://requiply.com/docs/es/developers/typescript-sdk/organization#orgsummary">
        <code>
          org.summary()
        </code>
      </a>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        GET /categories/list
      </code>
    </td>
    
    <td>
      Publicable
    </td>
    
    <td>
      <a href="https://requiply.com/docs/es/developers/typescript-sdk/inventory-and-categories#categorieslist">
        <code>
          categories.list()
        </code>
      </a>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        GET /services/list
      </code>
    </td>
    
    <td>
      Publicable
    </td>
    
    <td>
      <a href="https://requiply.com/docs/es/developers/typescript-sdk/inventory-and-categories#serviceslist">
        <code>
          services.list()
        </code>
      </a>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        GET /inventory/list
      </code>
    </td>
    
    <td>
      Publicable
    </td>
    
    <td>
      <a href="https://requiply.com/docs/es/developers/typescript-sdk/inventory-and-categories#inventorylist">
        <code>
          inventory.list()
        </code>
      </a>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        GET /inventory/groups/{id}
      </code>
    </td>
    
    <td>
      Publicable
    </td>
    
    <td>
      <a href="https://requiply.com/docs/es/developers/typescript-sdk/inventory-and-categories#inventorygetgroup">
        <code>
          inventory.getGroup()
        </code>
      </a>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        GET /inventory/status
      </code>
    </td>
    
    <td>
      Secreta
    </td>
    
    <td>
      <a href="https://requiply.com/docs/es/developers/typescript-sdk/inventory-and-categories#inventorystatus">
        <code>
          inventory.status()
        </code>
      </a>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        GET /bundles/list
      </code>
    </td>
    
    <td>
      Publicable
    </td>
    
    <td>
      <a href="https://requiply.com/docs/es/developers/typescript-sdk/inventory-and-categories#bundleslist">
        <code>
          bundles.list()
        </code>
      </a>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        GET /bundles/{id}
      </code>
    </td>
    
    <td>
      Publicable
    </td>
    
    <td>
      <a href="https://requiply.com/docs/es/developers/typescript-sdk/inventory-and-categories#bundlesget">
        <code>
          bundles.get()
        </code>
      </a>
    </td>
  </tr>
</tbody>
</table>

Los [packs](https://requiply.com/docs/es/guides/inventory/bundles) 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

<table>
<thead>
  <tr>
    <th>
      Método y ruta
    </th>
    
    <th>
      Claves
    </th>
    
    <th>
      Método del SDK
    </th>
  </tr>
</thead>

<tbody>
  <tr>
    <td>
      <code>
        POST /availability/calendar
      </code>
    </td>
    
    <td>
      Publicable
    </td>
    
    <td>
      <a href="https://requiply.com/docs/es/developers/typescript-sdk/availability-and-pricing#availabilitycalendar">
        <code>
          availability.calendar()
        </code>
      </a>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        POST /availability/items
      </code>
    </td>
    
    <td>
      Publicable
    </td>
    
    <td>
      <a href="https://requiply.com/docs/es/developers/typescript-sdk/availability-and-pricing#availabilityitems">
        <code>
          availability.items()
        </code>
      </a>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        POST /pricing/quote
      </code>
    </td>
    
    <td>
      Publicable
    </td>
    
    <td>
      <a href="https://requiply.com/docs/es/developers/typescript-sdk/availability-and-pricing#pricingquote">
        <code>
          pricing.quote()
        </code>
      </a>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        POST /bookings/create
      </code>
    </td>
    
    <td>
      Publicable, solo solicitudes de reserva
    </td>
    
    <td>
      <a href="https://requiply.com/docs/es/developers/typescript-sdk/bookings#bookingscreate">
        <code>
          bookings.create()
        </code>
      </a>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        GET /bookings/list
      </code>
    </td>
    
    <td>
      Secreta
    </td>
    
    <td>
      <a href="https://requiply.com/docs/es/developers/typescript-sdk/bookings#bookingslist">
        <code>
          bookings.list()
        </code>
      </a>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        GET /bookings/{id}
      </code>
    </td>
    
    <td>
      Secreta
    </td>
    
    <td>
      <a href="https://requiply.com/docs/es/developers/typescript-sdk/bookings#bookingsget">
        <code>
          bookings.get()
        </code>
      </a>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        POST /bookings/{id}/notes
      </code>
    </td>
    
    <td>
      Secreta
    </td>
    
    <td>
      <a href="https://requiply.com/docs/es/developers/typescript-sdk/bookings#bookingsaddnote">
        <code>
          bookings.addNote()
        </code>
      </a>
    </td>
  </tr>
</tbody>
</table>

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

<table>
<thead>
  <tr>
    <th>
      Método y ruta
    </th>
    
    <th>
      Claves
    </th>
    
    <th>
      Método del SDK
    </th>
  </tr>
</thead>

<tbody>
  <tr>
    <td>
      <code>
        POST /clients/lookup
      </code>
    </td>
    
    <td>
      Secreta
    </td>
    
    <td>
      <a href="https://requiply.com/docs/es/developers/typescript-sdk/clients#clientslookup">
        <code>
          clients.lookup()
        </code>
      </a>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        POST /clients/create
      </code>
    </td>
    
    <td>
      Secreta
    </td>
    
    <td>
      <a href="https://requiply.com/docs/es/developers/typescript-sdk/clients#clientscreate">
        <code>
          clients.create()
        </code>
      </a>
    </td>
  </tr>
</tbody>
</table>

### Productos en venta y ventas

<table>
<thead>
  <tr>
    <th>
      Método y ruta
    </th>
    
    <th>
      Claves
    </th>
    
    <th>
      Método del SDK
    </th>
  </tr>
</thead>

<tbody>
  <tr>
    <td>
      <code>
        GET /sale-items/list
      </code>
    </td>
    
    <td>
      Secreta; publicable mientras la organización vende a los clientes
    </td>
    
    <td>
      <a href="https://requiply.com/docs/es/developers/typescript-sdk/sales#saleitemslist">
        <code>
          saleItems.list()
        </code>
      </a>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        GET /sale-items/{id}
      </code>
    </td>
    
    <td>
      Secreta; publicable mientras la organización vende a los clientes
    </td>
    
    <td>
      <a href="https://requiply.com/docs/es/developers/typescript-sdk/sales#saleitemsget">
        <code>
          saleItems.get()
        </code>
      </a>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        GET /sales/list
      </code>
    </td>
    
    <td>
      Secreta
    </td>
    
    <td>
      <a href="https://requiply.com/docs/es/developers/typescript-sdk/sales#saleslist">
        <code>
          sales.list()
        </code>
      </a>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        GET /sales/{id}
      </code>
    </td>
    
    <td>
      Secreta
    </td>
    
    <td>
      <a href="https://requiply.com/docs/es/developers/typescript-sdk/sales#salesget">
        <code>
          sales.get()
        </code>
      </a>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        POST /sales/create
      </code>
    </td>
    
    <td>
      Secreta
    </td>
    
    <td>
      <a href="https://requiply.com/docs/es/developers/typescript-sdk/sales#salescreate">
        <code>
          sales.create()
        </code>
      </a>
    </td>
  </tr>
</tbody>
</table>

Estos endpoints responden `403` con `data.reason: "feature_disabled"` mientras **Enable sales** (activar ventas) está desactivado en [Funciones](https://requiply.com/docs/es/guides/settings/organization/features#activar-las-ventas) 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](https://requiply.com/docs/es/developers/typescript-sdk/sales#con-una-clave-publicable).

### Informes

Todos los informes necesitan una **clave secreta** y reciben sus parámetros como parámetros de consulta.

<table>
<thead>
  <tr>
    <th>
      Método y ruta
    </th>
    
    <th>
      Método del SDK
    </th>
  </tr>
</thead>

<tbody>
  <tr>
    <td>
      <code>
        GET /reports/revenue
      </code>
    </td>
    
    <td>
      <a href="https://requiply.com/docs/es/developers/typescript-sdk/reports#reportsrevenue">
        <code>
          reports.revenue()
        </code>
      </a>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        GET /reports/bookings-summary
      </code>
    </td>
    
    <td>
      <a href="https://requiply.com/docs/es/developers/typescript-sdk/reports#reportsbookingssummary">
        <code>
          reports.bookingsSummary()
        </code>
      </a>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        GET /reports/utilization
      </code>
    </td>
    
    <td>
      <a href="https://requiply.com/docs/es/developers/typescript-sdk/reports#reportsutilization">
        <code>
          reports.utilization()
        </code>
      </a>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        GET /reports/top-items
      </code>
    </td>
    
    <td>
      <a href="https://requiply.com/docs/es/developers/typescript-sdk/reports#reportstopitems">
        <code>
          reports.topItems()
        </code>
      </a>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        GET /reports/top-clients
      </code>
    </td>
    
    <td>
      <a href="https://requiply.com/docs/es/developers/typescript-sdk/reports#reportstopclients">
        <code>
          reports.topClients()
        </code>
      </a>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        GET /reports/outstanding
      </code>
    </td>
    
    <td>
      <a href="https://requiply.com/docs/es/developers/typescript-sdk/reports#reportsoutstanding">
        <code>
          reports.outstanding()
        </code>
      </a>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        GET /reports/overdue
      </code>
    </td>
    
    <td>
      <a href="https://requiply.com/docs/es/developers/typescript-sdk/reports#reportsoverdue">
        <code>
          reports.overdue()
        </code>
      </a>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        GET /reports/pipeline
      </code>
    </td>
    
    <td>
      <a href="https://requiply.com/docs/es/developers/typescript-sdk/reports#reportspipeline">
        <code>
          reports.pipeline()
        </code>
      </a>
    </td>
  </tr>
</tbody>
</table>

## Convenciones

<table>
<thead>
  <tr>
    <th>
      Tema
    </th>
    
    <th>
      Regla
    </th>
  </tr>
</thead>

<tbody>
  <tr>
    <td>
      <strong>
        Parámetros
      </strong>
    </td>
    
    <td>
      Los endpoints <code>
        GET
      </code>
      
       reciben parámetros de consulta. Los endpoints <code>
        POST
      </code>
      
       reciben un cuerpo JSON.
    </td>
  </tr>
  
  <tr>
    <td>
      <strong>
        Paginación
      </strong>
    </td>
    
    <td>
      Los endpoints de lista devuelven <code>
        nextCursor
      </code>
      
      . Vuelve a enviarlo como <code>
        cursor
      </code>
      
       para obtener la página siguiente; <code>
        null
      </code>
      
       significa que no hay más páginas. <code>
        limit
      </code>
      
       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 <code>
        bookings/list
      </code>
      
       y de 1 a 500 (por defecto 100) en <code>
        inventory/status
      </code>
      
      .
    </td>
  </tr>
  
  <tr>
    <td>
      <strong>
        Fechas y horas
      </strong>
    </td>
    
    <td>
      ISO 8601. En los presupuestos, la creación de reservas y <code>
        availability/items
      </code>
      
      , una fecha y hora sin desfase horario (<code>
        2026-07-01T10:00:00
      </code>
      
      ) se interpreta en la zona horaria de la organización, con el horario de verano incluido. Un valor con <code>
        Z
      </code>
      
       o con desfase se usa tal cual. Una fecha sin hora es medianoche.
    </td>
  </tr>
  
  <tr>
    <td>
      <strong>
        ID
      </strong>
    </td>
    
    <td>
      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 <code>
        ?idKind=org
      </code>
      
      .
    </td>
  </tr>
  
  <tr>
    <td>
      <strong>
        Dinero
      </strong>
    </td>
    
    <td>
      Los importes están en la unidad principal de la moneda de la organización (por ejemplo <code>
        1250.5
      </code>
      
      ), con el código de <code>
        currency
      </code>
      
       al lado.
    </td>
  </tr>
  
  <tr>
    <td>
      <strong>
        Subalquileres
      </strong>
    </td>
    
    <td>
      Los productos de proveedores nunca se devuelven a una clave publicable ni se aceptan de ella. Una clave secreta los ve cuando los <a href="https://requiply.com/docs/es/guides/settings/organization/features">
        subalquileres
      </a>
      
       están activados.
    </td>
  </tr>
</tbody>
</table>

## Errores

Una petición fallida responde con un estado HTTP de error y un cuerpo JSON:

```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](https://requiply.com/docs/es/developers/typescript-sdk/error-handling#motivos-de-error).

<table>
<thead>
  <tr>
    <th>
      Estado
    </th>
    
    <th>
      Causa habitual
    </th>
  </tr>
</thead>

<tbody>
  <tr>
    <td>
      <code>
        400
      </code>
    </td>
    
    <td>
      Un campo que falta o está mal formado, como una fecha no válida o una lista <code>
        items
      </code>
      
       vacía.
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        401
      </code>
    </td>
    
    <td>
      Falta la cabecera <code>
        Authorization
      </code>
      
      , o la clave es desconocida o está revocada.
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        403
      </code>
    </td>
    
    <td>
      El tipo de clave no puede usar el endpoint, o hay una función o un permiso desactivados.
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        404
      </code>
    </td>
    
    <td>
      La reserva, el producto, el cliente o la venta no existe en esta organización.
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        409
      </code>
    </td>
    
    <td>
      La petición choca con el estado actual, por ejemplo un producto está archivado o agotado.
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        429
      </code>
    </td>
    
    <td>
      La clave ha superado su límite de peticiones. Espera los segundos que indica <code>
        Retry-After
      </code>
      
      .
    </td>
  </tr>
</tbody>
</table>

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](https://requiply.com/docs/es/developers/typescript-sdk/bookings#gestionar-la-respuesta).

## Registrar una venta por REST

`POST /sales/create` recibe:

```json
{
  "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()`](https://requiply.com/docs/es/developers/typescript-sdk/sales#salescreate).


## Sitemap

See the full [sitemap](https://requiply.com/docs/sitemap.md) for all pages.
