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

# Obter token

> Emite tokens de acesso após a autorização ou renova um token expirado. Envie o corpo como `application/x-www-form-urlencoded`.

**Troca inicial** (`grant_type=authorization_code`): chamado no callback da Redirect URI, após o consentimento no portal. Envie o `code`, a mesma `redirect_uri`, o `client_id` e o `code_verifier` usado no PKCE. Passo a passo em [Troca de token](/autenticacao/oauth#3-troca-de-token).

**Renovação** (`grant_type=refresh_token`): envie `refresh_token` e `client_id` quando o `access_token` expirar (2 horas). Veja [Renovar token](/autenticacao/oauth#6-renovar-token).

A resposta traz `access_token`, `refresh_token` e `scope` (escopos concedidos na instalação). Use o `access_token` como `Authorization: Bearer` na API aberta; o estabelecimento é identificado pela instalação vinculada ao token. Exemplos em [Usar o Bearer na API aberta](/autenticacao/oauth#5-usar-o-bearer-na-api-aberta).

Os escopos do token limitam quais módulos da API aberta podem ser consumidos. Consulte [Escopos e permissões](/autenticacao/oauth#escopos-e-permissoes) e [Fluxos de integração](/fluxo-integracao). Para comparar OAuth com API Key legada, veja [Modelos de autenticação](/autenticacao/modelos-de-autenticacao).



## OpenAPI

````yaml /reference/api-autenticacao.json post /api/partner/oauth/token
openapi: 3.1.0
info:
  title: API Autenticação
  version: '1.0'
  description: >-
    Endpoint OAuth para apps da CW App Store.


    Integradoras obtêm tokens via `POST /api/partner/oauth/token` após o
    consentimento no portal CW. O `access_token` retornado deve ser enviado como
    `Authorization: Bearer` nos endpoints da API aberta.


    Guia completo: /autenticacao/oauth. Modelos de autenticação:
    /autenticacao/modelos-de-autenticacao.
  contact:
    email: integracao@cardapioweb.com
    url: https://cardapioweb.com
    name: Cardápio Web
servers:
  - url: https://integracao.sandbox.cardapioweb.com
    description: Sandbox
  - url: https://integracao.cardapioweb.com
    description: Produção
security: []
tags:
  - name: OAuth
    description: Autorização OAuth 2.0 com PKCE para apps da CW App Store.
paths:
  /api/partner/oauth/token:
    parameters: []
    post:
      tags:
        - OAuth
      summary: Obter token
      description: >-
        Emite tokens de acesso após a autorização ou renova um token expirado.
        Envie o corpo como `application/x-www-form-urlencoded`.


        **Troca inicial** (`grant_type=authorization_code`): chamado no callback
        da Redirect URI, após o consentimento no portal. Envie o `code`, a mesma
        `redirect_uri`, o `client_id` e o `code_verifier` usado no PKCE. Passo a
        passo em [Troca de token](/autenticacao/oauth#3-troca-de-token).


        **Renovação** (`grant_type=refresh_token`): envie `refresh_token` e
        `client_id` quando o `access_token` expirar (2 horas). Veja [Renovar
        token](/autenticacao/oauth#6-renovar-token).


        A resposta traz `access_token`, `refresh_token` e `scope` (escopos
        concedidos na instalação). Use o `access_token` como `Authorization:
        Bearer` na API aberta; o estabelecimento é identificado pela instalação
        vinculada ao token. Exemplos em [Usar o Bearer na API
        aberta](/autenticacao/oauth#5-usar-o-bearer-na-api-aberta).


        Os escopos do token limitam quais módulos da API aberta podem ser
        consumidos. Consulte [Escopos e
        permissões](/autenticacao/oauth#escopos-e-permissoes) e [Fluxos de
        integração](/fluxo-integracao). Para comparar OAuth com API Key legada,
        veja [Modelos de autenticação](/autenticacao/modelos-de-autenticacao).
      operationId: oauth-token
      requestBody:
        required: true
        content:
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/TokenRequest'
            examples:
              Troca de código:
                value:
                  grant_type: authorization_code
                  client_id: SEU_CLIENT_ID
                  code: CODIGO_RECEBIDO
                  redirect_uri: https://seuapp.com/oauth/callback
                  code_verifier: SEU_CODE_VERIFIER
              Renovação:
                value:
                  grant_type: refresh_token
                  client_id: SEU_CLIENT_ID
                  refresh_token: SEU_REFRESH_TOKEN
      responses:
        '200':
          description: Token emitido com sucesso.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TokenResponse'
              examples:
                Sucesso:
                  value:
                    access_token: ...
                    token_type: Bearer
                    expires_in: 7200
                    refresh_token: ...
                    scope: store orders
        '400':
          description: >-
            Requisição inválida (PKCE inválido, código expirado, `redirect_uri`
            incorreta, etc.).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OAuthError'
        '401':
          description: '`client_id` inválido ou app não aprovado.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OAuthError'
components:
  schemas:
    TokenRequest:
      type: object
      required:
        - grant_type
        - client_id
      properties:
        grant_type:
          type: string
          enum:
            - authorization_code
            - refresh_token
          description: >-
            Use `authorization_code` na troca inicial ou `refresh_token` na
            renovação.
        client_id:
          type: string
        code:
          type: string
          description: Obrigatório quando `grant_type=authorization_code`.
        redirect_uri:
          type: string
          format: uri
          description: >-
            Obrigatório quando `grant_type=authorization_code`. Deve ser igual à
            Redirect URI (`redirect_url`) informada no cadastro e ao
            `redirect_uri` usado no redirect para o portal.
        code_verifier:
          type: string
          description: Obrigatório quando `grant_type=authorization_code`.
        refresh_token:
          type: string
          description: Obrigatório quando `grant_type=refresh_token`.
    TokenResponse:
      type: object
      properties:
        access_token:
          type: string
        token_type:
          type: string
          example: Bearer
        expires_in:
          type: integer
          example: 7200
        refresh_token:
          type: string
        scope:
          type: string
          example: store orders
    OAuthError:
      type: object
      properties:
        error:
          type: string
          example: invalid_request
          description: >-
            Código do erro OAuth (ex.: `invalid_request`, `invalid_client`,
            `access_denied`).
        error_description:
          type: string
          description: Descrição legível do erro.

````