# Rug Pull Risk Scorer (`zinin/rug-pull-scorer`) Actor

Score ERC-20/BEP-20 token rug-pull risk from honeypot.is simulation + DexScreener liquidity/age. Detects honeypots, high taxes, thin liquidity, brand-new pairs. Heuristic signal, not financial advice. No wallet, no RPC key, no browser.

- **URL**: https://apify.com/zinin/rug-pull-scorer.md
- **Developed by:** [Tim Zinin](https://apify.com/zinin) (community)
- **Categories:** Developer tools, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 token scoreds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js/docs.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## Rug-Pull Risk Scorer — Token Honeypot & Liquidity Check

**Is this token safe to buy, or a rug pull waiting to happen?** Point this Actor at any
ERC-20/BEP-20 contract address and get back a 0-100 risk score built from a real honeypot
simulation and live DEX liquidity data — and, when the sell-side check can't run, an
honest `unknown` verdict instead of a false all-clear.

> ⚠️ **Not financial advice.** This is a heuristic risk signal from public APIs, not a
> guarantee. Always verify independently before trading.

### What you get

- **A "low" score you can trust, because it says "unknown" when it can't say low.** If
  the honeypot simulation is unavailable or fails to complete, the token comes back with
  `riskLabel: "unknown"` and reduced `confidence` — never a `"low"` verdict built on a
  check that never actually ran.
- 🍯 **honeypot.is** — actually simulates a buy + sell on the contract: is it a honeypot,
  what are the buy/sell/transfer taxes, how many holders.
- 💧 **DexScreener** — live liquidity (USD), 24h volume, and pair age from the token's
  best on-chain pool.
- **`checksPassed` / `checksSkipped` / `confidence` on every row**, so you see exactly
  which of the four underlying checks the score is — and isn't — built on, not just a
  number.
- **Unknown chains are rejected, not guessed.** An unsupported `chainId` returns a free
  error row for every token instead of silently pairing your chain's honeypot check with
  liquidity data pulled from a completely different network.
- No wallet, no RPC key, no browser — just two free public APIs.
- Runs on Apify: schedule it, monitor it, call it from the API or the MCP server, export
  to JSON, CSV or Excel, or push results straight into your own pipeline.

### How to run it

1. Click **Try for free** — no card needed on the free plan.
2. Paste your token contract addresses into **Token contract addresses**, one per line.
3. Press **Start**. Results appear in the dataset — read them in the UI, pull them from
   the API, or push them onward with a webhook.

### Pricing

Pay-per-event: **$0.005 per run start + $0.003 per token scored**. No monthly seat.
100 tokens cost about **$0.31**; 1,000 tokens about **$3.01**.

A token that could not be checked — invalid address, unsupported chain, no data on
either source — is still returned, with `found: false` and the reason, and it is **not**
charged. You pay for a verdict, not for an attempt.

### Input

| Field | Type | Description |
|-------|------|-------------|
| `tokens` | array of strings | Token contract addresses to score. Up to 100 per run. |
| `chainId` | integer | EVM chain: 1=Ethereum, 56=BSC, 8453=Base, 137=Polygon, 42161=Arbitrum (default 1). Any other value returns a free error row for every token in the run — see FAQ. |
| `maxConcurrency` | integer | Parallelism (1–20, default 5) |

```json
{
    "tokens": [
        "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
        "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2"
    ]
}
````

### Output

One dataset row per token. This is a real row from a real run:

```json
{
    "token": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",
    "chainId": 1,
    "found": true,
    "name": "Wrapped Ether",
    "symbol": "WETH",
    "isHoneypot": false,
    "buyTax": 0,
    "sellTax": 0,
    "liquidityUsd": 96516201.51,
    "ageHours": 45785.4,
    "totalHolders": 3308891,
    "riskScore": 0,
    "riskLabel": "low",
    "riskFlags": [
        "honeypot.is: sells simulate OK (not a honeypot)"
    ],
    "confidence": "high",
    "checksPassed": [
        "honeypot simulation (can the token be sold?)",
        "buy/sell tax",
        "holder count",
        "DEX liquidity & pair age"
    ],
    "checksSkipped": [],
    "summary": "WETH — risk 0/100 (low), buy/sell tax 0%/0%, liquidity $96516202. Confidence high (4/4 checks ran). Not financial advice; heuristic risk signal, verify independently.",
    "checkedAt": "2026-07-26T15:08:53.657Z"
}
```

| Field | Description |
|-------|-------------|
| `found` | Whether either source had data on this token |
| `isHoneypot` | `true` / `false` / `null` — `null` means the sell-side simulation did not run or did not complete; treat it as unverified, never as safe |
| `buyTax` / `sellTax` | Simulated tax percentage on buy/sell |
| `liquidityUsd` | USD liquidity of the token's best DEX pair on this chain |
| `ageHours` | Hours since the pair was created (brand-new pairs are riskier) |
| `riskScore` | 0-100, higher = riskier |
| `riskLabel` | `low` / `medium` / `high` / `critical` / **`unknown`** — `unknown` replaces what would otherwise read as `low` when the honeypot check never actually completed |
| `confidence` | `high` / `partial` / `low` / `none` — how many of the four underlying checks (honeypot simulation, tax, holder count, DEX liquidity) actually completed |
| `checksPassed` / `checksSkipped` | Which of those four checks ran, and which didn't, in plain English |
| `riskFlags` | Plain-English reasons behind the score |

Not found (both sources have no data, or the chain is unsupported) → same shape with
`found: false` and an `error`, and never billed.

### How the score is built

`riskScore` is a weighted heuristic, not a guarantee:

- **Honeypot confirmed** → score ≥ 90 (dominant signal — nothing else matters if you
  can't sell)
- **Honeypot check unavailable or inconclusive** → +15 to the score, and `riskLabel`
  cannot land on `low` — see below
- **High buy/sell/transfer tax** (>10%) → +10 to +15 each
- **honeypot.is risk level / flags** → up to +20
- **Thin liquidity** (<$10k, <$1k) → +12 to +25
- **Brand-new pair** (<24h, <7d) → +5 to +15
- **Very few holders** → +5 to +15

**Why "unknown" exists.** honeypot.is going down, timing out, or failing to simulate a
sell used to leave the row looking identical to a token that had actually been checked
and cleared — `isHoneypot: false`. That is the one thing this tool refuses to do: an
absent check is not evidence of safety. When the sell-side check doesn't complete,
`isHoneypot` is `null`, `riskLabel` reads `unknown` instead of `low`, and `confidence` /
`riskFlags` say exactly why.

**Why an unrecognized chain is rejected.** DexScreener returns pairs for a token address
across every chain that happens to have one — several EVM chains are genesis forks of
Ethereum and reuse the same addresses with entirely different liquidity. Passing a
`chainId` this Actor doesn't recognize used to leave the chain filter switched off, so
the honeypot simulation ran against the chain you asked for while the liquidity numbers
came from whichever network had the deepest pool for that address — one row silently
describing two different tokens. An unsupported `chainId` is now rejected up front, for
every token in the run, before any of that can happen — and it costs you nothing.

#### Need the rest of the picture?

These run on the same account, take the same shape of input and bill the same way, so they slot into an existing pipeline without new plumbing.

| Actor | What it does |
|---|---|
| [Token Launch Radar](https://apify.com/zinin/token-launch-radar) | Look up any token contract address or ticker across DEXes and get liquidity, 24h volume, pair age, a 0-100… |
| [AI Crawler Access Checker](https://apify.com/zinin/ai-crawler-access-checker) | Check which AI crawlers (GPTBot, ClaudeBot, PerplexityBot, Google-Extended & more) can access your website |
| [B2B Lead Enricher](https://apify.com/zinin/b2b-lead-enricher) | Turn a list of company websites into sales-qualified lead cards: detected tech stack, a rough revenue… |
| [Clinical Trials Monitor](https://apify.com/zinin/clinical-trials-monitor) | Watch conditions, drugs or sponsors for new and updated clinical trials |
| [Company Hiring Radar](https://apify.com/zinin/company-hiring-radar) | Pull every open role a company is hiring for from its public job board (Greenhouse, Lever, Ashby) and turn… |

### FAQ

**Does it need a wallet or RPC key?** No — both sources are free, keyless public APIs.

**Does a "low" score mean the token is safe?** No. It means no risk signals were
detected across two public data sources, with the honeypot simulation actually
completing, at the time of the check. Contracts can change behavior, liquidity can be
pulled after the check, and no automated scan replaces due diligence.

**What does an "unknown" score mean?** The sell-side simulation could not be completed —
honeypot.is was unreachable, timed out, or could not simulate a sell. Nothing about the
token is confirmed safe; treat it the same as a token you haven't checked yet.

**Which chains are supported?** Ethereum (1), BSC (56), Base (8453), Polygon (137),
Arbitrum (42161). Any other chain ID returns an error row for every token in the run,
not a mismatched or partial one — and it's free.

**Can I call it from an AI agent?** Yes — it's a standard Apify Actor, callable via the
Apify API or the Apify MCP server.

**What this is NOT.** It does not read source code for backdoors, does not check
ownership/mint functions, and does not track wallet-level behavior. It answers two
narrow questions from two free public sources — can this contract's sell path be
simulated successfully, and is there real on-chain liquidity — and says so honestly,
including when it can't.

Found a wrong result, or need a check we don't run? Open an issue on this Actor's page.

***

Built by [zinin](https://apify.com/zinin). Questions? Telegram [@timzinin](https://t.me/timzinin).

# Actor input Schema

## `tokens` (type: `array`):

ERC-20/BEP-20 token contract addresses to score (e.g. `0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48`). One row per token.

## `chainId` (type: `integer`):

EVM chain the tokens live on. 1 = Ethereum, 56 = BSC, 8453 = Base, 137 = Polygon, 42161 = Arbitrum.

## `maxConcurrency` (type: `integer`):

How many tokens to score in parallel.

## Actor input object example

```json
{
  "tokens": [
    "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
    "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2"
  ],
  "chainId": 1,
  "maxConcurrency": 5
}
```

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "tokens": [
        "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
        "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("zinin/rug-pull-scorer").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "tokens": [
        "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
        "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("zinin/rug-pull-scorer").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "tokens": [
    "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
    "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2"
  ]
}' |
apify call zinin/rug-pull-scorer --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=zinin/rug-pull-scorer",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Rug Pull Risk Scorer",
        "description": "Score ERC-20/BEP-20 token rug-pull risk from honeypot.is simulation + DexScreener liquidity/age. Detects honeypots, high taxes, thin liquidity, brand-new pairs. Heuristic signal, not financial advice. No wallet, no RPC key, no browser.",
        "version": "0.1",
        "x-build-id": "OU0LSE4g2xINaxQOP"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/zinin~rug-pull-scorer/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-zinin-rug-pull-scorer",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/zinin~rug-pull-scorer/runs": {
            "post": {
                "operationId": "runs-sync-zinin-rug-pull-scorer",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/zinin~rug-pull-scorer/run-sync": {
            "post": {
                "operationId": "run-sync-zinin-rug-pull-scorer",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "tokens"
                ],
                "properties": {
                    "tokens": {
                        "title": "Token contract addresses",
                        "maxItems": 100,
                        "type": "array",
                        "description": "ERC-20/BEP-20 token contract addresses to score (e.g. `0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48`). One row per token.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "chainId": {
                        "title": "Chain ID",
                        "type": "integer",
                        "description": "EVM chain the tokens live on. 1 = Ethereum, 56 = BSC, 8453 = Base, 137 = Polygon, 42161 = Arbitrum.",
                        "default": 1
                    },
                    "maxConcurrency": {
                        "title": "Max concurrency",
                        "minimum": 1,
                        "maximum": 20,
                        "type": "integer",
                        "description": "How many tokens to score in parallel.",
                        "default": 5
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
