botsrated (Python)
A pre-payment check for x402 agents. Before your agent pays a seller, it asks
BotsRated what it has measured about that seller, using the free
GET /v1/preflight route. Paid lookups are opt-in and capped by a budget you set.
BotsRated is in beta. It covers about 4,800 x402 seller hosts on Base, taken from the CDP Bazaar, Agentic.Market, 402index and x402-list. Each host gets an unpaid probe about every 1.8 h, and every receipt is signed.
Status: published on PyPI: botsrated 0.1.3.
pip install botsrated # free preflight + guard
pip install "botsrated[x402]" # + x402 SDK hook / paid lookups
Guard an x402 client (free)
from x402 import x402ClientSync
from x402.mechanisms.evm import EthAccountSigner
from x402.mechanisms.evm.exact import ExactEvmScheme
from botsrated import PrePaymentGuard
client = x402ClientSync()
client.register("eip155:*", ExactEvmScheme(signer=EthAccountSigner(account)))
client.on_before_payment_creation(PrePaymentGuard().x402_hook)
Defaults:
- A payTo that differs from every payTo BotsRated's own probes saw for the host, on the same network, is blocked.
The seller's directory listing alone never confirms a payTo: with no probe observation, a listing match is
allowed with a
payto_listing_onlynote and a listing mismatch is blocked. - A price above the last observed price on the same route is a warning.
- A host that is not covered is allowed.
- Data older than 24 h is allowed.
- If BotsRated cannot be reached (4 s timeout), the payment is allowed (
fail_open). - The minimum valid-402 rate is off.
Change these with GuardPolicy(...). Preflight answers are cached for 5 minutes per host.
Opt-in paid lookups with a budget
from botsrated import BotsRatedClient, PrePaymentGuard
botsrated = BotsRatedClient(budget_usd="0.05", x402_client=client) # signs only the validated quote
guard = PrePaymentGuard(botsrated, paid_check_at_or_above_usd=0.25)
client.on_before_payment_creation(guard.x402_hook)
botsrated.check("seller.example") # $0.001 (first 100/day free)
botsrated.report("seller.example") # $0.002 (first 10/day free)
botsrated.best("web search") # $0.01
x402_client= (since 0.1.4) is the recommended mode: the client validates the 402, rebuilds it from
the allowlisted fields only (scheme, network, asset, amount, payTo, maxTimeoutSeconds, EIP-3009
name/version, resource url/description/mimeType; never extensions), signs that copy with
client.create_payment_payload, and sends PAYMENT-SIGNATURE itself. The signer never sees the raw
402. The older paying_get=x402_requests(client).get still works, but that session re-reads the 402
itself, so register the guard on the same x402 client so the re-served 402 is checked again before signing.
How paid calls work:
- Free daily quota: the first 100
/v1/checkand 10/v1/reportcalls per client per UTC day are served free (200 withcharged: falseand afree_quotablock). The client asks unpaid first, so inside the quota nothing is paid and the budget is untouched;check()/report()also work without a budget until the quota is used up (thenpaid_disabled).client.last_free_quotashows what is left. - Otherwise the client reads the 402 quote unpaid first. It accepts the quote only if every option is
exactUSDC on Base to BotsRated's payTo0x7F936f42F46B6c4Cbd3242cF8A1759dfe829E349, at or below the published price. - The amount is reserved from the budget before paying. If the paid call fails or raises, it stays counted (the payment may already have settled), so the budget is a hard ceiling.
- Only a one-shot EIP-3009 payment is signed: an option whose
extraholds anything beyond the token'sname/version(e.g.assetTransferMethod: permit2,paymentFlow), amaxTimeoutSecondsabove 600, or payment extensions in the 402 (e.g.erc20ApprovalGasSponsoring; only the discovery-onlybazaarkey is tolerated) rejects the quote withterms_rejectedbefore anything is paid. - With
x402_client=, if signing fails nothing can settle and the reservation is released (payment_not_created). - When the guard is registered, it refuses any payment to botsrated.com that the client did not reserve or that carries payment extensions, and strips extensions before the x402 signer runs.
Tests
uv run --with pytest --with respx --with "x402[evm]" pytest
License: MIT. BotsRated reports measurements, not endorsements.
Metadata
Release files for botsrated 0.1.4
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| botsrated-0.1.4.tar.gz | 214.5 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| botsrated-0.1.4-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 228.3 kB
Release files / botsrated-0.1.4.tar.gz
| Download URL | botsrated-0.1.4.tar.gz |
|---|---|
| Size | 214.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
a96817a4559843f3f7f1b76ec8a8413e9bcc672ba2f8f2838f8d68a1f4f1de10
|
|
BLAKE2b-256 checksum How to use checksums |
160e4c1a8d0db0cd42ced15f3a53a80c09d8d1968000da7eee9548f58fc94021
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.13.5 {"installer":{"name":"uv","version":"0.13.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"13","id":"trixie","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / botsrated-0.1.4-py3-none-any.whl
| Download URL | botsrated-0.1.4-py3-none-any.whl |
|---|---|
| Size | 13.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
ab592a15422e12105aa97cbaf94cb3a7573360db142eefea813fac2b5aa5bdb7
|
|
BLAKE2b-256 checksum How to use checksums |
c4748e0e8c43b5af1cf1b2e2e3b1ab97c78c61a3d9d392769af6f96e1ddc1c1f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.13.5 {"installer":{"name":"uv","version":"0.13.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"13","id":"trixie","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Security for botsrated 0.1.4
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.