Pular para o conteúdo principal

RentalAgreement-v2

Esta seção diz respeito ao fluxo de análise de fraude com a scoragem principal ocorrendo na reserva.

Ao realizar a retirada de um veículo na loja, o locatário dá início ao seu processo de anti-fraude. Os dados enviados deverão ser os dados finais, que não serão alterados. Isto é importante para garantir dois pontos:

  • Consistência dos dados na base de dados do Antifraude
  • Avaliação realista do risco

O processo de análise consiste em enviar um RentalAgreement no endpoint adequado e esperar a resposta. Existem oito resultados possíveis, devolvido na flag fraud_status:

ResultadoDescrição
Aprovado AutomaticamenteRecomenda-se que este aluguel seja aprovado
Negado AutomaticamenteRecomenda-se que este aluguel seja reprovado
Derivado para análise manualNossas regras ou modelos não estão confiantes da decisão e decidiram enviar este aluguel para a análise manual.
Aprovado ManualmenteApós análise manual, o analista escolheu aprovar o aluguel
Reprovado ManualmenteApós análise manual, o analista escolheu reprovar o aluguel
Desafiado ManualmenteApós análise manual, o analista retorna para a loja que a CNH e/ou Selfie estão incorretas e/ou com baixa qualidade
PendenteAs consultas estão demorando mais do que o esperado, este aluguel entrou em uma fila de análise automática e será respondido por meio de Webhook
Não analisadoA consulta foi enviada com a flag de análise falsa, o que significa que nossos sistemas não deverão retornar parecer

Dinâmica dos Status

Ao recuperar um objeto do tipo RentalAgreement os status estão disponíveis. Além dos status, um histórico de modificações também são retornados para que possa ser consultado no futuro. Estas modificações são entituladas events e possuem, além do novo status, as datas de modificação.

Dinâmica dos Status - car_status

O status car_status relacionado a um RentalAgreement indica a situação do carro relacionado a este aluguel, isto é, se o carro foi devolvido ou não. Os seguintes enumeradores existem para este status:

  • rented
  • returned
  • recovered
  • written_off

Dinâmica dos Status - fraud_status

O status fraud_status indica o status da decisão do motor de fraude e possui uma máquina de estados bastante simples:

  • created
  • automatically_approved
  • automatically_reproved
  • in_manual_analysis
  • manually_approved
  • manually_reproved
  • manually_challenged
  • pending
  • not_analyzed

Além disso, o upgrade_status também possui os mesmos enumeradores.

Definição do Objeto

{
"id": "bca6268e-918a-4658-9161-a10b00a631ab",
"rental_agreement_code" : "12345678",
"rental_agreement_date": "2020-03-31T10:30:00-03:00",
"car_rental_estimated_final_date": "2020-04-01T10:28:00-03:00",
"reservation": {
"id": "0",
"channel": "reservation_central",
"reservation_date": "2020-03-31T08:15:00-03:00",
"sales_channel" : "PARCERIA TELEFONICA"
},
"rental_store": "SAOP",
"rental_store_group": "GSP",
"rental_store_type": "LOJA DE RUA",
"devolution_store": "SAOP",
"risky_antecedence": true,
"car": {
"model_group": "AM",
"upgrade_model_group": "SV",
"rental_daily_price" : 48496,
"risky_model_group": true,
"risky_upgrade_model_group": true
},
"client": {
"type": "natural_person",
"segment": "ota",
"document_number": "123.456.789-00",
"name": "John Sample",
"gender": "female",
"birthdate": "2001-01-15",
"mother_name": "Mary Sample",
"email": "john.sample@sample.com.br",
"allowed_information_on_email": true,
"face_picture": "c77d1925-0e72-4634-8393-395dbbce498d",
"additional_pictures": [
"718b8caa-8ef5-446c-b101-2dbf6c7e401f",
"9c67f365-1427-4889-b963-d3729d437ff3",
"8006f82c-3a80-4371-914e-e88c91507711",
"42c6909e-51aa-4b6d-972f-f4684a047993",
"b7a88947-96bd-4557-81e9-a69a3c84f428"
],
"total_rents": 6,
"fidelity_points": 1200,
"documents": {
"rg": {
"document_number": "00000000",
"issuer": "SSP"
},
"cnh": {
"document_number": "000000000",
"security_code": "00000",
"first_issuance": "2015-07-20",
"expiration_date": "2030-07-26",
"state": "SP"
}
},
"residential_address": {
"street": "Av Brigadeiro Faria Lima",
"number": "2391",
"neighborhood": "Jardins",
"city": "SÃO PAULO",
"uf": "SP",
"complement": "",
"postal_code": "00000-000"
},
"commercial_address": {
"street": "Av Brigadeiro Faria Lima",
"number": "2391",
"neighborhood": "Jardins",
"city": "SÃO PAULO",
"uf": "SP",
"complement": "",
"postal_code": "00000-000"
},
"phones": [
{
"international_dial_code": "55",
"area_code": "11",
"number": "00000-0000",
"type": "mobile"
},
{
"international_dial_code": "55",
"area_code": "11",
"number": "00000-0000",
"type": "residential"
}
]
},
"coverages": [
{
"description": "S/ PROTEÇÃO AMERICAN PLATINUM",
"price": 0
},
{
"description": "PROTEÇÃO OCUPANTES E TERCEIROS",
"price": 1668
}
],
"billing": {
"name": "Agência AAA",
"document_number": "00.000.000/0001-00",
"voucher_type": "ABCD75",
"voucher_description": "Pagamento pela agência"
},
"fare_name": "Mensal",
"rental_price": 43300,
"extra_hours": 0,
"extra_hours_price": 0,
"discount": 0,
"prepayment_discount": 100,
"extra_kms": 0,
"extra_kms_price": 0,
"third_party_coverage_price": 1490,
"coverage_price": 0,
"additional_driver_price": 1000,
"driver_service_price": 1000,
"additional_expenses": 1000,
"devolution_fee": 0,
"administration_fee": 5374,
"discount_partial_coverage": 50,
"free_day_discount": 20000,
"final_price": 50165,
"pre_authorization_amount": 0,
"coverage_deductible_amount": 0,
"upgrade_reason": "granted"
}

Todas as trocas de informação de um RentalAgreement utilizam a seguinte definição para este objeto. Em alguns casos, para facilitar a implementação e diminuir o fluxo de dados entre as partes, algumas informações poderão ser omitidas.

nometipodescrição
idstringIdentificador da requisição de análise no sistema do cliente. É essencial que este número seja único para cada aluguel. (obrigatório)
rental_agreement_codestringIdentificador do RentalAgreement no sistema do cliente. (obrigatório)
rental_agreement_dateDateTimeData e Hora com fuso-horário da retirada do veículo do aluguel que está ocorrendo. (obrigatório)
car_rental_estimated_final_dateDateTimeData e Hora com fuso-horário de quando o carro deve ser resolvido. (obrigatório)
reservationreservationObjeto que carrega as propriedades da reserva que deu origem a esse aluguel. (obrigatório)
rental_storestoreLoja onde o carro está sendo retirado. (obrigatório)
rental_store_groupstoreFilial da loja onde o carro está sendo retirado
rental_store_typestoreTipo da loja onde o carro será retirado
devolution_storestoreLoja onde o carro será devolvido, pode ou não ser a mesma loja de retirada. (obrigatório)
carcarCarro que está sendo retirado - é importante que este valor seja, de fato, o carro sendo retirado. (obrigatório)
clientclientObjeto que carrega as informações do cliente que está retirando o veículo. (obrigatório)
coveragesList of coverageLista de objetos coverage que descrevem as coberturas de seguro contratadas pelo cliente. (obrigatório)
billingbillingObjeto que descreve os detalhes da pessoa ou empresa responsável pelo pagamento do aluguel. (obrigatório)
rental_priceintegerPreço do aluguel, em centavos. (obrigatório)
extra_hoursintegerQuantidade de horas extras contratadas. (obrigatório)
extra_hours_priceintegerPreço das horas extras contratadas, em centavos. (obrigatório)
discountinteiroDesconto concedido por quaisquer motivos, em centavos. (obrigatório)
prepayment_discountinteiroDesconto por pagamento antecipado.
extra_kmsintegerQuantidade de kilômetros extras contratados. (obrigatório)
extra_kms_priceintegerPreço de kilômetros extras contratados, em centavos. (obrigatório)
third_party_coverage_priceintegerPreço do seguro de terceiros, em centavos. (obrigatório)
coverage_priceintegerPreço do seguro contratado, em centavos. (obrigatório)
additional_driver_priceintegerPreço total do(s) motoristas adicionais contratados, em centavos.
driver_service_priceintegerPreço total do serviço de motorista contratado, em centavos.
additional_expensesintegerDespesas adicionais, em centavos
devolution_feeintegerPreço da taxa de devolução, em centavos. (obrigatório)
administration_feeintegerPreço da taxa de administração, em centavos. (obrigatório)
discount_partial_coverageintegerDesconto de proteção parcial, em centavos.
free_day_discountintegerDesconto de Free Day, em centavos.
final_priceintegerPreço final do aluguel, em centavos. (obrigatório)
pre_authorization_amountintegerValor da pré-autorização, em centavos.
coverage_deductible_amountintegerValor dedutível da cobertura, em centavos. (obrigatório)
upgrade_reasonenumTipo de upgrade (Concedido ou Comprado) - Aceita os valores granted e bought respectivamente

Enviar um RentalAgreement

Exemplo de Request:

{
"id": "bca6268e-918a-4658-9161-a10b00a631ab",
...
}

Exemplo de Retorno:

{
"id": "bca6268e-918a-4658-9161-a10b00a631ab",
"fraud_status": "automatically_approved",
"pre_authorization_amount": 100000,
"block_document_number": true,
"upgrade_status": "automatically_approved",
"highest_allowed_car_group": "SV",
"score": 870
}

Para realizar a avaliação de um aluguel, basta enviar um objeto do tipo RentalAgreement ao seguinte endpoint com a flag setada adequadamente:

POST https://api.caas.qitech.app/car_rental/rental_agreement?analyze=true

Além do status do retorno, também é retornado, caso haja, o valor da pré autorização desejada. Caso nenhuma majoração de pré autorização seja identificada, o valor retornado é nulo e não deve ser utilizado.

O grupo máximo que pode ser fornecido naquele RA é disponibilizado na variável highest_allowed_car_group. Este valor é configurado na regra de avaliação do RA.

O parâmetro analyze existe para evitar que transações que não precisam ser analisadas passem pelos motores de fraude, sujando a base de dados. O valor padrão deste parâmetro é true, de maneira que somente alugueis que forem explícitamente retirados da análise não serão analisados.

Atualizar o status de um RentalAgreement

Corpo da requisição - Na efetivação de um aluguel de um carro:

{
"car_status": "rented",
"event_date": "2019-11-05T13:34:12-03:00"
}

Corpo da requisição - Na devolução sem incidentes de um carro:

{
"car_status": "returned",
"event_date": "2019-11-05T13:34:12-03:00"
}

Corpo da requisição - Na devolução mediante recuperação por roubo:

{
"car_status": "recovered",
"incident": "theft",
"event_date": "2019-11-05T13:34:12-03:00"
}

Corpo da requisição - Write-off com fraude confirmada:

{
"car_status": "written_off",
"incident": "misappropriation",
"event_date": "2019-11-05T13:34:12-03:00"
}

Para garantir a retroalimentação das regras e do modelo de inteligência artificial implementado, é necessário informar ao sistema quando os carros são alugados, devolvidos, ou quando são jogados a perda por fraude. Para isso, requisições com o método PUT devem ser utilizadas, passando-se como referência o id enviado na criação do rental_agreement, autenticadas normalmente:

PUT https://api.caas.qitech.app/car_rental/rental_agreement/{rental_agreement_id}

Caso o novo status seja written_off, os seguintes valores podem ser utilizados no campo incident, enviado no body da requisição, que indica o tipo de incidente do aluguel:

EnumeradorDescrição
theftRAs que sofreram um roubo
misappropriationRAs que foram classificados como apropriação indébita

Atualizar o veículo de um RentalAgreement

Corpo da requisição - Atualização de um veículo no aluguel:

{
"car_plate": "ABC1B34",
"car_model": "Chevrolet Onix",
"model_group": "B",
"event_date": "2020-10-15T13:34:12-03:00"
}

Para garantir a consistência entre as ocorrências de fraude e os aluguéis e garantir o retreinamento do modelo de score, é necessário informar ao sistema os dados de cada carro quando ele é atrelado ao aluguel. Para isso, requisições com o método POST devem ser utilizadas, passando-se como referência o id enviado na criação do rental_agreement, autenticadas normalmente:

POST https://api.caas.qitech.app/car_rental/rental_agreement/{rental_agreement_id}/car

No body da requisição devem ser enviados os dados do veículo que está sendo atrelado àquele aluguel:

nometipodescrição
car_platestringPlaca do veículo.
car_modelstringModelo do veículo, incluindo sua marca e modelo (ex.: Jeep Renegade).
model_groupstringO grupo do veículo, em letras maiúsculas.
event_dateDateTimeData e Hora com fuso-horário do momento em que ocorreu a associação do carro ao aluguel.

Recuperar um RentalAgreement

A fim de recuperar um RentalAgreement específico, basta realizar uma requisição GET. O resultado retornado é o json mais atualizado do RentalAgreement em questão. Caso este identificador não esteja relacionado a nenhum objeto, o HTTP Status 404 é retornado.

GET https://api.caas.qitech.app/car_rental/rental_agreements/{rental_agreement_id}

curl "https://api.caas.qitech.app/car_rental/rental_agreements/{rental_agreement_id}"
-H "Authorization: TESTETESTETESTE"

Buscar RentalAgreements

Retorno - uma lista de objetos RentalAgreement:

[
{
"id": "bca6268e-918a-4658-9161-a10b00a631ab",
...
},
{
"id": "13a91409-9793-49b6-8583-9ba575075831",
...
}
]

Caso seja necessário buscar um RentalAgreement, um GET com parâmetros de query poderá ser utilizado. O resultado retornado é um JSON que representa uma lista de RentalAgreements. Caso nenhum objeto seja encontrado com os parâmetros enviados, o HTTP Status 200 é retornado com uma lista vazia no corpo da resposta.

GET https://api.caas.qitech.app/car_rental/rental_agreements?initial_date=2019-10-01&final_date=2019-10-05&page_number=2&page_rows=20

Os seguintes parâmetros podem ser utilizados para buscar objetos de RentalAgreement:

ParâmetroPadrãoDescrição
initial_datenullPrimeira data que deve ser retornada a partir do campo rental_agreement_date
final_datenullÚltima data que deve ser retornada a partir do campo rental_agreement_date
store_codenullCódigo da loja de onde os resultados devem ser retornados
page_number1Número da página de resultados desejada
page_rows50Número de objetos máximo a ser retornados em uma consulta