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

# Autenticar widget In-App

> Troca o `client_id` público do OAuth Client + o `user_id` do usuário (e o `user_hash`, quando houver) por um token de 15 minutos, que só lê e marca como lidas as notificações in-app daquele usuário. O widget oficial chama este endpoint sozinho; use-o só se construir uma interface própria. Verificação de identidade: `user_hash` = HMAC-SHA256 do `user_id` com o segredo de verificação da conta, em hexadecimal, calculado no seu servidor. Só usuários MASTER da conta veem e geram o segredo e ligam a exigência, em Configurações → Canais → In-app (dentro da aplicação). Um `user_hash` enviado é sempre conferido; sem ele, a chamada só é aceita se a conta não exige a verificação. Limite: 60 chamadas por minuto por IP.



## OpenAPI

````yaml openapi.json POST /in-app-auth
openapi: 3.1.0
info:
  title: OctaSend API
  description: >-
    API de mensageria multicanal — envie mensagens por E-mail, WhatsApp, SMS,
    Slack, Telegram, Web Push, In-App e Push mobile através de um único
    endpoint.
  version: 1.3.0
servers:
  - url: https://yghpblhxrfmxkwejvpjz.supabase.co/functions/v1
    description: Produção
security:
  - bearerAuth: []
tags:
  - name: Autenticação
  - name: Mensagens
  - name: Automações
  - name: Consultas
  - name: Widget In-App
  - name: Web Push
paths:
  /in-app-auth:
    post:
      tags:
        - Widget In-App
      summary: Autenticar widget In-App
      description: >-
        Troca o `client_id` público do OAuth Client + o `user_id` do usuário (e
        o `user_hash`, quando houver) por um token de 15 minutos, que só lê e
        marca como lidas as notificações in-app daquele usuário. O widget
        oficial chama este endpoint sozinho; use-o só se construir uma interface
        própria. Verificação de identidade: `user_hash` = HMAC-SHA256 do
        `user_id` com o segredo de verificação da conta, em hexadecimal,
        calculado no seu servidor. Só usuários MASTER da conta veem e geram o
        segredo e ligam a exigência, em Configurações → Canais → In-app (dentro
        da aplicação). Um `user_hash` enviado é sempre conferido; sem ele, a
        chamada só é aceita se a conta não exige a verificação. Limite: 60
        chamadas por minuto por IP.
      operationId: createInAppAuth
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/InAppAuthRequest'
            example:
              client_id: client_a3f8b2...
              user_id: user_42
              user_hash: 4f1d8a...
      responses:
        '200':
          description: Token emitido
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/InAppAuthResponse'
              example:
                jwt: eyJhbGciOiJIUzI1...
                expires_in: 900
                supabase_url: https://yghpblhxrfmxkwejvpjz.supabase.co
                supabase_anon_key: eyJhbGciO...
        '400':
          description: >-
            `client_id` ou `user_id` ausente, ou `user_hash` enviado com um
            `user_id` que tem espaço no início ou no fim
          content:
            application/json:
              examples:
                missing_fields:
                  value:
                    error: missing_client_id_or_user_id
                user_id_whitespace:
                  value:
                    error: user_id_has_surrounding_whitespace
        '401':
          description: >-
            `client_id` inexistente ou OAuth Client revogado; `user_hash`
            ausente com a verificação de identidade exigida; ou `user_hash` que
            não confere (outro `user_id`, segredo já trocado ou conta sem
            segredo gerado)
          content:
            application/json:
              examples:
                invalid_client_id:
                  value:
                    error: invalid_client_id
                user_hash_required:
                  value:
                    error: user_hash_required
                invalid_user_hash:
                  value:
                    error: invalid_user_hash
        '403':
          description: Conta inativa ou canal In-App não liberado para a conta
          content:
            application/json:
              examples:
                tenant_inactive:
                  value:
                    error: tenant_inactive
                channel_disabled:
                  value:
                    error: in_app_channel_not_enabled
        '405':
          description: Método diferente de POST
          content:
            application/json:
              example:
                error: method_not_allowed
        '429':
          description: >-
            Mais de 60 chamadas por minuto do mesmo IP. O header `Retry-After`
            indica quantos segundos esperar.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RateLimitedError'
              example:
                error: rate_limited
                retry_after: 60
        '500':
          description: Erro interno
          content:
            application/json:
              example:
                error: internal_error
      security: []
components:
  schemas:
    InAppAuthRequest:
      type: object
      required:
        - client_id
        - user_id
      properties:
        client_id:
          type: string
          example: client_a3f8b2...
          description: >-
            client_id público do OAuth Client. Os nomes `key` e `api_token`
            também são aceitos para o mesmo valor
        user_id:
          type: string
          example: user_42
          description: >-
            Identificador do usuário no seu sistema. Com `user_hash`, é usado
            exatamente como enviado
        user_hash:
          type: string
          example: 4f1d8a...
          description: >-
            HMAC-SHA256 do `user_id` com o segredo de verificação de identidade
            da conta, em hexadecimal, calculado no seu servidor. Obrigatório
            quando a conta liga Exigir verificação de identidade; quando
            enviado, é sempre conferido
    InAppAuthResponse:
      type: object
      properties:
        jwt:
          type: string
        expires_in:
          type: integer
          const: 900
        supabase_url:
          type: string
          format: uri
        supabase_anon_key:
          type: string
    RateLimitedError:
      type: object
      properties:
        error:
          type: string
          const: rate_limited
        retry_after:
          type: integer
          example: 60
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: >-
        Access token (`at_...`) obtido em `/oauth-token`, ou o par
        `client_id:client_secret` separado por dois-pontos, sem espaços.

````

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