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

# Obter token

> Autentique sua aplicação com o fluxo client_credentials e receba um JWT válido por 1 hora

A API Open Delivery da Repediu usa o fluxo **client\_credentials** do OAuth 2.0. O token emitido identifica a sua **aplicação** — não um estabelecimento específico: um único token dá acesso a todos os merchants que ativaram a sua integração, sem header de contexto por requisição.

<Steps>
  <Step title="Receba suas credenciais">
    O `client_id` e o `client_secret` são emitidos pela Repediu durante o onboarding do integrador. Não há autocadastro — se você ainda não tem credenciais, fale com o time de integrações.
  </Step>

  <Step title="Solicite o token">
    Envie um `POST` para `/od/v2/oauth/token` com corpo **JSON** (não é form-urlencoded) contendo `client_id`, `client_secret` e `grant_type` fixo em `client_credentials`. Use o playground ao lado para testar.
  </Step>

  <Step title="Use o token nas rotas de dados">
    Envie o `access_token` no header `Authorization: Bearer <token>` em todas as chamadas. Comece por [Listar merchants](/open-delivery/listar-merchants) para descobrir quais estabelecimentos estão no seu escopo.
  </Step>

  <Step title="Renove somente ao expirar">
    O token expira em **3600 segundos (1 hora)**. A regra é uma só: **reutilize o mesmo token em todas as requisições até ele expirar — só então gere um novo**, repetindo esta chamada (não existe refresh token). Não gere um token por requisição e não gere um novo "por precaução" enquanto o atual ainda é válido: guarde o token e o instante de expiração, e troque-o apenas quando receber `401` ou quando o `expires_in` se esgotar.
  </Step>
</Steps>

<Warning>
  O `client_secret` é confidencial: use-o apenas em backend (servidor ↔ servidor). Nunca o embuta em aplicativo móvel, front-end ou repositório público. Em caso de vazamento, solicite a rotação da credencial à Repediu.
</Warning>

<Info>
  O JWT carrega o escopo `od.crm`, exigido por todas as rotas de dados, e o `app_id` da sua aplicação. Não é necessário pedir escopo na requisição — ele é atribuído à credencial.
</Info>

## Erros

| HTTP  | `code` no corpo | Quando acontece                                                             | O que fazer                                                          |
| ----- | --------------- | --------------------------------------------------------------------------- | -------------------------------------------------------------------- |
| `400` | `BAD_REQUEST`   | Campo obrigatório ausente ou `grant_type` diferente de `client_credentials` | Corrija o corpo — a lista `details` indica cada validação que falhou |
| `401` | `UNAUTHORIZED`  | `client_id` inexistente, `client_secret` incorreto ou credencial revogada   | Confira as credenciais; se persistir, contate a Repediu              |

## Usando o token

Com o token em mãos, o próximo passo é descobrir o seu escopo:

<CodeGroup>
  ```bash Exemplo: listar merchants theme={null}
  curl --request GET \
    --url https://public-api.repediu.com.br/od/v2/merchants \
    --header 'Authorization: Bearer SEU_ACCESS_TOKEN'
  ```

  ```bash Exemplo: renovar o token theme={null}
  curl --request POST \
    --url https://public-api.repediu.com.br/od/v2/oauth/token \
    --header 'Content-Type: application/json' \
    --data '{
      "client_id": "9702451f-078a-4680-b4ea-4ba22ae5defc",
      "client_secret": "e78720b6-55d5-4985-9d7c-34b64297eb4e",
      "grant_type": "client_credentials"
    }'
  ```
</CodeGroup>

<Card title="Listar merchants" icon="store" href="/open-delivery/listar-merchants">
  Descubra quais estabelecimentos autorizaram a sua aplicação — o ponto de partida de toda integração.
</Card>


## OpenAPI

````yaml openapi.yaml POST /od/v2/oauth/token
openapi: 3.0.1
info:
  title: Repediu — API de integração
  description: >-
    API de integração da Repediu: rotas Open Delivery 2.0 (capabilities CRM),
    dado bruto do CRM do parceiro (/v1/stores) e métricas agregadas
    (/v1/stores/.../metrics). A autenticação usa o fluxo client_credentials: o
    token identifica a aplicação integradora e dá acesso a todos os
    estabelecimentos (merchants) que ativaram a integração.
  version: v2
servers:
  - url: https://public-api.repediu.com.br
    description: Produção
security:
  - Bearer: []
paths:
  /od/v2/oauth/token:
    post:
      tags:
        - Autenticação
      summary: Obter token de acesso
      description: >-
        Emite um token de acesso (JWT) via fluxo client_credentials. O corpo é
        JSON (não form-urlencoded). O token expira em 3600 segundos e carrega o
        escopo `od.crm`, exigido por todas as rotas de dados.
      operationId: createAccessToken
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateAccessTokenRequest'
            example:
              client_id: 9702451f-078a-4680-b4ea-4ba22ae5defc
              client_secret: e78720b6-55d5-4985-9d7c-34b64297eb4e
              grant_type: client_credentials
      responses:
        '200':
          description: Token emitido com sucesso.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CreateAccessTokenResponse'
              example:
                access_token: >-
                  eyJhbGciOiJIUzI1NiIsInR5cCI6ImJlYXJlciJ9.eyJhcHBfaWQiOiI3ZWY5N2ZjYy4uLiJ9.assinatura
                token_type: bearer
                expires_in: 3600
        '400':
          description: >-
            Corpo inválido (campo obrigatório ausente ou grant_type diferente de
            client_credentials).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                code: BAD_REQUEST
                message: One or more validation errors occurred
                details:
                  - grant_type must be client_credentials
        '401':
          description: >-
            client_id inexistente, client_secret incorreto ou credencial
            revogada.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                code: UNAUTHORIZED
                message: Invalid client credentials.
                details: null
      security: []
components:
  schemas:
    CreateAccessTokenRequest:
      type: object
      required:
        - client_id
        - client_secret
        - grant_type
      properties:
        client_id:
          type: string
          description: Identificador da aplicação, emitido pela Repediu no onboarding.
        client_secret:
          type: string
          description: Segredo da aplicação, emitido junto com o client_id.
        grant_type:
          type: string
          description: Tipo de concessão. Único valor aceito é client_credentials.
          enum:
            - client_credentials
    CreateAccessTokenResponse:
      type: object
      properties:
        access_token:
          type: string
          description: JWT a ser enviado no header Authorization das demais rotas.
        token_type:
          type: string
          description: Sempre `bearer`.
        expires_in:
          type: integer
          format: int32
          description: Validade do token em segundos (3600).
    ErrorResponse:
      type: object
      properties:
        code:
          type: string
          description: >-
            Código do erro (BAD_REQUEST, UNAUTHORIZED, FORBIDDEN, NOT_FOUND,
            INTERNAL_SERVER_ERROR).
        message:
          type: string
        details:
          type: array
          nullable: true
          description: Lista de mensagens de validação, quando aplicável.
          items:
            type: string
  securitySchemes:
    Bearer:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: >-
        Token de acesso emitido por POST /od/v2/oauth/token (fluxo
        client_credentials). Envie no header Authorization como `Bearer
        <token>`.

````