Package Information
Documentation
n8n-nodes-sendrepute
An n8n community package for SendRepute customer services. Its original classification node
accepts only sender, subject, and body; it has no recipient or attachment
input.
Customer services
The additional SendRepute Services node exposes the current non-deprecated
customer API operations: account, billing, catalogs, AI rewrites, standard and VIP
templates, builder services, and campaign insights. Choose an operation to reveal
its contract fields. Structured documents use JSON fields.
Every non-GET operation requires explicit authorization for each input item.
Fetch and review the appropriate price quote before enabling that authorization
and entering its expected price. Requests are not automatically retried. Keep
recovery identifiers and use result/recovery operations after ambiguous failures.
API key scopes, membership eligibility and spending limits still apply.
The original classification node and its workflow decisions remain unchanged.
The package is available on npm; this does not imply approval for n8n Cloud's
verified community catalog.
Security and decision model
- Paid-analysis consent is explicit and defaults to off. With consent off,
no request is made. - The credential uses n8n's password-field credential schema and is sent only
as a bearer header. The node never includes it in output or errors. - Requests go only to the fixed
https://www.sendrepute.com/api/v1/classify
endpoint, use verified platform TLS, have a 20-second timeout, reject
redirects, and cap response bodies at 1 MiB. - The node performs exactly one request per consenting input item. It does not
retry paid analysis. The service may return a cached receipt for an exact
repeat, but callers must not assume a request is free. - A score must be a finite number from 0 through 1. Invalid JSON, malformed
results, network failures, authentication/authorization failures, insufficient
balance, and rate limiting are failures—not spam classifications. - Advisory mode always allows a successfully analyzed item and emits a
separaterecommendation. Blocking mode blocks when the probability is
at or above the threshold. - Fail closed returns
decision: "block"when analysis cannot run. Fail
open returnsdecision: "allow"plusanalysisStatus: "failed"and a
failure category. Consumers must checkallowed; merely receiving output is
not an allow decision.
Classification is a pre-send content safety signal. It does not guarantee
inbox placement, email delivery, or compliance.
Build and test reproducibly
Requirements: Node.js 20.19 or newer and npm. From this directory:
git clone https://github.com/sendrepute/n8n-nodes-sendrepute.git
cd n8n-nodes-sendrepute
npm ci
npm run pack:check
npm pack --ignore-scripts
npm ci uses this package's committed package-lock.json; it does not modify
the repository root lockfile. pack:check compiles against the real publishedn8n-workflow 2.39.3 types and runtime, runs offline HTTP transport and node tests, checks
tarball contents, and installs that tarball into an isolated temporary npm
project. TypeScript's skipLibCheck is enabled because the
published n8n type bundle references optional packages that are not required by
this node; this package's own source remains strict-checked.
Tests make no paid API calls and send no email. Their HTTP server is bound to
loopback only.
The tested dependency is pinned to the registry's stable release, 2.39.3,
rather than its older latest alias (2.16.0) or beta (2.41.0). The peer range
is >=2.39.3 <3; use a patched self-hosted n8n release that supplies a compatible
workflow runtime. Do not force-install into an older incompatible host.
Run npm audit after npm ci to check current advisory data. The upgraded
lockfile passed a full audit with zero reported vulnerabilities when tested;
this is a point-in-time result, not a guarantee against future advisories.
Install on self-hosted n8n
- Build the tarball using the commands above.
- On the n8n host, create the custom-node directory if necessary:
mkdir -p ~/.n8n/nodes. - In that directory, run
npm install /absolute/path/to/n8n-nodes-sendrepute-0.1.0.tgz. - Restart the self-hosted n8n process and confirm SendRepute appears in the
node picker. - Create a SendRepute API credential containing a server-side customer API
key with theclassifyscope. Do not put the key in workflow JSON,
expressions, environment output, or logs.
Because the package is unpublished, n8n's Settings → Community nodes npm
name installation and n8n Cloud community-node installation are not supported.
Workflow use
Import examples/classify-email.workflow.json. It intentionally contains no
credential reference or secret and keeps paid consent disabled. Attach a
credential, review the inputs, threshold, decision mode, and failure policy,
then deliberately enable paid consent.
On completion the node preserves the input JSON and replaces the completesendrepute namespace with an explicit analysisStatus, decision, allowed,recommendation, validated result fields, a billing receipt, and the advisory
disclaimer. On failure it replaces that namespace with a result that omits
classification labels/scores and contains only a sanitized failureCategory
and errorCode. This prevents stale decision fields from a previous run from
being mistaken for the current result. The example routes the result through an
IF node and leaves the false output unconnected, so onlysendrepute.allowed === true continues.
Supported hosted route: POST /api/v1/classify (the customer contract's/v1/classify behind the hosted /api prefix), with sender (1–320
characters), subject (1–998), and body (1–524,288). Model selection is
intentionally left to the account preference. Recipients, attachments,
rewrites, sending, arbitrary origins, custom headers, and automatic retries are
not supported.
Complete node parameter reference
The node type is n8n-nodes-sendrepute.sendRepute, version 1. It has one main
input and one main output. It processes input items sequentially, preserving
item pairing. Configure these properties in the node editor:
| Property | Values / default | Behavior |
|---|---|---|
operation |
classify only |
Classify Email; no other API operations are implemented. |
paidConsent |
Boolean, false |
Explicit permission for a potentially paid request for each valid input item. |
sender |
Required string, 1–320 JavaScript string units | Sender display name, not an address or recipient list. |
subject |
Required string, 1–998 JavaScript string units | Rendered message subject. |
body |
Required string, 1–524,288 JavaScript string units | Plain text or HTML; render templates before this node. |
decisionMode |
advisory (default), blocking |
Advisory allows successful analysis; blocking follows the recommendation. |
threshold |
Finite number 0–1, default 0.8 |
Recommend block when spamProbability >= threshold. |
failurePolicy |
closed (default), open |
Block or allow when a known analysis/input failure occurs. Invalid configuration and unexpected internal errors always fail closed. |
Credential type sendReputeApi has one required password field: apiKey.
Credential lookup failure or a non-string key stops node execution before the
item loop. Empty, oversized or newline-containing string credentials are
reported as per-item authentication failures when paid analysis is attempted.
For an upstream item containing sender, subject and body, use expressions={{ $json.sender }}, ={{ $json.subject }}, and ={{ $json.body }}. The included
manual-trigger workflow does not generate message fields: add an Edit Fields
node or your actual source before classification. Keep consent off until the
input and billing policy have been reviewed.
Output and failure reference
The node copies input JSON, replacing any existing sendrepute object:
- Successful analysis:
analysisStatus: "completed",decision(alloworblock), Booleanallowed,recommendation,decisionMode,threshold,label(inboxorspam),spamProbability,confidence(low,medium,high),reasons(objects withsignal,detail, finiteweight),flaggedTerms,analyzedFields,model,modelVersion,analyzedAt,requestId, andbilling(chargedMillicents,replayed). - Known failure:
analysisStatus: "failed",decision,allowed,failurePolicy,failureCategory, and sanitizederrorCode. No stale
classification score or label is retained. - Disabled consent:
analysisStatus: "not_run",decision,allowed,failurePolicy,failureCategory: "consent_required". There is noerrorCode, classification or billing result. The selected failure policy
determinesallowed; no request is made. - Every outcome includes an
advisorystring anddeliverabilityGuarantee: false.
HTTP 400/413/422 map to malformed, 401/403 to authentication, 402 tobalance, 429 to rate_limit, and other unsuccessful responses to service,
with HTTP_<status> codes. Redirects and network/timeouts map to transport.
Examples of transport codes are REDIRECT_REFUSED, NETWORK_ERROR, TIMEOUT,FETCH_UNAVAILABLE, and RESPONSE_READ_ERROR. Oversized, non-JSON or invalid
successful responses use RESPONSE_TOO_LARGE, INVALID_JSON, orINVALID_RESPONSE. Invalid credential strings use INVALID_CREDENTIAL.
Node-side validation uses INVALID_CONFIG, INVALID_INPUT, orUNKNOWN_FAILURE; these are not spam determinations.
Downstream send nodes must be behind an IF check of{{ $json.sendrepute.allowed }} equal to Boolean true. Connect the false
branch to explicit review/defer handling. This node does not send or queue mail.
Input JSON remains available downstream and may contain sensitive data; configure
n8n execution-data retention and access controls accordingly.
For contributors, SendRepute.execute is the n8n execution entry point andSendReputeApi describes credentials. The internal transport helperclassify(apiKey, { sender, subject, body }, { fetch? }) returns a validatedClassificationResponse or throws SendReputeTransportError with category,code, and optional HTTP status. Its optional fetch injection exists for
offline testing, not for a workflow-configurable URL or authentication bypass.
Consent and policy enforcement belong to the node; the helper alone does not
enforce them and is not a standalone public SDK API.
Support and security
Use GitHub issues for reproducible, non-sensitive bugs. Account support and
private vulnerability reports: support@sendrepute.com. Never include API keys,
customer messages or unredacted workflow data. See SECURITY.md.
MIT licensed; see LICENSE.