Why agents use PG1
An autonomous agent acts on things it has never seen before: it pays a wallet, opens a link, installs a package, patches a CVE. PG1 checks that thing first and answers in one machine-readable shape, reasons + status + checks, so the agent can decide on its own and a person can audit why.
- It never says "safe". PG1 only knows what its sources have recorded, so the best answer it gives is
no_flags: nothing found in the sources checked. A check that did not finish isunknown, neverno_flags. - Free to start. The wallet, domain, hostname and package checks are always free. The paid calls start with 5 free calls a day; after that each is 0.01 USD in USDC on Base via x402, with no account or key.
- The tools that matter most:
check_wallet_sanctions,check_wallet_age,check_hostname_reputation,check_domain_age,check_package,get_cve_details,get_cve_batch,get_threat_actor_profileandget_ioc_context.
Connect in under 30 seconds. Add the MCP server to your client:
{ "mcpServers": { "pg1": { "type": "http", "url": "https://pg1-ai-agent.vercel.app/api/mcp" } } }
Or call it directly:
curl -X POST https://pg1-ai-agent.vercel.app/api/mcp \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"check_hostname_reputation","arguments":{"hostname":"example.com"}}}'
A2A agents use https://pg1-ai-agent.vercel.app/api/a2a (agent card at /.well-known/agent-card.json).
Which tool to call
| You have | Call | Notes |
|---|---|---|
| One IP, domain, URL or file hash | get_ioc_context | Free when nothing is on record (found: false). PG1's licensed records hold only CVE ids from NVD today, so an IP, domain, URL or hash returns found: false; for a domain or hostname also run the two hostname checks below. |
| Several indicators (up to 20) | get_ioc_batch | Free when none is found (the same CVE-only records as above). Read each entry in results, not only the batch status. |
| A CVE id | get_cve_details | Several ids: get_cve_batch (up to 20). |
| A vendor and product, no CVE id | get_cve_by_product | Known-exploited CVEs come first. |
| A wallet address you are about to pay or trust | check_wallet_sanctions and check_wallet_age | Sanctions list match, then on-chain age; a wallet with no history is flagged. |
| A link, hostname or possible phishing site | check_hostname_reputation and check_domain_age | Listed or look-alike hostname, then registration age; a domain under 30 days old is flagged. |
| An npm or PyPI package before installing it | check_package | Flags a name that does not exist, a malicious report, or a new look-alike of a popular package. |
| A threat actor or APT name | get_threat_actor_profile | MITRE ATT&CK dossier. |
| One public IP and your own AbuseIPDB key | check_ip_abuse | Send the key in X-AbuseIPDB-Key; PG1 has no key of its own. |
| The CVE list to ingest | get_threat_indicators | STIX 2.1 bundle of CVE records from NVD: CVE id and an NVD reference, no scores, no IP/domain/URL/hash indicators. REST: GET /api/ioc. Free while it holds no current data (PG1_FEED_PAID off): no payment, no licence key, and it does not use the 5 free calls a day. |
| Your remaining free calls | get_usage_status | Always free. |
What status means
status | Meaning | What to do |
|---|---|---|
"no_flags" | Nothing bad is recorded in the sources checked (see checks). It is not proof the target is safe. | Proceed under your own policy. |
"flagged" | At least one warning in reasons. | Stop, or escalate to a person. Match on reasons[].code, never on message. |
"unknown" | A source timed out, errored or was skipped, so the answer is incomplete. | Never treat it as clean: retry, or fail closed. |
Informational codes (WALLET_DELEGATED, IP_TOR_EXIT_NODE, IP_WHITELISTED, IP_REPORTS_SCORED_ZERO) report a fact and never change status. Every code: /docs/reason-codes.
Free tier and rate limits
| Tool | Cost | Limit without a licence key |
|---|---|---|
check_wallet_sanctions | Always free | 120 calls/hour per caller |
check_domain_age, check_hostname_reputation, check_wallet_age, check_package | Always free | 60 calls/hour per caller, per tool |
check_ip_abuse | Always free (your own AbuseIPDB quota) | 60 calls/hour per caller |
get_usage_status | Always free | none |
get_ioc_context, get_ioc_batch | Free when nothing is found; paid when something is | Paid calls use the free tier first |
get_threat_indicators, GET /api/ioc (the STIX feed) | Free while the feed holds no current data (PG1_FEED_PAID off) | none, and it does not use the 5 free calls a day |
get_cve_details, get_cve_batch, get_cve_by_product, get_threat_actor_profile | Paid: 0.01 USD per call | 5 free calls a day per caller, shared across all of them, then x402 |
| Test fixtures (/docs/testing) | Always free | none, and they spend no free call |
- No header is needed for the free tier. It is automatic for any caller with no payment and no licence key. Responses carry
X-Free-Tier-LimitandX-Free-Tier-Remaining. - Send
X-Free-Tier: 0to skip it and get the payment challenge straight away. - A licence key in
X-API-KEYlifts the hourly limits and pays for paid calls. - A rate-limited call is a
rate_limitederror withretry_after.