Integrações de fluxos de trabalho de e-mail e SDKs
Explore as APIs e integrações do SendRepute para análise de e-mail, reescritas de IA pagas separadamente e ferramentas de design. Os endpoints centrais de análise, reescrita e construtor não enviam e-mail; a entrega de Campaigns deliberadamente ativada e certos adaptadores de provedores podem enviar usando seu provedor configurado. Nenhum resultado garante o posicionamento na caixa de entrada.
O pacote Node.js está disponível no npm. Outras integrações podem ser baixadas aqui ou instaladas a partir de um repositório público verificado do GitHub. Escolha uma integração, siga o seu guia e revise as permissões, os preços atuais e as configurações de falha antes de ativá-la.
Mantenha seu fluxo de trabalho de e-mail atual. Estes exemplos centrais de API apenas analisam, reescrevem ou criam conteúdo; eles nunca enviam e-mails. Separadamente, o envio de Campanhas deliberadamente habilitado e certos adaptadores de provedores podem enviar através do seu provedor configurado. Escolha uma ferramenta pela sua instalação, configuração, exemplos e limites operacionais. Os exemplos não são executados nesta página; revise as operações pagas e ações de envio separadamente.
Plugin WordPress
0.2.0
Requer WordPress 5.7+, PHP 7.4+ e OpenSSL. Carregue o ZIP através de Plugins > Adicionar Novo > Carregar Plugin e abra Configurações > SendRepute. Configure o token de cada site e o consentimento de análise paga separadamente. Evidência de ciclo de vida instalado cobre WordPress 6.8.3 com WooCommerce 10.4.3; evidência separada de plugin SMTP cobre WordPress 7.1.2 com WP Mail SMTP 4.9.0 e FluentSMTP 2.4.0.
Verifica mensagens via pre_wp_mail sem substituir o SMTP ou reescrever mensagens. O modo consultivo permite a entrega; o modo de bloqueio aplica um limite de probabilidade. A política de falha da API é configurada separadamente. Plugins que ignoram o wp_mail não são cobertos; alterações posteriores no transporte não são analisadas. O bloqueio não coloca as mensagens em fila.
A análise está desativada por padrão. Configure um token de cliente com escopo, execute o teste de conexão não pago, revise os preços e consinta explicitamente antes de ativar a análise paga. Ações manuais de IA exigem confirmação separada.
Baixar ZIP do WordPress
Repositório de código público
README completo e exemplos
Notas de segurança e limitações conhecidas
1. Instalar
Execute estes comandos a partir do diretório do WordPress com o WP-CLI disponível, ou envie o ZIP baixado através de Plugins > Adicionar Novo > Enviar Plugin e ative-o. Abra Configurações > SendRepute. Configure e ative cada site separadamente no multisite. Mantenha uma combinação WordPress/PHP suportada; uma versão mínima não é uma recomendação para executar software em fim de vida (end-of-life).
curl -fLO https://www.sendrepute.com/downloads/sendrepute-wp.zip
wp plugin install ./sendrepute-wp.zip --activate
Alternativa: instalar a partir da fonte pública
Use esta rota de código fonte em vez das instruções de download do site acima. O README do repositório explica as etapas restantes de ativação e configuração; criar um ZIP por si só não instala um plugin. Para Python, o segundo comando adiciona suporte opcional ao Django. Mantenha as credenciais em segredos do servidor e revise as notas de segurança antes de ativar recursos pagos. Apenas o Node está no npm; um repositório público no GitHub não implica publicação no WordPress.org, n8n Cloud, Packagist ou PyPI.
git clone https://github.com/sendrepute/sendrepute-wordpress.git
cd sendrepute-wordpress
python3 package.py
2. Configurar com segurança
Crie um token de cliente no servidor com os escopos classify, account:read e catalog:read, expiração e limites de gastos. Insira-o nas configurações ou carregue SENDREPUTE_API_TOKEN do seu armazenamento de segredos do servidor conforme mostrado. Tokens armazenados usam criptografia autenticada com WordPress salts e OpenSSL; reinsira-os após a rotação de salts. Execute a verificação de conexão não paga, revise os preços de classificação e, em seguida, habilite explicitamente a análise automática. Defina o modo consultivo/bloqueio, o threshold e a política independente de fail-open/fail-closed.
// wp-config.php — optional server-secret alternative to settings storage.
$sendreputeToken = getenv('SENDREPUTE_API_TOKEN');
if (is_string($sendreputeToken) && $sendreputeToken !== '') {
define('SENDREPUTE_API_TOKEN', $sendreputeToken);
}
3. Usar deliberadamente
A função abaixo usa o wp_mail normal e envia apenas quando sua aplicação a chama. Com a análise paga ativada, o plugin analisa no pre_wp_mail e então permite ou bloqueia o transporte existente. Forneça seu próprio destinatário autorizado; teste primeiro contra um coletor local de e-mail que não faça relay. Um resultado falso significa que o chamador deve tratar o envio rejeitado—ele não é enfileirado.
// Call deliberately: this sends through your existing WordPress transport.
function sendrepute_reviewed_message($recipient) {
return wp_mail(
$recipient,
'Your requested account summary',
'Here is the account summary you requested.'
);
}
O que mais ela pode fazer?
As configurações também fornecem ações manuais de reescrita por AI e geração de templates com confirmação paga separada. A exibição de preço precisa de vip:read; a reescrita precisa de rewrite; a geração precisa de ai:generate, e a geração VIP exige assinatura VIP ativa. Os resultados são texto com escape, apenas para cópia: nunca aplicados ou enviados automaticamente. Tokens existentes não ganham escopos automaticamente.
Resultados, falhas e limites
O modo de aviso (Advisory) permite a entrega; o bloqueio compara a probabilidade de spam finita ao seu limite. Timeouts e falhas de API seguem a política de falha separada, não um rótulo de spam. Bloqueios locais opacos suprimem análises repetidas por 24 horas; resultados de rede desconhecidos não são repetidos automaticamente. Os envios em si não são deduplicados. As verificações de atualização instaladas cobriram um ZIP 0.1.0 rastreado atualizado para 0.2.0, rejeição/salvamento de nonce do administrador e o caminho WooCommerce selecionado. Uma matriz separada de 40 cenários cobriu ambas as ordens de carregamento de plugins com WP Mail SMTP e FluentSMTP, incluindo To/Cc/Bcc, Reply-To, cabeçalhos, anexos, rejeição SMTP e resultados de política. Estas tuplas exatas não certificam outros CMS, versões de plugins SMTP ou provedores. Hooks que ignoram wp_mail e alterações posteriores de transporte permanecem fora de cobertura. A desativação preserva as configurações; a desinstalação remove as credenciais mesmo ao reter configurações desativadas. Remova você mesmo um token wp-config.
Adaptador de e-mail do WooCommerce
0.2.0
Incluído no mesmo ZIP do SendRepute 0.2.0 que o plugin do WordPress; não existe um add-on ou download separado para o WooCommerce. Requer os requisitos base do plugin: WordPress 5.7+, PHP 7.4+ e OpenSSL. O adaptador teve o código revisado em relação ao WooCommerce 10.4.3, não sendo certificado para todas as versões do WooCommerce ou extensões de e-mail.
A análise do WooCommerce possui seu próprio seletor de administrador e seleções exatas de tipos de e-mail integrados, todos desativados por padrão. Os controles globais de análise e paid-consent também devem estar ativados. Tipos não selecionados e definidos por extensões ignoram a análise. Cada tipo customer_* integrado selecionado é protegido e apenas consultivo: pode ser analisado, mas nunca é bloqueado. E-mails multipart selecionados falham na classificação antes de qualquer requisição paga; o modo consultivo ou fail-open preserva a entrega, enquanto o fail-closed bloqueia apenas e-mails não protegidos.
Baixar ZIP compartilhado do WordPress e WooCommerce
Repositório de código público
README completo e exemplos
Notas de segurança e limitações conhecidas
1. Instalar
Este é o mesmo ZIP instalável usado pelo guia WordPress. Instale-o uma vez; não instale um segundo add-on WooCommerce. Ative o SendRepute, depois abra Configurações > SendRepute. Mantenha o WordPress, WooCommerce, PHP e o transporte de e-mail real suportados e atualizados.
curl -fLO https://www.sendrepute.com/downloads/sendrepute-wp.zip
wp plugin install ./sendrepute-wp.zip --activate
Alternativa: instalar a partir da fonte pública
Use esta rota de código fonte em vez das instruções de download do site acima. O README do repositório explica as etapas restantes de ativação e configuração; criar um ZIP por si só não instala um plugin. Para Python, o segundo comando adiciona suporte opcional ao Django. Mantenha as credenciais em segredos do servidor e revise as notas de segurança antes de ativar recursos pagos. Apenas o Node está no npm; um repositório público no GitHub não implica publicação no WordPress.org, n8n Cloud, Packagist ou PyPI.
git clone https://github.com/sendrepute/sendrepute-wordpress.git
cd sendrepute-wordpress
python3 package.py
2. Configurar com segurança
Use um token de cliente com escopo definido a partir dos segredos do servidor ou da configuração criptografada do WordPress. Primeiro, configure a verificação de conexão não paga compartilhada, a revisão de preço atual, o consentimento pago global (paid_analysis_consent), o modo de risco, o limite e a política de falha. Depois, ative separadamente a análise do WooCommerce e selecione apenas os tipos de e-mail integrados que você revisou. Tipos definidos por extensões nunca são selecionados automaticamente.
// wp-config.php — keep the shared WordPress/WooCommerce token server-side.
$sendreputeToken = getenv('SENDREPUTE_API_TOKEN');
if (is_string($sendreputeToken) && $sendreputeToken !== '') {
define('SENDREPUTE_API_TOKEN', $sendreputeToken);
}
3. Usar deliberadamente
Continue enviando através do WooCommerce normalmente. O adaptador envolve o callback já escolhido pelo WooCommerce e preserva seus argumentos originais e transporte; ele não fornece um novo método sendMail. Se outro filtro alterar os argumentos do callback, se e-mails comuns forem aninhados durante esse callback, ou se um callback personalizado nunca chamar wp_mail, a análise é ignorada conservadoramente em vez de entrar no caminho geral pago. Teste tipos não críticos selecionados com um coletor de e-mail sem retransmissão.
Resultados, falhas e limites
E-mails de parte única selecionados seguem as políticas compartilhadas de aviso, limite e falha do WordPress, exceto que todo tipo customer_* é protegido e apenas informativo. E-mails protegidos de clientes sempre continuam após um resultado de alto risco, falha na API ou conteúdo não suportado. O WooCommerce constrói alternativas multipart após pre_wp_mail, portanto, e-mails multipart selecionados falham antes de qualquer solicitação paga em vez de serem parcialmente classificados; apenas e-mails não protegidos selecionados podem ser recusados pelo fechamento por falha (fail-closed). O contexto do callback é removido após o sucesso, falha e envios aninhados.
Backend de e-mail do Drupal
0.1.0
Requer Drupal 10.3+ ou 11.x e PHP 8.1+. Instale o ZIP como um módulo, conceda administer sendrepute apenas a administradores confiáveis, configure um nome de exibição de remetente delimitado (non-address) e selecione rotas exatas de módulo/chave de e-mail. A versão 0.1.0 suporta apenas php_mail do Drupal core; é um backend de Mail, não um provedor ou transporte substituto. Evidência de site instalado cobre as versões exatas Drupal 10.6.17 e 11.4.7 com PHP 8.4.10.
O consentimento pago e todas as rotas estão desativados por padrão. Cada rota exata utiliza o delegado fixo do núcleo php_mail, modo consultivo ou de bloqueio, uma política de falha independente de preservação ou bloqueio, limite e seleção deliberada de e-mails críticos. E-mails de conta e segurança permanecem entregáveis, a menos que essa rota exata permita explicitamente o bloqueio crítico. A mesma instância de php_mail formata e envia um corpo final escalar; saídas multipart e com anexos não são suportadas.
Baixar ZIP do Drupal
Repositório de código público
README completo e exemplos
Notas de segurança e limitações conhecidas
1. Instalar
Execute a partir da raiz do projeto Drupal ou envie o ZIP com o instalador de módulos do Drupal. O arquivo contém uma raiz de módulo sendrepute adequada para modules/contrib. Ative-o, conceda a permissão 'administer sendrepute' apenas a administradores confiáveis e abra Configuração > Sistema > SendRepute.
curl -fLO https://www.sendrepute.com/downloads/sendrepute-drupal.zip
unzip sendrepute-drupal.zip -d modules/contrib
drush en sendrepute -y
Alternativa: instalar a partir da fonte pública
Use esta rota de código fonte em vez das instruções de download do site acima. O README do repositório explica as etapas restantes de ativação e configuração; criar um ZIP por si só não instala um plugin. Para Python, o segundo comando adiciona suporte opcional ao Django. Mantenha as credenciais em segredos do servidor e revise as notas de segurança antes de ativar recursos pagos. Apenas o Node está no npm; um repositório público no GitHub não implica publicação no WordPress.org, n8n Cloud, Packagist ou PyPI.
git clone https://github.com/sendrepute/sendrepute-drupal.git
cd sendrepute-drupal
2. Configurar com segurança
Armazene um SENDREPUTE_API_TOKEN com escopo classify apenas no ambiente do processo web/PHP. Ele nunca é aceito pelo formulário ou exportado na configuração do Drupal. No formulário, insira um nome de exibição do remetente obrigatório de no máximo 320 bytes, sem endereço, colchetes angulares ou controles. Adicione uma linha de sete campos por rota exata conforme mostrado; o delegado deve ser php_mail. Escolha o modo advisory/block, política de falha preserve/block, limite e crítico sim/não. Comece com advisory, preserve e não.
export SENDREPUTE_API_TOKEN="replace-with-a-scoped-server-token"
# Enter a non-address sender display name in Configuration > System > SendRepute.
# One exact route in Configuration > System > SendRepute:
# contact|page_mail|php_mail|advisory|preserve|0.90|no
3. Usar deliberadamente
Continue chamando o gerenciador de e-mail normal do Drupal. Para uma rota que optou por participar, sendrepute_mail chama o format() do php_mail do núcleo, analisa esse corpo escalar final, aplica a política e, em seguida, chama o mail() da mesma instância em cache do php_mail. Outros IDs de delegados são rejeitados. O sistema não utiliza hook_mail_alter e não reescreve a mensagem.
Resultados, falhas e limites
Um sucesso validado bloqueia apenas no limite configurado ou acima dele no modo de bloqueio. O resultado completo da classificação aninhada e a resposta de faturamento são validados antes que a spamProbability possa afetar a entrega. Falhas de API, autenticação, saldo, limite de taxa, malformação, multipart, indicador de anexo e tamanho seguem a política de falha de rota independente, exceto e-mails críticos protegidos que continuam. A matriz instalada 10.6.17/11.4.7 cobriu a instalação e substituição de ZIP in-loco enquanto ENABLED, login real de administrador, rejeição/salvamento Form API CSRF, descoberta de plugin, opt-in de rota, classificação sintética, preservação de e-mail crítico e php_mail do core através de um coletor local. Verificações de origem de linha de base também cobrem arquivos imutáveis 10.3.0 e 11.0.0; nenhum resultado certifica cada patch posterior ou mailer contribuído. O nome de exibição configurado, assunto não vazio e corpo enquadrado por comprimento são enviados; endereços, destinatários, cabeçalhos, parâmetros e anexos são excluídos. O assunto é limitado a 998 bytes e o corpo a 256 KiB. Há uma tentativa HTTPS verificada, sem redirecionamentos, retry ou fila.
Módulo de e-mail para PrestaShop
0.1.1
A versão 0.1.1 suporta exatamente PrestaShop 9.0.0, 9.0.1, 9.0.2 e 9.0.3 com PHP 8.1–8.4. Carregue o ZIP em Módulos > Gerenciador de Módulos e configure a classificação de e-mail SendRepute. Todas as quatro versões clássicas pré-compiladas oficiais passaram na instalação isolada, na configuração de administrador autenticado e nas verificações de atualização via ZIP; suas implementações Mail::send() inalteradas também passaram na matriz offline de e-mail real. PrestaShop 8, 9.1+ e patches 9.0 posteriores não listados não são suportados.
O módulo, o consentimento pago/de conteúdo e a seleção exata de templates estão desativados por padrão. Ele analisa o assunto renderizado final e cada corpo exibido suportado sem reconstruir a mensagem Symfony. Uma mensagem contendo tanto text/plain quanto text/html é enviada em uma única requisição de classificação vinculada: a alternativa plain torna-se inerte, o HTML original é preservado e o serviço analisa cada alternativa tipada independentemente sem concatenação. O resultado utiliza o risco mais alto com as auditorias de conteúdo completas, produz uma classificação paga e nunca retorna uma pontuação de segurança parcial. O modo consultivo nunca interrompe o envio. O bloqueio por limite e o fail-closed lançam uma exceção implementando tanto a ExceptionInterface do Symfony Mailer quanto a ModuleErrorInterface do PrestaShop; em cada versão suportada, o teste instalado observou Mail::send() retornar false sem entrega SMTP. A política de falha é independente do limite de risco.
Baixar ZIP do PrestaShop
Repositório de código público
README completo e exemplos
Notas de segurança e limitações conhecidas
1. Instalar
Descarregue o ZIP 0.1.1 e utilize Módulos > Gestor de Módulos > Carregar um módulo e selecione-o. Abra Configurar para a classificação de correio SendRepute. Não force a instalação fora do intervalo exato PrestaShop 9.0.0–9.0.3: o comportamento de cancelamento e assinatura depende dos caminhos auditados Mail::send().
curl -fLO https://www.sendrepute.com/downloads/sendrepute-prestashop.zip
Alternativa: instalar a partir da fonte pública
Use esta rota de código fonte em vez das instruções de download do site acima. O README do repositório explica as etapas restantes de ativação e configuração; criar um ZIP por si só não instala um plugin. Para Python, o segundo comando adiciona suporte opcional ao Django. Mantenha as credenciais em segredos do servidor e revise as notas de segurança antes de ativar recursos pagos. Apenas o Node está no npm; um repositório público no GitHub não implica publicação no WordPress.org, n8n Cloud, Packagist ou PyPI.
git clone https://github.com/sendrepute/sendrepute-prestashop.git
cd sendrepute-prestashop
2. Configurar com segurança
Defina SENDREPUTE_API_BASE para a origem HTTPS de produção canônica do SendRepute fornecida para este módulo e SENDREPUTE_API_TOKEN para um token de servidor com escopo no ambiente PHP-FPM/servidor. A base deve ser uma origem HTTPS de DNS público sem caminhos; literais, credenciais, redirecionamentos e respostas de DNS privado são recusados. Execute a verificação de conexão de conta/preço não paga, depois ative explicitamente o módulo, o consentimento de conteúdo/pago e os nomes exatos dos modelos. Escolha aviso/bloqueio, limite e política de falha aberta/fechada de forma independente.
export SENDREPUTE_API_BASE="replace-with-the-canonical-sendrepute-https-origin"
export SENDREPUTE_API_TOKEN="replace-with-a-scoped-server-token"
3. Usar deliberadamente
Continue a utilizar o fluxo normal Mail::send do PrestaShop. O hook inicial apenas memoriza um template exato com opt-in. O hook final lê o assunto, corpo de texto e corpo HTML já renderizados pelo Symfony Email sem alterar destinatários, cabeçalhos, anexos ou transporte. Para corpos duplos, submete o texto simples inerte e o HTML original como alternativas tipadas num único pedido; a normalização independente do serviço impede que um fragmento consuma outro, retendo destinos visíveis de links e imagens HTML para auditoria. Um único corpo de texto mantém-se no caminho estreito de texto inerte, e um único corpo HTML mantém-se no caminho estreito de extração de DOM. A classificação é concluída antes de o PrestaShop criar uma mensagem separada com assinatura DKIM. A matriz de versões suportadas verificou a estrutura multipart emitida, além do hash do corpo DKIM e assinatura RSA após a classificação. O caminho de assinatura fixo do PrestaShop omite Bcc dos cabeçalhos assinados preparados e perde esse destinatário SMTP oculto; evidências de assinatura válidas, portanto, não estabelecem compatibilidade de entrega Bcc. Não combine DKIM e Bcc neste caminho suportado. Fontes de exibição não suportadas, semântica ativa, HTML ambíguo em quoted-printable ou base64, e conteúdo agregado excessivo seguem a política de falha configurada antes do pagamento. Deixe templates críticos não selecionados, a menos que aprovados deliberadamente.
Resultados, falhas e limites
O classificador aceita um corpo text/plain, um corpo text/html ou ambos como alternativas de exibição analisadas independentemente. O texto literal, entidade, conteúdo oculto e de estilo numa alternativa aceite não podem consumir ou esconder uma alternativa posterior; HTML ambíguo em quoted-printable ou base64 é rejeitado antes do pagamento. Qualquer alternativa aceite pode determinar o resultado de maior risco, enquanto as auditorias de conteúdo cobrem todas as alternativas; a classificação é cobrada apenas uma vez após a aceitação do input completo delimitado. O corpo legado obrigatório duplica exatamente a alternativa simples inerte para uma mensagem dupla, e esse duplicado mais ambas as alternativas tipadas partilham o orçamento exato de 524288-byte por pedido. Destinatários, anexos e recursos incorporados são excluídos, e a mensagem de transporte original pré-assinatura é preservada. O teste fixo de e-mail real verifica separadamente a integridade MIME/assinatura e os destinatários SMTP reais: as assinaturas DKIM permanecem válidas após a classificação, mas o caminho assinado a montante auditado não preserva os destinatários Bcc. Uma classificação validada armazena um resumo consultivo recente limitado. O modo de bloqueio apenas lança exceções no limite ou acima dele; a exceção de interface dupla sobrevive ao despacho do hook e produz false antes do transporte em todas as quatro versões instaladas. Conteúdo não suportado, erros de API e de validação seguem o estado aberto/fechado de forma independente. Uma tentativa HTTPS utiliza DNS público fixo, TLS verificado, timeouts finitos, um limite de resposta de 256 KiB, sem redirecionamentos e sem repetição. O bloqueio baseia-se na captura de exceção auditada do PrestaShop Mail::send(), e não no valor de retorno do hook final.
Adaptador Symfony Mailer
0.1.1
Requer PHP 8.1+ e destina-se apenas ao Symfony Mailer 6.4 ou 7.4; as versões exatas verificadas são 6.4.46 e 7.4.19. Não é reivindicada compatibilidade com Symfony 8.1 ou linhas não testadas. Instale o arquivo ZIP local através de um repositório de caminho do Composer; este pacote não está publicado no Packagist.
O bundle e o consentimento pago estão desativados por padrão, e apenas mensagens com o cabeçalho de opt-in exatamente configurado são elegíveis. A política de pontuação consultiva ou de bloqueio é independente da política de falha de permissão ou bloqueio. A classificação é executada no MessageEvent oficial de pré-envio; a rejeição utiliza MessageEvent::reject(). Eventos de clonagem em fila são ignorados para que o evento de transporte do worker seja o único ponto de classificação paga.
Baixar ZIP do código-fonte Symfony
Repositório de código público
README completo e exemplos
Notas de segurança e limitações conhecidas
1. Instalar
Extraia o ZIP transferido para um diretório de pacotes mantido, registe esse diretório como um repositório de caminho do Composer, exija o pacote 0.1.1 exato e registe SendRepute\Symfony\SendReputeBundle se o Flex não o fizer. O arquivo fonte é local e não publicado.
mkdir -p packages
curl -fL https://www.sendrepute.com/downloads/sendrepute-symfony.zip -o packages/sendrepute-symfony.zip
unzip packages/sendrepute-symfony.zip -d packages
composer config repositories.sendrepute path ./packages/sendrepute-symfony
composer require sendrepute/symfony:0.1.1
Alternativa: instalar a partir da fonte pública
Use esta rota de código fonte em vez das instruções de download do site acima. O README do repositório explica as etapas restantes de ativação e configuração; criar um ZIP por si só não instala um plugin. Para Python, o segundo comando adiciona suporte opcional ao Django. Mantenha as credenciais em segredos do servidor e revise as notas de segurança antes de ativar recursos pagos. Apenas o Node está no npm; um repositório público no GitHub não implica publicação no WordPress.org, n8n Cloud, Packagist ou PyPI.
git clone https://github.com/sendrepute/sendrepute-symfony.git
cd sendrepute-symfony
2. Configurar com segurança
Resolva SENDREPUTE_API_TOKEN a partir dos segredos do servidor. Mantenha enabled e paid_analysis_consent como false enquanto revê o preço atual. O modo, o limite e a política de falha são independentes. O endpoint é fixado em HTTPS verificado com prazos limitados, sem redirecionamentos ou tentativas, e um limite de resposta de 1 MiB.
send_repute:
enabled: false
paid_analysis_consent: false
api_token: '%env(SENDREPUTE_API_TOKEN)%'
mode: advisory
failure_policy: allow
spam_probability_threshold: 0.8
3. Usar deliberadamente
Adicione o cabeçalho exato de opt-in apenas aos objetos Email não críticos revistos, depois continue através do Mailer normal. A mensagem, envelope, transporte e cabeçalho não são reescritos. Para entrega via Messenger, configure o bundle em workers: eventos de clone do producer intencionalmente não são classificados.
$email->getHeaders()->addTextHeader('X-SendRepute-Classify', 'yes');
$mailer->send($email);
Resultados, falhas e limites
Exatamente um corpo em memória text/plain ou text/html é suportado. Alternativas mistas, DataParts textuais, streams ou caminhos, chaves CSS, marcação, sintaxe quoted-printable, cabeçalhos base64 ou base64 de corpo inteiro falham antes do pagamento e seguem a política de falha; conteúdo comum sem chaves permanece inalterado. Cada campo de resposta aninhado obrigatório e ramo de auditoria opcional é validado e propriedades desconhecidas são rejeitadas. O modo consultivo nunca bloqueia por pontuação; o bloqueio rejeita no limite através do evento real de transporte.
Adaptador Rails Action Mailer
0.1.0
Requer Ruby 3.2+ e foi verificado rigorosamente com as versões reais Action Mailer 7.1.6 e Mail 2.9.1; o caminho de callback também foi observado no Action Mailer 7.2.3.2. Isto não constitui uma certificação de todas as versões permitidas do Rails 7.x. Instale o ZIP da fonte local através do Bundler; não há reivindicação de publicação no RubyGems.
Ambas as comportas globais pagas estão desativadas por padrão, e cada ação de mailer deve chamar sendrepute_paid_preflight! explicitamente. O comportamento de pontuação consultiva/bloqueio e o comportamento de falha preservar/bloquear são independentes. Rotas de redefinição de senha, MFA, login, verificação, faturamento e segurança devem permanecer não selecionadas. Toda mensagem multipart e conteúdo CSS ambíguo, quoted-printable ou com aparência de base64 é rejeitado antes do pagamento; um corpo aceito de texto decodificado ou HTML é analisado sem alterar a mensagem original ou o transporte.
Baixar ZIP do código-fonte Rails
Repositório de código público
README completo e exemplos
Notas de segurança e limitações conhecidas
1. Instalar
Extraia o ZIP exatamente em vendor/sendrepute-rails, adicione a entrada do caminho local ao Gemfile, execute o Bundler no seu ambiente controlado e inclua SendRepute::Rails::Mailer em ApplicationMailer. Esta não é uma instalação via RubyGems.
# Download sendrepute-rails.zip, then extract it into vendor/sendrepute-rails.
gem "sendrepute-rails", path: "vendor/sendrepute-rails"
Alternativa: instalar a partir da fonte pública
Use esta rota de código fonte em vez das instruções de download do site acima. O README do repositório explica as etapas restantes de ativação e configuração; criar um ZIP por si só não instala um plugin. Para Python, o segundo comando adiciona suporte opcional ao Django. Mantenha as credenciais em segredos do servidor e revise as notas de segurança antes de ativar recursos pagos. Apenas o Node está no npm; um repositório público no GitHub não implica publicação no WordPress.org, n8n Cloud, Packagist ou PyPI.
git clone https://github.com/sendrepute/sendrepute-rails.git
cd sendrepute-rails
2. Configurar com segurança
Mantenha enabled e paid_consent como false até que os preços e as rotas atuais sejam revistos. Leia o token a partir do Rails credentials ou de outro segredo do servidor. Configure advisory/block, preserve/block e threshold de forma independente; os callbacks on_result e on_error não devem registar o conteúdo da mensagem, dados de autorização ou respostas completas.
SendRepute::Rails.configure do |config|
config.enabled = false
config.paid_consent = false
config.token = Rails.application.credentials.dig(:sendrepute, :api_token)
config.mode = :advisory
config.failure_policy = :preserve
config.score_threshold = 0.8
end
3. Usar deliberadamente
Chame sendrepute_paid_preflight! apenas dentro de cada action de mailer não crítica deliberadamente selecionada. Actions normais ignoram a classificação. O hook pago utiliza a rota before_deliver do Action Mailer; não é fornecido auto-opt-in global e o adaptador não reescreve a Mail::Message.
class ApplicationMailer < ActionMailer::Base
include SendRepute::Rails::Mailer
end
def newsletter
sendrepute_paid_preflight!
mail(to: params[:to], subject: "News")
end
Resultados, falhas e limites
Um corpo exibido descodificado text/plain ou text/html é suportado. Cada entrada de normalizador multipart ou ambígua falha antes do pagamento e segue a política de falha. Uma resposta aninhada tipada completa pode bloquear apenas no modo de bloqueio no ou acima do limite; o modo consultivo preserva cada pontuação. Callbacks de resultado e erro recebem dados seguros imutáveis, e exceções de callback ou throw(:abort) são capturadas localmente para que não possam terminar o modo consultivo ou a entrega de preservação. O endpoint fixo recusa redirecionamentos e tentativas e usa um prazo total limitado. Testes reais de Action Mailer 7.1.6 aprovados: 19 execuções e 59 asserções; nenhum pedido pago ou entrega real ocorreu.
Adaptador Spring JavaMailSender
0.1.1
Requer Java 17+ e tem como alvo o JavaMailSender do Spring Framework 6.2.x; a verificação exata de dependência utilizou Spring Framework 6.2.19. Não há reivindicação de Spring Boot 4 ou de versão abrangente do framework. Compile o ZIP da fonte local com Maven; não está publicado no Maven Central ou em outro registro.
O decorator, o consentimento pago, o modo consultivo e os padrões de permitir na falha são explícitos. Somente sendWithSendRepute(...) realiza análise paga antes do envio; cada sobrecarga comum de send(...) ignora a classificação e delega sem alterações. Use o send comum para e-mails críticos, a menos que esse envio individual seja selecionado deliberadamente. Alternativas MIME exibidas e suportadas são estruturadas inertemente em conjunto; conteúdo não suportado, aninhado, assinado, criptografado ou ambíguo falha antes do pagamento.
Baixar ZIP da fonte Spring Java
Repositório de código público
README completo e exemplos
Notas de segurança e limitações conhecidas
1. Instalar
Extraia o ZIP da fonte 0.1.1, execute mvn verify e instale-o apenas no seu repositório Maven local controlado. A aplicação consumidora fornece o seu JavaMailSender existente e a implementação de e-mail em tempo de execução. A verificação exata de dependências utilizou bytecode Java 17, Spring Framework 6.2.19 e as versões documentadas no README incluído.
curl -fLO https://www.sendrepute.com/downloads/sendrepute-spring-mail.zip
unzip sendrepute-spring-mail.zip
cd sendrepute-spring-mail-0.1.1
mvn verify
mvn install
Alternativa: instalar a partir da fonte pública
Use esta rota de código fonte em vez das instruções de download do site acima. O README do repositório explica as etapas restantes de ativação e configuração; criar um ZIP por si só não instala um plugin. Para Python, o segundo comando adiciona suporte opcional ao Django. Mantenha as credenciais em segredos do servidor e revise as notas de segurança antes de ativar recursos pagos. Apenas o Node está no npm; um repositório público no GitHub não implica publicação no WordPress.org, n8n Cloud, Packagist ou PyPI.
git clone https://github.com/sendrepute/sendrepute-java.git
cd sendrepute-java
2. Configurar com segurança
Construa a SendReputeConfiguration a partir de um token do lado do servidor e comutadores explícitos. Mantenha enabled e paidAnalysisConsent como false até que os preços e as chamadas selecionadas sejam revistos. As políticas de falha advisory/blocking, threshold e allow/block são independentes. O endpoint é fixado em HTTPS verificado, sem redirecionamento ou retry.
var settings = new SendReputeConfiguration(
token, false, false,
SendReputeConfiguration.Mode.ADVISORY,
SendReputeConfiguration.FailurePolicy.ALLOW,
0.80, Duration.ofSeconds(3), Duration.ofSeconds(10));
var reviewedSender = new SendReputeJavaMailSender(existingSender, settings);
3. Usar deliberadamente
Chame sendWithSendRepute(...) apenas para um SimpleMailMessage, MimeMessage ou MimeMessagePreparator individual que deva incorrer análise. Sobrecargas únicas e varargs são suportadas. Todas as sobrecargas normais de send(...) ignoram a classificação. Os Preparators são renderizados uma vez e o MIME original preparado é delegado após a policy permitir.
// Paid classification is possible only on this explicit method.
reviewedSender.sendWithSendRepute(reviewedMessage);
// Every ordinary JavaMailSender send overload bypasses classification.
reviewedSender.send(criticalMessage);
Resultados, falhas e limites
Todas as partes exibidas de texto simples e HTML suportadas são analisadas; destinatários e anexos são excluídos. A varredura é limitada a 16 níveis, 256 partes e 524,288 bytes UTF-8 exibidos. Binários inline ignorados nunca são materializados; fontes exibidas com carregamento lazy desconhecidas ou ilimitadas falham antes que um fluxo seja aberto ou uma requisição paga seja feita, e leituras de fontes suportadas são limitadas. O enquadramento de entidades numéricas mantém fragmentos inertes através da ordem do normalizador do servidor verificado. Lotes inteiros de varargs são preparados e normalizados antes da primeira requisição paga, e a inspeção não gera cabeçalhos Jakarta Mail. É necessária uma resposta aninhada recursivamente exata.
Adaptador de e-mail Magento Open Source
0.1.1
Suporta apenas Magento Open Source 2.4.7-p5 e 2.4.7-p6 com as fontes imutáveis da interface de e-mail revisadas. Testes de fixação tipados offline passaram, mas nenhuma instalação completa do Magento foi realizada; nenhuma outra versão do Magento ou Adobe Commerce é certificada. Instale o ZIP local através de um repositório de caminhos do Composer; não é um pacote da Adobe Marketplace.
O módulo, o consentimento pago e as listas de rotas permanecem desativados por padrão. Cada identificador de modelo requer duas aprovações exatas independentes; a criticidade nunca é inferida pelo seu nome. O plugin aroundSendMessage analisa no limite final de transporte sem reconstruir a mensagem. As políticas de limite consultivo/bloqueio e as políticas de falha preservar/bloquear são independentes; o bloqueio gera uma MailException visível no Magento. Múltiplas partes MIME exibidas e conteúdo ambíguo falham antes do pagamento.
Descarregar ZIP com o código-fonte do Magento
Repositório de código público
README completo e exemplos
Notas de segurança e limitações conhecidas
1. Instalar
Extraia o ZIP para um diretório de pacotes retido, registre sua raiz SendRepute_MailAdapter como um repositório de caminho do Composer, exija a versão 0.1.1 e use o processo normal do Magento de habilitar módulo e atualização de configuração. Não represente este arquivo local como um pacote do Adobe Marketplace.
mkdir -p packages/sendrepute-magento
curl -fLO https://www.sendrepute.com/downloads/sendrepute-magento.zip
unzip sendrepute-magento.zip -d packages/sendrepute-magento
composer config repositories.sendrepute path ./packages/sendrepute-magento/SendRepute_MailAdapter
composer require sendrepute/magento-mail-adapter:0.1.1
bin/magento module:enable SendRepute_MailAdapter
bin/magento setup:upgrade
Alternativa: instalar a partir da fonte pública
Use esta rota de código fonte em vez das instruções de download do site acima. O README do repositório explica as etapas restantes de ativação e configuração; criar um ZIP por si só não instala um plugin. Para Python, o segundo comando adiciona suporte opcional ao Django. Mantenha as credenciais em segredos do servidor e revise as notas de segurança antes de ativar recursos pagos. Apenas o Node está no npm; um repositório público no GitHub não implica publicação no WordPress.org, n8n Cloud, Packagist ou PyPI.
git clone https://github.com/sendrepute/sendrepute-magento.git
cd sendrepute-magento
2. Configurar com segurança
Configure SENDREPUTE_API_TOKEN apenas no ambiente do servidor PHP-FPM e CLI. Em Stores > Configuration > Services > SendRepute, mantenha o módulo e o consentimento pago desativados inicialmente. Adicione cada identificador exato de modelo a ambas as listas independentes de aprovação de rota; nomes, incluindo nomes numéricos, nunca inferem criticalidade. Configure o comportamento de aviso/bloqueio, limiar e preservação/bloqueio em caso de falha separadamente.
export SENDREPUTE_API_TOKEN="replace-with-a-scoped-server-token"
# Then configure Stores > Configuration > Services > SendRepute.
3. Usar deliberadamente
Continue usando o fluxo normal de template e transporte do Magento. A correlação de rota registra o identificador exato e a loja selecionada através do TransportBuilder, enquanto o plugin aroundSendMessage final lê as interfaces oficiais de email tipado e MIME antes de chamar o mesmo transporte. O estado do construtor é limpo em finally, e as correlações de construtor/mensagem usam entradas WeakMap com chave de objeto para que um transporte construído abandonado não possa deixar uma autorização de ID de objeto numérico reutilizável. O adaptador não fornece um novo método de envio nem altera a mensagem.
Resultados, falhas e limites
Apenas uma parte MIME exibida e suportada é aceita; anexos são preservados, mas excluídos da análise. Múltiplas partes exibidas, codificações de transferência ou charsets não suportados, streams, MIME aninhado e texto normalizador ambíguo falham antes do pagamento. Uma requisição HTTPS verificada possui prazos delimitados e tamanho de resposta limitado, sem tentativas de retry ou redirecionamento. Um resultado aninhado válido pode bloquear no limiar definido; a configuração de falha com bloqueio lança uma MailException do Magento.
Adaptador MailKit para .NET
0.1.0
Requer .NET 8 e evidência exata de dependência para MailKit/MimeKit 4.18.0. Trata-se de um wrapper explícito em torno de um IMailTransport pertencente à aplicação, não sendo um hook global, cliente SMTP ou transporte substituto. Compile ou referencie o ficheiro fonte ZIP local; nenhuma publicação no NuGet é reivindicada.
O adaptador e o consentimento pago vêm desativados por padrão; o modo consultivo e a preservação de envio são padrões independentes. Chamadas para AnalyzeAsync, AnalyzeThenSend ou AnalyzeThenSendAsync são explícitas. E-mails críticos de segurança/conta precisam de uma categoria e consentimento separados por chamada. Cada alternativa exibida em text/plain ou text/html suportada é enquadrada de forma inerte em uma única requisição limitada; conteúdos não suportados, aninhados, assinados ou criptografados falham antes do pagamento. O MimeMessage original e o token de cancelamento chegam ao transporte existente apenas após a permissão da política.
Baixar código-fonte ZIP do .NET MailKit
Repositório de código público
README completo e exemplos
Notas de segurança e limitações conhecidas
1. Instalar
Extraia o ZIP fonte e referencie src/SendRepute.MailKit/SendRepute.MailKit.csproj a partir do projeto .NET 8 consumidor. O comando restore obtém MailKit/MimeKit 4.18.0. Este pacote de código-fonte é local e não publicado; não se trata de uma instalação via NuGet.
curl -fLO https://www.sendrepute.com/downloads/sendrepute-mailkit.zip
unzip sendrepute-mailkit.zip
dotnet add reference ./sendrepute-mailkit-0.1.0/src/SendRepute.MailKit/SendRepute.MailKit.csproj
Alternativa: instalar a partir da fonte pública
Use esta rota de código fonte em vez das instruções de download do site acima. O README do repositório explica as etapas restantes de ativação e configuração; criar um ZIP por si só não instala um plugin. Para Python, o segundo comando adiciona suporte opcional ao Django. Mantenha as credenciais em segredos do servidor e revise as notas de segurança antes de ativar recursos pagos. Apenas o Node está no npm; um repositório público no GitHub não implica publicação no WordPress.org, n8n Cloud, Packagist ou PyPI.
git clone https://github.com/sendrepute/sendrepute-dotnet.git
cd sendrepute-dotnet
2. Configurar com segurança
Envolva o IMailTransport de propriedade do aplicativo existente com o SendReputeMailAdapter. Leia o API token da configuração do servidor e mantenha Enabled e PaidAnalysisConsent como false até que sejam revisados. As configurações de limite de aviso/bloqueio e preservação/bloqueio em caso de falha são independentes. O endpoint, o piso TLS, o comportamento de tentativa única, os prazos e os limites de 1 MiB são fixos.
var options = new SendReputeOptions {
Enabled = false,
PaidAnalysisConsent = false,
ApiToken = configuration["SENDREPUTE_API_KEY"]!,
Enforcement = EnforcementPolicy.Advisory,
OnFailure = FailurePolicy.PreserveSend,
SpamProbabilityThreshold = 0.80
};
var adapter = new SendReputeMailAdapter(existingTransport, new SendReputeClient(options), options);
3. Usar deliberadamente
Invoque AnalyzeAsync apenas para análise, ou AnalyzeThenSend e AnalyzeThenSendAsync para comportamento explícito de pré-envio. Nenhum caminho de correio comum ou global é interceptado. Passe o consentimento pago e a categoria da mensagem em cada operação selecionada; e-mails críticos de segurança/conta exigem a configuração separada de consentimento crítico.
await adapter.AnalyzeThenSendAsync(message, new AnalysisConsent {
PaidAnalysisConsent = true,
Category = MessageCategory.Ordinary
}, cancellationToken);
Resultados, falhas e limites
A decodificação real do MimeKit coleta todas as alternativas suportadas de plain text e HTML exibidas em um enquadramento inerte, excluindo destinatários e anexos. O enquadramento externo não-base64 e as entidades decodificadas tardiamente neutralizam chaves CSS, texto quoted-printable, cabeçalhos base64, base64 de corpo inteiro e marcações antes da normalização do serviço. Conteúdo exibido não suportado, aninhado, assinado ou criptografado falha antes do pagamento. Cada campo de resposta obrigatório é tipificado; o flaggedTermCount opcional deve ser um número inteiro não negativo e o contentAudit opcional é validado total e recursivamente contra o contrato público. O MimeMessage original exato e o token de cancelamento alcançam o transporte fornecido apenas quando as políticas independentes de pontuação e falha permitem.
Análise manual de rascunhos no Zapier
0.2.0
Receita manual do Zapier para exibir análise paga de exatamente três strings de rascunho selecionadas pelo proprietário. Não é um aplicativo Zapier da SendRepute, listagem de marketplace, artefato de importação, adaptador de pré-envio, remetente, rota de permissão/bloqueio ou classificador de mensagem inteira. O Zapier Webhooks usa um proxy HTTPS limitado operado pelo proprietário porque o token SendRepute não deve entrar no Zap.
Duas constantes em tempo de compilação têm como padrão false antes do HTTP. O Zap mapeia apenas o nome de exibição do remetente, o assunto e o corpo, posta JSON para o design de proxy do proprietário incluído, valida completamente a resposta aninhada e, em seguida, exibe os campos de aviso e faturamento em uma etapa de revisão privada. Não deve adicionar um remetente, imposição de Paths, Autoreplay ou rota de preservação na falha; etapas de Code ou Webhook com falha são interrompidas.
Baixar ZIP da receita para Zapier e Make
Repositório de código público
README completo e exemplos
Notas de segurança e limitações conhecidas
1. Instalar
Baixe e extraia o código-fonte da receita 0.2.0 compartilhada. Leia o guia do Zapier incluído e implante o proxy Node de loopback incluído apenas atrás de um proxy reverso HTTPS gerenciado pelo proprietário. Este pacote não o implanta. Não existe um aplicativo SendRepute no Zapier ou artefato Zap importável.
curl -fLO https://www.sendrepute.com/downloads/sendrepute-automation-recipes.zip
unzip sendrepute-automation-recipes.zip
cd sendrepute-automation-recipes
Alternativa: instalar a partir da fonte pública
Use esta rota de código fonte em vez das instruções de download do site acima. O README do repositório explica as etapas restantes de ativação e configuração; criar um ZIP por si só não instala um plugin. Para Python, o segundo comando adiciona suporte opcional ao Django. Mantenha as credenciais em segredos do servidor e revise as notas de segurança antes de ativar recursos pagos. Apenas o Node está no npm; um repositório público no GitHub não implica publicação no WordPress.org, n8n Cloud, Packagist ou PyPI.
git clone https://github.com/sendrepute/sendrepute-automation.git
cd sendrepute-automation
2. Configurar com segurança
Mantenha o Zap desligado. Na fonte exata do Code de preflight, ENABLED e PAID_CONSENT permanecem ambos como false até que o uso pago seja revisado. O proxy do proprietário armazena o SENDREPUTE_API_TOKEN; o Zap recebe apenas uma credencial revogável separadamente de SENDREPUTE_PROXY_CREDENTIALS. Editores e o histórico de tarefas podem expô-la, portanto, restrinja, rotacione e revogue-a. Configure limites de token-bucket e simultaneidade por credencial, limites globais de conexão/simultaneidade, um orçamento diário fixo definido pelo proprietário para chamadas pagas, limites restritivos de gastos upstream e controles correspondentes de tamanho/taxa/prazo no terminador TLS. Não ative o Autoreplay.
// In zapier/preflight.js; review charges before changing either literal.
const ENABLED = false;
const PAID_CONSENT = false;
3. Usar deliberadamente
Construa as etapas manualmente: rascunho de trigger; mapeamento de código preflight apenas para sender, subject e body; Webhooks POST com linhas JSON para o proxy do proprietário; código de response-validation; exibição de revisão privada. Nunca interpole manualmente JSON bruto. Exiba apenas requestId, model, label, spamProbability e faturamento; não adicione uma ação de mail ou decisão de Paths.
{
"sender": "Mapped draft sender display name",
"subject": "Mapped draft subject",
"body": "Mapped draft body"
}
Resultados, falhas e limites
A receita analisa apenas as três strings mapeadas; MIME não mapeado, alternativas HTML, anexos e eventual conteúdo de saída permanecem não analisados. O preflight conservador rejeita gatilhos conhecidos do normalizador, mas não prova a cobertura de toda a mensagem. Os limites de taxa, simultaneidade e orçamento diário do proxy rejeitam antes do upstream, e a reserva do orçamento persiste antes da tentativa paga; execute um processo de proxy por arquivo de orçamento. O proxy faz uma única tentativa limitada em HTTPS fixo. Qualquer resposta exata não-200 ou incompleta gera um erro e para; não há preservação, Resume ou resultado substituto.
Criar análise manual de rascunho no Make
0.2.0
Instruções manuais de cenário Make para exibir análise paga de exatamente três strings de rascunho selecionadas. Não é um blueprint, um app SendRepute aprovado, um remetente de e-mail, uma rota de execução ou uma afirmação sobre MIME não mapeado, HTML, anexos ou eventual conteúdo de saída. O token de portador pertence apenas ao chaveiro seguro do Make HTTP.
Os booleanos persistidos enabled e paidConsent têm como padrão false e um filtro AND interrompe antes do HTTP. O JSON é produzido pelo módulo JSON do Make e enviado uma única vez pelo módulo HTTP com redirecionamentos e tentativas desativados. Um filtro de resposta é apenas uma proteção de exibição, não uma validação completa ou permissão para enviar. Falhas de HTTP usam Break, nunca Resume ou substituem a saída.
Fazer download do ZIP da receita Zapier e Make
Repositório de código público
README completo e exemplos
Notas de segurança e limitações conhecidas
1. Instalar
Descarregue e extraia a fonte da receita 0.2.0 partilhada, depois siga o guia Make incluído para construir os módulos nativos atuais manualmente. Não é reivindicado nenhum blueprint, aplicação de marketplace ou formato de importação. Mantenha o agendamento de cenários desligado enquanto testa contra um mock endpoint.
curl -fLO https://www.sendrepute.com/downloads/sendrepute-automation-recipes.zip
unzip sendrepute-automation-recipes.zip
cat sendrepute-automation-recipes/make/README.md
Alternativa: instalar a partir da fonte pública
Use esta rota de código fonte em vez das instruções de download do site acima. O README do repositório explica as etapas restantes de ativação e configuração; criar um ZIP por si só não instala um plugin. Para Python, o segundo comando adiciona suporte opcional ao Django. Mantenha as credenciais em segredos do servidor e revise as notas de segurança antes de ativar recursos pagos. Apenas o Node está no npm; um repositório público no GitHub não implica publicação no WordPress.org, n8n Cloud, Packagist ou PyPI.
git clone https://github.com/sendrepute/sendrepute-automation.git
cd sendrepute-automation
2. Configurar com segurança
Crie variáveis persistentes do tipo boolean em Tools denominadas enabled=false e paidConsent=false, seguidas por um filtro AND que exija que ambas sejam true. Utilize JSON > Create JSON exatamente para sender, subject e body. Armazene o token bearer SendRepute apenas no keychain seguro da aplicação HTTP; cenários exportados não devem conter credenciais.
Tools variables: enabled = false; paidConsent = false
Filter: enabled = true AND paidConsent = true
HTTP credential: secure keychain; Authorization header
Body type: Raw; Content type: application/json; map serialized JSON
Follow redirect: No; Timeout: 10 seconds; no retry
Response filter: Minimal display guard
3. Usar deliberadamente
Configure um HTTP POST para a URL fixa classify. Selecione o tipo de Body como Raw e o controle de content-type application/json sem adicionar um cabeçalho de texto livre conflitante, então mapeie a saída serializada de JSON > Create JSON. Habilite a resposta analisada (parsed response), desabilite redirecionamentos, defina um timeout de 10 segundos e não adicione repetidor ou retentativa automática. Exija o limite de resposta de 1 MiB do módulo; se não estiver disponível, use em vez disso um proxy limitado controlado pelo proprietário. Adicione apenas uma exibição de revisão privada após o Minimal display guard—nunca um roteador de remetente ou de permitir/bloquear.
{
"sender": "Mapped draft sender display name",
"subject": "Mapped draft subject",
"body": "Mapped draft body"
}
Resultados, falhas e limites
Apenas as strings mapeadas são analisadas; a normalização não é idêntica a um e-mail original ou de saída. O filtro de resposta verifica apenas o status e a presença do resultado principal/faturamento e explicitamente não é uma validação completa de schema ou imposição. Erros de HTTP usam Break para que ações posteriores não sejam executadas; nunca use Resume, saída fabricada ou uma rota de preservação de falhas.
SDK Node.js
0.1.1
SDK apenas para servidor para Node.js 18.17+. Instale @sendrepute/node a partir do npm ou use o tarball para download. O adaptador Nodemailer opcional preserva seu transporte existente. Defina uma chave de API com escopo e uma URL base da API explícita no ambiente do seu servidor, nunca no código do navegador.
Registre createSendReputePlugin no estágio de stream apenas após revisar os preços e habilitar deliberadamente o consentimento de análise paga. O modo consultivo relata descobertas sem bloquear a entrega. O modo de bloqueio impõe o spamProbabilityThreshold; onApiFailure escolhe allow ou block, enquanto uma recusa por alteração de preço sempre bloqueia a entrega. A classificação é uma operação de API paga.
Baixar tarball do Node.js
Repositório de código público
README completo e exemplos
Notas de segurança e limitações conhecidas
Ver pacote npm verificado
1. Instalar
O pacote npm verificado é @sendrepute/node versão 0.1.1; fixe as instalações do registro em @sendrepute/node@0.1.1. O tarball do site e o repositório público fixado fornecem o código-fonte e o build da versão 0.1.1. Nodemailer é opcional e necessário apenas para o adaptador de transporte. O SDK suporta requisições de API de cliente tipadas para conta, catálogo, classificação, AI e builders. Utilize-o em um servidor Node.js, nunca em um bundle de navegador.
npm install @sendrepute/node nodemailer
Alternativa: instalar a partir da fonte pública
Use esta rota de código fonte em vez das instruções de download do site acima. O README do repositório explica as etapas restantes de ativação e configuração; criar um ZIP por si só não instala um plugin. Para Python, o segundo comando adiciona suporte opcional ao Django. Mantenha as credenciais em segredos do servidor e revise as notas de segurança antes de ativar recursos pagos. Apenas o Node está no npm; um repositório público no GitHub não implica publicação no WordPress.org, n8n Cloud, Packagist ou PyPI.
npm install @sendrepute/node@0.1.1
npm install nodemailer
2. Configurar com segurança
Injete SENDREPUTE_API_KEY do seu armazenamento de segredos do servidor e defina a URL base explícita abaixo para a API de cliente hospedada. Não cole segredos em comandos, arquivos de origem ou logs. Conceda apenas os escopos que suas operações exigem. A configuração usa um transporte de renderização local, não SMTP; maxRetries está definido como zero aqui para tornar as tentativas pagas deliberadas.
export SENDREPUTE_API_BASE_URL=https://www.sendrepute.com/api
Configuração do Nodemailer
Este exemplo configura um transporte de renderização local e não chama sendMail. O envio através do plugin configurado realiza uma análise paga. Substitua o transporte local pelo seu transporte SMTP existente apenas quando estiver pronto.
import nodemailer from "nodemailer";
import { SendReputeClient } from "@sendrepute/node";
import { createSendReputePlugin } from "@sendrepute/node/nodemailer";
const apiKey = process.env.SENDREPUTE_API_KEY;
const baseUrl = process.env.SENDREPUTE_API_BASE_URL;
if (!apiKey || !baseUrl) {
throw new Error("SENDREPUTE_API_KEY and SENDREPUTE_API_BASE_URL are required");
}
const client = new SendReputeClient({ apiKey, baseUrl, maxRetries: 0 });
const transporter = nodemailer.createTransport({
streamTransport: true,
buffer: true,
newline: "unix",
});
transporter.use("stream", createSendReputePlugin({
client,
policy: {
paidAnalysisConsent: true,
mode: "blocking",
spamProbabilityThreshold: 0.85,
onApiFailure: "block",
},
}));
3. Usar deliberadamente
Use o cliente da configuração acima. Leia a conta e os preços atuais antes de exibir uma ação de consentimento. Invoque classifyAfterConsent apenas a partir de uma ação de servidor autenticada após a confirmação; ele retorna a classificação tipada e a resposta de faturamento. O envio através do plugin Nodemailer configurado também é uma ação de classificação paga. O adaptador exige paidAnalysisConsent: true e rejeita qualquer outro valor antes do registro; defina-o somente após a autorização.
// Uses client from the setup above; nothing calls this function automatically.
async function classifyAfterConsent({ sender, subject, body, confirmed }) {
if (confirmed !== true) throw new Error("Paid consent required");
return client.request("classifyCustomerEmail", { body: { sender, subject, body } });
}
async function readAccountAndPricing() {
return Promise.all([
client.request("customerGetAccount", {}),
client.request("customerGetPricingSettings", {}),
]);
}
Construtores VIP padrão e nativos
O construtor padrão gratuito importa, valida, compila e exporta MJML como HTML, MJML ou um ZIP de ambos. O construtor VIP nativo separado usa seu próprio formato de documento, não MJML: suas operações de importação, validação, compilação e exportação exigem uma assinatura ativa e um direito de acesso aberto e proprietário, e seu ZIP contém três variantes de HTML CSS. A geração opcional por IA é paga separadamente, produzindo um design editável em MJML padrão ou VIP nativo; mostre o preço efetivo atual e passe o expectedPriceMillicents confirmado, nunca um preço fixo no código. As respostas ZIP contêm archiveBase64, não um campo html: decodeExportBytes retorna bytes para sua aplicação salvar. Estes endpoints de processamento não buscam ativos, não persistem designs nem enviam e-mail.
import { decodeExportBytes } from "@sendrepute/node";
async function exportStandardZip(mjml) {
const exported = await client.request("customerStandardBuilderExport", {
body: { mjml, format: "zip", filename: "newsletter.zip" },
});
return decodeExportBytes(exported);
}
async function generateNativeAfterConsent(prompt, expectedPriceMillicents, confirmed) {
if (confirmed !== true) throw new Error("Paid consent required");
return client.request("customerCreateVipEmailTemplate", {
body: { prompt, expectedPriceMillicents },
});
}
O que mais ela pode fazer?
IDs de operação gerados cobrem leituras de conta e preços, classificação e edições manuais, reescrita por AI/geração de templates, planos/status/compras VIP, templates nativos/direitos de acesso e importação/exportação Standard/nativa sem estado. Consulte os exemplos de origem e a referência da API do cliente para cada tipo de solicitação, escopo necessário e preço atual. Leituras de catálogo não compram acesso. Novas capacidades pagas exigem tokens com escopo deliberado e confirmação explícita na UI.
Resultados, falhas e limites
SendReputeError expõe status, code e requestId; retenha apenas esses metadados operacionais seguros. Nunca registre corpos, prompts, cabeçalhos ou respostas completas. AbortSignal cancela o trabalho; timeoutMs aplica-se por tentativa. Tentativas limitadas (retries) reconhecem a operação e a proteção de recebimento é limitada no tempo, não uma cobrança de exatamente-uma-vez ilimitada. O modo Advisory Nodemailer relata sem bloquear; o bloqueio usa spamProbabilityThreshold e onApiFailure independentemente. Preserve e teste seu transporte real separadamente.
import { SendReputeError } from "@sendrepute/node";
async function readAccountSafely() {
try {
return await client.request("customerGetAccount", {});
} catch (error) {
if (error instanceof SendReputeError) {
console.error({
status: error.status, code: error.code, requestId: error.requestId,
});
}
throw error;
}
}
Referência de API e métodos
O SendReputeClient requer apiKey e baseUrl; o timeoutMs opcional tem o valor padrão de 30000 (máximo 300000), o maxRetries tem o valor padrão de 2 (intervalo 0–10), e o fetch aceita uma implementação de servidor compatível. O método request(operationId, input, { signal }) retorna a resposta tipada da operação; o input contém os campos de corpo, caminho e/ou consulta. Configurações inválidas geram TypeError; falhas na API utilizam SendReputeError com status, code, requestId e retryAfterMs. O decodeExportBytes converte uma exportação ZIP para Uint8Array e rejeita entradas que não sejam ZIP ou base64 inválido. OperationInput, OperationResponse e os tipos de esquema gerados são exportados para chamadores TypeScript.
Alternativa: envolver um transporte Nodemailer de baixo nível
createSendReputeTransport(existingTransport, options) envolve um objeto de transporte existente com os métodos send, e opcionalmente close e verify; não é um transportador sendMail. Escolha este ou createSendReputePlugin, não ambos, para evitar análise dupla. Ambos aceitam client e policy, além dos opcionais model, sender string/resolver, signal e onDiagnostic. Callbacks de diagnóstico não podem alterar a entrega. Os códigos de SendReputeNodemailerError distinguem política/mensagem inválida, conteúdo não suportado, bloqueios de spam e falhas de API. O pacote npm 0.1.1 publicado e o download 0.1.1 do site combinam todas as alternativas text/plain e text/html exibidas em memória em uma única requisição de classificação limitada; no modo de bloqueio, eles rejeitam alternativas exibidas não suportadas. Mensagens Raw, streams, paths e URLs permanecem não suportados.
import { createSendReputeTransport } from "@sendrepute/node/nodemailer";
function wrapExistingTransport(existingTransport) {
return createSendReputeTransport(existingTransport, {
client,
policy: {
paidAnalysisConsent: true,
mode: "advisory",
spamProbabilityThreshold: 0.85,
onApiFailure: "block",
},
onDiagnostic(diagnostic) {
console.info(diagnostic.kind, diagnostic.action);
},
});
}
Todas as 49 operações da API do cliente
Expanda uma operação para ver seu tipo exato de entrada do SDK, tipo de retorno, escopo e status HTTP documentados. O link do esquema abre seus parâmetros completos, campos de resposta e exemplos na referência da API do cliente. Estes wrappers usam o cliente configurado acima; a confirmação é necessária e nada é executado automaticamente. Operações de leitura não autorizam compras. Mutações, pagamentos, fechamento de acesso e IA paga exigem a ação deliberada correspondente na conta.
Cotar uma análise de insights agregados de campanha
POST /v1/campaign-insights/quote
Escopo necessário: ai:generate
Entrada: { body: CustomerCampaignInsightsQuoteInput; }
Retornos: CustomerCampaignInsightsQuote
Status HTTP documentados: 200, 400, 401, 403, 429, 503
Parâmetros, esquemas e exemplos HTTP
// The configured server-side client needs ai:generate scope.
// A quote is free; it does not authorize or start paid analysis.
const quote = await client.request("customerQuoteCampaignInsights", { body: {} });
// quote.priceMillicents: 10000 (USD 0.10) regular, 5000 (USD 0.05) active VIP.
// The quoted rate can change; obtain fresh consent before analysis.
Analisar métricas agregadas de entrega de campanha com IA
POST /v1/campaign-insights/analyze
Escopo necessário: ai:generate
Entrada: { body: CustomerCampaignInsightsAnalyzeInput; }
Retornos: CustomerCampaignInsightsAnalysis
Status HTTP documentados: 200, 400, 401, 402, 403, 409, 413, 429, 502, 503
Parâmetros, esquemas e exemplos HTTP
import { randomUUID } from "node:crypto";
import type { CustomerCampaignInsightsMetrics } from "@sendrepute/node";
async function analyzeReviewedAggregate(
metrics: CustomerCampaignInsightsMetrics,
paidConsent: boolean,
) {
if (paidConsent !== true) throw new Error("Explicit price consent required");
// Aggregate counts/rates only: never include campaign IDs, contacts,
// message bodies or individual events. Requires ai:generate scope.
const quote = await client.request("customerQuoteCampaignInsights", { body: {} });
const body = {
analysisId: randomUUID(), // Persist this opaque ID and exact body for safe replay.
expectedPriceMillicents: quote.priceMillicents,
consent: true as const,
metrics,
};
// USD 0.10 regular or USD 0.05 active VIP; no automatic retry on a paid request.
// 409 PRICE_CHANGED requires a new quote and fresh consent, not blind retry.
// Aggregate input and result expire after 30 days.
return client.request("customerAnalyzeCampaignInsights", { body });
}
Listar modelos de classificação da API do cliente
GET /v1/models
Escopo necessário: models:read
Entrada: Record<string, never>
Retornos: CustomerApiModelsResponse
Status HTTP documentados: 200, 401, 403, 429, 503
Parâmetros, esquemas e exemplos HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function getCustomerApiModels(
input: OperationInput<"getCustomerApiModels">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"getCustomerApiModels">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("getCustomerApiModels", input, { signal });
}
Obter uso e limites da API do cliente
GET /v1/usage
Escopo necessário: usage:read
Entrada: Record<string, never>
Retornos: CustomerApiUsageResponse
Status HTTP documentados: 200, 401, 403, 429, 503
Parâmetros, esquemas e exemplos HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function getCustomerApiUsage(
input: OperationInput<"getCustomerApiUsage">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"getCustomerApiUsage">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("getCustomerApiUsage", input, { signal });
}
Classificar um e-mail do cliente
POST /v1/classify
Escopo necessário: classify
Entrada: { body: CustomerClassificationInput; }
Retornos: CustomerClassificationResponse
Status HTTP documentados: 200, 400, 401, 402, 403, 409, 413, 429, 503
Parâmetros, esquemas e exemplos HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function classifyCustomerEmail(
input: OperationInput<"classifyCustomerEmail">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"classifyCustomerEmail">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("classifyCustomerEmail", input, { signal });
}
Obter a conta atual e o saldo
GET /v1/account
Escopo necessário: account:read
Entrada: Record<string, never>
Retornos: Account
Status HTTP documentados: 200, 400, 401, 403, 404, 429, 503
Parâmetros, esquemas e exemplos HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerGetAccount(
input: OperationInput<"customerGetAccount">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerGetAccount">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerGetAccount", input, { signal });
}
Obter o link de indicação da conta atual e atividade de recompensas
GET /v1/account/referrals
Escopo necessário: account:read
Entrada: { query?: { page?: number; pageSize?: number; }; }
Retornos: ReferralDashboard
Status HTTP documentados: 200, 400, 401, 403, 404, 429, 503
Parâmetros, esquemas e exemplos HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerGetAccountReferrals(
input: OperationInput<"customerGetAccountReferrals">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerGetAccountReferrals">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerGetAccountReferrals", input, { signal });
}
Listar o livro-razão de créditos da conta atual
GET /v1/account/ledger
Escopo necessário: billing:read
Entrada: { query?: { kind?: "usage" | "payments"; limit?: number; offset?: number; }; }
Retornos: Array<CreditLedgerEntry>
Status HTTP documentados: 200, 400, 401, 403, 404, 429, 503
Parâmetros, esquemas e exemplos HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerGetCreditLedger(
input: OperationInput<"customerGetCreditLedger">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerGetCreditLedger">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerGetCreditLedger", input, { signal });
}
Listar faturas de Bitcoin da conta atual
GET /v1/payments/invoices
Escopo necessário: billing:read
Entrada: { query?: { limit?: number; offset?: number; }; }
Retornos: Array<BitcoinInvoice>
Status HTTP documentados: 200, 400, 401, 403, 404, 429, 503
Parâmetros, esquemas e exemplos HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerListPaymentInvoices(
input: OperationInput<"customerListPaymentInvoices">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerListPaymentInvoices">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerListPaymentInvoices", input, { signal });
}
Criar uma fatura de depósito em Bitcoin denominada em USD
POST /v1/payments/invoices
Escopo necessário: billing:write
Entrada: { body: InvoiceInput; }
Retornos: BitcoinInvoice
Status HTTP documentados: 201, 400, 401, 402, 403, 404, 409, 413, 429, 503
Parâmetros, esquemas e exemplos HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerCreatePaymentInvoice(
input: OperationInput<"customerCreatePaymentInvoice">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerCreatePaymentInvoice">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerCreatePaymentInvoice", input, { signal });
}
Ocultar uma fatura de Bitcoin não paga
DELETE /v1/payments/invoices/{invoiceId}
Escopo necessário: billing:write
Entrada: { path: { invoiceId: string; }; }
Retornos: undefined
Status HTTP documentados: 204, 400, 401, 402, 403, 404, 409, 413, 429, 503
Parâmetros, esquemas e exemplos HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerDeletePaymentInvoice(
input: OperationInput<"customerDeletePaymentInvoice">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerDeletePaymentInvoice">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerDeletePaymentInvoice", input, { signal });
}
GET /payments/methods
GET /v1/payments/methods
Escopo necessário: billing:read
Entrada: Record<string, never>
Retornos: Array<PaymentMethod>
Status HTTP documentados: 200, 400, 401, 403, 404, 429, 503
Parâmetros, esquemas e exemplos HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerListPaymentMethods(
input: OperationInput<"customerListPaymentMethods">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerListPaymentMethods">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerListPaymentMethods", input, { signal });
}
Obter a oferta de bônus de depósito em Bitcoin atualmente ativa
GET /v1/payments/deposit-offer
Escopo necessário: billing:read
Entrada: Record<string, never>
Retornos: DepositBonusOffer | null
Status HTTP documentados: 200, 400, 401, 403, 404, 429, 503
Parâmetros, esquemas e exemplos HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerGetActiveDepositOffer(
input: OperationInput<"customerGetActiveDepositOffer">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerGetActiveDepositOffer">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerGetActiveDepositOffer", input, { signal });
}
Atualizar confirmações das faturas da conta atual
POST /v1/payments/refresh
Escopo necessário: billing:write
Entrada: Record<string, never>
Retornos: Array<BitcoinInvoice>
Status HTTP documentados: 200, 400, 401, 402, 403, 404, 409, 413, 429, 503
Parâmetros, esquemas e exemplos HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerRefreshMyPayments(
input: OperationInput<"customerRefreshMyPayments">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerRefreshMyPayments">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerRefreshMyPayments", input, { signal });
}
Obter preços públicos atuais de análise e edição
GET /v1/pricing
Escopo necessário: catalog:read
Entrada: Record<string, never>
Retornos: PricingSettings
Status HTTP documentados: 200, 400, 401, 403, 404, 429, 503
Parâmetros, esquemas e exemplos HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerGetPricingSettings(
input: OperationInput<"customerGetPricingSettings">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerGetPricingSettings">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerGetPricingSettings", input, { signal });
}
Obter a cotação pública VIP atual e comparação de preços
GET /v1/vip/plans
Escopo necessário: catalog:read
Entrada: Record<string, never>
Retornos: VipPlanQuote
Status HTTP documentados: 200, 400, 401, 403, 404, 429, 503
Parâmetros, esquemas e exemplos HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerGetVipPlans(
input: OperationInput<"customerGetVipPlans">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerGetVipPlans">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerGetVipPlans", input, { signal });
}
GET /vip
GET /v1/vip
Escopo necessário: vip:read
Entrada: Record<string, never>
Retornos: VipState
Status HTTP documentados: 200, 400, 401, 403, 404, 429, 503
Parâmetros, esquemas e exemplos HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerGetVip(
input: OperationInput<"customerGetVip">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerGetVip">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerGetVip", input, { signal });
}
POST /vip/purchase
POST /v1/vip/purchase
Escopo necessário: vip:purchase
Entrada: { body: CustomerVipPurchaseInput; }
Retornos: VipPurchaseResult
Status HTTP documentados: 200, 400, 401, 402, 403, 404, 409, 413, 429, 503
Parâmetros, esquemas e exemplos HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerPurchaseVip(
input: OperationInput<"customerPurchaseVip">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerPurchaseVip">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerPurchaseVip", input, { signal });
}
Cotar uma edição e verificar novamente em relação a uma classificação salva
POST /v1/rewrite/quote
Escopo necessário: rewrite
Entrada: { body: EditQuoteInput; }
Retornos: EditQuote
Status HTTP documentados: 200, 400, 401, 402, 403, 404, 409, 413, 429, 503
Parâmetros, esquemas e exemplos HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerQuoteClassificationEdit(
input: OperationInput<"customerQuoteClassificationEdit">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerQuoteClassificationEdit">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerQuoteClassificationEdit", input, { signal });
}
Cotar uma edição e verificar novamente em relação a uma classificação salva
POST /v1/classify/edit/quote
Escopo necessário: classify
Entrada: { body: EditQuoteInput; }
Retornos: EditQuote
Status HTTP documentados: 200, 400, 401, 402, 403, 404, 409, 413, 429, 503
Parâmetros, esquemas e exemplos HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerQuoteManualClassificationEdit(
input: OperationInput<"customerQuoteManualClassificationEdit">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerQuoteManualClassificationEdit">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerQuoteManualClassificationEdit", input, { signal });
}
Classificar um e-mail usando o nome do remetente, assunto e corpo
POST /v1/classify/edit
Escopo necessário: classify
Entrada: { body: CustomerManualEditInput; }
Retornos: CustomerManualEditResult
Status HTTP documentados: 200, 400, 401, 402, 403, 404, 409, 413, 429, 503
Parâmetros, esquemas e exemplos HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerClassifyEmail(
input: OperationInput<"customerClassifyEmail">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerClassifyEmail">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerClassifyEmail", input, { signal });
}
Solicitar uma reescrita paga separadamente por IA de termos sinalizados selecionados e reclassificar o resultado
POST /v1/rewrite
Escopo necessário: rewrite
Entrada: { body: CustomerAiRewriteInput; }
Retornos: AiRewriteResult
Status HTTP documentados: 200, 400, 401, 402, 403, 404, 409, 413, 429, 502, 503
Parâmetros, esquemas e exemplos HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerRewriteFlaggedTermsWithAi(
input: OperationInput<"customerRewriteFlaggedTermsWithAi">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerRewriteFlaggedTermsWithAi">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerRewriteFlaggedTermsWithAi", input, { signal });
}
Verificar um rascunho final renderizado exato contra um recibo pago de Reescrever Tudo sem outro débito
POST /v1/rewrite/finalize
Escopo necessário: rewrite
Entrada: { body: { requestId: string; sender: string; subject: string; body: string; }; }
Retornos: { requestId: string; input: RewrittenClassificationInput; classification: ClassificationResult; }
Status HTTP documentados: 200, 400, 401, 402, 403, 404, 409, 413, 429, 503
Parâmetros, esquemas e exemplos HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerFinalizeAiRewrite(
input: OperationInput<"customerFinalizeAiRewrite">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerFinalizeAiRewrite">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerFinalizeAiRewrite", input, { signal });
}
Recuperar um recibo de reescrita de IA pago concluído e de propriedade
GET /v1/rewrite/result/{requestId}
Escopo necessário: rewrite
Entrada: { path: { requestId: string; }; }
Retornos: AiRewriteResult
Status HTTP documentados: 200, 400, 401, 403, 404, 429, 503
Parâmetros, esquemas e exemplos HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerGetAiRewriteResult(
input: OperationInput<"customerGetAiRewriteResult">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerGetAiRewriteResult">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerGetAiRewriteResult", input, { signal });
}
Cotar o preço máximo autorizado de uma reescrita de IA paga separadamente
POST /v1/rewrite/ai-quote
Escopo necessário: rewrite
Entrada: { body: AiRewriteQuoteInput; }
Retornos: AiRewriteQuote
Status HTTP documentados: 200, 400, 401, 402, 403, 404, 409, 413, 429, 503
Parâmetros, esquemas e exemplos HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerQuoteAiRewrite(
input: OperationInput<"customerQuoteAiRewrite">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerQuoteAiRewrite">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerQuoteAiRewrite", input, { signal });
}
Gerar um design de e-mail MJML padrão editável com IA pelo preço de conta confirmado
POST /v1/email-builder/ai-template
Escopo necessário: ai:generate
Entrada: { body: CustomerAiEmailTemplateInput; }
Retornos: AiEmailTemplateResult
Status HTTP documentados: 200, 400, 401, 402, 403, 404, 409, 413, 429, 502, 503
Parâmetros, esquemas e exemplos HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerCreateAiEmailTemplate(
input: OperationInput<"customerCreateAiEmailTemplate">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerCreateAiEmailTemplate">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerCreateAiEmailTemplate", input, { signal });
}
Gerar um design de e-mail VIP nativo editável com IA pelo preço de membro confirmado
POST /v1/vip/email-template
Escopo necessário: ai:generate
Entrada: { body: CustomerVipEmailTemplateInput; }
Retornos: CustomerVipEmailTemplateResult
Status HTTP documentados: 200, 400, 401, 402, 403, 404, 409, 413, 429, 502, 503
Parâmetros, esquemas e exemplos HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerCreateVipEmailTemplate(
input: OperationInput<"customerCreateVipEmailTemplate">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerCreateVipEmailTemplate">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerCreateVipEmailTemplate", input, { signal });
}
Abrir uma sessão padrão do editor de design de e-mail gratuitamente
POST /v1/email-builder/access
Escopo necessário: builder:write
Entrada: { body: CustomerEmailBuilderAccessInput; }
Retornos: EmailBuilderAccess
Status HTTP documentados: 200, 400, 401, 402, 403, 404, 409, 413, 429, 503
Parâmetros, esquemas e exemplos HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerAccessEmailBuilder(
input: OperationInput<"customerAccessEmailBuilder">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerAccessEmailBuilder">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerAccessEmailBuilder", input, { signal });
}
GET /email-builder/access/{accessId}
GET /v1/email-builder/access/{accessId}
Escopo necessário: builder:read
Entrada: { query?: { designId?: string; }; path: { accessId: string; }; }
Retornos: EmailBuilderActiveAccess
Status HTTP documentados: 200, 400, 401, 403, 404, 429, 503
Parâmetros, esquemas e exemplos HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerGetEmailBuilderAccess(
input: OperationInput<"customerGetEmailBuilderAccess">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerGetEmailBuilderAccess">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerGetEmailBuilderAccess", input, { signal });
}
DELETE /email-builder/access/{accessId}
DELETE /v1/email-builder/access/{accessId}
Escopo necessário: builder:write
Entrada: { path: { accessId: string; }; }
Retornos: undefined
Status HTTP documentados: 204, 400, 401, 402, 403, 404, 409, 413, 429, 503
Parâmetros, esquemas e exemplos HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerCloseEmailBuilderAccess(
input: OperationInput<"customerCloseEmailBuilderAccess">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerCloseEmailBuilderAccess">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerCloseEmailBuilderAccess", input, { signal });
}
POST /vip/email-builder/access
POST /v1/vip/email-builder/access
Escopo necessário: vip:builder
Entrada: { body: CustomerVipBuilderAccessInput; }
Retornos: VipBuilderAccess
Status HTTP documentados: 201, 400, 401, 402, 403, 404, 409, 413, 429, 503
Parâmetros, esquemas e exemplos HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerCreateVipEmailBuilderAccess(
input: OperationInput<"customerCreateVipEmailBuilderAccess">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerCreateVipEmailBuilderAccess">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerCreateVipEmailBuilderAccess", input, { signal });
}
GET /vip/email-builder/access/{accessId}
GET /v1/vip/email-builder/access/{accessId}
Escopo necessário: builder:read
Entrada: { path: { accessId: string; }; }
Retornos: VipBuilderAccess
Status HTTP documentados: 200, 400, 401, 403, 404, 429, 503
Parâmetros, esquemas e exemplos HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerGetVipEmailBuilderAccess(
input: OperationInput<"customerGetVipEmailBuilderAccess">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerGetVipEmailBuilderAccess">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerGetVipEmailBuilderAccess", input, { signal });
}
DELETE /vip/email-builder/access/{accessId}
DELETE /v1/vip/email-builder/access/{accessId}
Escopo necessário: vip:builder
Entrada: { path: { accessId: string; }; }
Retornos: undefined
Status HTTP documentados: 204, 400, 401, 402, 403, 404, 409, 413, 429, 503
Parâmetros, esquemas e exemplos HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerDeleteVipEmailBuilderAccess(
input: OperationInput<"customerDeleteVipEmailBuilderAccess">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerDeleteVipEmailBuilderAccess">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerDeleteVipEmailBuilderAccess", input, { signal });
}
Read permanent paid-result evidence with the original account and credential
GET /customer/paid-results/{recoveryId}
Escopo necessário: authenticated original credential
Entrada: { path: { recoveryId: string; }; }
Retornos: { status: "pending" | "succeeded" | "failed"; operation: "customerStandardAiGenerate" | "customerVipAiGenerate" | "customerVipBuilderAccess"; settlement: { kind: "paid_result" | "no_charge" | "confirmed_refund" | "unresolved"; accountId: string; credentialId: string | null; recoveryId: string; receiptId: string; chargeMillicents?: number; refundMillicents?: number; deletedAt?: string; }; result?: { [key: string]: unknown; }; error?: { [key: string]: unknown; }; }
Status HTTP documentados: 200, 400, 401, 403, 404, 429, 503
Parâmetros, esquemas e exemplos HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerGetPaidResult(
input: OperationInput<"customerGetPaidResult">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerGetPaidResult">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerGetPaidResult", input, { signal });
}
Read the authenticated account and credential identity before paid dispatch
GET /customer/paid-results/identity
Escopo necessário: authenticated credential
Entrada: Record<string, never>
Retornos: { accountId: string; credentialId: string; }
Status HTTP documentados: 200, 401, 403, 429, 503
Parâmetros, esquemas e exemplos HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerPaidResultIdentity(
input: OperationInput<"customerPaidResultIdentity">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerPaidResultIdentity">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerPaidResultIdentity", input, { signal });
}
Explicitly resolve an owned paid result with the original credential and service scope
POST /customer/paid-results/{recoveryId}/resolve
Escopo necessário: original ai:generate or vip:builder service scope
Entrada: { body: { action: "resolve"; reason: string; }; path: { recoveryId: string; }; }
Retornos: { status: "pending" | "succeeded" | "failed"; operation: "customerStandardAiGenerate" | "customerVipAiGenerate" | "customerVipBuilderAccess"; settlement: { kind: "paid_result" | "no_charge" | "confirmed_refund" | "unresolved"; accountId: string; credentialId: string | null; recoveryId: string; receiptId: string; chargeMillicents?: number; refundMillicents?: number; deletedAt?: string; }; result?: { [key: string]: unknown; }; error?: { [key: string]: unknown; }; }
Status HTTP documentados: 200, 400, 401, 403, 404, 429, 503
Parâmetros, esquemas e exemplos HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerResolvePaidResult(
input: OperationInput<"customerResolvePaidResult">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerResolvePaidResult">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerResolvePaidResult", input, { signal });
}
Importar e compilar um design MJML padrão sem salvar ou enviar
POST /v1/email-builder/import
Escopo necessário: builder:write
Entrada: { body: CustomerStandardBuilderInput; }
Retornos: CustomerStandardBuilderImportResult
Status HTTP documentados: 200, 400, 401, 403, 404, 413, 429, 503
Parâmetros, esquemas e exemplos HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerStandardBuilderImport(
input: OperationInput<"customerStandardBuilderImport">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerStandardBuilderImport">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerStandardBuilderImport", input, { signal });
}
Validar e compilar um design MJML padrão sem salvar ou enviar
POST /v1/email-builder/validate
Escopo necessário: builder:write
Entrada: { body: CustomerStandardBuilderInput; }
Retornos: CustomerStandardBuilderValidateResult
Status HTTP documentados: 200, 400, 401, 403, 404, 413, 429, 503
Parâmetros, esquemas e exemplos HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerStandardBuilderValidate(
input: OperationInput<"customerStandardBuilderValidate">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerStandardBuilderValidate">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerStandardBuilderValidate", input, { signal });
}
Compilar um design MJML padrão para HTML sem salvar ou enviar
POST /v1/email-builder/compile
Escopo necessário: builder:write
Entrada: { body: CustomerStandardBuilderInput; }
Retornos: CustomerStandardBuilderCompileResult
Status HTTP documentados: 200, 400, 401, 403, 404, 413, 429, 503
Parâmetros, esquemas e exemplos HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerStandardBuilderCompile(
input: OperationInput<"customerStandardBuilderCompile">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerStandardBuilderCompile">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerStandardBuilderCompile", input, { signal });
}
Exportar um design MJML padrão como HTML, MJML ou ZIP sem enviar
POST /v1/email-builder/export
Escopo necessário: builder:write
Entrada: { body: CustomerStandardBuilderInput; }
Retornos: CustomerStandardBuilderExportResult
Status HTTP documentados: 200, 400, 401, 403, 404, 413, 429, 503
Parâmetros, esquemas e exemplos HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerStandardBuilderExport(
input: OperationInput<"customerStandardBuilderExport">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerStandardBuilderExport">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerStandardBuilderExport", input, { signal });
}
Importar e compilar um design VIP nativo com assinatura ativa e acesso aberto proprietário
POST /v1/vip/email-builder/import
Escopo necessário: vip:builder
Entrada: { body: CustomerNativeBuilderInput; }
Retornos: CustomerNativeBuilderImportResult
Status HTTP documentados: 200, 400, 401, 403, 404, 413, 429, 503
Parâmetros, esquemas e exemplos HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerNativeBuilderImport(
input: OperationInput<"customerNativeBuilderImport">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerNativeBuilderImport">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerNativeBuilderImport", input, { signal });
}
Validar e compilar um design VIP nativo com assinatura ativa e acesso aberto proprietário
POST /v1/vip/email-builder/validate
Escopo necessário: vip:builder
Entrada: { body: CustomerNativeBuilderInput; }
Retornos: CustomerNativeBuilderValidateResult
Status HTTP documentados: 200, 400, 401, 403, 404, 413, 429, 503
Parâmetros, esquemas e exemplos HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerNativeBuilderValidate(
input: OperationInput<"customerNativeBuilderValidate">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerNativeBuilderValidate">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerNativeBuilderValidate", input, { signal });
}
Compilar um design VIP nativo para HTML com assinatura ativa e acesso aberto próprio
POST /v1/vip/email-builder/compile
Escopo necessário: vip:builder
Entrada: { body: CustomerNativeBuilderInput; }
Retornos: CustomerNativeBuilderCompileResult
Status HTTP documentados: 200, 400, 401, 403, 404, 413, 429, 503
Parâmetros, esquemas e exemplos HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerNativeBuilderCompile(
input: OperationInput<"customerNativeBuilderCompile">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerNativeBuilderCompile">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerNativeBuilderCompile", input, { signal });
}
Exportar um design VIP nativo como HTML ou um ZIP de HTML com três variantes sem enviar
POST /v1/vip/email-builder/export
Escopo necessário: vip:builder
Entrada: { body: CustomerNativeBuilderInput; }
Retornos: CustomerNativeBuilderExportResult
Status HTTP documentados: 200, 400, 401, 403, 404, 413, 429, 503
Parâmetros, esquemas e exemplos HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerNativeBuilderExport(
input: OperationInput<"customerNativeBuilderExport">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerNativeBuilderExport">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerNativeBuilderExport", input, { signal });
}
Iniciar um redirecionamento único para editor VIP hospedado nativo, padrão ou com direito
POST /v1/email-builder/hosted-handoffs
Escopo necessário: builder:write
Entrada: { body: CustomerHostedBuilderHandoffInput; }
Retornos: CustomerHostedBuilderHandoff
Status HTTP documentados: 201, 400, 401, 403, 429, 503
Parâmetros, esquemas e exemplos HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerCreateHostedBuilderHandoff(
input: OperationInput<"customerCreateHostedBuilderHandoff">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerCreateHostedBuilderHandoff">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerCreateHostedBuilderHandoff", input, { signal });
}
Listar Modelos do Construtor VIP
GET /v1/vip/email-builder/templates
Escopo necessário: vip:read
Entrada: Record<string, never>
Retornos: CustomerVipTemplateCatalog
Status HTTP documentados: 200, 400, 401, 403, 404, 413, 429, 503
Parâmetros, esquemas e exemplos HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerListVipBuilderTemplates(
input: OperationInput<"customerListVipBuilderTemplates">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerListVipBuilderTemplates">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerListVipBuilderTemplates", input, { signal });
}
Obter Modelo do Construtor VIP
GET /v1/vip/email-builder/templates/{templateId}
Escopo necessário: vip:read
Entrada: { path: { templateId: string; }; }
Retornos: CustomerVipTemplateDocument
Status HTTP documentados: 200, 400, 401, 403, 404, 413, 429, 503
Parâmetros, esquemas e exemplos HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerGetVipBuilderTemplate(
input: OperationInput<"customerGetVipBuilderTemplate">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerGetVipBuilderTemplate">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerGetVipBuilderTemplate", input, { signal });
}
Listar Modelos do Construtor Standard
GET /v1/email-builder/templates
Escopo necessário: catalog:read
Entrada: Record<string, never>
Retornos: CustomerStandardTemplateCatalog
Status HTTP documentados: 200, 400, 401, 403, 404, 413, 429, 503
Parâmetros, esquemas e exemplos HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerListStandardBuilderTemplates(
input: OperationInput<"customerListStandardBuilderTemplates">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerListStandardBuilderTemplates">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerListStandardBuilderTemplates", input, { signal });
}
Obter Modelo do Construtor Standard
GET /v1/email-builder/templates/{templateId}
Escopo necessário: catalog:read
Entrada: { path: { templateId: string; }; }
Retornos: CustomerStandardTemplateDetail
Status HTTP documentados: 200, 400, 401, 403, 404, 413, 429, 503
Parâmetros, esquemas e exemplos HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerGetStandardBuilderTemplate(
input: OperationInput<"customerGetStandardBuilderTemplate">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerGetStandardBuilderTemplate">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerGetStandardBuilderTemplate", input, { signal });
}
Nó n8n auto-hospedado
0.1.0
Requer Node.js 20.19+ e uma instalação n8n auto-hospedada com patch fornecendo n8n-workflow >=2.39.3 <3. Não force a instalação em um host antigo incompatível. Instale o tarball baixado em seu diretório custom-node e reinicie o n8n. Este nó não publicado não está disponível através do n8n Cloud ou instalação comunitária por npm-name.
O consentimento pago está desativado por padrão. Cada item consentido realiza uma solicitação de classificação sem tentativas automáticas. Os resultados são colocados sob o namespace sendrepute. Use um portão IF em sendrepute.allowed antes de enviar e verifique o status de falha separadamente. Os modos de consultoria e bloqueio retornam decisões explícitas. O próprio nó não envia e-mail.
Baixar tarball do n8n
Repositório de código público
README completo e exemplos
Notas de segurança e limitações conhecidas
1. Instalar
Execute no host n8n self-hosted e reinicie o serviço n8n usando seu gerenciador de processos normal. Confirme se o SendRepute aparece no seletor de nós. Importe o arquivo extraído package/examples/classify-email.workflow.json a partir do editor n8n. Instalação via npm-name Community nodes e n8n Cloud não são suportados por este pacote não publicado.
mkdir -p ~/.n8n/nodes
cd ~/.n8n/nodes
curl -fLO https://www.sendrepute.com/downloads/sendrepute-n8n.tgz
npm install ./sendrepute-n8n.tgz
tar -xzf sendrepute-n8n.tgz package/examples/classify-email.workflow.json
Alternativa: instalar a partir da fonte pública
Use esta rota de código fonte em vez das instruções de download do site acima. O README do repositório explica as etapas restantes de ativação e configuração; criar um ZIP por si só não instala um plugin. Para Python, o segundo comando adiciona suporte opcional ao Django. Mantenha as credenciais em segredos do servidor e revise as notas de segurança antes de ativar recursos pagos. Apenas o Node está no npm; um repositório público no GitHub não implica publicação no WordPress.org, n8n Cloud, Packagist ou PyPI.
git clone https://github.com/sendrepute/n8n-nodes-sendrepute.git
cd n8n-nodes-sendrepute
npm ci
npm run pack:check
npm pack --ignore-scripts
archive="$PWD/n8n-nodes-sendrepute-0.1.0.tgz"
mkdir -p ~/.n8n/nodes
cd ~/.n8n/nodes
npm install "$archive"
2. Configurar com segurança
Crie uma credencial de API SendRepute com uma chave de cliente com escopo classify no armazenamento de credenciais do n8n. Nunca a coloque no JSON do fluxo de trabalho ou em expressões. O JSON abaixo mostra parâmetros do nó, não um fluxo de trabalho completo importável. Mapeie o nome de exibição do remetente, assunto e corpo; escolha advisory/blocking, threshold e a política de falha open/closed. Revise os preços antes de mudar paidConsent para true. Cada item com consentimento realiza no máximo uma requisição.
{
"operation": "classify",
"paidConsent": false,
"sender": "={{ $json.sender }}",
"subject": "={{ $json.subject }}",
"body": "={{ $json.body }}",
"decisionMode": "blocking",
"threshold": 0.8,
"failurePolicy": "closed"
}
3. Usar deliberadamente
Coloque um nó IF imediatamente após o SendRepute e use esta condição booleana. Conecte apenas a saída true ao seu nó de e-mail existente; direcione false para revisão ou interrupção. Inspecione o analysisStatus separadamente, mesmo quando allowed for true. O fluxo de trabalho incluído começa com o consentimento pago desativado e não contém credenciais. O SendRepute em si nunca envia e-mail.
{{ $json.sendrepute.allowed === true }}
Resultados, falhas e limites
Resultados bem-sucedidos substituem o namespace sendrepute por campos de analysisStatus, decision, allowed, recommendation, pontuação validada e cobrança. Falhas omitem pontuações de spam e retornam failureCategory/errorCode higienizados. Falhas fechadas bloqueiam; falhas abertas permitem, mas marcam o analysisStatus como failed. Sucessos consultivos sempre permitem, independentemente da recomendação. Consent-off retorna not_run. Não há retries, destinatários, anexos, reescritas, seletor de modelo ou endpoints personalizados. A auditoria de dependência de origem atualizada relatou zero descobertas; este é um resultado pontual, não uma certificação de segurança. Mantenha o tempo de execução auto-hospedado atualizado com patches e revise o arquivo SECURITY.md antes da instalação.
Integração Laravel
0.1.0
Destinado a PHP 8.2+ e Laravel 12–13. Instale o ZIP usando um repositório de artefatos local do Composer ou extraia-o e configure um repositório de caminho do Composer conforme descrito no README incluído. Nenhuma publicação no Packagist é reivindicada.
O consentimento pago e o gancho de e-mail estão desativados por padrão. Mesmo quando ativado, cada mensagem deve optar explicitamente por participar com X-SendRepute-Classify: yes. O cabeçalho é removido antes da entrega. Os modos consultivo e de bloqueio possuem políticas de falha independentes; redefinições de senha e e-mails transacionais permanecem inalterados, a menos que a adesão seja deliberada.
Baixar ZIP do Laravel
Repositório de código público
README completo e exemplos
Notas de segurança e limitações conhecidas
1. Instalar
Execute dentro da sua aplicação Laravel. Estes comandos extraem o download e registram um repositório de caminho do Composer; esta não é uma instalação via Packagist. A descoberta de pacotes registra o provedor, e vendor:publish cria config/sendrepute.php. Mantenha o diretório do pacote extraído disponível para o Composer. Um repositório de artefatos é outra opção documentada no README.
mkdir -p packages
curl -fL https://www.sendrepute.com/downloads/sendrepute-laravel.zip -o packages/sendrepute-laravel.zip
unzip packages/sendrepute-laravel.zip -d packages
composer config repositories.sendrepute path ./packages/sendrepute-laravel
composer require sendrepute/laravel:@dev
php artisan vendor:publish --tag=sendrepute-config
Alternativa: instalar a partir da fonte pública
Use esta rota de código fonte em vez das instruções de download do site acima. O README do repositório explica as etapas restantes de ativação e configuração; criar um ZIP por si só não instala um plugin. Para Python, o segundo comando adiciona suporte opcional ao Django. Mantenha as credenciais em segredos do servidor e revise as notas de segurança antes de ativar recursos pagos. Apenas o Node está no npm; um repositório público no GitHub não implica publicação no WordPress.org, n8n Cloud, Packagist ou PyPI.
composer config repositories.sendrepute vcs https://github.com/sendrepute/sendrepute-laravel
composer require sendrepute/laravel:dev-main
php artisan vendor:publish --tag=sendrepute-config
2. Configurar com segurança
Armazene SENDREPUTE_API_KEY nos segredos do servidor. A URL base termina em /api; o cliente anexa /v1/classify. É necessária correspondência exata de host confiável e HTTPS verificado. Ambos os seletores mostrados permanecem desativados até que você revise os preços e os defina explicitamente como true. Em config/sendrepute.php, escolha mail.mode, mail.spam_probability_threshold e mail.failure_policy independentemente. O padrão é advisory com permissão em caso de falha.
SENDREPUTE_API_BASE_URL=https://www.sendrepute.com/api
SENDREPUTE_TRUSTED_HOSTS=www.sendrepute.com
SENDREPUTE_PAID_ANALYSIS_CONSENT=false
SENDREPUTE_MAIL_ENABLED=false
3. Usar deliberadamente
Adicione o cabeçalho exato de opt-in apenas a classes Mailable deliberadamente selecionadas, nunca em um callback global de e-mail. Tanto os interruptores globais quanto o cabeçalho por mensagem são necessários para o gancho automático. O cabeçalho é removido antes da entrega. Mantenha redefinições de senha e notificações críticas fora do bloqueio automático, a menos que testado explicitamente. A classificação manual pode, em vez disso, resolver o contrato Classifier e conceder consentimento por chamada, conforme mostrado.
// Inside your deliberately opted-in Mailable:
public function headers(): \Illuminate\Mail\Mailables\Headers
{
return new \Illuminate\Mail\Mailables\Headers(text: [
'X-SendRepute-Classify' => 'yes',
]);
}
// Or classify manually inside an authenticated, explicitly confirmed action:
function classifyAfterConsent(bool $confirmed, string $subject, string $body): \SendRepute\Laravel\ClassificationResult
{
if (!$confirmed) {
throw new \RuntimeException('Paid consent required');
}
return app(\SendRepute\Laravel\Contracts\Classifier::class)->classify(
sender: 'Example Company',
subject: $subject,
body: $body,
paidAnalysisConsent: true,
);
}
Referência de API e métodos
Resolva a interface Classifier a partir do container do Laravel. classify(string sender, string subject, string body, ?string model = null, bool paidAnalysisConsent = false) retorna ClassificationResult. Seus campos públicos são requestId, model, label, spamProbability, confidence, replayed e chargedMillicents. SendReputeException fornece categoria higienizada, status HTTP, código da API e ID da requisição. O gancho automático é AnalyzeOutgoingMessage em MessageSending e seu diagnóstico seguro é ClassificationOutcome. Esta integração suporta apenas classificação, não administração de conta, pagamentos, construtores ou reescrita por IA.
Resultados, falhas e limites
ClassificationResult contém o resultado validado e dados de faturamento. O hook MessageSending retorna false para cancelar uma mensagem bloqueada; o cancelamento não é um erro de SMTP ou um evento MessageSent. ClassificationOutcome relata apenas ação, pontuação e metadados de falha higienizados, nunca o conteúdo da mensagem. A política de falha cobre entrada/resposta malformada, autenticação, saldo, limites de taxa e problemas de transporte. Nenhuma retentativa ou fila é adicionada. É necessário um remetente nomeado e um corpo de texto ou HTML na memória.
Pré-voo de rascunho do Mautic
0.1.0
Destina-se a instalações Mautic 5.x em nó web único com PHP 8.1+ e ext-curl. Mautic 4, Mautic 6 e clusters multi-nó não são suportados. Extraia o SendReputeBundle para o seu diretório de plugins, recarregue os plugins e limpe o cache seguindo o README incluído. Configure a credencial e confirme explicitamente o modo de bloqueio local-flock no ambiente do servidor.
Análise consultiva paga de apenas um rascunho salvo, iniciada pelo administrador. Opt-in global, verificações de acesso à entidade, validação CSRF e uma confirmação de uso único protegem cada solicitação. Não envia, reescreve ou bloqueia e-mails e não possui aplicação no momento do envio. Substituições de destinatários permanecem sem expansão; salve as alterações do editor primeiro.
Baixar ZIP do Mautic
Repositório de código público
README completo e exemplos
Notas de segurança e limitações conhecidas
1. Instalar
Execute a partir da raiz do Mautic com o mesmo usuário PHP e ambiente da aplicação web, ou extraia o ZIP através do seu processo de implantação antes de recarregar os plugins. Requer Mautic 5.x, PHP 8.1+, ext-curl e um único nó web Linux/POSIX. Mautic 4/6 e clusters multi-nó não são suportados; nenhuma certificação de instalação patch-a-patch ao vivo é reivindicada.
curl -fLO https://www.sendrepute.com/downloads/sendrepute-mautic.zip
unzip sendrepute-mautic.zip -d plugins
php bin/console mautic:plugins:reload
php bin/console cache:clear
Alternativa: instalar a partir da fonte pública
Use esta rota de código fonte em vez das instruções de download do site acima. O README do repositório explica as etapas restantes de ativação e configuração; criar um ZIP por si só não instala um plugin. Para Python, o segundo comando adiciona suporte opcional ao Django. Mantenha as credenciais em segredos do servidor e revise as notas de segurança antes de ativar recursos pagos. Apenas o Node está no npm; um repositório público no GitHub não implica publicação no WordPress.org, n8n Cloud, Packagist ou PyPI.
git clone https://github.com/sendrepute/sendrepute-mautic.git
cd sendrepute-mautic
python3 package.py
2. Configurar com segurança
Crie o diretório de registro persistente mostrado fora da raiz web, pertencente ao usuário PHP com permissão 0700. Não use /tmp, contêineres efêmeros, symlinks ou armazenamento de rede incerto. Armazene SENDREPUTE_API_KEY no lado do servidor. Confirme local-flock apenas quando um único nó web fornecer bloqueio de processo compartilhado. A análise paga global permanece desativada em 0; defina-a como 1 somente após revisar preços e limites. Nenhum campo de navegador deve fornecer a credencial ou endpoint.
SENDREPUTE_MAUTIC_PAID_ANALYSIS_ENABLED=0
SENDREPUTE_MAUTIC_ATOMIC_LOCK_MODE=local-flock
SENDREPUTE_MAUTIC_LEDGER_DIR=/var/lib/mautic/sendrepute-ledger
3. Usar deliberadamente
Salve as alterações no editor primeiro. Como um administrador real do Mautic com acesso a esse e-mail, abra o rascunho salvo e escolha SendRepute preflight. Revise a confirmação e aceite explicitamente a operação paga. A requisição precisa de validação CSRF e uma intenção de uso único de dez minutos vinculada ao conteúdo salvo. O bloqueio persistente e um registro sem conteúdo evitam gastos duplicados simultâneos no nó único suportado.
Resultados, falhas e limites
Exibe probabilidade validada, rótulo, confiança e o valor faturado real ou replay de recibo. Falhas não exibem decisão de spam e não são repetidas automaticamente. Apenas o nome de exibição do remetente, assunto e corpo salvos são analisados; as substituições de contato permanecem não expandidas. O plugin não reescreve rascunhos, não envia e-mail, não bloqueia campanhas nem aplica uma política de horário de envio. Uma revisão de rascunho salvo não pode certificar a mensagem final renderizada pelo destinatário.
Cliente Python e backend Django
0.1.0
Requer Python 3.9+. Extraia o ZIP de origem e instale seu diretório com pip. O cliente de servidor genérico usa a biblioteca padrão; o Django é uma dependência opcional para o backend de e-mail explícito. Este pacote não está publicado no PyPI.
O consentimento pago vem predefinido como desativado. O wrapper Django preserva os objetos originais de transporte e mensagem. Ele analisa uma string delimitada combinando o corpo principal e alternativas inline text/plain e text/html, não anexos. O modo de bloqueio rejeita conteúdo exibido não suportado ou excessivamente grande. Falhas de autenticação bloqueiam por padrão mesmo com uma política de permissão; escolha deliberadamente o comportamento critical-mail.
Baixar ZIP de origem Python
Repositório de código público
README completo e exemplos
Notas de segurança e limitações conhecidas
1. Instalar
Use um ambiente virtual. O cliente genérico utiliza apenas a biblioteca padrão; o comando final adiciona a dependência opcional do Django e é desnecessário para o uso com Flask, FastAPI ou outros servidores genéricos. O pacote é instalado a partir do diretório de origem baixado, não do PyPI. Python 3.9+ é o requisito mínimo do pacote; escolha versões de Python/Django suportadas entre si.
curl -fLO https://www.sendrepute.com/downloads/sendrepute-python.zip
unzip sendrepute-python.zip
python -m venv .venv
. .venv/bin/activate
python -m pip install ./sendrepute-python
python -m pip install './sendrepute-python[django]'
Alternativa: instalar a partir da fonte pública
Use esta rota de código fonte em vez das instruções de download do site acima. O README do repositório explica as etapas restantes de ativação e configuração; criar um ZIP por si só não instala um plugin. Para Python, o segundo comando adiciona suporte opcional ao Django. Mantenha as credenciais em segredos do servidor e revise as notas de segurança antes de ativar recursos pagos. Apenas o Node está no npm; um repositório público no GitHub não implica publicação no WordPress.org, n8n Cloud, Packagist ou PyPI.
python -m pip install "sendrepute @ git+https://github.com/sendrepute/sendrepute-python.git@7d54935c4ae2db136800231136e4ea28d63118db"
python -m pip install "sendrepute[django] @ git+https://github.com/sendrepute/sendrepute-python.git@7d54935c4ae2db136800231136e4ea28d63118db"
2. Configurar com segurança
Injete SENDREPUTE_API_KEY via segredos do servidor. O cliente genérico usa como padrão o endpoint hospedado canônico, HTTPS verificado, sem redirecionamentos e sem repetições. O consentimento do cliente é desativado por padrão; o exemplo concede consentimento por chamada apenas após a verificação de confirmação. Substituições de endpoint precisam de uma allowlist explícita de origens HTTPS. O dicionário retornado contém resultados validados e dados de faturamento, não uma decisão de envio.
import os
from sendrepute import SendReputeClient, SendReputeError
client = SendReputeClient(api_key=os.environ["SENDREPUTE_API_KEY"])
def classify_after_consent(sender, subject, body, confirmed=False):
if confirmed is not True:
raise ValueError("Paid consent required")
try:
return client.classify(
sender=sender, subject=subject, body=body,
paid_analysis_consent=True,
)
except SendReputeError as error:
# Safe metadata only; do not log message content or response bodies.
print(error.code, error.status, error.request_id)
raise
Backend de e-mail Django
Preserve seu backend existente em SENDREPUTE_ORIGINAL_EMAIL_BACKEND e mantenha suas configurações normais de SMTP. O exemplo mantém o consentimento pago desativado; defina-o como True apenas após a revisão de preços. O modo consultivo permite análises bem-sucedidas; o bloqueio compara com SENDREPUTE_SPAM_THRESHOLD. Escolha a política de falha independente deliberadamente. Erros de autenticação bloqueiam por padrão, mesmo sob permissão. O exemplo segue os padrões do README e não é uma recomendação para falhar em modo aberto para e-mails críticos.
# Django settings.py
import os
EMAIL_BACKEND = "sendrepute.django.SendReputeEmailBackend"
SENDREPUTE_ORIGINAL_EMAIL_BACKEND = "django.core.mail.backends.smtp.EmailBackend"
SENDREPUTE_API_KEY = os.environ["SENDREPUTE_API_KEY"]
SENDREPUTE_PAID_ANALYSIS_CONSENT = False
SENDREPUTE_POLICY_MODE = "advisory"
SENDREPUTE_SPAM_THRESHOLD = 0.90
SENDREPUTE_FAILURE_POLICY = "allow"
SENDREPUTE_ALLOW_AUTH_FAILURE = False
SENDREPUTE_TIMEOUT = 10
3. Usar deliberadamente
Esta função envia apenas quando chamada. Com o wrapper Django configurado e o consentimento pago ativado, o backend original recebe os objetos de mensagem originais inalterados. O classificador recebe uma string delimitada combinando o corpo principal com alternativas inline text/plain e text/html; anexos e destinatários não são entradas separadas. Renderize os templates antes de chamar. Use um backend de teste local primeiro, depois seu transporte real configurado deliberadamente.
from django.core.mail import EmailMultiAlternatives
def send_reviewed_message(recipient):
message = EmailMultiAlternatives(
subject="Your requested summary",
body="Here is the summary you requested.",
from_email="Example Team <team@example.com>",
to=[recipient],
)
message.attach_alternative(
"<p>Here is the summary you requested.</p>", "text/html"
)
return message.send()
Referência de API e métodos
O construtor público é SendReputeClient(api_key, endpoint, allowed_origins, timeout, paid_analysis_consent), com todos exceto api_key passados por palavra-chave. timeout deve ser maior que zero e no máximo 30 segundos. classify requer os argumentos nomeados sender, subject e body; model e paid_analysis_consent por chamada são opcionais. Sender tem 1–320 caracteres, subject 1–998 e body 1–524,288, com um limite separado para a requisição codificada. O dict retornado contém requestId, model, result e billing; result inclui label, spamProbability, confidence, reasons e o opcional contentAudit. billing contém chargedMillicents e replayed. Os erros incluem ConsentRequiredError, AuthenticationError, BalanceError, RateLimitError, TransportError e InvalidResponseError, todos sob SendReputeError. Configurações inválidas podem lançar ValueError. O backend Django expõe open(), close() e send_messages(email_messages), retornando a contagem de envios do backend original; ele não adiciona métodos genéricos de API, construtor, reescrita ou pagamento.
Resultados, falhas e limites
O bloqueio rejeita conteúdo exibido não suportado ou superdimensionado em vez de analisar apenas um subconjunto mais seguro. Falhas de autenticação exigem uma substituição explícita separada para permitir. Outros erros seguem a política de permitir/bloquear escolhida; fail_silently controla se as falhas bloqueadas são geradas ou ignoradas. O wrapper não enfileira, não repete, não troca transportes, não inspeciona anexos nem renderiza templates. O cliente genérico gera subclasses SendReputeError sanitizadas com code/status/request_id; não registre corpos de mensagens em logs.
Cliente de classificação Go
0.1.0
Requer Go 1.22+. O cliente que utiliza apenas a biblioteca padrão suporta classificação, não transporte de e-mail. Escolha o ZIP da fonte para download com uma substituição de módulo local ou a instalação do módulo público verificado mostrada na alternativa da fonte.
Classificação do lado do servidor apenas com biblioteca padrão, com consentimento pago explícito, solicitações limitadas, HTTPS verificado, redirecionamentos recusados e sem repetições. Não envia e-mails nem toma decisões de envio/bloqueio. Seu aplicativo deve escolher deliberadamente os limites e o comportamento de falha, especialmente para e-mails transacionais críticos.
Baixar ZIP de origem Go
Repositório de código público
README completo e exemplos
Notas de segurança e limitações conhecidas
1. Instalar
Extraia a fonte no diretório da sua aplicação Go existente e execute os comandos do módulo lá. A substituição local aponta para o módulo baixado; mova ou ajuste esse caminho se o layout do seu projeto for diferente. Execute go mod init com seu próprio nome de módulo primeiro apenas ao criar uma nova aplicação. Nenhum módulo de runtime externo é exigido por este cliente.
curl -fLO https://www.sendrepute.com/downloads/sendrepute-go.zip
unzip sendrepute-go.zip
# Run inside your existing application's module:
go mod edit -require=github.com/sendrepute/sendrepute-go@v0.0.0
go mod edit -replace=github.com/sendrepute/sendrepute-go=./sendrepute-go-v0.1.0
go mod tidy
Alternativa: instalar a partir da fonte pública
Use esta rota de código fonte em vez das instruções de download do site acima. O README do repositório explica as etapas restantes de ativação e configuração; criar um ZIP por si só não instala um plugin. Para Python, o segundo comando adiciona suporte opcional ao Django. Mantenha as credenciais em segredos do servidor e revise as notas de segurança antes de ativar recursos pagos. Apenas o Node está no npm; um repositório público no GitHub não implica publicação no WordPress.org, n8n Cloud, Packagist ou PyPI.
go get github.com/sendrepute/sendrepute-go@bfd656f829618348232da506225a5d92587d48e2
2. Configurar com segurança
Injete SENDREPUTE_API_KEY a partir dos segredos do servidor. A função mostrada não realiza nenhum trabalho até ser chamada com confirmed=true; essa chamada pode incorrer em uma classificação paga. Ela define um contexto de dez segundos e usa o endpoint HTTPS canônico. O consentimento do cliente é desativado por padrão; o argumento final true concede consentimento para esta solicitação específica. Uma substituição de endpoint requer uma entrada AllowedOrigins explícita; redirecionamentos são recusados.
package integration
import (
"context"
"errors"
"os"
"time"
sendrepute "github.com/sendrepute/sendrepute-go"
)
func Analyze(subject, body string, confirmed bool) error {
if !confirmed {
return errors.New("paid consent required")
}
client, err := sendrepute.NewClient(sendrepute.Config{
APIKey: os.Getenv("SENDREPUTE_API_KEY"),
})
if err != nil {
return err
}
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
result, err := client.Classify(ctx, sendrepute.ClassificationInput{
Sender: "Example Team", Subject: subject, Body: body,
}, true)
if err != nil {
return err
}
if result.Result.SpamProbability >= 0.90 {
return errors.New("review required")
}
return nil
}
3. Usar deliberadamente
Chame Analyze a partir de sua aplicação autenticada apenas após a revisão de preços e consentimento explícito. O limite de 0.90 e o erro de revisão são exemplos de política da aplicação, não padrões do SDK. Decida se erros significam adiar, permitir ou falhar fechado antes de conectar qualquer código de envio. O cliente retorna um resultado tipado com Result.SpamProbability e campos de faturamento; ele nunca envia e-mail ou toma decisões de entrega por si só.
Referência de API e métodos
NewClient(Config) retorna (*Client, error). Config aceita APIKey, Endpoint, AllowedOrigins, Timeout e PaidAnalysisConsent. Classify(ctx, ClassificationInput, consent) retorna (*ClassificationResponse, error). Os campos de Input são Sender, Subject, Body e o opcional Model. Sender tem 1–320 runes, subject 1–998 runes e body no máximo 524,288 bytes UTF-8. A resposta tipada contém RequestID, Model, Result e Billing; Billing expõe ChargedMillicents e Replayed. Result inclui Label, SpamProbability, Confidence, Reasons, FlaggedTerms e o opcional ContentAudit. Use errors.As para inspecionar *Error com segurança; falhas de configuração e de API continuam sendo erros, não pontuações de spam. Não existem métodos de conta, pagamento, construtor ou reescrita.
Resultados, falhas e limites
Uma invocação faz no máximo uma tentativa HTTP paga sem repetições. Erros expõem uma categoria segura, código/ID de solicitação e status restritos, nunca credenciais, corpos ou detalhes de rede. A duração do contexto e os tamanhos de solicitação e resposta são delimitados; respostas malformadas são rejeitadas em vez de convertidas em pontuações. O cliente não possui recursos de análise MIME, renderização, destinatários, anexos, fila, construtor, reescrita ou SMTP. Escolha o modelo explicitamente apenas se necessário; caso contrário, aplica-se o padrão da conta.
listmonk HTTP Messenger
0.1.0
Um pacote de código local não publicado para Node.js 20+ destinado à interface Custom HTTP Messenger do listmonk 6.2.0. Este serviço externo detém a entrega SMTP posterior após a classificação; não é um plugin em processo ou um proxy de preflight SMTP. A verificação é isolada e offline, não sendo uma implantação listmonk instalada ou um teste real de provedor SMTP.
Ambas as chaves pagas permanecem desativadas por padrão. O messenger aceita um corpo totalmente renderizado, rejeita anexos, verifica preços atuais e exige o resultado Inbox estrito: rótulo inbox, spamProbability de no máximo 0.12 e zero flaggedTermCount. Em seguida, ele constrói e envia esse mesmo corpo inspecionado por meio de sua conexão SMTP configurada. Recibos duráveis evitam repetições automáticas após resultados bloqueados, falhos, em andamento ou incertos.
Baixar ZIP de código-fonte não publicado listmonk
1. Instalar
Extraia este ZIP de código-fonte do site não publicado no host de mensageria dedicado. Revise o README.md e SECURITY.md, copie o ambiente de exemplo e verifique a sintaxe do ponto de entrada do servidor antes da configuração. O artefato permitido disponível para download exclui intencionalmente a suíte de testes do repositório. Não há pacotes de runtime de terceiros. Esta não é uma instalação de marketplace do listmonk ou de processo interno.
curl -fLO https://www.sendrepute.com/downloads/sendrepute-listmonk.zip
unzip sendrepute-listmonk.zip
cd sendrepute-listmonk
cp config.example.env .env
node --check src/server.mjs
2. Configurar com segurança
Use uma conta dedicada não privilegiada e um diretório de estado local durável com modo 0700. Mantenha os três interruptores de segurança mostrados como false até que os preços e a limitação de preço não atômica sejam aceitos. Armazene as credenciais do SendRepute, Basic Auth do mensageiro e SMTP downstream apenas em segredos do servidor. Termine o HTTPS em um proxy reverso confiável.
SENDREPUTE_ENABLED=false
SENDREPUTE_PAID_CONSENT=false
SENDREPUTE_ALLOW_NONATOMIC_PRICE_CONFIRMATION=false
SENDREPUTE_CONFIRMED_MAX_PRICE_MILLICENTS=
STATE_DIRECTORY=/var/lib/sendrepute-listmonk
SMTP_HOST=smtp.example.com
SMTP_PORT=465
SMTP_SECURE=true
3. Usar deliberadamente
Exponha apenas POST /v1/listmonk atrás de HTTPS e Basic Auth dedicado. Em listmonk Settings > Messengers, adicione sua URL como um Custom HTTP Messenger, escolha zero retries e selecione-o apenas para campanhas que devam ser inspecionadas e entregues. Não selecione também o listmonk SMTP: este serviço realiza o envio SMTP downstream por si só.
Custom HTTP Messenger URL: https://messenger.example.com/v1/listmonk
Authentication: dedicated Basic Auth username and password
Retries: 0
Select this messenger only. Do not also select SMTP for the campaign.
Resultados, falhas e limites
Uma duplicata entregue retorna sucesso sem outra classificação ou envio. Cada recibo bloqueado, falho, em inspeção (inspecting), enviando (sending) ou incerto recusa outro envio. Após um resultado SMTP incerto, reconcilie os logs do provedor e o contexto do listmonk manualmente; nunca exclua um recibo apenas para forçar uma nova tentativa. A verificação de preço atual é recente, mas não atômica, porque a classificação não aceita o campo expectedPriceMillicents.
Adaptador Mailcoach Self-Hosted v10
0.1.0
Um pacote local do Composer não publicado destinado ao Mailcoach Self-Hosted v10 no Laravel 12. O núcleo licenciado spatie/laravel-mailcoach v10 não está disponível neste ambiente, portanto, este pacote não alega possuir um teste de ponta a ponta instalado do Mailcoach v10. Testes reais do Laravel 12 Mailer cobrem o evento cancelável MessageSending documentado; um detentor de licença deve verificar cada caminho exato de envio do Mailcoach antes da produção.
As chaves enabled, paidConsent e o reconhecimento de preços atuais vêm desativadas por padrão. Uma vez ativado, o hook aplica-se a todas as mensagens através desse mailer do Laravel, não apenas a rotas nomeadas do Mailcoach. Ele analisa as alternativas de Symfony Email já renderizadas e pode cancelar o transporte. Fail-closed é o padrão; permitir falhas de análise é uma política deliberada separada.
Baixar ZIP da fonte experimental do Mailcoach
1. Instalar
Coloque o arquivo ZIP não publicado e baixado em um diretório privado de artefatos do Composer acessível à aplicação licenciada Mailcoach. Registre esse repositório de artefatos local, exija a linha 0.1, realize o commit do lockfile de consumo e, opcionalmente, publique a configuração. Esta não é uma instalação via Packagist. Um detentor da licença deve executar a verificação contra a versão exata do Mailcoach Self-Hosted v10.
mkdir -p packages
curl -fL https://www.sendrepute.com/downloads/sendrepute-mailcoach.zip -o packages/sendrepute-mailcoach.zip
composer config repositories.sendrepute artifact packages
composer require sendrepute/mailcoach:^0.1
php artisan vendor:publish --tag=sendrepute-mailcoach-config
2. Configurar com segurança
Mantenha todos os três interruptores como false inicialmente. Armazene a chave de API nos segredos do servidor e configure um limite de gastos no lado da conta. A operação classify atual não possui uma proteção expectedPriceMillicents atômica, portanto, o terceiro interruptor aceita explicitamente os preços atuais da API em vez de prometer uma cotação fixa. Configure o limite e a política de falha allow/block de forma independente.
SENDREPUTE_MAILCOACH_ENABLED=false
SENDREPUTE_MAILCOACH_PAID_CONSENT=false
SENDREPUTE_MAILCOACH_ACCEPT_CURRENT_API_PRICING=false
SENDREPUTE_API_BASE_URL=https://www.sendrepute.com/api
3. Usar deliberadamente
A descoberta de pacotes registra um listener MessageSending do Laravel. Não há chamada por campanha no código da aplicação: quando habilitado deliberadamente em uma instalação dedicada do Mailcoach, ele inspeciona cada e-mail Symfony enviado através daquele mailer do Laravel imediatamente antes do transporte. Em uma aplicação Laravel mista, o e-mail da aplicação hospedeira também é coberto.
Resultados, falhas e limites
O adaptador envia o nome de exibição do remetente, o assunto e cada alternativa em memória text/plain ou text/html não vazia, excluindo destinatários, endereços, anexos, dados de envelope e MIME bruto. Conteúdo ausente ou não suportado, respostas malformadas e falhas de API bloqueiam por padrão. Testes de núcleo offline exercitam o cancelamento real do Laravel Mailer, mas as rotas de campanha, automação, transacional e mensagens de teste do Mailcoach licenciado permanecem não verificadas.
Fluxo de envio controlado do Brevo
0.1.0
Um pacote de código-fonte local Node.js 20+ não publicado que implementa uma API de envio explícita no lado do servidor em torno da operação transacional POST /v3/smtp/email da Brevo. Ele não intercepta envios do painel Brevo, campanhas, automações, SMTP relay ou chamadas por meio de outros SDKs. Os testes são controlados e offline; eles não certificam uma conta Brevo ativa.
O paidConsent padrão é desativado. Apenas mensagens fixas de texto simples e HTML são aceitas; templates remotos, parâmetros, envios agendados, versões de mensagens e conteúdos baseados em URL são rejeitados. O snapshot exato e imutável inspecionado é enviado para a Brevo. Um registro durável de sendKey bloqueia tentativas duplicadas e ambíguas, e resultados incertos do provedor exigem reconciliação do operador.
Baixar ZIP do código-fonte Brevo não publicado
1. Instalar
Extraia o ZIP de código-fonte não publicado em uma aplicação de servidor, revise seu README e notas de segurança, e verifique a sintaxe de src/index.mjs. O artefato permitido disponível para download exclui intencionalmente a suíte de testes do repositório. Importe SendReputeBrevo de src/index.mjs; esta não é uma instalação de npm ou de marketplace da Brevo. Node.js 20+ é obrigatório e não há dependências de runtime.
curl -fLO https://www.sendrepute.com/downloads/sendrepute-brevo.zip
unzip sendrepute-brevo.zip
cd sendrepute-brevo
node --check src/index.mjs
2. Configurar com segurança
Mantenha paidConsent como false até que os preços atuais e a limitação de preço não atômica sejam aceitos. Mantenha ambas as chaves API em segredos do servidor e use um diretório de ledger persistente privado em armazenamento durável de host único. expectedPriceMillicents deve ser igual ao máximo recém-obtido, mas o débito de classify ainda não pode aplicar esse valor de forma atômica.
const integration = new SendReputeBrevo({
sendreputeApiKey: process.env.SENDREPUTE_API_KEY,
brevoApiKey: process.env.BREVO_API_KEY,
paidConsent: false,
expectedPriceMillicents: approvedMaximum,
ledgerDirectory: "/var/lib/my-app/sendrepute-brevo",
});
3. Usar deliberadamente
Chame send apenas a partir do caminho controlado do servidor que deve tanto classificar quanto entregar. Reutilize uma sendKey estável para cada tentativa do mesmo e-mail pretendido. Forneça conteúdo em linha fixo; não forneça IDs de template da Brevo, parâmetros mutáveis, agendamento ou versões de mensagem. Envios feitos em outros lugares ignoram completamente este wrapper.
await integration.send({
sendKey: durableBusinessEventId,
message: {
sender: { name: "Example Shop", email: "orders@example.com" },
to: [{ email: recipient }],
subject,
textContent,
htmlContent,
},
});
Resultados, falhas e limites
Um resultado Inbox dentro do limite permite uma requisição da API transacional do Brevo para o mesmo snapshot imutável. O ledger muda para delivery-unknown antes do despacho do provedor. Timeouts, desconexões, sucessos malformados, falhas (crashes) e rejeições do provedor nunca são repetidos automaticamente; reconcilie-os com os registros do Brevo antes de qualquer decisão manual.
Fluxo de envio controlado BigMailer
0.1.0
Um wrapper local não publicado para Node.js 24+ para chamadas explícitas da API transacional do BigMailer. Ele não se instala no BigMailer nem intercepta envios do painel ou de APIs não relacionadas. Como o BigMailer detém o conteúdo da campanha editável remotamente, o wrapper não pode provar que a campanha permaneceu igual ao snapshot de renderização fornecido pelo chamador entre a revisão e a entrega.
enabled, paidConsent e remoteTemplateSnapshotLimitationAcknowledged todos vêm desativados por padrão. O chamador deve fornecer e gerar o hash de um snapshot de renderização completo, congelar operacionalmente a campanha remota correspondente e fornecer uma deliveryKey durável. O preço é verificado novamente antes da classificação, mas a API de classificação atual não possui um campo atômico expectedPriceMillicents. Estados de entrega duplicados, bloqueados, rejeitados e ambíguos nunca são reenviados automaticamente.
Baixar ZIP da fonte experimental do BigMailer
1. Instalar
Extraia este arquivo ZIP de código não publicado na aplicação servidora controlada em Node.js 24+ e revise os arquivos README.md e SECURITY.md. Importe o wrapper e o FileDeliveryStore diretamente de src. Esta não é uma instalação via npm ou do marketplace do BigMailer e não possui dependências de tempo de execução de terceiros.
curl -fLO https://www.sendrepute.com/downloads/sendrepute-bigmailer.zip
unzip sendrepute-bigmailer.zip
cd sendrepute-bigmailer
node --check src/index.mjs
node --check src/file-delivery-store.mjs
2. Configurar com segurança
Mantenha enabled, paidConsent e remoteTemplateSnapshotLimitationAcknowledged como false até a revisão. Armazene as chaves de API, UUIDs de marca e campanha apenas no lado do servidor. Coloque o FileDeliveryStore em armazenamento durável privado. Copie o preço revisado recentemente para expectedPricing, compreendendo que a API classify atual não pode bloqueá-lo atomicamente.
const integration = createBigMailerIntegration({
enabled: false,
paidConsent: false,
remoteTemplateSnapshotLimitationAcknowledged: false,
sendReputeApiKey: process.env.SENDREPUTE_API_KEY,
bigMailerApiKey: process.env.BIGMAILER_API_KEY,
brandId,
campaignId,
expectedPricing,
deliveryStore: new FileDeliveryStore("/var/lib/my-app/bigmailer-deliveries.json"),
});
3. Usar deliberadamente
Para cada envio controlado por API, forneça uma deliveryKey estável, todas as alternativas text/plain e text/html exibidas, o render snapshot exato e o snapshotDigest(snapshot). Reconheça a remote-template limitation apenas quando um controle operacional congelar a revisão da campanha BigMailer correspondente a esse snapshot. O Dashboard e envios de API não relacionados ignoram este wrapper.
await integration.send({
deliveryKey: durableBusinessEventId,
snapshot,
snapshotSha256: snapshotDigest(snapshot),
email: recipient,
variables,
});
Resultados, falhas e limites
O armazenamento de arquivos reserva a chave de entrega antes da classificação. Resultados de duplicata, conflito, bloqueio, rejeição e entrega ambígua não podem ser reenviados automaticamente. O endpoint de envio do BigMailer aceita dados de mesclagem em vez do corpo inspecionado, portanto, uma classificação bem-sucedida não é prova de que o conteúdo mutável da campanha remota ainda coincide; use outro provedor quando o acoplamento exato for necessário.
Privacidade e operações pagas
A análise envia o nome de exibição do remetente, o assunto e o corpo da mensagem para o SendRepute. Destinatários e anexos não são transmitidos separadamente, mas o conteúdo incluído no corpo é transmitido. Mantenha as credenciais em segredo e desative o log de requisições/corpo (request/body logging). Sem garantias de entrega ou de colocação na caixa de entrada.
A classificação é paga. Leia os preços atuais e os limites de gastos da sua conta antes de conceder o consentimento. Uma solicitação idêntica de conta/conteúdo/modelo pode reproduzir um recibo dentro de 24 horas; conteúdo ou modelo alterado pode incorrer em uma nova cobrança. Não presuma que uma tentativa de repetição seja gratuita. A reescrita por IA requer uma cotação de carga máxima para o recibo pai, modo e termos selecionados antes do envio pago; consulte um recibo em andamento e recupere resultados concluídos com o ID da solicitação original em vez de iniciar outra solicitação. 'Reescrever Tudo' pode verificar um rascunho final renderizado exato sem outro débito. A geração de modelos por IA e o acesso VIP nativo têm preços separados; o processamento do construtor padrão é gratuito. Nenhum resultado de análise, reescrita ou construtor garante a entrega, o posicionamento na caixa de entrada ou a conformidade.
A validação offline não é uma certificação de cada versão de framework, plugin ou transporte. Leia as instruções de instalação e segurança incluídas, mantenha a análise paga desativada até que seja deliberadamente configurada e teste sua política de falha escolhida antes de ativá-la para e-mails críticos.
Revisar preços
Referência da API do Cliente
Pedir suporte de integração