Counterparty Check.

Check the payee before your agent pays.

One API call before money moves. It screens the payee against US sanctions lists, spots domains imitating real vendors, catches mistyped or fabricated bank and wallet details, and recognizes the patterns behind invoice fraud. You get back proceed, review or block, the reasons, and a signed receipt for your audit trail.

Exhibit A: a real-looking invoice request
POST /v1/check
payee email   ar@acmesupp1y.com
on file       acmesupply.com
bank details  changed, by email
tone          "pay today"
  • Lookalike domainacmesupp1y.com swaps an "l" for a "1" in the vendor's real domain.
  • Domain registered 6 days agoFraud campaigns use fresh domains; real suppliers rarely do.
  • Bank details changed by email, under pressureThe textbook business email compromise pattern.

What it checks

Every finding comes with a plain-English explanation, the evidence behind it, and how much it moved the score. Anything that could not be checked is listed, never silently passed.

CheckWhat it looks forTypical effect
SanctionsPayee name and aliases against the OFAC SDN and consolidated lists, with fuzzy matching; receiving wallets against OFAC-listed crypto addresses; embargoed countries and regions.block
Vendor impersonationWebsite and email domains that imitate the vendor domain you have on file: swapped characters, extra words, a different ending, the real name tucked into someone else's domain.block
Executive impersonationPayment requests sent from addresses imitating your own company's domain.block
Changed payment detailsNew bank or wallet details compared with the last payment, how the change was requested, and whether there was pressure to pay quickly.review to block
Domain and emailDomain registration age, domains that don't exist, mail servers, SPF and DMARC, free and disposable email used by businesses.review
Brand impersonationDomains and names posing as well-known companies such as Microsoft, PayPal, DocuSign or major banks.review to block
Payment detailsUS routing number check digits, IBAN check digits and length, SWIFT/BIC format, wallet checksums for Ethereum-style, Bitcoin, Solana and TRON addresses.review

Pricing

Full check

$0.25

Everything above, in one call. POST /v1/check

Sanctions screen

$0.05

Names, wallets and jurisdictions only. POST /v1/screen

Receipt verification

Free

Prove a past check is authentic. POST /v1/receipts/verify

Pay per call, no account

Agents with a wallet pay each call in USDC on Base using the x402 protocol. Call the endpoint, receive a 402 with the price, pay, and retry. No sign-up, no API key. The Machine Payments Protocol (MPP) is accepted too.

Or buy prepaid credit

Pay by card, get an API key immediately, and spend the balance on any check. Credit doesn't expire. Unused credit can be refunded within 30 days of purchase; see the refund policy.

Starter

$25

$25 of credit, about 100 full checks.

Growth

$100

$110 of credit, about 440 full checks.

Scale

$500

$600 of credit, about 2,400 full checks.

Add credit to a key you already have

Integrate

With an API key

curl https://counterpartycheck.com/v1/check \
  -H "Authorization: Bearer cc_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "counterparty": {"name": "Acme Supply Co", "country": "US", "email": "ar@acmesupply.com"},
    "payment": {"method": "ach", "routing_number": "021000021", "amount": 4850, "currency": "USD"},
    "context": {"known_good_domain": "acmesupply.com", "bank_details_changed": false}
  }'

As an MCP server

Add it to Claude, Cursor or any MCP client. Your agent gets check_counterparty, screen_sanctions, check_balance and verify_receipt.

{
  "mcpServers": {
    "counterparty-check": {
      "url": "https://counterpartycheck.com/mcp",
      "headers": { "Authorization": "Bearer cc_live_…" }
    }
  }
}

Pay per call with x402

import { wrapFetchWithPayment, x402Client } from '@x402/fetch';
import { ExactEvmScheme } from '@x402/evm';

const pay = wrapFetchWithPayment(fetch,
  new x402Client().register('eip155:8453', new ExactEvmScheme(signer)));

const res = await pay('https://counterpartycheck.com/v1/check', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({ counterparty: { name: 'Acme Supply Co', email: 'ar@acmesupply.com' } }),
});

Give the context object everything your agent knows: whether this is the first payment, whether bank details changed and how the change arrived, the vendor's domain on file, your own domain. Those fields are what separate a routine invoice from a fraud attempt.

What it doesn't do