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

# Troca client credentials por um token de acesso de parceiro

> Implementa o grant `client_credentials` do OAuth 2.0 (RFC 6749 §4.4). O token retornado autentica chamadas de servidor-a-servidor (Entitlements, Subscriber, Billing) — não é um token de usuário final. TTL curto (10 minutos); o cliente deve renovar antes de expirar, não reutilizar tokens vencidos.

**Autenticação do cliente:** as credenciais são aceitas via HTTP Basic (`Authorization: Basic base64(client_id:client_secret)`, RFC 6749 §2.3.1 — **forma preferida**) ou nos campos `client_id`/`client_secret` do corpo (`client_secret_post`). O corpo é sempre `application/x-www-form-urlencoded`.

**Escopos:** os escopos do token são os cadastrados na credencial do parceiro — não há parâmetro `scope` na requisição; pedir um subconjunto de escopos por chamada não é suportado hoje.



## OpenAPI

````yaml /platform/openapi.yaml post /oauth2/token
openapi: 3.1.0
info:
  title: Googa Platform API
  version: 1.0.0
  summary: >-
    API compartilhada por todo parceiro Googa — entitlements, status de
    assinante, uso para billing e webhooks. Consumida por NovelAI, HistorinhAI e
    NovelAudio da mesma forma; a lógica de catálogo/conteúdo de cada produto
    vive em sua própria API (ver abas NovelAI / HistorinhAI / NovelAudio).
  description: >-
    Hoje, apenas os apps oficiais (Web/PWA) consomem os produtos Googa,
    autenticando diretamente contra o Supabase de cada produto. Esta API é a
    camada que permite um parceiro terceiro (como uma operadora) integrar sem
    acesso direto ao banco de dados. Ver [Modelo de autenticação sobre
    Supabase](/architecture/supabase-auth-model) para o desenho completo.


    **Status:** os endpoints de token, entitlements, status de assinante,
    billing usage, JWKS e o despacho de webhooks estão implementados no código
    (repo `googa-platform` e Edge Functions de domínio de cada produto); o
    deploy em produção ainda está pendente. O SSO do assinante (`GET
    /oauth2/authorize`) é **planejado — ainda não implementado** e está marcado
    como tal na própria operação.
  contact:
    name: Googa — Suporte a parceiros
    email: developers@googa.com.br
  license:
    name: Uso restrito — ver Política de Uso da API
    url: https://developers.googa.com.br/security/api-usage-policy
servers:
  - url: https://api.googa.com.br/v1
    description: Produção (proposto)
  - url: https://sandbox.googa.com.br/v1
    description: >-
      Sandbox (proposto — ambiente ainda não existe) — dados fictícios, sem
      impacto em billing real
security:
  - partnerOAuth2: []
tags:
  - name: OAuth2
    description: >-
      Emissão e uso de credenciais de parceiro (client credentials) e, no
      futuro, SSO federado do assinante.
  - name: Entitlements
    description: Ativação e suspensão de acesso por assinante e produto.
  - name: Subscriber
    description: Consulta de status do assinante.
  - name: Billing
    description: Consulta de uso para reconciliação e Nota de Débito.
  - name: Keys
    description: >-
      Chave pública (JWKS) usada pelos projetos de produto para verificar o
      token de parceiro.
paths:
  /oauth2/token:
    post:
      tags:
        - OAuth2
      summary: Troca client credentials por um token de acesso de parceiro
      description: >-
        Implementa o grant `client_credentials` do OAuth 2.0 (RFC 6749 §4.4). O
        token retornado autentica chamadas de servidor-a-servidor (Entitlements,
        Subscriber, Billing) — não é um token de usuário final. TTL curto (10
        minutos); o cliente deve renovar antes de expirar, não reutilizar tokens
        vencidos.


        **Autenticação do cliente:** as credenciais são aceitas via HTTP Basic
        (`Authorization: Basic base64(client_id:client_secret)`, RFC 6749 §2.3.1
        — **forma preferida**) ou nos campos `client_id`/`client_secret` do
        corpo (`client_secret_post`). O corpo é sempre
        `application/x-www-form-urlencoded`.


        **Escopos:** os escopos do token são os cadastrados na credencial do
        parceiro — não há parâmetro `scope` na requisição; pedir um subconjunto
        de escopos por chamada não é suportado hoje.
      operationId: issuePartnerToken
      requestBody:
        required: true
        content:
          application/x-www-form-urlencoded:
            schema:
              type: object
              required:
                - grant_type
              properties:
                grant_type:
                  type: string
                  enum:
                    - client_credentials
                client_id:
                  type: string
                  description: Obrigatório quando as credenciais não vêm via HTTP Basic.
                  example: algar-prod-a1b2c3
                client_secret:
                  type: string
                  format: password
                  description: Obrigatório quando as credenciais não vêm via HTTP Basic.
      responses:
        '200':
          description: >-
            Token emitido. A resposta não inclui campo `scope` — os escopos são
            os cadastrados na credencial.
          content:
            application/json:
              schema:
                type: object
                properties:
                  access_token:
                    type: string
                  token_type:
                    type: string
                    enum:
                      - Bearer
                  expires_in:
                    type: integer
                    example: 600
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
      security: []
components:
  responses:
    BadRequest:
      description: Requisição inválida (corpo, parâmetro ou produto desconhecido).
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    Unauthorized:
      description: Credenciais ausentes, inválidas ou expiradas.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
  schemas:
    Error:
      type: object
      description: >-
        Formato de erro no estilo OAuth2 (RFC 6749 §5.2) — usado por todos os
        endpoints, não só pelo de token.
      properties:
        error:
          type: string
          example: invalid_request
        error_description:
          type: string
          example: Missing subscriber_id, product, or status
  securitySchemes:
    partnerOAuth2:
      type: oauth2
      description: >-
        Client credentials — para Entitlements (escrita), Subscriber Status e
        Billing (leitura). Cada endpoint exige o escopo correspondente; um token
        sem o escopo recebe `403`.
      flows:
        clientCredentials:
          tokenUrl: https://api.googa.com.br/v1/oauth2/token
          scopes:
            entitlements:write: Ativar/suspender/cancelar entitlements
            subscriber:read: Consultar status de assinante
            billing:read: Consultar uso para billing

````