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

# Configurar ou alterar o proxy

> Define explicitamente um dos três estados aceitos:
  - `mode=custom`: usa um proxy próprio informado em `proxy_url`;
  - `mode=internal`: usa a infraestrutura interna; ou
  - `mode=none`: conexão direta, permitida apenas com `confirm_no_proxy=true`.

Importante: `POST /instance/proxy` confirma que a configuração foi salva, não que o proxy já foi comprovado em uso.
A validação operacional principal acontece no próximo ciclo real de conexão da instância.

Em termos práticos:
  - `200 OK` aqui = configuração persistida com sucesso;
  - falhas reais de conectividade podem aparecer depois; e
  - para observar o estado real, consulte `GET /instance/proxy` e leia:
    - `effective_mode`
    - `effective_detail`
    - `fallback.active`
    - `last_test_error`
    - `validation_error`

Quando `mode=custom`, você também pode definir a contingência via `proxy_fallback`:
  - `internal`: tenta a infraestrutura interna e, se ainda assim falhar, pode usar direto como último recurso;
  - `never`: não usa contingência; ou
  - uma URL de proxy de contingência controlada pelo próprio cliente.

Quando `mode=internal`, `rotate_now: true` troca imediatamente o proxy interno persistido.
Se houver mais de uma origem interna disponível, a plataforma escolhe outra origem sem expor o fornecedor.
Se houver apenas uma origem, troca apenas o proxy/IP dentro dessa origem.

Protocolos aceitos em URLs de proxy customizado:
  - `http://usuario:senha@host:porta`
  - `https://usuario:senha@host:porta`
  - `socks5://usuario:senha@host:porta`
  - `socks5h://usuario:senha@host:porta`

O esquema `socks://` genérico não é aceito. Para proxies SOCKS, use `socks5://` ou `socks5h://`.




## OpenAPI

````yaml /openapi-pt-BR.json post /instance/proxy
openapi: 3.1.0
info:
  title: WppFy -  WhatsApp API
  version: 1.0.0
  description: >
    API para gerenciamento de instâncias do WhatsApp e comunicações.


    ## Recomendação Importante: WhatsApp Business

    **É ALTAMENTE RECOMENDADO usar contas do WhatsApp Business** em vez do
    WhatsApp normal para integração, o WhatsApp normal pode apresentar
    inconsistências, desconexões, limitações e instabilidades durante o uso com
    a nossa API.


    ## Autenticação

    - Endpoints regulares requerem um header 'token' com o token da instância


    ## Estados da Instância

    As instâncias podem estar nos seguintes estados:

    - `disconnected`: Desconectado do WhatsApp

    - `connecting`: Em processo de conexão

    - `connected`: Conectado e autenticado com sucesso
servers:
  - url: https://api.wppfy.com
security:
  - token: []
tags:
  - name: Instancia
    description: |
      Operações relacionadas ao ciclo de vida de uma instância, como conectar,
      desconectar e verificar o status.
  - name: Proxy
    description: >
      A WppFy opera com um proxy interno como padrão.

      Você pode manter esse padrão, configurar um proxy próprio via `proxy_url`
      ou usar seu celular android como proxy instalando o app em
      https://github.com/WppFy/silver_proxy_apk (APK direto:
      https://github.com/WppFy/silver_proxy_apk/raw/refs/heads/main/silver_proxy.apk).

      Se nada for enviado, seguimos no proxy interno. IPs são brasileiros; para
      clientes internacionais, considere um proxy da região do cliente.
  - name: Perfil
    description: |
      Operações relacionadas ao perfil da instância do WhatsApp, como alterar
      nome e imagem de perfil.
  - name: Business
    description: |
      ⚠️ **EXPERIMENTAL** - Endpoints ainda não testados completamente.

      Operações relacionadas ao perfil comercial do WhatsApp Business.
      Permite consultar e atualizar dados do perfil comercial como descrição,
      endereço, email, categorias e gerenciar o catálogo de produtos.

      **Requisitos:**
      - A conta atualmente conectada deve ser uma conta **WhatsApp Business**
      - Contas pessoais do WhatsApp não possuem perfil comercial

      **Nota:** Estes endpoints podem não funcionar como esperado.
      Reporte problemas encontrados.
  - name: Chamadas
    description: |
      Operações relacionadas a chamadas peloWhatsApp.
      Permite realizar e rejeitar chamadas programaticamente.
  - name: Enviar Mensagem
    description: >
      Endpoints para envio de mensagens do WhatsApp com diferentes tipos de
      conteúdo.


      ## Campos Opcionais Comuns


      Todos os endpoints de envio de mensagem suportam os seguintes campos
      opcionais:


      - **`delay`** *(integer)*: Atraso em milissegundos antes do envio
        - Durante o atraso aparecerá "Digitando..." ou "Gravando áudio..." dependendo do tipo
        - Exemplo: `5000` (5 segundos)

      - **`readchat`** *(boolean)*: Marcar chat como lido após envio
        - Remove o contador de mensagens não lidas do chat
        - Exemplo: `true`

      - **`readmessages`** *(boolean)*: Marcar últimas mensagens recebidas como
      lidas
        - Marca as últimas 10 mensagens **recebidas** (não enviadas por você) como lidas
        - Útil para confirmar leitura de mensagens pendentes antes de responder
        - Diferente do `readchat` que apenas remove contador de não lidas
        - Exemplo: `true`

      - **`replyid`** *(string)*: ID da mensagem para responder
        - Cria uma resposta vinculada à mensagem original
        - Suporte varia por tipo de mensagem
        - Exemplo: `"3A12345678901234567890123456789012"`

      - **`mentions`** *(string)*: Números para mencionar (apenas para envio em
      grupos)
        - Números específicos: `"5511999999999,5511888888888"`
        - Mencionar todos: `"all"`

      - **`forward`** *(boolean)*: Marca a mensagem como encaminhada no WhatsApp
        - Adiciona o indicador "Encaminhada" na mensagem
        - Exemplo: `true`

      - **`track_source`** *(string)*: Origem do rastreamento da mensagem
        - Identifica o sistema ou fonte que está enviando a mensagem
        - Útil para integrações (ex: "chatwoot", "crm", "chatbot")
        - Exemplo: `"chatwoot"`

      - **`track_id`** *(string)*: ID para rastreamento da mensagem
        - Identificador livre para acompanhar a mensagem em sistemas externos
        - Permite correlacionar mensagens entre diferentes plataformas
        - **Nota**: O sistema aceita valores duplicados - não há validação de unicidade
        - Use o mesmo ID em várias mensagens se fizer sentido para sua integração
        - Exemplo: `"msg_123456789"`

      ### Envio para Grupos

      - **`number`** *(string)*: Para enviar mensagem para grupo, use o ID do
      grupo que termina com `@g.us`
        - Exemplo: `"120363012345678901@g.us"`
        - **Como obter o ID do grupo:**
          - Use o `chatid` do webhook recebido quando alguém envia mensagem no grupo
          - Use o endpoint `GET /group/list` para listar todos os grupos e seus IDs

      ## Placeholders Disponíveis


      Todos os endpoints de envio de mensagem suportam placeholders dinâmicos
      para personalização automática:


      ### Campos de Nome

      - **`{{name}}`**: Nome consolidado do chat, usando a primeira opção
      disponível:
        1. Nome do lead (`lead_name`)
        2. Nome completo do lead (`lead_fullName`)
        3. Nome do contato no WhatsApp (`wa_contactName`)
        4. Nome do perfil do WhatsApp (`wa_name`)

      - **`{{first_name}}`**: Primeira palavra válida do nome consolidado
      (mínimo 2 caracteres)


      ### Campos do WhatsApp

      - **`{{wa_name}}`**: Nome do perfil do WhatsApp

      - **`{{wa_contactName}}`**: Nome do contato como salvo no WhatsApp


      ### Campos do Lead

      - **`{{lead_name}}`**: Nome do lead

      - **`{{lead_fullName}}`**: Nome completo do lead

      - **`{{lead_personalid}}`**: ID pessoal (CPF, CNPJ, etc)

      - **`{{lead_email}}`**: Email do lead

      - **`{{lead_status}}`**: Status atual do lead

      - **`{{lead_notes}}`**: Anotações do lead

      - **`{{lead_assignedAttendant_id}}`**: ID do atendente designado


      ### Campos Personalizados

      Campos adicionados via custom fields são acessíveis usando
      `{{lead_field01}}` à `{{lead_field20}}` ou usar `{{nomedocampo}}` definido
      em `/instance/updateFieldsMap`.


      ### Exemplo de Uso

      ```

      Olá {{name}}! Vi que você trabalha na {{company}}.

      Seu email {{lead_email}} está correto?

      ```


      **💡 Dica**: Use `/chat/find` para buscar dados do chat e ver os campos
      disponíveis antes de enviar mensagens com placeholders.
  - name: Mensagem Async
    description: >
      Controles operacionais da fila interna de envio assíncrono usada quando um
      endpoint de envio recebe `async=true`.


      Esta seção serve para:

      - consultar o estado atual da fila async

      - configurar o delay entre mensagens enviadas com `async=true`

      - limpar backlog pendente e cancelar mensagens ainda não concluídas


      Escopo:

      - cobre apenas a fila interna de mensagens diretas async

      - não altera mensagens já enviadas com sucesso
  - name: Ações na mensagem e Buscar
  - name: Chats
  - name: Contatos
  - name: Bloqueios
  - name: Etiquetas
  - name: Grupos e Comunidades
  - name: Newsletters e Canais
    description: >
      Operações para leitura e acompanhamento de canais do WhatsApp
      (newsletters).


      Casos de uso principais:

      - listar posts já publicados em um canal

      - editar posts recentes de um canal

      - deletar posts recentes de um canal

      - consultar views e reações dos posts

      - integrar canais sem necessidade de persistir as mensagens localmente


      Observações:

      - `/newsletter/messages` retorna o conteúdo dos posts

      - `/newsletter/messages/edit` edita o conteúdo de posts recentes

      - `/newsletter/messages/delete` apaga posts recentes

      - views (`viewsCount`) e reactions (`reactionCounts`) vêm em cada post de
      `/newsletter/messages`, não por evento de webhook

      - `/newsletter/updates` está obsoleta: o WhatsApp não responde e a API
      devolve 504

      - newsletters usam rotas próprias e não devem usar `/message/edit` ou
      `/message/delete`
  - name: Respostas Rápidas
    description: >
      Gerenciamento de respostas rápidas para agilizar o atendimento.


      **⚠️ Importante**: Este recurso tem serventia apenas se você utilizar um
      sistema frontend/interface

      personalizada para registrar e utilizar as respostas. A API apenas
      armazena as respostas, 

      mas não as aplica automaticamente.


      ### Como funciona:

      - **Criar**: Cadastre respostas pré-definidas com títulos e conteúdo

      - **Listar**: Recupere todas as respostas cadastradas para exibir na sua
      interface

      - **Usar**: Seu sistema frontend pode usar essas respostas para agilizar
      digitação


      ### Casos de uso:

      - Interfaces web personalizadas de atendimento

      - Apps mobile com sugestões de resposta

      - Sistemas CRM com templates de mensagem

      - Ferramentas de produtividade para atendentes


      **Não é um chatbot**: Para respostas automáticas, use os recursos de
      Chatbot.
  - name: CRM
    description: >
      Sistema completo de gestão de relacionamento com clientes integrado à API.


      **💾 Armazenamento interno**: Todos os dados dos leads ficam salvos
      diretamente na API,

      eliminando a necessidade de bancos de dados externos. Sua aplicação pode
      focar apenas

      na interface e lógica de negócio.


      ### Recursos disponíveis:

      - **📋 20+ campos personalizáveis**: Nome, telefone, email, empresa,
      observações, etc.

      - **🏷️ Sistema de etiquetas**: Organize e categorize seus contatos

      - **🔍 Busca avançada**: Filtre por qualquer campo ou etiqueta

      - **📊 Histórico completo**: Todas as interações ficam registradas
      automaticamente


      ### 🎯 Placeholders em mensagens:

      Use variáveis dinâmicas nas mensagens para personalização automática:


      ```

      Olá {{nome}}! Vi que você trabalha na {{empresa}}.

      Seu email {{email}} está correto?

      Observações: {{observacoes}}

      ```


      ### Fluxo típico:

      1. **Captura**: Leads chegam via WhatsApp ou formulários

      2. **Enriquecimento**: Adicione dados usando `/chat/editLead`

      3. **Segmentação**: Organize com etiquetas

      4. **Comunicação**: Envie mensagens personalizadas com placeholders

      5. **Acompanhamento**: Histórico fica salvo automaticamente


      **Ideal para**: Vendas, marketing, atendimento, qualificação de leads
  - name: Integração Chatwoot
    description: >
      **🚧 INTEGRAÇÃO BETA - Sistema de integração com Chatwoot para atendimento
      unificado**


      **⚠️ AVISO**: Esta integração está em fase BETA. Use por sua conta e
      risco. Recomendamos testes em ambiente não-produtivo antes do uso em
      produção.


      Esta categoria contém recursos para configurar e gerenciar a integração
      com o Chatwoot, uma plataforma de atendimento ao cliente open-source. A
      integração permite centralizar conversas do WhatsApp no Chatwoot.


      ### Recursos disponíveis:

      - 🔧 **Configuração Completa**: Configure URL, tokens e credenciais do
      Chatwoot

      - 📬 **Sincronização Bidirecional**: Mensagens novas entre WhatsApp e
      Chatwoot são sincronizadas automaticamente

      - 📱 **Gerenciamento de Contatos**: Sincronização automática de nomes e
      telefones

      - 🔄 **Atualização LID→PN**: Migração automática de Local ID para Phone
      Number

      - 🏷️ **Nomes Inteligentes**: Sistema de nomes com til (~) para
      atualização automática

      - 🚫 **Separação de Grupos**: Opção para ignorar grupos na sincronização

      - 👤 **Assinatura de Mensagens**: Identificação do agente nas mensagens
      enviadas

      - 🔗 **Webhook Automático**: URL gerada automaticamente para configurar no
      Chatwoot


      ### 🏷️ Sistema de Nomes Inteligentes:

      - **Nomes com til (~)**: Atualizados automaticamente quando contato
      modifica nome no WhatsApp

      - **Nomes específicos**: Para nome fixo, remover til (~) do nome no
      Chatwoot

      - **Exemplo**: "~João Silva" = automático, "João Silva" = fixo

      - **Migração LID→PN**: Sem duplicação de conversas durante a transição

      - **Respostas nativas**: Aparecem diretamente no Chatwoot sem marcações
      externas


      ### ⚠️ Limitações conhecidas:

      - **Sincronização de histórico**: Não implementada - apenas mensagens
      novas são sincronizadas


      ### Casos de uso:

      - Atendimento centralizado no Chatwoot

      - Equipes de suporte com múltiplos agentes

      - Integração com CRM via Chatwoot

      - Centralização de canais de comunicação

      - Gestão automática de contatos e nomes


      **Ideal para**: Empresas com equipes de atendimento, call centers, suporte
      técnico (em ambiente de testes)


      **Requer**: Instância do Chatwoot configurada, tokens de API e ambiente de
      testes


      **🚧 Lembre-se**: Integração em BETA - funcionalidades podem mudar sem
      aviso prévio
  - name: Server-Sent Events (SSE)
paths:
  /instance/proxy:
    post:
      tags:
        - Proxy
      summary: Configurar ou alterar o proxy
      description: >
        Define explicitamente um dos três estados aceitos:
          - `mode=custom`: usa um proxy próprio informado em `proxy_url`;
          - `mode=internal`: usa a infraestrutura interna; ou
          - `mode=none`: conexão direta, permitida apenas com `confirm_no_proxy=true`.

        Importante: `POST /instance/proxy` confirma que a configuração foi
        salva, não que o proxy já foi comprovado em uso.

        A validação operacional principal acontece no próximo ciclo real de
        conexão da instância.


        Em termos práticos:
          - `200 OK` aqui = configuração persistida com sucesso;
          - falhas reais de conectividade podem aparecer depois; e
          - para observar o estado real, consulte `GET /instance/proxy` e leia:
            - `effective_mode`
            - `effective_detail`
            - `fallback.active`
            - `last_test_error`
            - `validation_error`

        Quando `mode=custom`, você também pode definir a contingência via
        `proxy_fallback`:
          - `internal`: tenta a infraestrutura interna e, se ainda assim falhar, pode usar direto como último recurso;
          - `never`: não usa contingência; ou
          - uma URL de proxy de contingência controlada pelo próprio cliente.

        Quando `mode=internal`, `rotate_now: true` troca imediatamente o proxy
        interno persistido.

        Se houver mais de uma origem interna disponível, a plataforma escolhe
        outra origem sem expor o fornecedor.

        Se houver apenas uma origem, troca apenas o proxy/IP dentro dessa
        origem.


        Protocolos aceitos em URLs de proxy customizado:
          - `http://usuario:senha@host:porta`
          - `https://usuario:senha@host:porta`
          - `socks5://usuario:senha@host:porta`
          - `socks5h://usuario:senha@host:porta`

        O esquema `socks://` genérico não é aceito. Para proxies SOCKS, use
        `socks5://` ou `socks5h://`.
      requestBody:
        required: true
        content:
          application/json:
            examples:
              custom_with_internal_fallback:
                summary: Proxy customizado com fallback interno
                value:
                  mode: custom
                  proxy_url: http://usuario:senha@proxy-do-cliente.example:8080
                  proxy_fallback: internal
              custom_with_explicit_backup_proxy:
                summary: Proxy customizado com proxy de contingência próprio
                value:
                  mode: custom
                  proxy_url: http://usuario:senha@proxy-principal.example:8080
                  proxy_fallback: socks5://backup:senha@proxy-backup.example:1080
              internal_now:
                summary: Modo interno
                value:
                  mode: internal
              internal_rotate_now:
                summary: Rotacionar proxy interno agora
                value:
                  mode: internal
                  rotate_now: true
              no_proxy:
                summary: Direto explícito
                value:
                  mode: none
                  confirm_no_proxy: true
            schema:
              type: object
              properties:
                mode:
                  type: string
                  enum:
                    - custom
                    - internal
                    - none
                  description: Campo canônico para definir a estratégia de proxy.
                proxy_url:
                  type: string
                  description: >
                    Obrigatório quando `mode=custom`.

                    Protocolos aceitos: `http://`, `https://`, `socks5://` e
                    `socks5h://`.

                    O esquema `socks://` genérico não é suportado; use
                    `socks5://` ou `socks5h://`.
                  example: http://usuario:senha@ip:porta
                proxy_fallback:
                  type: string
                  description: >
                    Política de contingência para `mode=custom`.

                    Aceita `internal`, `never` ou uma URL de proxy de
                    contingência usando `http://`, `https://`, `socks5://` ou
                    `socks5h://`.
                confirm_no_proxy:
                  type: boolean
                  description: Obrigatório quando `mode=none`.
                rotate_now:
                  type: boolean
                  description: >-
                    Quando `true` com `mode=internal`, troca imediatamente o
                    proxy interno persistido sem expor o fornecedor usado.
                  default: false
                proxy_managed_country:
                  type: string
                  description: >-
                    País ISO alpha-2 usado para validar a saída do proxy
                    gerenciado. Use somente com `mode=internal`.
                  example: br
                proxy_managed_state:
                  type: string
                  description: >-
                    Estado/UF do alvo geográfico retornado pelo catálogo de
                    cidades.
                  example: sp
                proxy_managed_city:
                  type: string
                  description: Slug da cidade retornado por `GET /proxy-managed/cities`.
                  example: campinas
      responses:
        '200':
          description: Proxy configurado com sucesso
          content:
            application/json:
              examples:
                custom_internal_fallback_saved:
                  summary: >-
                    Configuração salva; o uso real será confirmado no próximo
                    ciclo de conexão
                  value:
                    details: Proxy configurado
                    proxy:
                      mode: custom
                      effective_mode: custom
                      fallback:
                        active: false
                        reason: ''
                        since: 0
                      proxy_url: http://***:***@proxy-do-cliente.example:8080
                      proxy_fallback: internal
                      managed: false
                      last_test_at: 0
                      last_test_error: ''
                      validation_error: false
                    restart_requested: true
                after_connect_failure_example:
                  summary: >-
                    Exemplo do que o GET pode mostrar depois se o proxy salvo
                    falhar
                  value:
                    details: Proxy configurado
                    proxy:
                      mode: custom
                      effective_mode: custom
                      fallback:
                        active: false
                        reason: ''
                        since: 0
                      proxy_url: http://***:***@proxy-do-cliente.example:8080
                      proxy_fallback: internal
                      managed: false
                      last_test_at: 0
                      last_test_error: ''
                      validation_error: false
                    restart_requested: true
                direct_explicit:
                  summary: Direto explícito
                  value:
                    details: Proxy configurado
                    proxy:
                      mode: none
                      effective_mode: direct
                      fallback:
                        active: false
                        reason: ''
                        since: 0
                      proxy_url: ''
                      proxy_fallback: internal
                      managed: false
                      last_test_at: 0
                      last_test_error: ''
                      validation_error: false
                internal_rotated:
                  summary: Proxy interno rotacionado
                  value:
                    details: Proxy configurado
                    rotated: true
                    proxy:
                      mode: internal
                      effective_mode: internal
                      effective_detail: managed_pool
                      fallback:
                        active: false
                        reason: ''
                        since: 0
                      proxy_url: managed_pool://hidden
                      proxy_fallback: internal
                      managed: true
                      last_test_at: 0
                      last_test_error: ''
                      validation_error: false
              schema:
                type: object
                example:
                  details: Proxy configurado
                  proxy:
                    mode: custom
                    effective_mode: custom
                    fallback:
                      active: false
                      reason: ''
                      since: 0
                    proxy_url: http://***:***@proxy-do-cliente.example:8080
                    proxy_fallback: internal
                    managed: false
                    last_test_at: 0
                    last_test_error: ''
                    validation_error: false
                  restart_requested: true
                properties:
                  details:
                    type: string
                    example: Proxy configurado
                  proxy:
                    type: object
                    properties:
                      mode:
                        type: string
                        enum:
                          - custom
                          - internal
                          - none
                        description: Intenção persistida do cliente após a gravação.
                      effective_mode:
                        type: string
                        enum:
                          - custom
                          - internal
                          - direct
                        description: Transporte efetivo no momento da resposta.
                      effective_detail:
                        type: string
                        enum:
                          - managed_pool
                          - internal_route
                          - relay
                        description: >-
                          Detalhe complementar do transporte efetivo. Quando não
                          há detalhe adicional, o campo é omitido.
                      fallback:
                        type: object
                        description: Estado atual da contingência.
                        properties:
                          active:
                            type: boolean
                            description: >-
                              Indica se a instância está operando em fallback
                              neste momento.
                          reason:
                            type: string
                            description: Motivo interno resumido do fallback atual.
                          since:
                            type: integer
                            description: >-
                              Timestamp Unix em milissegundos desde quando o
                              fallback atual está ativo.
                      proxy_url:
                        type: string
                        description: URL mascarada do proxy persistido.
                      proxy_fallback:
                        type: string
                        description: >-
                          Política de contingência persistida para
                          `mode=custom`.
                      managed:
                        type: boolean
                        description: Campo legado ligado ao uso da infraestrutura interna.
                      last_test_at:
                        type: integer
                        description: Timestamp do último teste/erro persistido.
                      last_test_error:
                        type: string
                        description: Último erro persistido para diagnóstico.
                      validation_error:
                        type: boolean
                        description: Indica se `last_test_error` está preenchido.
                  restart_requested:
                    type: boolean
                    description: >-
                      Indica se uma reinicialização da conexão foi solicitada
                      para aplicar o proxy.
                  rotated:
                    type: boolean
                    description: >-
                      Presente como `true` quando `rotate_now` troca o proxy
                      interno com sucesso.
        '400':
          description: Payload inválido ou falha na validação do proxy
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    example: confirm_no_proxy é obrigatório para desabilitar proxy
        '401':
          description: Token inválido ou expirado
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    example: Unauthorized
        '409':
          description: Não há proxy alternativo disponível para rotação interna
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    example: >-
                      nao foi possivel rotacionar proxy interno: nenhum proxy
                      alternativo disponível para rotação
        '500':
          description: Erro interno do servidor ao configurar o proxy
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    description: Mensagem detalhando o erro encontrado
      security:
        - token: []
components:
  securitySchemes:
    token:
      name: token
      type: apiKey
      in: header

````

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