Aller au contenu principal

Erreurs et pagination

Ce guide décrit comment l'API de Rently communique les erreurs (structure JSON et codes), ce que signifient les codes de statut HTTP les plus courants, et comment parcourir les réponses paginées avec les paramètres offset et limit.

Tous les exemples supposent que vous avez déjà obtenu un token Bearer. Consultez le guide d'authentification pour le détail du flux. Le header d'autorisation est envoyé dans chaque appel :

Authorization: Bearer {token}

Format des erreurs

Lorsqu'une requête ne peut pas aboutir à cause d'une erreur métier ou de validation, l'API répond avec un corps JSON ayant la structure suivante :

ChampTypeDescription
ErrorMessagestring (nullable)Message lisible décrivant l'erreur.
ErrorCodeintegerCode numérique identifiant le type d'erreur (voir le tableau des codes).
Idstring (nullable)Identifiant de corrélation pour retracer l'erreur auprès du support.
remarque

ErrorCode est toujours sérialisé comme un nombre entier, et non comme du texte. Par exemple, 1 correspond à CustomerNotFound.

Exemple de réponse d'erreur

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

Conservez la valeur d'Id dans vos logs. C'est l'identifiant de corrélation qui permet au support de Rently de localiser la trace exacte de la requête qui a échoué.

Codes d'erreur (ErrorCode)

Le champ ErrorCode provient d'une énumération à valeurs numériques. Le tableau suivant répertorie tous les codes d'erreur que l'API peut renvoyer :

CodeNameDescription
0NoErrorAucune erreur ne s'est produite.
1CustomerNotFoundLe client demandé est introuvable dans le système.
2CarNotFoundLe véhicule demandé est introuvable dans le système.
3CarNotAvailableLe véhicule demandé n'est pas disponible pour les dates spécifiées.
4PriceMismatchLe prix calculé ne correspond pas au prix attendu.
5CustomerDataNotValidLes données client fournies ne sont pas valides.
6LanguageNotSupportedLa langue demandée n'est pas prise en charge par le système.
7InsuficientPermissionsL'utilisateur ne dispose pas des autorisations suffisantes pour effectuer l'opération.
8BookingNotFoundForCustomerAucune réservation n'a été trouvée pour le client spécifié.
9BookingStatusNotAllowCancelLe statut actuel de la réservation ne permet pas l'annulation.
10CreditCardNotAvailableLa carte de crédit n'est pas disponible.
11GatewayNotSupportedLa passerelle de paiement demandée n'est pas prise en charge.
12InfractionNotFoundL'infraction demandée est introuvable.
13InvlaidDatesLes dates fournies sont invalides.
14UnquotedReserveLa réservation n'a pas été cotée.
15MaxDayForQuotedReserveLe nombre maximal de jours pour une réservation cotée a été dépassé.
21TariffNotFoundLe tarif demandé est introuvable.
22BookingNotFoundLa réservation demandée est introuvable.
23ReturnPlaceNotFoundLe lieu de retour spécifié est introuvable.
24PromotionNotFoundLa promotion demandée est introuvable.
25DeliveryPlaceNotFoundLe lieu de livraison spécifié est introuvable.
26BookingStatusNotAllowUpdateLe statut actuel de la réservation ne permet pas les mises à jour.
27IlimitedKmNotEnabledL'option kilométrage illimité n'est pas activée.
28LimitedKmNotEnabledL'option kilométrage limité n'est pas activée.
29MinimunDaysOfBookingNotReachedLe nombre minimal de jours pour la réservation n'a pas été atteint.
30MaxDaysOfBookingReachedLe nombre maximal de jours pour la réservation a été dépassé.
31AdditionalNotFoundL'article additionnel demandé est introuvable.
32AdditionalMaxQuantityExceededLa quantité maximale pour l'article additionnel a été dépassée.
33DateFromForBookingNotEnabledLa date de début de la réservation n'est pas activée.
34DriverAgeNotAllowedL'âge du conducteur n'est pas dans la plage autorisée.
35BookingVersionErrorIl existe un décalage de version avec la réservation.
36BookingAlreadyDeliveredLa réservation a déjà été livrée.
37BookingAlreadyReturnedLa réservation a déjà été retournée.
38BookingNeedsToCompleteDepositLa réservation nécessite un dépôt pour être finalisée.
39InvalidCarKilometersLa valeur du kilométrage du véhicule est invalide.
40BookingStatusNotAllowDeliveryLe statut actuel de la réservation ne permet pas la livraison.
41DriverLicenseInvalidLe permis de conduire est invalide.
42BookingStatusNotAllowReturnLe statut actuel de la réservation ne permet pas le retour.
43NotificationRelatedEntityNotFoundL'entité liée à la notification est introuvable.
44NotificationReceiverAddressInvalidL'adresse du destinataire de la notification est invalide.
45MailNotificationDisabledLes notifications par e-mail sont désactivées.
46ReturnPlaceNotAllowedForDeliveryPlaceLe lieu de retour n'est pas autorisé pour le lieu de livraison spécifié.
47BookingOutOfOfficeHoursNotAllowedLes réservations en dehors des heures d'ouverture ne sont pas autorisées.
48NotificationNotFoundLa notification demandée est introuvable.
49BlockedCustomerToBookLe client est bloqué et ne peut pas effectuer de réservations.
50MustHaveAtLeastOneInsuranceLa configuration du système exige la sélection d'au moins une assurance lors de la création ou de la modification d'une réservation.
51InvalidCommercialAgreementL'accord commercial est invalide.
60AppProtocolNotFoundLe protocole d'application est introuvable.
61ServiceTypeInvalidLe type de service est invalide.
62ServiceStatusInvalidLe statut du service est invalide.
63ServiceDatesInvalidsLes dates du service sont invalides.
64ServiceProviderNotFoundLe prestataire de service est introuvable.
65ServiceCanNotCreateLe service ne peut pas être créé.
66ServiceCanNotEditLe service ne peut pas être modifié.
67ServiceNotFoundLe service demandé est introuvable.
68CarLocationInvalidDriverL'emplacement du véhicule a un conducteur invalide.
69ReturnPlaceIsCurrentPlaceErrorLe lieu de retour est identique au lieu actuel.
70CarIsNotFreeLe véhicule n'est pas disponible pour l'opération demandée.
71CarTransferErrorUne erreur s'est produite lors du transfert du véhicule.
72InvalidCarGasolineLe niveau de carburant du véhicule est invalide.
73CannotDeliverBookingWithBalanceImpossible de livrer une réservation présentant un solde impayé.
74PlaceDoesNotAcceptCustomAddressesLe lieu n'accepte pas les adresses personnalisées.
75PlaceCantOperatesLikePickUpLe lieu ne peut pas servir de point de prise en charge.
76PlaceCantOperatesLikeDropOffLe lieu ne peut pas servir de point de restitution.
77CannotPayQuoteImpossible de payer le devis.
80FeatureNotEnabledLa fonctionnalité demandée n'est pas activée.
98ModelNotValidLe modèle n'est pas valide.
99UnknownUne erreur inconnue s'est produite.
100MissingCurrencyCodeLe code de devise est manquant.
101TotalGreaterThanZeroLe montant total doit être supérieur à zéro.
102InfractionAlreadyExistsL'acte d'infraction ou la contravention existe déjà dans le système.
103InvalidIncidentTypeLe type d'incident est invalide
104InvalidIncidentDateLa date de l'incident est invalide
105SettingNotFoundUn paramètre requis est introuvable
106BookingBrandNotFoundBooking Brand introuvable
107BookingCannotBeUncancelled
108RateAlreadyExistsUn débit avec le code donné existe déjà et aucune mise à jour n’a été demandée.
499Timeout
1100MappingAlreadyExists
1101ModelNotExists
1102CompanyCodeNotFound
1103CommercialAgreementNotSupportedL'accord commercial n'est pas pris en charge.
1104CommercialAgreementRequired
1105InfractionNoticeNotFoundL’avis d’infraction mentionné n’a pas été trouvé pour le locataire.
1106InfractionNoticeDismissedL’InfractionNotice mentionné est rejeté et ne peut être lié.
1107InfractionNoticeContextMismatchLe contexte de l’infraction (voiture, date, réservation ou conducteur) ne correspond pas à l’InfractionNotice.
1108InfractionNoticeMainAlreadyLinkedL’InfractionNotice contient déjà une infraction principale associée.
1109InfractionNoticeNicAlreadyLinkedL’InfractionNotice inclut déjà une infraction NIC (pénalité de non-identification du conducteur).
1110InfractionNoticeInfractionAlreadyLinkedL’infraction est déjà liée à un autre InfractionNotice.
attention

Les valeurs numériques ne sont pas contiguës : l'énumération saute des positions (par exemple, de 15 à 21). Mappez vos relances et vos messages à partir de la valeur exacte et ne supposez pas de plages consécutives.

Codes de statut HTTP

L'API utilise un ensemble restreint de codes de statut. Notez que les échecs d'authentification sont signalés par un 403 (l'API ne renvoie pas 401).

StatutSignificationCorps
200 OKLa requête a été traitée correctement.Payload de la ressource ou résultat paginé.
400 Bad RequestErreur métier ou de validation (Api Error).JSON avec ErrorMessage, ErrorCode et Id.
403 ForbiddenUtilisateur non authentifié ou sans permissions pour l'endpoint.Sans corps.
404 Not FoundLa ressource demandée n'existe pas.Sans corps.
remarque

Un 403 peut signifier aussi bien que le token est invalide ou absent que l'utilisateur authentifié n'a pas la permission requise pour cet endpoint. Vérifiez d'abord le header Authorization, puis les permissions de l'utilisateur.

Comment gérer les erreurs

  • 200 → traitez la réponse normalement.
  • 400 → lisez ErrorCode pour décider de l'action (corriger les données, recalculer le devis, etc.) et affichez ErrorMessage à l'opérateur.
  • 403 → vérifiez que le token est valide, en cours de validité et qu'il correspond au même tenant ; confirmez que l'utilisateur a les permissions.
  • 404 → l'identifiant utilisé ne correspond à aucune ressource ; validez les IDs avant de réessayer.

Pagination

Les endpoints qui renvoient des listes (par exemple GET /api/bookings/list, GET /api/customers ou GET /api/cars) utilisent la pagination par offset et limit.

Paramètres de requête

ParamètreTypeDefaultDescription
offsetinteger0Point de départ de la page. Doit être >= 0.
limitinteger30Nombre maximum d'éléments par page. Limité à un maximum de 100.
remarque

Si vous envoyez un limit supérieur à 100, l'API le limite automatiquement à 100. Un offset négatif est normalisé à 0.

Forme du résultat

Les réponses paginées partagent la même structure PagedResult :

ChampTypeDescription
OffsetintegerOffset appliqué à cette page.
LimitintegerLimite appliquée à cette page.
TotalintegerTotal d'éléments disponibles sur toutes les pages.
Resultsarray (nullable)Éléments de la page actuelle.
NextOffsetintegerOffset à utiliser pour demander la page suivante.

Exemple de réponse paginée

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

Exemple de requête

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

Comment parcourir toutes les pages

Pour itérer sur la totalité d'une liste, utilisez le NextOffset de chaque réponse comme offset de la requête suivante. L'itération se termine lorsque Results renvoie moins d'éléments que Limit.

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

# Page 2 : utiliser le NextOffset renvoyé par la page précédente
curl "https://{tenant}.rently.com.ar/api/bookings/list?offset={NextOffset}&limit=30&language=es-AR" \
-H "Authorization: Bearer {token}"
astuce

Pour l'itération, basez-vous sur Results.Count < Limit comme condition de fin plutôt que de comparer à Total. Cela fonctionne de manière cohérente avec les deux styles de pagination de l'API.

attention

Dans GET /api/bookings/list, le paramètre offset fonctionne comme un curseur par Id, et non comme un nombre d'enregistrements à sauter. Passez toujours 0 au premier appel (quel que soit le sens du tri) et, dans les suivants, la valeur de NextOffset renvoyée par la réponse précédente. Ne construisez pas l'offset manuellement en additionnant des tailles de page.