
Security News
Rust 1.100 Will Add Dependency Cooldowns to Cargo
Rust 1.100 will add opt-in dependency cooldowns to Cargo, giving security scanners and maintainers time to catch malicious crate releases.
@vouchscore/sdk
Advanced tools
Trust scores for AI agents and x402 payees on Base. Read a score, or gate a payment with SpendGuard before it settles.
Thin TypeScript client for the vet402 Trust API. Node 20+, ESM, zero runtime dependencies.
npm install @vouchscore/sdk
Get a key at vet402.com/dashboard/keys,
export it as VOUCH_API_KEY, and this runs as-is:
import { createVouchClient } from "@vouchscore/sdk";
// apiUrl defaults to https://vet402.com/api/v1 — pass it only to point at
// another deployment (a local dev server, say).
const vouch = createVouchClient({ apiKey: process.env.VOUCH_API_KEY! });
// Seller side: "should I accept payment from this wallet?"
const score = await vouch.getWalletScore("0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045");
console.log(score.trustScore, score.recommendation); // e.g. 72 'ALLOW'
// Buyer side: "should my agent pay this wallet?"
const payee = await vouch.getPayeeScore("0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045");
console.log(payee.score, payee.recommendation, payee.dataDepth);
// After an x402 payment settles, feed it back (weights future scores).
await vouch.attestX402Payment({
wallet: "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
txHash: "0x" + "11".repeat(32),
resource: "/api/premium/data",
});
Methods: getAgentScore, getWalletScore, getPayeeScore, batchScore, attestX402Payment, createSpendGuard.
On 0.1.0? Check with
npm ls @vouchscore/sdk. That release predates three things documented here: theapiUrldefault (passapiUrl: "https://vet402.com/api/v1"explicitly), theVouchApiErrorclass (errors are plainErrors whosemessageis the API's code), and the fail-closedtrustPolicydefault (see SpendGuard below). Everything else below is the same on both.
A non-2xx answer throws a VouchApiError carrying the API's machine-readable
code and the HTTP status, so you can tell your key is wrong from we are
having a bad day without parsing strings:
import { VouchApiError } from "@vouchscore/sdk";
try {
await vouch.getPayeeScore("0x...");
} catch (err) {
if (err instanceof VouchApiError && err.status === 401) {
// err.code === "missing_api_key" | "invalid_api_key" — fix the key.
}
}
Buyer-side counterpart to the score lookups above: before your agent pays someone, ask the guard. It returns an allow/deny decision plus machine-readable reasons — and nothing else. SpendGuard is strictly non-custodial: it never touches keys, funds, signing, or transaction submission. Execution stays with your wallet stack (Coinbase AgentKit, Privy, ...).
BREAKING (v0.2.0): fail-closed by default. Money moves only on a clean
ALLOWverdict unless you explicitly opt out. With notrustPolicyset, everyevaluate()performs the payee trust lookup and denies when:
Condition Reason code Recommendation is WARNorBLOCKpayee_recommendation_not_allowThe score came from a degraded read payee_score_degradedPartial measurement ( signalsUnavailablenon-empty)payee_partial_measurementThe lookup was refused for your key (401/403) payee_trust_unauthenticatedThe lookup failed on our side (5xx, timeout, rate limit) payee_trust_unavailableOpt-outs:
trustPolicy: "block-only"(WARN passes; BLOCK, degraded and failed lookups still deny) ortrustPolicy: "custom"(pre-0.2.0 behaviour — only the rules you set apply, and the lookup only runs whenminPayeeScore/blockOnRecommendationis set).Which default do you have? Check with
npm ls @vouchscore/sdk. 0.1.0 has notrustPolicyoption: the lookup runs only when you setminPayeeScore/blockOnRecommendation, which is what"custom"means here. 0.2.0 and later are fail-closed out of the box.
const guard = vouch.createSpendGuard({
maxPerTxUsd: 10, // deny any single payment above $10
dailyBudgetUsd: 50, // deny once today's allowed total would pass $50
// trustPolicy: "allow-only" is the default: deny anything but a clean ALLOW
minPayeeScore: 40, // optional stricter floor on top of the policy
});
const decision = await guard.evaluate({ payee: "0x...", amountUsd: 5 });
if (decision.allow) {
// hand off to AgentKit / Privy / your own signer
} else {
console.error(decision.reasons); // e.g. ["payee_recommendation_not_allow"]
}
How it works:
maxPerTxUsd, dailyBudgetUsd) are optional — set only
the ones you want. Under the default trustPolicy: "allow-only" the payee
trust lookup (GET /v1/payees/{address}/score) always runs, but is skipped
when a local rule already denied, so no quota is burned on a dead payment.
Only trustPolicy: "custom" makes the lookup conditional on
minPayeeScore / blockOnRecommendation being set — with "custom" and
neither set, no API calls happen at all.payee_trust_unauthenticated means the API key is missing or invalid and
retrying will not help; payee_trust_unavailable means the upstream is
unhappy and retrying might.evaluate calls within one process cannot
race past the daily budget together. If an allowed transfer then fails or
is skipped, call guard.release(amountUsd) to give the reservation back.Absolute, because relative repo paths do not resolve on the npm package page.
VOUCH_API_KEY@vouchscore/middleware — seller side (x402 request gate)@vouchscore/mcp-server — MCP toolMIT · vet402
FAQs
Trust scores for AI agents and x402 payees on Base. Read a score, or gate a payment with SpendGuard before it settles.
We found that @vouchscore/sdk demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.

Security News
Rust 1.100 will add opt-in dependency cooldowns to Cargo, giving security scanners and maintainers time to catch malicious crate releases.

Security News
Cloudflare is acquiring Deno’s team, which will provide another year of bug fixes and security updates before ending support for the runtime.

Security News
Anthropic’s free OSS Scanner uses Mythos and other Claude models to find open source vulnerabilities and send maintainers reports with proposed fixes.