Documentação para uso dos endpoints da API para clientes corporativos da 99.
Endereço de acesso: https://api-corp.99app.com/v1
É possível realizar testes online utilizando a interface do Swagger. Para isso, acesse o endereço abaixo:
https://api-corp.99app.com/docs
Todas as requisições precisam informar o token de acesso para o processo de autenticação. Informe a chave com nome x-api-key
juntamente com o valor do token de acesso no cabeçalho HTTP de cada requisição.
Considerando o cenário de exemplo onde a chave de acesso possui o valor key-abc-123
, segue chamada cURL para a listagem de colaboradores:
curl -X GET https://api-corp.99app.com/v1/employee -H 'x-api-key: key-abc-123'
-
URL
/companies
-
Method
GET
-
Retorno
Status Code: 200
[ { "id": "1", "name": "Empresa principal" }, { "id": "2", "name": "Empresa secundária" } ]
-
URL
/employee
-
Method
GET
-
Parâmetros via query
Atributo Tipo do dado Descrição Obrigatório Valor padrão Exemplo search alfanumérico Busca pelo nome do centro de custo não - financeiro offset numérico Índice da página no sistema de paginação não 1 0 limit numérico Quantidade de registros por página não 50 20 page numérico Depreciado não - - nationalId alfanumérico Documento do colaborador (somente números) não - 98765432100 -
Retorno
Status Code: 200
[ { "name": "José Santos", "phone": { "number": "11999999999", "country": "BRA" }, "email": "jose.santos@empresa.com.br", "companyId": 1073, "company": { "id": "47a3083b-5d03-4e05-ad9d-9fd6fddd613e", "name": "99" }, "nationalId": "98765432100", "supervisorlId": 167, "pin": "053", "enabled": true, "externalId": 0, "categories": [ "regular-taxi", "turbo-taxi", "pop99" ], "id": 125 } ]
Observação O campo companyId está depreciado. Deve-se usar os campos company.id e company.name.
-
URL
/employee/{id}
-
Method
GET
-
Parâmetros via url
Atributo Tipo do dado Descrição Obrigatório Valor padrão Exemplo id numérico Identificador do colaborador sim - 125 -
Retorno
Status Code: 200
{ "name": "José Santos", "phone": { "number": "11999999999", "country": "BRA" }, "email": "jose.santos@empresa.com.br", "company": { "id": "47a3083b-5d03-4e05-ad9d-9fd6fddd613e", "name": "99" }, "nationalId": "98765432100", "supervisorId": 167, "pin": "053", "enabled": true, "externalId": 0, "categories": [ "regular-taxi", "turbo-taxi", "pop99" ], "id": 125 }
-
URL
/employee/{id}/categories
-
Method
GET
-
Parâmetros via url
Atributo | Tipo do dado | Descrição | Obrigatório | Valor padrão | Exemplo |
---|---|---|---|---|---|
id | numérico | Identificador do colaborador | sim | - | 10 |
fromLat | alfanumérico | Latitude do ponto de origem | sim | - | -23.5986665 |
fromLng | alfanumérico | Longitude do ponto de origem | sim | - | -46.6907445 |
toLat | alfanumérico | Latitude do ponto de destino | sim | - | -23,6822 |
toLng | alfanumérico | Longitude do ponsto de destino | sim | - | -46,6896 |
-
Retorno
Status Code: 200
Estrutura de retorno
Atributo Descrição category.id Identificador da categoria. Valores possíveis: regular-taxi, turbo-taxi, top99, pop99 category.name Nome da categoria disponível category.description Descrição da categoria disponível category.eta Tempo de estimativa de chegada do motorista estimate.lowerFare Menor valor possível para o trajeto estimado estimate.upperFare Maior valor possível para o trajeto estimado estimate.currencyCode Código da moeda usada para retornar o valor da corrida estimate.fareText Texto com valor precificado estimate.fareTextComplement Complemento do texto com valor precificado optional.id Identificador de opcional disponível para a corrida optional.title Nome do opcional disponível optional.description Descrição do opcional disponível Exemplo de retorno
[ { "category": { "id": "turbo-taxi", "name": "99TAXI", "description": "Agora: 30% OFF", "eta": 2 }, "estimate": { "lowerFare": 23, "upperFare": 32, "currencyCode": "R$", "fareText": "R$23", "fareTextComplement": "ou mais" }, "optionals": [ { "id": "accessible-taxi", "title": "Veículo adaptado para cadeirante", "description": "Veículo acessível" }, { "id": "big-trunk", "title": "Porta-malas grande", "description": "Porta-malas grande" }, { "id": "accept-animals", "title": "Permite animais", "description": "Permite animais" }, { "id": "air-conditioner", "title": "Ar-condicionado", "description": "Ar-condicionado" } ] }, { "category": { "id": "regular-taxi", "name": "Táxi Comum", "description": "Tarifa cheia", "eta": 4 }, "estimate": { "lowerFare": 34, "upperFare": 45, "currencyCode": "R$", "fareText": "R$34", "fareTextComplement": "ou mais" }, "optionals": [ { "id": "accessible-taxi", "title": "Veículo adaptado para cadeirante", "description": "Veículo acessível" }, { "id": "big-trunk", "title": "Porta-malas grande", "description": "Porta-malas grande" }, { "id": "accept-animals", "title": "Permite animais", "description": "Permite animais" }, { "id": "air-conditioner", "title": "Ar-condicionado", "description": "Ar-condicionado" } ] } ]
-
URL
/employee
-
Method
POST
-
Parâmetros via body
Atributo Tipo do dado Descrição Obrigatório Valor padrão Exemplo employee.name alfanumérico Nome do colaborador sim - José Santos employee.phone.number alfanumérico Número do telefone do colaborador (somente números) sim - 11999999999 employee.phone.country alfanumérico Código do país atrelado ao número não BRA BRA employee.email alfanumérico E-mail do colaborador sim - jose.santos@empresa.com.br employee.nationalId alfanumérico Documento do colaborador (CPF) (Somente números) não* - 98765432100 employee.pin alfanumérico Código de confirmação de corrida (deve conter 3 dígitos) não* - 934 employee.externalId numérico Identificador externo do colaborador. É possível relacionar o identificador de um sistema externo. não - 456 employee.supervisorId numérico Id do supervisor (employeeId)do colaborador. não - 256 employee.categories conjunto de alfanuméricos Categorias permitidas para uso do colaborador. Valores aceitos: regular-taxi, turbo-taxi, top99, pop99 sim - regular-taxi, turbo-taxi sendWelcomeEmail verdadeiro/falso Se verdadeiro, colaborador cadastrado receberá um e-mail de boas vindas não false false -
Regras
Ao cadastrar um colaborador é necessário informar o nationalId ou o pin. Ambos os atributos podem ser cadastrados, mas ao menos um deles é obrigatório.
Quando o colaborador realizar uma corrida da categoria "regular-taxi", ao término da mesma será necessário entrar com um código de confirmação do pagamento. Esse código será os 3 primeiros dígitos do CPF ou o código pin cadastrado (também de 3 dígitos).
-
Exemplo de envio
{ "employee": { "name": "José Santos", "phone": { "number": "11999999999", "country": "BRA" }, "email": "jose.santos@empresa.com.br", "nationalId": "98765432100", "pin": "053", "externalId": 55091, "categories": [ "regular-taxi", "turbo-taxi", "pop99" ], "id": 125 }, "sendWelcomeEmail": false }
-
Retorno
Status Code: 201
{ "name": "José Santos", "phone": { "number": "11999999999", "country": "BRA" }, "company": { "id": "47a3083b-5d03-4e05-ad9d-9fd6fddd613e", "name": "99" }, "email": "jose.santos@empresa.com.br", "nationalId": "98765432100", "supervisorId": 256, "pin": "053", "externalId": 55091, "categories": [ "regular-taxi", "turbo-taxi", "pop99" ], "id": 125 }
-
URL
/employee/{id}
-
Method
PUT
-
Parâmetros via url
Atributo Tipo do dado Descrição Obrigatório Valor padrão Exemplo id numérico Identificador do colaborador sim - 125 -
Parâmetros via body
Atributo Tipo do dado Descrição Obrigatório Valor padrão Exemplo employee.name alfanumérico Nome do colaborador sim - José Santos employee.phone.number alfanumérico Número do telefone do colaborador (somente números) sim - 11999999999 employee.phone.country alfanumérico Código do país atrelado ao número não BRA BRA employee.email alfanumérico E-mail do colaborador sim - jose.santos@empresa.com.br employee.nationalId alfanumérico Documento do colaborador (CPF) (Somente números) não - 98765432100 employee.pin alfanumérico Código de confirmação de corrida (deve conter 3 dígitos) não - 934 employee.externalId numérico Identificador externo do colaborador. É possível relacionar o identificador de um sistema externo. não - 456 employee.supervisorId numérico Id do supervisor (employeeId) do colaborador. não - 256 employee.categories conjunto de alfanuméricos Categorias permitidas para uso do colaborador. Valores aceitos: regular-taxi, turbo-taxi, top99, pop99 sim - regular-taxi, turbo-taxi sendWelcomeEmail verdadeiro/falso Se verdadeiro, colaborador cadastrado receberá um e-mail de boas vindas não false false -
Exemplo de envio
{ "employee": { "name": "José Santos", "phone": { "number": "11999999999", "country": "BRA" }, "email": "jose.santos@empresa.com.br", "nationalId": "98765432100", "supervisorId": 256, "pin": "123", "externalId": 55666, "categories": [ "pop99" ], "id": 125 }, "sendWelcomeEmail": false }
-
Retorno
Status Code: 200
{ "name": "José Santos", "phone": { "number": "11999999999", "country": "BRA" }, "company": { "id": "47a3083b-5d03-4e05-ad9d-9fd6fddd613e", "name": "99" }, "email": "jose.santos@empresa.com.br", "nationalId": "98765432100", "supervisorId": 256, "pin": "123", "externalId": 55666, "categories": [ "pop99" ], "id": 125 }
-
URL
/employee/{id}
-
Method
DELETE
-
Parâmetros via body
Atributo Tipo do dado Descrição Obrigatório Valor padrão Exemplo id numérico Identificador do colaborador sim - 20 -
Retorno
Status Code: 204
-
URL
/employee/{id}/supervisor
-
Method
DELETE
-
Parâmetros via url
Atributo Tipo do dado Descrição Obrigatório Valor padrão Exemplo id numérico Identificador do colaborador sim - 20 -
Retorno
Status Code: 204
-
URL
/costcenter
-
Method
GET
-
Parâmetros via query
Atributo Tipo do dado Descrição Obrigatório Valor padrão Exemplo search alfanumérico Busca pelo nome do centro de custo não - financeiro offset numérico Índice da página no sistema de paginação não 1 0 limit numérico Quantidade de registros por página não 50 20 -
Retorno
Status Code: 200
[ { "id": 1, "name": "financeiro", "enabled": true, "company": { "id": "47a3083b-5d03-4e05-ad9d-9fd6fddd613e", "name": "99" } }, { "id": 2, "name": "recursos humanos", "enabled": true, "company": { "id": "47a3083b-5d03-4e05-ad9d-9fd6fddd613e", "name": "99" } } ]
-
URL
/costcenter/{id}
-
Method
GET
-
Parâmetros via url
Atributo Tipo do dado Descrição Obrigatório Valor padrão Exemplo id numérico Identificador do centro de custo sim - 20 -
Retorno
Status Code: 200
{ "id": 20, "name": "financeiro", "enabled": true, "company": { "key": "47a3083b-5d03-4e05-ad9d-9fd6fddd613e", "name": "99" } }
-
URL
/employee/{id}/costcenter
-
Method
GET
-
Parâmetros via query
Atributo Tipo do dado Descrição Obrigatório Valor padrão Exemplo id numérico Identificador do colaborador sim - 125 -
Retorno
Status Code: 200
[ { "id": 1, "name": "financeiro", "enabled": true, "company": { "id": "47a3083b-5d03-4e05-ad9d-9fd6fddd613e", "name": "99" } }, { "id": 2, "name": "recursos humanos", "enabled": true, "company": { "id": "47a3083b-5d03-4e05-ad9d-9fd6fddd613e", "name": "99" } } ]
-
URL
/employee/{id}/costcenter
-
Method
PATCH
-
Parâmetros via url
Atributo Tipo do dado Descrição Obrigatório Valor padrão Exemplo id numérico Identificador do colaborador sim - 10 -
Parâmetros via body
Atributo Tipo do dado Descrição Obrigatório Valor padrão Exemplo costCenterIDs conjunto de numéricos Identificadores de centros de custo sim - 100, 200, 300 -
Retorno
Status Code: 200
{ "costCenterIDs": [ 100, 200, 300 ] }
-
URL
/employee/{employeeID}/costcenter/{costcenterID}
-
Method
DELETE
-
Parâmetros via url
Atributo Tipo do dado Descrição Obrigatório Valor padrão Exemplo employeeID numérico Identificador do colaborador sim - 10 costcenterID numérico Identificador do centro de custo sim - 20 -
Retorno
Status Code: 204
-
URL
/costcenter
-
Method
POST
-
Parâmetros via body
Atributo Tipo do dado Descrição Obrigatório Valor padrão Exemplo name alfanumérico Nome do centro de custo sim - recursos humanos -
Exemplo de envio
{ "name": "recursos humanos" }
-
Retorno
Status Code: 201
{ "id": 44, "name": "recursos humanos", "enabled": true, "company": { "id": "47a3083b-5d03-4e05-ad9d-9fd6fddd613e", "name": "99" } }
-
URL
/costcenter/{id}
-
Method
DELETE
-
Parâmetros via body
Atributo Tipo do dado Descrição Obrigatório Valor padrão Exemplo id numérico Identificador do centro de custo sim - 20 -
Retorno
Status Code: 204
-
URL
/project
-
Method
GET
-
Parâmetros via query
Atributo Tipo do dado Descrição Obrigatório Valor padrão Exemplo search alfanumérico Busca pelo nome do centro de custo não - financeiro page numérico Índice da página no sistema de paginação não 1 0 limit numérico Quantidade de registros por página não 50 20 -
Retorno
Status Code: 200
[ { "id": 1, "name": "evento brasil 2017", "company": { "id": "47a3083b-5d03-4e05-ad9d-9fd6fddd613e", "name": "99" } }, { "id": 2, "name": "project financeiro", "company": { "id": "47a3083b-5d03-4e05-ad9d-9fd6fddd613e", "name": "99" } } ]
-
URL
/project/{id}
-
Method
GET
-
Parâmetros via url
Atributo Tipo do dado Descrição Obrigatório Valor padrão Exemplo id numérico Identificador do project sim - 1 -
Retorno
Status Code: 200
{ "id": 1, "name": "evento brasil 2017", "company": { "id": "47a3083b-5d03-4e05-ad9d-9fd6fddd613e", "name": "99" } }
-
URL
/project
-
Method
POST
-
Parâmetros via body
Atributo Tipo do dado Descrição Obrigatório Valor padrão Exemplo name alfanumérico Nome do projecto sim - expo 2015 -
Exemplo de envio
{ "name": "recursos humanos" }
-
Retorno
Status Code: 201
{ "id": 5, "name": "expo 2015", "company": { "id": "47a3083b-5d03-4e05-ad9d-9fd6fddd613e", "name": "99" } }
-
URL
/project/{id}
-
Method
PUT
-
Parâmetros via url
Atributo Tipo do dado Descrição Obrigatório Valor padrão Exemplo id numérico Identificador do project sim - 1 -
Parâmetros via body
Atributo Tipo do dado Descrição Obrigatório Valor padrão Exemplo name alfanumérico Nome do projeto sim - expo 2017 -
Exemplo de envio
{ "name": "expo 2017" }
-
Retorno
Status Code: 201
{ "id": 5, "name": "expo 2017", "company": { "id": "47a3083b-5d03-4e05-ad9d-9fd6fddd613e", "name": "99" } }
-
URL
/project/{id}
-
Method
DELETE
-
Parâmetros via body
Atributo Tipo do dado Descrição Obrigatório Valor padrão Exemplo id numérico Identificador do projeto sim - 20 -
Retorno
Status Code: 204
-
URL
/ride
-
Method
GET
-
Retorno
Status Code: 200
Estrutura de retorno
Atributo Descrição employeeID Identificador do colaborador atrelado a corrida from.latitude Latitude do endereço de origem from.longitude Longitude do endereço de origem from.street Endereço de origem number Numeração do endereço de origem reference Referência para o endereço de origem phoneNumber Telefone do colaborador atrelado a corrida costCenterID Identificador do centro de custo projectID Identificador do projeto to.latitude Latitude do endereço de destino to.longitude Longitude do endereço de destino to.street Endereço de destino to.number Número do endereço de destino to.reference Referência para o endereço de destino status Estado da corrida. Os valores possíveis estão listados na tabela abaixo. running.rideID Identificador da corrida em andamento running.jobID Identificador da corrida finalizada running.driver.driverId Identificador do motorista running.driver.fullName Nome completo do motorista running.driver.phoneNumber Telefone do motorista running.driver.carModel Modelo do carro usado pelo motorista running.driver.carPlate Placa do veículo usado na corrida running.driver.img Endereço com foto do motorista running.position.latitude Latitude do endereço onde o motorista está localizado running.position.longitude Longitude do endereço onde o motorista está localizado running.route.time Tempo restante para chegada do motorista para início da corrida (em segundos) running.route.distance Distância já percorrida na corrida (em metros) running.smsStartedSent Notifica se o SMS com os dados do motorista foi enviado ao passageiro running.smsDriverCanceledSent Notifica se o SMS informando o cancelamento da corrida pelo motorista foi enviado receiver.name Nome do destinatário da corrida do tipo Entrega99 receiver.phone Telefone do destinatário da corrida do tipo Entrega99 Retornos possíveis para o estado da corrida
Código Descrição WAITING_DRIVERS_ANSWERS Aguardando resposta dos motoristas COULDNT_FIND_AVAILABLE_DRIVERS Nenhum motorista disponível DRIVERS_REJECTED Nenhum motorista aceitou a corrida CAR_ON_THE_WAY Motorista está a caminho do endereço solicitado WAITING_FOR_PASSENGER Motorista chegou e está aguardando passageiro CAR_ARRIVED A corrida está em andamento CANCELED_BY_DRIVER Corrida cancelada pelo motorista CANCELED_BY_PASSENGER Corrida cancelada pelo passageiro RIDE_ENDED Corrida finalizada Exemplo de retorno
[{ "employeeID": 884373, "from": { "latitude": -23.564758, "longitude": -46.651850, "street": "Av Paulista, 1000, São Paulo - SP, Brasil", "number": "0", "reference": "" }, "phoneNumber": "11999999999", "costCenterID": 43431, "categoryID": "delivery99", "to": { "latitude": -23.590760, "longitude": -46.682129, "street": "Av. Faria Lima, 3000, São Paulo - SP, Brasil", "number": "0", "reference": "" }, "projectID": 394932, "status": "CAR_ARRIVED", "running": { "rideID": "12219921932", "jobID": "12219921932", "driver": { "driverId": 6988, "fullName": "Claudo Moreira Cruz", "phoneNumber": "11999999999", "carModel": "Toyota Etios Sedan", "carPlate": "EAN-0165", "img": "https://s3.amazonaws.com/99taxis-drivers/xxx.jpg", "position": { "latitude": -23.582894, "longitude": -46.683991 } }, "route": { "time": 0, "distance": 507 }, "smsStartedSent": true, "smsDriverCanceledSent": false }, "receiver": { "name": "João da Silva", "phone": "+5511999998888" } }]
-
URL
/ride/{id}
-
Method
GET
-
Parâmetros via url
Atributo Tipo do dado Descrição Obrigatório Valor padrão Exemplo id alfanumérico Identificador da corrida sim - 1 -
Retorno
Status Code: 200
Exemplo de retorno
{ "employeeID": 884373, "from": { "latitude": -23.564758, "longitude": -46.651850, "street": "Av Paulista, 1000, São Paulo - SP, Brasil", "number": "0", "reference": "" }, "phoneNumber": "11999999999", "costCenterID": 43431, "categoryID": "delivery99", "to": { "latitude": -23.590760, "longitude": -46.682129, "street": "Av. Faria Lima, 3000, São Paulo - SP, Brasil", "number": "0", "reference": "" }, "projectID": 394932, "status": "CAR_ARRIVED", "running": { "rideID": "12219921932", "jobID": "12219921932", "driver": { "driverId": 6988, "fullName": "Claudo Moreira Cruz", "phoneNumber": "11999999999", "carModel": "Toyota Etios Sedan", "carPlate": "EAN-0165", "img": "https://s3.amazonaws.com/99taxis-drivers/xxx.jpg", "position": { "latitude": -23.582894, "longitude": -46.683991 } }, "route": { "time": 0, "distance": 507 }, "smsStartedSent": true, "smsDriverCanceledSent": false }, "receiver": { "name": "João da Silva", "phone": "+5511999998888" } }
-
URL
/ride
-
Method
POST
-
Parâmetros via body
Atributo Tipo do dado Descrição Obrigatório Valor padrão Exemplo employeeID numérico Identificador do colaborador sim - 884373 from.latitude alfanumérico Latitude do endereço de origem sim - -23.564758 from.longitude alfanumérico Longitude do endereço de origem sim - -46.651850 from.street alfanumérico Endereço de origem sim - Av Paulista, 1000, São Paulo - SP, Brasil from.reference alfanumérico Ponto de referência para endereço de origem não - Próximo a estação de metrô to.latitude alfanumérico Latitude do endereço de destino sim - -23.564758 to.longitude alfanumérico Longitude do endereço de destino sim - -46.651850 to.street alfanumérico Endereço de destino sim - Av Paulista, 1000, São Paulo - SP, Brasil to.reference alfanumérico Ponto de referência para destino de origem não - Próximo a estação de metrô phoneNumber alfanumérico Número de telefone do colaborador a ser exibido para o motorista sim - 11999999999 costCenterID numérico Identificador do centro de custo sim - 43431 categoryID alfanumérico Categoria a ser usada na corrida. Valores aceitos: regular-taxi, turbo-taxi, top99, pop99, comfort99, poupa99, delivery99 sim - pop99 notes alfanumérico Justificativa da corrida não - reunião com cliente projectID numérico Identificador do projeto não - 394932 optionals conjunto de alfanuméricos Opcionais da corrida. Valores aceitos: accessible-taxi não - - receiver.name conjunto de alfanuméricos Nome do destinatário da corrida do tipo Entrega99 apenas quando a corrida for da categoria delivery99 - "João da Silva" receiver.phone conjunto de alfanuméricos Número de telefone do destinatário da corrida do tipo Entrega99 apenas quando a corrida for da categoria delivery99 - "11999999999" -
Exemplo de envio
{ "employeeID": 884373, "from": { "latitude": -23.564758, "longitude": -46.651850, "street": "Av Paulista, 1000, São Paulo - SP, Brasil", "number": "1000", "reference": "" }, "phoneNumber": "11999999999", "costCenterID": 43431, "categoryID": "pop99", "to": { "latitude": -23.590760, "longitude": -46.682129, "street": "Av. Faria Lima, 3000, São Paulo - SP, Brasil", "number": "0", "reference": "" }, "notes": "", "projectID": 394932, "optionals": [ "air-conditioner", "female-driver" ] }
-
Retorno
Status Code: 200
{ "rideID": "12219921932", "smsStartedSent": false, "smsDriverCanceledSent": false }
-
URL
/ride/{id}
-
Method
DELETE
-
Parâmetros via body
Atributo Tipo do dado Descrição Obrigatório Valor padrão Exemplo id alfanumérico Identificador da corrida sim - 20 -
Retorno
Status Code: 204
-
URL
/job
-
Method
GET
-
Parâmetros via query
Atributo Tipo do dado Descrição Obrigatório Valor padrão Exemplo startDate data Indica data de início para filtro de busca por corridas finalizadas sim - 2017-06-01 endDate data Indica data de término para filtro de busca por corridas finalizadas sim - 2017-06-02 costCenterID numérico Indicador do centro de custo não - 20 projectID numérico Indicador do projeto não - 15 taxiCategory alfanumérico Categoria da corrida. Valores possíveis: regular-taxi, turbo-taxi, top99 ou pop99 não - pop99 offset numérico Índice da página no sistema de paginação não 1 0 limit numérico Quantidade de registros por página não 20 10 page numérico Depreciado não - - -
Retorno
Status Code: 200
Estrutura de retorno
Atributo Descrição ride.apiTaxiJobId Identificador da corrida ride.receiptId Identificador do recibo ride.company.id Identificador da empresa ride.company.name Nome da empresa ride.employee.id Identificador do colaborador ride.employee.name Nome do colaborador ride.employee.phone Telefone do colaborador ride.employee.phoneCountry País do telefone do colaborador ride.employee.email Email do colaborador ride.employee.nationalId Documento do colaborador (somente números) ride.employee.externalId Identificador externo do colaborador. É possível relacionar o identificador de um sistema externo. ride.costCenter.id Identificador do centro de custo ride.costCenter.name Nome do centro de custo ride.project.id Identificador do projeto ride.project.name Nome do projeto ride.fare Valor total da corrida ride.note Justificativa ride.odometer Distância total da corrida em metros ride.duration Duração da corrida em minutos ride.start.latitude Latitude do ponto de origem ride.start.longitude Longitude do ponto de origem ride.start.date Data de início da corrida ride.start.address Endereço de origem ride.end.latitude Latitude do ponto de destino ride.end.longitude Longitude do ponto de destino ride.end.date Data de término da corrida ride.end.address Endereço de destino ride.driver.name Nome do motorista ride.driver.phone Telefone do motorista ride.driver.car Veículo do motorista ride.driver.carYear Ano do veículo ride.driver.carPlate Placa do veículo ride.city Cidade ride.callPlatform Depreciado ride.requesterName Nome da pessoa que solicitou a corrida ride.taxiCategoryName Categoria da corrida summary.quantity Quantidade de corridas summary.totalFare Valor total das corridas retornadas Retornos possíveis para o estado da corrida
Código Descrição RIDE_ENDED Corrida finalizada Exemplo de retorno
{ "rides": [{ "apiTaxiJobId": "12219921932", "receiptId": "8382932932", "company": { "id": 9311, "name": "99 Tecnologia" }, "employee": { "id": 434343, "name": "COLABORADOR", "phone": "11999999999", "phoneCountry": "BRA", "email": "colaborador@99taxis.com", "nationalId": "63313137709", "externalId": 329932 }, "costCenter": { "id": 8483843, "name": "99Integracao" }, "project": { "id": 433902, "name": "99Projeto" }, "fare": 25.4, "note": "justificativa", "odometer": 7593, "start": { "latitude": -23.590760, "longitude": -46.682129, "date": 1502921626000, "address": "Av. Faria Lima, 3000, São Paulo - SP, Brasil" }, "end": { "latitude": -23.564758, "longitude": -46.651850, "date": 1502922838000, "address": "Av Paulista, 1000, São Paulo - SP, Brasil" }, "driver": { "name": "Motorista", "phone": "11999999999", "car": "Fiat Siena", "carYear": 2015, "carPlate": "EJF-3931" }, "city": "São Paulo", "callPlatform": "web", "requesterName": "COLABORADOR", "taxiCategoryName": "Taxi 30% OFF" }], "summary": { "quantity": 1, "totalFare": 25.4 } }
-
URL
/job/{id}
-
Method
GET
-
Parâmetros via url
Atributo Tipo do dado Descrição Obrigatório Valor padrão Exemplo id alfanumérico Identificador da corrida sim - 1 -
Regras
Após o término da corrida, existe o tempo de sincronização e geração do recibo. Devido a isso, pode demorar até 10 minutos para que o recibo da corrida esteja disponível. O identificador da corrida é o mesmo usado para obter os dados do recibo.
Enquanto o recibo não estiver disponível, o endpoint irá retornar o status code 204.
-
Retorno
Status Code: 200
Descrição: Recibo gerado e disponível.
Exemplo de retorno
{ "apiTaxiJobId": "12219921932", "receiptId": "8382932932", "company": { "id": 9311, "name": "99 Tecnologia" }, "employee": { "id": 434343, "name": "COLABORADOR", "phone": "11999999999", "phoneCountry": "BRA", "email": "colaborador@99taxis.com", "nationalId": "63313137709", "externalId": 329932 }, "costCenter": { "id": 8483843, "name": "99Integracao" }, "project": { "id": 433902, "name": "99Projeto" }, "fare": 25.4, "note": "justificativa", "odometer": 7593, "start": { "latitude": -23.590760, "longitude": -46.682129, "date": 1502921626000, "address": "Av. Faria Lima, 3000, São Paulo - SP, Brasil" }, "end": { "latitude": -23.564758, "longitude": -46.651850, "date": 1502922838000, "address": "Av Paulista, 1000, São Paulo - SP, Brasil" }, "driver": { "name": "Motorista", "phone": "11999999999", "car": "Fiat Siena", "carYear": 2015, "carPlate": "EJF-3931" }, "city": "São Paulo", "callPlatform": "web", "requesterName": "COLABORADOR", "taxiCategoryName": "Taxi 30% OFF" }
Status Code: 204
Descrição: O recibo não existe ou não está disponível. Em caso de corrida finalizada, deve-se aguardar o tempo de sincronização e geração do recibo.
Webhook permite que seu sistema receba notificações de eventos originados de corridas da 99. Quando um desses eventos ocorrer, iremos enviar um HTTP POST com o payload do evento para a URL configurada no webhook. Webhooks podem ser utilizados para receber o status e a posição do motorista durante uma corrida em andamento. É possível receber eventos de mudança de status de corrida, assim como posição atual do motorista durante uma corrida em andamento.
Toda comunicação deve ser feita com HTTPS e a url de recebimento do evento deve estar configurada na porta 443.
Para garantir a integridade do evento, e que o mesmo está sendo enviado através dos servidores da 99, um header no padrão Basic Authentication será acrescentado em toda requisição. As credenciais podem ser configuradas através do endpoint de Criação de Webhook abaixo. Seu servidor deve validar o header afim de garantir a segurança da informação.
O webhook espera que sua aplicação responda com o http status code de sucesso 2xx (aceita-se 200, 201, 202, 203, 204, 205 ou 206) com um corpo vazio para todo evento gerado, e iremos aguardar até 10 segundos para receber a resposta. Caso qualquer uma dessas regras não sejam atingidas, o evento será re-transmitido para sua aplicação de acordo com um algoritmo de compensação exponencial (exponential back-off) com multiplicador de 15 segundos, até um limite máximo de 10 tentativas. Isso significa que iremos tentar enviar o mesmo evento para o seu servidor durante um período de 2 horas (por exemplo: 15, 30, 60, 120, 240 segundos e assim sucessivamente).
De acordo com as regras acima, um evento pode ser transmitido mais de uma única vez para os seus servidores, portanto você deve decidir em ignorar caso receba eventos repetidos. O atributo event.id
garante a chave única do evento, e você pode utilizá-lo para validar eventuais duplicidades.
Os seguintes status de corrida serão notificados quando ocorrerem. Os status marcados como final significam que não sofrerão alterações futuras.
Status | Descrição | Status final? |
---|---|---|
finding | Buscando motorista | não |
no-drivers-available | Nenhum motorista foi encontrado para sua solicitação | sim |
canceled-by-passenger | Corrida cancelada pelo passageiro | sim |
canceled-by-driver | Corrida cancelada pelo motorista | sim |
on-the-way | Motorista encontrado e a caminho | não |
arrived | Motorista chegou e está aguardando o passageiro | não |
in-progress | Corrida iniciada com passageiro a bordo | não |
finished | Corrida encerrada | sim |
-
URL
/webhooks/
-
Method
GET
-
Retorno
Status Code: 200
Descrição: Configuração do webhook cadastrada
{ "url": "https://app.99taxis.com/v1/webhook", "authentication": { "username": "username", "password": "password123&&" }, "subscriptions": [ "ride-status", "ride-driver-location" ] }
-
URL
/webhooks/
-
Method
PUT
-
Parâmetros via body
Atributo Tipo do dado Descrição Obrigatório Valor padrão Exemplo url alfanumérico URL https de recebimento dos eventos do seu servidor sim não possui https://seudominio.com.br/ninenine/webhooks authentication.username alfanumérico Credencial do usuário de Basic Authentication sim não possui username authentication.password alfanumérico Credencial de senha de Basic Authentication sim não possui password subscriptions conjunto de alfanuméricos Lista com subscrições para recebimento de webhooks. Valores aceitos: ride-status, ride-driver-location sim não possui ["ride-status", "ride-driver-location"] -
Regras
-
A senha informada para o sistema de segurança Basic Authentication deve conter as seguintes premissas:
- Conter ao menos 8 caracteres
- Conter ao menos 1 dígito numérico
- Conter ao menos 1 caracter special
-
Exemplo de envio
{ "url": "https://app.99taxis.com/v1/webhook", "authentication": { "username": "username", "password": "password123&&" }, "subscriptions": [ "ride-status", "ride-driver-location" ] }
-
Retorno
Status Code: 200
Descrição: Configuração de webhook atualizada.
Status Code: 422
Descrição: Ocorreram um ou mais erros de validação. Neste status, a seguinte estrutura json será retornada:
{ "errors": [ { "code": "required-url", "field": "url", "message": "Url must be informed" }, { "code": "invalid-url", "field": "url", "message": "Url is not valid" }, { "code": "required-authentication", "field": "authentication", "message": "Authentication must be informed" } ] }
Segue mapeamento de erros completos que podem ser retornados caso algum dado inválido seja informado ao se definir o webhook.
Code Field Message Descrição required-url url Url must be informed Url não foi informada invalid-url url Url is not valid Url informada não é válida invalid-url url Url must have secure https scheme Url precisa ser segura e usar https required-authenticationl authentication Authentication must be informed Dados de autenticação não foram informados required-username authentication.username Authentication username must be informed Usuário para autenticação não foi informado required-password authentication.password Authentication password must be informed Senha para autenticação não foi informado invalid-password authentication.password Authentication password should contain at least eight digits Senha de autenticação deve conter ao menos 8 caracteres invalid-password authentication.password Authentication password should contain at least one digit Senha de autenticação deve conter ao menos 1 número invalid-password authentication.password Authentication password should contain at least one special character Senha de autenticação deve conter ao menos 1 caracter especial required-subscriptions subscriptions At least one subscription must be informed Subscrição de eventos não foi definida invalid-subscriptions subscriptions Allowed subscriptions: ride-status, ride-driver-location Subscrição de evento selecionada não é válida
-
URL
/webhooks/
-
Method
DELETE
-
Retorno
Status Code: 204
Descrição: Desativado uso do webhook.
O identificador do evento event.id
é único por toda a plataforma, portanto sua aplicação deve ler essa informação e se adequar a duplicidades.
Os eventos enviados através do webhook seguem um padrão, para que sua aplicação entenda facilmente os eventos. Determinados dados não serem exibidos, dependendo do estado atual da corrida. Conforme a corrida mudar de status (iniciar, entrar em andamento ou finalizar), novos dados serão enviados, seguindo a estrutura única de entidade. Abaixo segue o payload da requisição através de um POST HTTP.
Estrutura de retorno
Atributo | Tipo do dado | Descrição |
---|---|---|
event.id | identificador único universal (UUID) | Identificador único do evento |
event.date | numérico | Data e hora do evento em formato unix timestamp |
event.notification | alfanumérico | Tipo da notificação. Valores possíveis: ride-status, ride-driver-location |
data.ride.id | alfanumérico | Identificador da corrida |
data.ride.status | alfanumérico | Estado atual da corrida |
data.ride.category | alfanumérico | Categoria da corrida. Valores possíveis: 99POP, 99TOP, 99TAXI ou REGULAR-TAXI |
data.ride.corporate.employee.id | numérico | Identificador do colaborador |
data.ride.corporate.note | alfanumérico | Justificativa definida pelo colaborador ao solicitar a corrida |
data.ride.origin.latitude | coordenada geográfica | Latitude do endereço de origem |
data.ride.origin.longitude | coordenada geográfica | Longitude do endereço de origem |
data.ride.destination.latitude | coordenada geográfica | Latitude do endereço de destino |
data.ride.destination.longitude | coordenada geográfica | Longitude do endereço de destino |
data.ride.driver.name | alfanumérico | Nome do motorista |
data.ride.driver.phone | alfanumérico | Telefone do motorista |
data.ride.vehicle.model | alfanumérico | Modelo do veículo |
data.ride.vehicle.plate | alfanumérico | Placa do veículo |
location.latitude | coordenada geográfica | Latitude com última localização da corrida |
location.longitude | coordenada geográfica | Longitude com última localização da corrida |
Exemplo de notificação
{
"event": {
"id": "5c99bf07-a852-42ed-9bff-30ff13ed888a",
"date": 1519918755701,
"type": "ride-status"
},
"data": {
"ride": {
"id": "123456789",
"status": "on-the-way",
"category": "99POP",
"corporate": {
"employee": {
"id": 123456
},
"note": "reunião com cliente externo"
},
"origin": {
"latitude": -23.563157,
"longitude": -46.654316
},
"destination": {
"latitude": -23.599713,
"longitude": -46.687777
},
"driver": {
"name": "Claudio Moreira Cruz",
"phone": "11223344559"
},
"vehicle": {
"model": "Volkswagen GOL",
"plate": "ABC-1234"
},
"location": {
"latitude": -23.565678,
"longitude": -46.680754
}
}
}
}
Headers
Todos as notificações serão enviadas com as seguintes chaves no cabeçalho HTTP:
Header | Descrição |
---|---|
X-Environment | Indica se a notificação de evento foi enviada pela API no ambiente de sandbox ou production |
-
Endereço
https://sandbox-api-corp.99app.com/v1
O ambiente de sandbox tem como objetivo prover uma estrutura para realizar os testes de gerenciamento de recursos como colaboradores (employee), centros de custo (cost center) e projetos (project). Adicionalmente, é possível criar corridas e atualizar seu status sem a necessidade de um aplicativo aberto com um motorista disponível. Por fim, o mecanismo de webhook, ou seja, notificações sobre mudança de status da corrida ou localização do motorista, também está disponível neste ambiente de testes, permitindo validar todos os passos da integração com a api da 99.
Todos os dados de corrida neste ambiente são simulados e com isso alguns valores podem não fazer sentido como relação entre distância e duração de uma corrida. Os dados de motorista, veículo, entre outros, sempre serão os mesmos. O objetivo é ter um conteúdo válido e para permitir validar a integração entre sistemas.
As corridas criadas neste ambiente de teste ficarão disponíveis por 72 horas (3 dias no total). Após esse período, os dados serão expirados, sendo necessário criar outra corrida.
- Cenário de testes de corrida
- Criar uma corrida
Para criar uma corrida basta utilizar o mesmo endpoint de criação de corridas disponível no recurso ride
.
curl -X POST https://sandbox-api-corp.99app.com/v1/ride -H "Content-Type: application/json" -H "x-api-key: token" -d '{ "employeeID": 884373, "from": { "latitude": -23.564758, "longitude": -46.651850, "street": "Av Paulista, 1000, São Paulo - SP, Brasil", "number": "1000", "reference": "" }, "phoneNumber": "11999999999", "costCenterID": 43431, "categoryID": "pop99", "to": { "latitude": -23.590760, "longitude": -46.682129, "street": "Av. Faria Lima, 3000, São Paulo - SP, Brasil", "number": "0", "reference": "" }, "notes": "", "projectID": 394932, "optionals": [ "air-conditioner", "female-driver" ] }'
- Acompanhar status de uma corrida
Após criar a corrida, para obter os dados da mesma, basta utilizar o mesmo endpoint de acompanhamento de corridas disponível no recurso ride
.
curl -X GET https://sandbox-api-corp.99app.com/v1/ride/1234567890 -H "x-api-key: token"
- Atualizar o status de uma corrida
É possível atualizar o status da corrida, permitindo simular diversos cenários como cancelamento por parte do passageiro ou motorista, não localização de motoristas, corridas em andamento ou finalizadas. Para isso, é necessário realizar uma requisição com o método HTTP PATCH
, fornecendo o identificador da corrida na url e o status desejado no corpo da mensagem.
Estrutura do endpoint:
-
URL
/ride/{id}
-
Method
PATCH
-
Parâmetros via body
Atributo Tipo do dado Descrição Obrigatório Valor padrão Exemplo status alfanumérico Status da corrida sim -
Valores de status válidos
Status | Descrição |
---|---|
WAITING_DRIVERS_ANSWERS | Aguardando resposta dos motoristas |
COULDNT_FIND_AVAILABLE_DRIVERS | Nenhum motorista disponível |
DRIVERS_REJECTED | Nenhum motorista aceitou a corrida |
CAR_ON_THE_WAY | Motorista está a caminho do endereço solicitado |
CAR_ARRIVED | Motorista chegou e a corrida está em andamento |
CANCELED_BY_DRIVER | Corrida cancelada pelo motorista |
CANCELED_BY_PASSENGER | Corrida cancelada pelo passageiro |
RIDE_ENDED | Corrida finalizada |
-
Retorno
Status Code: 204
Descrição: Corrida teve seu status atualizado com sucesso.
Status Code: 400
Descrição: Estrutura de envio de requisição inválida.
Status Code: 404
Descrição: Corrida não localizada ou inválida.
Status Code: 500
Descrição: Algum erro inesperado ocorreu.
-
Exemplo de requisição
curl --request PATCH https://sandbox-api-corp.99app.com/v1/ride/1234567890 -H "Content-Type: application/json" -H "x-api-key: token" -d '{"status": "RIDE_ENDED"}'
- Receber notificações
Para receber notificações de mudança de status de corrida ou posição do motorista quando uma corrida estiver em andamento, é preciso definir as configurações de webhook através do recurso webhooks
. Feito isso, sempre que o status da corrida for alterado usando o procedimento anterior (ou seja, uma requisição HTTP PATCH para o recurso ride
), uma notificação será enviada para o endereço cadastrado com o status atual da corrida.
Caso não receba as notificações de webhook, verifique as configurações cadastradas de webhook como URL e meio de autenticação (nome usuário e senha).
É possível associar múltiplas empresas a um mesmo token de acesso. Esta funcionalidade permite gerenciar múltiplas empresas que podem ser filiais ou parceiras usando um único meio de autenticação. Para ativar esta funcionalidade, é preciso entrar em contato com nossa equipe através do e-mail help-corp-api@99taxis.com
-
URL
/companies/
-
Method
GET
-
Retorno
Status Code: 200
Descrição: Lista de empresas associadas ao token de acesso
[ { "id": "6d74008f-d2d5-4f79-95f5-4e049bdbac99", "name": "99 matriz" }, { "id": "5169224d-30c5-4bdf-ba2c-019aa51c3829", "name": "99 filial" } ]
-
Exemplo de chamada
Considera-se 123 como a chave de autenticação da empresa (token único de acesso)
curl -X GET "/v1/companies" -H "x-api-key: 123"
O endpoint de listagem de empresas deve ser usado para obter o identificador de cada empresa. Este identificador será usado para escolher qual empresa de destino por operação, tendo como exemplo de uso o cadastro de colaborador/centro de custo/projeto, solicitação de corridas ou extração de relatórios de recibos.
É preciso fornecer o identificador da empresa como parâmetro de uma chave no cabeçalho HTTP com o nome x-company-id. Exemplo:
"x-company-id: 6d74008f-d2d5-4f79-95f5-4e049bdbac99"
Exemplos de uso considerando a chave de acesso 123 e o ambiente de sandbox:
- Listar centros de custo da empresa 99 Matriz
curl -X GET https://sandbox-api-corp.99app.com/v1/costcenter/ 'x-api-key: 123' -H 'x-company-id: 6d74008f-d2d5-4f79-95f5-4e049bdbac99'
- Listar centros de custo da empresa 99 Filial
curl -X GET https://sandbox-api-corp.99app.com/v1/costcenter/ 'x-api-key: 123' -H 'x-company-id: 5169224d-30c5-4bdf-ba2c-019aa51c3829'
Se o identificador (chave x-company-id) não for fornecido, será considerado a empresa primária associada ao token de acesso (na listagem de empresas associadas, será considerado o primeiro registro).
A estimativa de corridas está atrelada ao recurso de colaboradores (
employee
). Veja mais detalhes na seção Categorias por colaborador e estimativa de valor por corrida.
Este erro acontece quando há algum bloqueio ou restrição do colaborador para realizar esta corrida. Certifique-se que a corrida foi estimada através do endpoint
/employee/{id}/categories
, pois é obrigatório a estimativa antes de se fazer a corrida.
Sim, devido a condições de trânsito, tempo e rotas alternativas, o valor final da corrida pode ser diferente do valor estimado via API.
Através do endpoint /job, faça a busca com um range de datas do mês atual. O objeto summary irá trazer a quantidade de corridas realizadas e a soma de todas as corridas.
Sim, um e-mail de recibo de corrida é enviado para o colaborador, contendo as informações de rota, valores e os dados da empresa que fez a corrida. Alguns SMSs são enviados no decorrer da corrida, como por exemplo quando o motorista aceita a corrida. O telefone que será utilizado para enviar o SMS é do campo phoneNumber no endpoint /ride. Este telefone pode ser diferente do telefone cadastrado para o colaborador (/employee).
Apesar da diferença de nomenclatura entre os atributos, o identificador representado em ambos os campos é o mesmo. Supondo uma ride que foi criada com rideID igual a "123", o jobID também terá seu valor como "123".
Uma corrida pode ser cancelada a qualquer momento desde que o passageiro não tenha embarcado no carro, representado pelo status CAR_ARRIVED.
Ambos identificam que a corrida foi cancelada. Uma corrida pode ser cancelada tanto pelo motorista (CANCELED_BY_DRIVER), como pelo passageiro (CANCELED_BY_PASSENGER). Esses status são finais, portanto, caso o cliente ainda queira fazer a corrida, deve ser solicitada uma nova através do endpoint /ride
Caso tenha mais dúvidas ou esteja com problemas na integração, mande um e-mail para help-corp-api@99taxis.com