> ## 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.

# Registrar dispositivo Web Push

> Associa o token FCM de um navegador ao `user_id` do usuário no seu sistema. Chamado pelo script de registro que roda no site, com o `client_id` público do OAuth Client. Um usuário tem um token por conta: um registro novo substitui o anterior, e o mesmo token registrado para outro `user_id` é removido para evitar entrega duplicada. Usa a mesma verificação de identidade do In-App (mesmo segredo e mesma exigência): `user_hash` = HMAC-SHA256 do `user_id` com o segredo de verificação da conta, em hexadecimal. Limite: 60 chamadas por minuto por IP.



## OpenAPI

````yaml openapi.json POST /web-push-register
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:
  /web-push-register:
    post:
      tags:
        - Web Push
      summary: Registrar dispositivo Web Push
      description: >-
        Associa o token FCM de um navegador ao `user_id` do usuário no seu
        sistema. Chamado pelo script de registro que roda no site, com o
        `client_id` público do OAuth Client. Um usuário tem um token por conta:
        um registro novo substitui o anterior, e o mesmo token registrado para
        outro `user_id` é removido para evitar entrega duplicada. Usa a mesma
        verificação de identidade do In-App (mesmo segredo e mesma exigência):
        `user_hash` = HMAC-SHA256 do `user_id` com o segredo de verificação da
        conta, em hexadecimal. Limite: 60 chamadas por minuto por IP.
      operationId: registerWebPush
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WebPushRegisterRequest'
            example:
              client_id: client_a3f8b2...
              user_id: user_42
              fcm_token: d9k3s...
              user_hash: 4f1d8a...
      responses:
        '200':
          description: Registrado
          content:
            application/json:
              example:
                success: true
        '400':
          description: >-
            Algum campo obrigatório 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: client_id, user_id and fcm_token are required
                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
          content:
            application/json:
              examples:
                invalid_client_id:
                  value:
                    error: Invalid or inactive client_id
                user_hash_required:
                  value:
                    error: user_hash_required
                invalid_user_hash:
                  value:
                    error: invalid_user_hash
        '422':
          description: Canal Web Push não configurado ou inativo na conta
          content:
            application/json:
              example:
                error: Web push channel not configured for this tenant
        '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:
              schema:
                $ref: '#/components/schemas/Error'
      security: []
components:
  schemas:
    WebPushRegisterRequest:
      type: object
      required:
        - client_id
        - user_id
        - fcm_token
      properties:
        client_id:
          type: string
          description: client_id público do OAuth Client
        user_id:
          type: string
          description: >-
            Identificador do usuário no seu sistema — o mesmo usado depois em
            `recipient.user_id`
        fcm_token:
          type: string
          description: Token FCM do navegador
        user_hash:
          type: string
          description: >-
            HMAC-SHA256 do `user_id` com o segredo de verificação de identidade
            da conta (o mesmo do In-App), em hexadecimal. Obrigatório quando a
            conta liga Exigir verificação de identidade; quando enviado, é
            sempre conferido
    RateLimitedError:
      type: object
      properties:
        error:
          type: string
          const: rate_limited
        retry_after:
          type: integer
          example: 60
    Error:
      type: object
      properties:
        error:
          type: string
  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.