> ## Documentation Index
> Fetch the complete documentation index at: https://docs.machine.global/llms.txt
> Use this file to discover all available pages before exploring further.

# Validar login único

> Troca o token do login único pelos dados do passageiro ou do condutor que abriu o site da central pelo app.

Com o login único ligado, o app abre o link da central com o parâmetro `Mch-Token` na URL. O servidor da central lê esse parâmetro e chama este endpoint com ele. O token vale por 60 segundos e uma vez só: a primeira validação apaga o token, e as seguintes recebem o erro `245`.

O token pertence à central: a Api-Key dela e a de qualquer associada validam os tokens das pessoas da central e das associadas. O campo `bandeira_id` da resposta diz a central ou a associada da pessoa.

Chame este endpoint só do servidor da central. A Api-Key e a senha do usuário da API não podem ir para o navegador.

Para acessar este endpoint, o usuário autenticado deve ser um gestor da central, sem empresa vinculada, com a permissão Login único, da seção API do cargo, e a central deve ter a licença de integração via API ativa.



## OpenAPI

````yaml pages/v2/openapi-entregas.json POST /login-unico/validar
openapi: 3.1.0
info:
  title: API de Integração
  description: API de Integração v2 - Entregas
  license:
    name: MIT
  version: 2.0.0
servers:
  - url: https://api.taximachine.com.br/api/v2/integracao
  - url: https://api-vendas.taximachine.com.br/api/v2/integracao
security:
  - basicAuth: []
    ApiKeyAuth: []
paths:
  /login-unico/validar:
    post:
      summary: Validar login único
      description: >-
        Troca o token do login único pelos dados do passageiro ou do condutor
        que abriu o site da central pelo app.


        Com o login único ligado, o app abre o link da central com o parâmetro
        `Mch-Token` na URL. O servidor da central lê esse parâmetro e chama este
        endpoint com ele. O token vale por 60 segundos e uma vez só: a primeira
        validação apaga o token, e as seguintes recebem o erro `245`.


        O token pertence à central: a Api-Key dela e a de qualquer associada
        validam os tokens das pessoas da central e das associadas. O campo
        `bandeira_id` da resposta diz a central ou a associada da pessoa.


        Chame este endpoint só do servidor da central. A Api-Key e a senha do
        usuário da API não podem ir para o navegador.


        Para acessar este endpoint, o usuário autenticado deve ser um gestor da
        central, sem empresa vinculada, com a permissão Login único, da seção
        API do cargo, e a central deve ter a licença de integração via API
        ativa.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - token
              properties:
                token:
                  type: string
                  pattern: ^[0-9a-f]{64}$
                  description: >-
                    Valor do parâmetro `Mch-Token` da URL, sem alteração: 64
                    caracteres hexadecimais minúsculos.
                  example: >-
                    9f2c4be17a0d58e3c6b2f914a7d03e5b81c6f2a94d7e0b35c8a1f6e2d4b79a03
            example:
              token: 9f2c4be17a0d58e3c6b2f914a7d03e5b81c6f2a94d7e0b35c8a1f6e2d4b79a03
      responses:
        '200':
          description: Sucesso
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
                  data:
                    type: object
                    required:
                      - tipo
                      - id
                      - bandeira_id
                    properties:
                      tipo:
                        type: string
                        enum:
                          - passageiro
                          - condutor
                        description: >-
                          Quem abriu o site. Passageiro e condutor podem ter o
                          mesmo `id`, então identifique a pessoa pelo par `tipo`
                          e `id`.
                      id:
                        type: integer
                        description: ID do passageiro ou do condutor.
                      bandeira_id:
                        type: integer
                        description: ID da central ou da associada da pessoa.
                      telefone:
                        type: string
                        description: >-
                          Telefone do cadastro, como foi gravado. Fica fora da
                          resposta quando o cadastro não tem telefone.
                      email:
                        type: string
                        description: >-
                          E-mail do cadastro. Fica fora da resposta quando o
                          cadastro não tem e-mail.
              example:
                success: true
                data:
                  tipo: passageiro
                  id: 88231
                  bandeira_id: 1057
                  telefone: '21998765432'
                  email: ana.souza@exemplo.com
        '400':
          description: >-
            Token inválido, vencido ou já usado, `api-key` ausente ou corpo que
            não é JSON
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RespostaErro'
              examples:
                token_invalido:
                  summary: >-
                    Token ausente, fora do formato, inexistente, vencido, já
                    usado ou de outra central
                  value:
                    success: false
                    errors:
                      - code: 245
                        message: Token do login único inválido, vencido ou já usado.
                chave_nao_informada:
                  $ref: '#/components/examples/ChaveNaoInformada'
                json_invalido:
                  $ref: '#/components/examples/JsonInvalido'
        '401':
          description: >-
            Usuário ou senha do Basic Auth inválidos. Uma `api-key` não
            reconhecida normalmente recebe `403`; o `401` com `B4` aparece só em
            situações excepcionais.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RespostaErro'
              examples:
                gestor_nao_autenticado:
                  $ref: '#/components/examples/GestorNaoAutenticado'
                api_key_invalida:
                  $ref: '#/components/examples/ApiKeyInvalida'
        '403':
          description: >-
            Gestor sem acesso, central sem licença de integração ou `api-key`
            não reconhecida. A `api-key` não reconhecida recebe o corpo em texto
            puro (`-`), sem o envelope JSON.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RespostaErro'
              examples:
                sem_permissao:
                  summary: >-
                    Gestor vinculado a uma empresa ou sem a permissão Login
                    único
                  value:
                    success: false
                    errors:
                      - code: 63
                        message: Você não tem permissão para realizar essa operação.
                licenca_invalida:
                  $ref: '#/components/examples/LicencaInvalida'
            text/plain:
              schema:
                type: string
              examples:
                api_key_nao_reconhecida:
                  $ref: '#/components/examples/ApiKeyNaoReconhecida'
        '429':
          $ref: '#/components/responses/ErroLimite429'
        '500':
          $ref: '#/components/responses/ErroInterno500'
components:
  schemas:
    RespostaErro:
      type: object
      description: Corpo das respostas de erro da API.
      required:
        - success
        - errors
      properties:
        success:
          type: boolean
          const: false
        errors:
          type: array
          description: >-
            Lista de erros. O formato usual de cada item é `{code, message}`.
            Algumas operações devolvem o item como `{field, error}`, como texto
            solto ou dentro de uma lista aninhada; a descrição e os exemplos de
            cada resposta indicam o formato.
          items:
            anyOf:
              - $ref: '#/components/schemas/ErroItem'
              - $ref: '#/components/schemas/ErroCampo'
              - type: string
              - type: array
                items:
                  anyOf:
                    - $ref: '#/components/schemas/ErroItem'
                    - type: string
    ErroItem:
      type: object
      description: Um erro da requisição.
      required:
        - message
      properties:
        code:
          type:
            - integer
            - string
          description: >-
            Código do erro. É numérico na maioria dos casos e texto (`B1`, `B4`,
            `B5` e `B6`) nos erros de chave e de usuário da v2. Trate o erro por
            este campo, não pela mensagem.
        message:
          type: string
          description: >-
            Descrição do erro em português. O texto pode trazer valores da
            requisição e variar conforme o tipo da central.
        field:
          type: string
          description: >-
            Campo da requisição que causou o erro. Só vem em alguns erros de
            validação.
    ErroCampo:
      type: object
      description: >-
        Erro de um campo do corpo, sem `code`. Algumas operações devolvem este
        formato.
      required:
        - field
        - error
      properties:
        field:
          type: string
          description: Campo da requisição que causou o erro.
        error:
          type: string
          description: Descrição do erro em português.
    RespostaLimiteExcedido:
      type: object
      description: Corpo da resposta `429`, sem a lista `errors`.
      required:
        - success
      properties:
        success:
          type: boolean
          const: false
  examples:
    ChaveNaoInformada:
      summary: Nenhuma chave de API enviada
      description: A requisição não trouxe o header `api-key`.
      value:
        success: false
        errors:
          - code: B1
            message: Chave da api não informada.
    JsonInvalido:
      summary: Corpo com JSON malformado
      description: O corpo da requisição não é um JSON válido.
      value:
        success: false
        errors:
          - code: 0
            message: JSON inválido
    GestorNaoAutenticado:
      summary: Login ou senha do usuário inválidos
      description: >-
        O endpoint exige usuário autenticado por Basic Auth, e o login ou a
        senha não conferem, ou o usuário não foi enviado.
      value:
        success: false
        errors:
          - code: B5
            message: Usuário e/ou senhas inválidos.
    ApiKeyInvalida:
      summary: api-key inexistente
      description: >-
        A `api-key` não está cadastrada. Normalmente uma chave não reconhecida
        recebe `403`; este `401` aparece só em situações excepcionais.
      value:
        success: false
        errors:
          - code: B4
            message: Você não está autorizado a acessar este recurso.
    LicencaInvalida:
      value:
        errors:
          - code: 19
            message: Não é possível utilizar a API com a sua licença.
        success: false
    ApiKeyNaoReconhecida:
      summary: api-key não reconhecida
      description: >-
        A `api-key` enviada não é reconhecida, e a requisição é recusada antes
        de ser processada. A resposta vem em texto puro, sem o envelope JSON.
      value: '-'
    LimiteExcedido:
      summary: Limite de requisições excedido
      description: >-
        O consumo da janela passou do limite de bloqueio do grupo de endpoints
        ou do recurso.
      value:
        success: false
    FalhaOperacao:
      summary: Falha inesperada
      description: Ocorreu uma falha não prevista ao processar a requisição.
      value:
        success: false
        errors:
          - code: 0
            message: Falha na operação
  responses:
    ErroLimite429:
      description: >-
        O limite de requisições foi excedido. Espere os segundos do header
        `Retry-After` antes de repetir. Os limites estão em [Rate
        limit](/pages/v2/entregas/rate-limit).
      headers:
        Retry-After:
          $ref: '#/components/headers/RetryAfter'
        X-RateLimit-Limit:
          $ref: '#/components/headers/XRateLimitLimit'
        X-RateLimit-Remaining:
          $ref: '#/components/headers/XRateLimitRemaining'
        X-Total-Period:
          $ref: '#/components/headers/XTotalPeriod'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/RespostaLimiteExcedido'
          examples:
            limite_excedido:
              $ref: '#/components/examples/LimiteExcedido'
    ErroInterno500:
      description: >-
        Falha inesperada no processamento. Também chegam neste status, com
        `code` 0, falhas de comunicação interna que excedem o tempo limite de 5
        segundos; nesse caso, a operação pode ter sido concluída. Veja [Códigos
        de erro](/pages/v2/entregas/codigos-de-erro).
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/RespostaErro'
          examples:
            falha_operacao:
              $ref: '#/components/examples/FalhaOperacao'
  headers:
    RetryAfter:
      description: Segundos a esperar antes de repetir a requisição.
      schema:
        type: integer
    XRateLimitLimit:
      description: Limite efetivo do grupo de endpoints na janela.
      schema:
        type: integer
    XRateLimitRemaining:
      description: >-
        Requisições ainda disponíveis na janela atual. Vale `0` na resposta
        `429`.
      schema:
        type: integer
    XTotalPeriod:
      description: Duração da janela em segundos.
      schema:
        type: integer
  securitySchemes:
    basicAuth:
      type: http
      scheme: basic
    ApiKeyAuth:
      type: apiKey
      in: header
      name: api-key
      description: Obrigatório. Sua chave API.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.