The Passiv agent API.
Buy anonymized wallet-cohort intelligence the way agents pay for anything else — per call, in USDC, over x402. No accounts, no invoices: the first request returns a 402 with a price, your wallet signs the micropayment, and the retry returns the data. Every response is cohort-level only (k ≥ 50) — never an address, transaction hash, or member id.
Preview: the endpoints are live but currently serve synthetic cohorts (PSV_DATA_SOURCE=mock); real cohort data ships with the live data layer.
Overview
Passiv turns a Base wallet's public behavior into an anonymized, cohort-level profile. Wallet owners opt in and keep 80% of every query; the protocol keeps 20%. The agent API is the buyer side: it serves those cohorts to paying agents and settles owners' shares on-chain.
Endpoints
/v1/cohortsfreeDiscover queryable cohorts (aggregate catalog, k≥50 only).
/v1/query$0.02–$0.05Match a cohort and return its bucketed behavioral profile.
/v1/insight$0.05An AI-written summary of a cohort's trading behavior.
Prices stay within the $0.02–$0.05 band. An optional X-Buyer-Type header (agent, researcher, market-maker, indexer) labels revenue attribution.
How x402 works
agent ──POST /v1/query──────────────▶ oracle
◀──── 402 Payment Required ───── { accepts: [{ asset: USDC, maxAmountRequired }] }
agent ──POST + X-PAYMENT (signed) ──▶ oracle ── verify+settle on Base (facilitator)
◀──── 200 OK ────────────────── { cohortId, k, profiles, suppressed }Settlement uses the standard x402 facilitator on Base — the oracle never holds your keys, and you never hold an account with us. Sub-floor cohorts (k < 50) are suppressed: you get suppressed: true and no data.
SDK quickstart
The TypeScript SDK runs the whole 402 → pay → retry handshake. Supply a payer (your USDC-on-Base wallet/facilitator) and call query().
import { createPassivClient } from "@passiv/sdk";
const client = createPassivClient({
baseUrl: "https://oracle.passiv.finance",
payer: async (req) => signX402Payment(req), // your USDC-on-Base wallet
});
const cohort = await client.query({
traderType: "swing",
minMonthlyVolumeUsd: 10_000,
});
console.log(cohort.cohortId, cohort.k, cohort.profiles.length);
// → swing-moderate 340 12 (the SDK refuses any cohort with k < 50)Privacy guarantees
- k ≥ 50 — every served cohort has at least 50 members; smaller cohorts are suppressed.
- No identities — responses carry bucketed behavior only; never an address, tx hash, or member id.
- Cohort-level only — you get a representative sample of buckets, never the full roster or a linkable handle.
- Guarded AI — cohort insights are generated from aggregates and pass a fail-closed identifier filter.
Building something? Start with the developer docs or get in touch.
PASSIV