AssayCelo mainnet

Docs

Check any Celo address before paying it, from a browser, an HTTP call, an x402 client or an MCP tool. Read the score onchain from a contract.

Quickstart

The free endpoint returns the whole report for any address. No key, no wallet.

Free report with curl
curl https://api-production-63cc.up.railway.app/v1/address/0xSELLER

Agents that check sellers before paying them use the paid check: $0.002 in USA₮, USDC or USDT over x402, no rate limit, and a signed score in the answer.

Paid check with an x402 client
import { x402Client, wrapFetchWithPayment } from "@x402/fetch";
import { ExactEvmScheme } from "@x402/evm/exact/client";
import { privateKeyToAccount } from "viem/accounts";

const client = new x402Client().register("eip155:42220", new ExactEvmScheme(privateKeyToAccount(KEY)));
const pay = wrapFetchWithPayment(fetch, client);
const res = await pay("https://api-production-63cc.up.railway.app/v1/check/0xSELLER");
const { verdict, rating, reasons, attestation } = await res.json();

HTTP API

EndpointPriceReturns
GET /v1/check/:address$0.002pass, caution or block; rating; organic share; reasons; signed EIP-712 score
GET /v1/attest/:address$0.01the full report plus a signed score AssayRegistry accepts
GET /v1/address/:addressfree, rate limitedthe full report: revenue split, payers, flags with evidence, identity
GET /v1/economyfreegross vs organic volume, loops, ratings, review stats, top sellers
GET /v1/economy/daily?days=120freevolume per UTC day, gross and organic
GET /v1/sellers?sort=organic|grossfreeevery seller with its rating, paginated
GET /v1/agents?q=&paid=1freeERC-8004 agents ranked by reviews from paying wallets
GET /v1/agents/:idfreeone agent with its report and every review, each tiered by payment
GET /v1/agents/:id/payments/:clientfreea client's settlements to an agent, for reviewing
GET /v1/proof/:txfreea live check of one settlement transaction on Celo
GET /v1/statusfreeindexed block, lag, relayers, attester and registry
GET /.well-known/agent-registration.jsonfreeAssay's own ERC-8004 registration file

Errors are JSON with error and message. Bad addresses answer 400 before any payment is asked for. The free endpoints allow 60 calls a minute per IP and answer 429 with retry-after after that.

SDK guard

withAssayGuard wraps any x402 paying fetch. When a seller answers 402, every payTo it offers is checked first; a blocked seller throws AssayBlockedError and nothing is paid. Responses that are not 402 pass through untouched.

Guarding an x402 client
import { withAssayGuard, AssayBlockedError } from "@assay/sdk";

const guarded = withAssayGuard(fetch, pay, {
  baseUrl: "https://api-production-63cc.up.railway.app",
  minRating: "BB",        // optional: refuse anything rated below BB
  allowUnrated: true,     // new sellers have to start somewhere
  onAssayError: "allow",  // fail open if Assay is unreachable; "block" to fail closed
});

try {
  await guarded("https://seller.example/api/forecast");
} catch (e) {
  if (e instanceof AssayBlockedError) console.log(e.result.reasons);
}

MCP server

Four read-only tools for any MCP client: assay_check_seller, assay_report, assay_find_agents and assay_economy.

Add the MCP server to Claude Code
git clone https://github.com/Oshioke-Salaki/assay && cd assay && pnpm install && pnpm -r --filter @assay/mcp... build
claude mcp add assay --env ASSAY_URL=https://api-production-63cc.up.railway.app -- node $(pwd)/packages/mcp/dist/index.js

AssayRegistry

A paid check or report includes an EIP-712 Score signed by Assay’s attester. Anyone can submit it to AssayRegistry on Celo; contracts then read it without trusting an API. Scores are valid for 7 days and only a newer score replaces an older one.

Gating a contract on an Assay rating
interface IAssayRegistry {
    function isInvestmentGrade(address subject) external view returns (bool); // fresh and BBB or better
    function verify(Score calldata s, bytes calldata signature) external view returns (bool);
}

function payOut(address seller) external {
    require(assay.isInvestmentGrade(seller), "seller not investment grade");
    // ...
}

Rating codes run from 1 (D) to 8 (AAA); 0 is not rated. The domain is Assay, version 1, chain 42220, verifying contract the registry.

Payment-verified reviews

Reviews in the ERC-8004 Reputation Registry cost nothing to write, so most say little. Assay tiers every review on Celo: payment proven when its feedback file names a settlement that Assay finds onchain from the reviewer to the agent, paid customer when the reviewer paid the agent before writing it, and never paid it otherwise. Reviews written from an agent’s page here store their file inline as a data: URI with proofOfPayment, so anyone can check them without Assay.

Methodology

Version 2026.10-1. Every x402 settlement on Celo is read from finalized blocks:

  • EIP-3009 transfers of USDC, USD₮ and USA₮ that the payer signed and someone else submitted, paired with their AuthorizationUsed event;
  • wARS, wBRL and wCOP transfers inside calls to the x402 Permit2 proxy, priced in dollars at that day’s rate.

Revenue is then assayed. A payment counts as organic unless:

  • It comes back. Sellers and payers that can reach each other through payments form a loop (a strongly connected component). Within a loop only the net inflow counts: money the seller sends back to its loop is subtracted from what the loop paid it.
  • The seller paid for it. A payer first funded by the seller, or by a wallet the seller funded, counts for nothing.
  • It shares the seller’s purse. A payer funded by the seller’s own private funder, or by a member of its loop, counts for nothing. Exchanges, bridges, contracts and very busy wallets are public sources and are ignored, unless they buy or sell over x402 themselves.

The score is 100 × quality^1.5 × (0.55 × diversity + 0.45 × track) × dormancy + identity, where quality is the organic share, diversity is 1 − e^(−payers/6) over effective independent payers (an inverse Herfindahl in which wallets with one private funder, or one Self human, count once and wallets created only to pay count half), track is 1 − e^(−days/10) over days with organic revenue, dormancy is 0.85 after 30 idle days and 0.6 after 90, and identity adds up to 8 points for an ERC-8004 identity and a fresh Self proof, only when quality is 0.5 or more.

AAAAAABBBBBBCCCD
90+80+70+60+45+30+15+0+

Fewer than 5 settlements, 2 payers or $0.05 of revenue is a thin file: the numbers are shown and the rating is NR. Funding data is filled in continuously; until a payer is checked it is treated as independent and the report says how much is checked. wFIAT days before Assay’s first stored rate use the earliest stored rate.

Pricing and limits

Reports in the browser and the free endpoints cost nothing, within 60 calls a minute. Paid endpoints are $0.002 per check and $0.01 per full report with attestation, paid over x402 through Celo’s facilitator in USA₮, USDC or USD₮. The seller pays the facilitator’s fee; buyers pay only the price.

Run your own

Assay is open source. One process indexes Celo, enriches addresses and serves the API from a SQLite file; the web app is a separate Next.js deploy.

Running the server
git clone https://github.com/Oshioke-Salaki/assay && cd assay
pnpm install && pnpm build
cp apps/server/.env.example apps/server/.env   # set PAY_TO, X402_API_KEY, ATTESTER_PRIVATE_KEY, REGISTRY_ADDRESS
pnpm --filter @assay/server backfill            # index Celo history once
pnpm --filter @assay/server start               # API + indexer

Source on GitHub