Saltar al contenido principal

Errores y paginación

Esta guía describe cómo la API de Rently comunica los errores (estructura JSON y códigos), qué significan los códigos de estado HTTP más habituales, y cómo recorrer respuestas paginadas con los parámetros offset y limit.

Todos los ejemplos asumen que ya obtuviste un token Bearer. Consultá la guía de autenticación para el detalle del flujo. El header de autorización se envía en cada llamada:

Authorization: Bearer {token}

Formato de errores

Cuando una petición no puede completarse por un error de negocio o de validación, la API responde con un cuerpo JSON con la siguiente estructura:

CampoTipoDescripción
ErrorMessagestring (nullable)Mensaje legible que describe el error.
ErrorCodeintegerCódigo numérico que identifica el tipo de error (ver tabla de códigos).
Idstring (nullable)Identificador de correlación para rastrear el error en soporte.
nota

ErrorCode se serializa siempre como número entero, no como texto. Por ejemplo, 1 corresponde a CustomerNotFound.

Ejemplo de respuesta de error

{
"ErrorMessage": "The requested resource was not found",
"ErrorCode": 1,
"Id": "0HMVB9A2K3C4D-00000001"
}
tip

Guardá el valor de Id en tus logs. Es el identificador de correlación que permite a soporte de Rently ubicar la traza exacta de la petición que falló.

Códigos de error (ErrorCode)

El campo ErrorCode proviene de una enumeración con valores numéricos. La siguiente tabla lista todos los códigos de error que puede devolver la API:

CodeNameDescription
0NoErrorNo ocurrió ningún error.
1CustomerNotFoundNo se encontró en el sistema el cliente solicitado.
2CarNotFoundNo se encontró en el sistema el auto solicitado.
3CarNotAvailableEl auto solicitado no está disponible para las fechas indicadas.
4PriceMismatchEl precio calculado no coincide con el precio esperado.
5CustomerDataNotValidLos datos del cliente proporcionados no son válidos.
6LanguageNotSupportedEl idioma solicitado no es compatible con el sistema.
7InsuficientPermissionsEl usuario no tiene permisos suficientes para realizar la operación.
8BookingNotFoundForCustomerNo se encontró ninguna reserva para el cliente indicado.
9BookingStatusNotAllowCancelEl estado actual de la reserva no permite la cancelación.
10CreditCardNotAvailableLa tarjeta de crédito no está disponible para su uso.
11GatewayNotSupportedLa pasarela de pago solicitada no es compatible.
12InfractionNotFoundNo se encontró la infracción solicitada.
13InvlaidDatesLas fechas proporcionadas no son válidas.
14UnquotedReserveLa reserva no fue cotizada.
15MaxDayForQuotedReserveSe superó la cantidad máxima de días para una reserva cotizada.
21TariffNotFoundNo se encontró el tarifario solicitado.
22BookingNotFoundNo se encontró la reserva solicitada.
23ReturnPlaceNotFoundNo se encontró el lugar de devolución indicado.
24PromotionNotFoundNo se encontró la promoción solicitada.
25DeliveryPlaceNotFoundNo se encontró el lugar de entrega indicado.
26BookingStatusNotAllowUpdateEl estado actual de la reserva no permite actualizaciones.
27IlimitedKmNotEnabledLa opción de kilómetros ilimitados no está habilitada.
28LimitedKmNotEnabledLa opción de kilómetros limitados no está habilitada.
29MinimunDaysOfBookingNotReachedNo se alcanzó la cantidad mínima de días para la reserva.
30MaxDaysOfBookingReachedSe superó la cantidad máxima de días para la reserva.
31AdditionalNotFoundNo se encontró el adicional solicitado.
32AdditionalMaxQuantityExceededSe superó la cantidad máxima para el adicional.
33DateFromForBookingNotEnabledLa fecha de inicio de la reserva no está habilitada.
34DriverAgeNotAllowedLa edad del conductor no está dentro del rango permitido.
35BookingVersionErrorHay una discrepancia de versión con la reserva.
36BookingAlreadyDeliveredLa reserva ya fue entregada.
37BookingAlreadyReturnedLa reserva ya fue devuelta.
38BookingNeedsToCompleteDepositLa reserva requiere un depósito para ser completada.
39InvalidCarKilometersEl valor de kilómetros del auto no es válido.
40BookingStatusNotAllowDeliveryEl estado actual de la reserva no permite la entrega.
41DriverLicenseInvalidLa licencia de conducir no es válida.
42BookingStatusNotAllowReturnEl estado actual de la reserva no permite la devolución.
43NotificationRelatedEntityNotFoundNo se encontró la entidad relacionada de la notificación.
44NotificationReceiverAddressInvalidLa dirección del destinatario de la notificación no es válida.
45MailNotificationDisabledLas notificaciones por correo están deshabilitadas.
46ReturnPlaceNotAllowedForDeliveryPlaceEl lugar de devolución no está permitido para el lugar de entrega indicado.
47BookingOutOfOfficeHoursNotAllowedNo se permiten reservas fuera del horario de atención.
48NotificationNotFoundNo se encontró la notificación solicitada.
49BlockedCustomerToBookEl cliente está bloqueado para realizar reservas.
50MustHaveAtLeastOneInsuranceLa configuración del sistema requiere seleccionar al menos un seguro al crear o editar una reserva.
51InvalidCommercialAgreementEl acuerdo comercial no es válido.
60AppProtocolNotFoundNo se encontró el protocolo de la aplicación.
61ServiceTypeInvalidEl tipo de servicio no es válido.
62ServiceStatusInvalidEl estado del servicio no es válido.
63ServiceDatesInvalidsLas fechas del servicio no son válidas.
64ServiceProviderNotFoundNo se encontró el proveedor del servicio.
65ServiceCanNotCreateNo se puede crear el servicio.
66ServiceCanNotEditNo se puede editar el servicio.
67ServiceNotFoundNo se encontró el servicio solicitado.
68CarLocationInvalidDriverLa ubicación del auto tiene un conductor inválido.
69ReturnPlaceIsCurrentPlaceErrorEl lugar de devolución es el mismo que el lugar actual.
70CarIsNotFreeEl auto no está disponible para la operación solicitada.
71CarTransferErrorOcurrió un error durante la transferencia del auto.
72InvalidCarGasolineEl nivel de combustible del auto no es válido.
73CannotDeliverBookingWithBalanceNo se puede entregar una reserva con un saldo pendiente.
74PlaceDoesNotAcceptCustomAddressesEl lugar no acepta direcciones personalizadas.
75PlaceCantOperatesLikePickUpEl lugar no puede operar como punto de entrega.
76PlaceCantOperatesLikeDropOffEl lugar no puede operar como punto de devolución.
77CannotPayQuoteNo se puede pagar la cotización.
80FeatureNotEnabledLa funcionalidad solicitada no está habilitada.
98ModelNotValidEl modelo no es válido.
99UnknownOcurrió un error desconocido.
100MissingCurrencyCodeFalta el código de moneda.
101TotalGreaterThanZeroEl monto total debe ser mayor que cero.
102InfractionAlreadyExistsEl acta de infracción o la violación ya existe en el sistema.
103InvalidIncidentTypeEl tipo de incidente no es válido
104InvalidIncidentDateLa fecha del incidente no es válida
105SettingNotFoundNo se encontró una configuración requerida
106BookingBrandNotFoundBooking Brand no encontrado
107BookingCannotBeUncancelled
108RateAlreadyExistsYa existe una tasa con el código dado y no se solicitaron actualizaciones.
499Timeout
1100MappingAlreadyExists
1101ModelNotExists
1102CompanyCodeNotFound
1103CommercialAgreementNotSupportedEl acuerdo comercial no es compatible.
1104CommercialAgreementRequired
1105InfractionNoticeNotFoundEl Aviso de Infracción referenciado no se encontró para el inquilino.
1106InfractionNoticeDismissedEl Aviso de Infracción referenciado queda desestimado y no puede ser vinculado.
1107InfractionNoticeContextMismatchEl contexto de la infracción (coche, fecha, reserva o conductor) no coincide con el Aviso de Infracción.
1108InfractionNoticeMainAlreadyLinkedEl Aviso de Infracción ya incluye una infracción principal vinculada.
1109InfractionNoticeNicAlreadyLinkedEl InfractionNotice ya incluye una infracción NIC (penalización por no identificación del conductor).
1110InfractionNoticeInfractionAlreadyLinkedLa infracción ya está vinculada a otro Aviso de Infracción.
aviso

Los valores numéricos no son contiguos: la enumeración salta posiciones (por ejemplo, de 15 a 21). Mapeá tus reintentos y mensajes a partir del valor exacto y no asumas rangos correlativos.

Códigos de estado HTTP

La API utiliza un conjunto acotado de códigos de estado. Tené en cuenta que los fallos de autenticación se reportan como 403 (la API no devuelve 401).

EstadoSignificadoCuerpo
200 OKLa petición se procesó correctamente.Payload del recurso o resultado paginado.
400 Bad RequestError de negocio o de validación (Api Error).JSON con ErrorMessage, ErrorCode e Id.
403 ForbiddenUsuario no autenticado o sin permisos para el endpoint.Sin cuerpo.
404 Not FoundEl recurso solicitado no existe.Sin cuerpo.
nota

Un 403 puede significar tanto que el token es inválido o ausente como que el usuario autenticado no tiene el permiso requerido para ese endpoint. Verificá primero el header Authorization y luego los permisos del usuario.

Cómo manejar errores

  • 200 → procesá la respuesta normalmente.
  • 400 → leé ErrorCode para decidir la acción (corregir datos, recotizar, etc.) y mostrá ErrorMessage al operador.
  • 403 → revisá que el token sea válido, esté vigente y corresponda al mismo tenant; confirmá que el usuario tenga permisos.
  • 404 → el identificador usado no corresponde a ningún recurso; validá los IDs antes de reintentar.

Paginación

Los endpoints que devuelven listas (por ejemplo GET /api/bookings/list, GET /api/customers o GET /api/cars) usan paginación por offset y limit.

Parámetros de consulta

ParámetroTipoDefaultDescripción
offsetinteger0Punto de partida de la página. Debe ser >= 0.
limitinteger30Cantidad máxima de elementos por página. Se recorta a un máximo de 100.
nota

Si enviás un limit mayor a 100, la API lo recorta automáticamente a 100. Un offset negativo se normaliza a 0.

Forma del resultado

Las respuestas paginadas comparten la misma estructura PagedResult:

CampoTipoDescripción
OffsetintegerOffset aplicado a esta página.
LimitintegerLímite aplicado a esta página.
TotalintegerTotal de elementos disponibles en todas las páginas.
Resultsarray (nullable)Elementos de la página actual.
NextOffsetintegerOffset a usar para solicitar la página siguiente.

Ejemplo de respuesta paginada

{
"Offset": 0,
"Limit": 30,
"Total": 2,
"Results": [
{ "Id": 1 },
{ "Id": 2 }
],
"NextOffset": 0
}

Ejemplo de request

curl "https://{tenant}.rently.com.ar/api/customers?offset=0&limit=30&language=es-AR" \
-H "Authorization: Bearer {token}"

Cómo recorrer todas las páginas

Para iterar la totalidad de un listado, usá NextOffset de cada respuesta como offset de la petición siguiente. La iteración termina cuando Results trae menos elementos que Limit.

# Página 1
curl "https://{tenant}.rently.com.ar/api/bookings/list?offset=0&limit=30&language=es-AR" \
-H "Authorization: Bearer {token}"

# Página 2: usar el NextOffset devuelto por la página anterior
curl "https://{tenant}.rently.com.ar/api/bookings/list?offset={NextOffset}&limit=30&language=es-AR" \
-H "Authorization: Bearer {token}"
tip

Para la iteración, fijate en Results.Count < Limit como condición de fin en lugar de comparar contra Total. Esto funciona de forma consistente con ambos estilos de paginación de la API.

aviso

En GET /api/bookings/list el parámetro offset funciona como cursor por Id, no como cantidad de registros a saltar. Pasá siempre 0 en la primera llamada (sin importar la dirección de orden) y, en las siguientes, el valor de NextOffset que devolvió la respuesta anterior. No construyas el offset manualmente sumando tamaños de página.