ToolAssay

Plexa /v1/pretrade/check — pre-trade token safety check on Base

Plexa /v1/pretrade/check — pre-trade token safety check on Base: can you still sell this token? avoid fires only on a trap proven on-chain now: no pool to exit into, an exit pot under 5% of your size, or the trading gate off (the honeypot shape). A drained pot is what a rug leaves behind — measured, not predicted. clear = no provable trap, NOT safe. risk_profile: token age, holder concentration, liquidity, transfer limits. Not financial advice.

Not tested: has real-world effectsour last check, 2026-09-24
0 of 0checks answered this week
n/amedian answer time
$0.05listed price per call
n/aprice it asked us

Paid test badge: not yet. The checks above are free: we call the tool without paying and read the payment request it sends back. The Verified badge needs paid calls whose answers match the promised output, and nobody can buy a badge.

Endpoint

POST https://api.getplexa.com/v1/pretrade/check

CategoryMarket data
Provider hostapi.getplexa.com
Networkseip155:137, eip155:42161, eip155:8453, solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp
Payment schemesexact
Self-reported calls, 30 days67 from 1 payers (the provider's figure, not ours)

Our checks, last 30 days

We never call tools that send, buy, move money or file anything, not even without paying.

Example input (from the provider)

{
  "body": {
    "sizeUSD": "1000",
    "token": "0xE014d2A4da6E450f21b5050120D291e63c8940FD"
  },
  "bodyType": "json",
  "method": "POST",
  "type": "http"
}

Promised output schema (from the provider)

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {
    "input": {
      "additionalProperties": false,
      "properties": {
        "body": {
          "additionalProperties": false,
          "examples": [
            {
              "sizeUSD": "1000",
              "token": "0xE014d2A4da6E450f21b5050120D291e63c8940FD"
            }
          ],
          "properties": {
            "chain": {
              "description": "Optional, default \"base\". One of: base | polygon | matic | arbitrum | arbitrum-one | arb | eip155:8453 | eip155:137 | eip155:42161 \u2014 case-sensitive (see `enum`). The safety flags are Base-tuned, so a non-base value currently answers 422 rather than returning Base-calibrated flags for another chain.",
              "enum": [
                "base",
                "polygon",
                "matic",
                "arbitrum",
                "arbitrum-one",
                "arb",
                "eip155:8453",
                "eip155:137",
                "eip155:42161"
              ],
              "type": "string"
            },
            "sizeUSD": {
              "description": "Optional USD notional for the executable-quote sub-result, default \"1000\". A STRING, not a number; positive, no thousands separator (\"1,000\" is rejected) \u2014 see `pattern`.",
              "maxLength": 78,
              "pattern": "^(?:0\\.\\d*[1-9]\\d*|[1-9]\\d*(?:\\.\\d+)?)$",
              "type": "string"
            },
            "token": {
              "description": "ERC-20 to vet before buying. 0x + 40 hex (see `pattern`) \u2014 a symbol like \"WETH\" is rejected with 400.",
              "pattern": "^0x[0-9a-fA-F]{40}$",
              "type": "string"
            }
          },
          "required": [
            "token"
          ],
          "type": "object"
        },
        "bodyType": {
          "enum": [
            "json",
            "form-data",
            "text"
          ],
          "type": "string"
        },
        "method": {
          "enum": [
            "POST"
          ],
          "type": "string"
        },
        "type": {
          "const": "http",
          "type": "string"
        }
      },
      "required": [
        "type",
        "method",
        "bodyType",
        "body"
      ],
      "type": "object"
    },
    "output": {
      "properties": {
        "example": {
          "properties": {
            "confidence": {
              "description": "high | medium | low. On \"avoid\" this is confidence IN THE TRIGGER, which is a measurement taken this call, so it is always \"high\" \u2014 a check that failed elsewhere does not make the measured trap less true. On \"clear\" it is how COMPLETE the checks were: fewer axes computed, lower confidence. On \"unknown\" it is capped at \"low\" by construction: the check the verdict depends on did not finish, so a high number there would contradict the verdict word next to it. Either way the gaps are reported explicitly \u2014 see `reasons` and the null fields in `risk_profile`.",
              "type": "string"
            },
            "quote": {
              "description": "Executable quote sub-result (realizable fill under size, not mid/spot)",
              "type": "object"
            },
            "reasons": {
              "description": "Human-readable reasons behind the verdict",
              "items": {
                "type": "string"
              },
              "type": "array"
            },
            "risk_profile": {
              "description": "Structural risk as measured DATA (age, concentration, liquidity incl. exitLiquidityUsd, oracle availability, transfer restrictions), each section with a plain-language note. Never a severity: these factors do not separate live from dead tokens [M, n=40].",
              "type": "object"
            },
            "triggers": {
              "description": "Proven traps that fired \u2014 CLOSED list (NO_EXIT_VENUE, EXIT_LIQUIDITY_DRAINED, TRADING_DISABLED), empty when verdict is \"clear\".",
              "items": {
                "type": "string"
              },
              "type": "array"
            },
            "verdict": {
              "description": "avoid | clear | unknown. \"avoid\" = a listed trap was PROVEN at this block (see `triggers`); \"clear\" = none of them fired AND the liquidity sweep reached a conclusion; \"unknown\" = none fired but the sweep did NOT reach a conclusion (`liquidityCoverage.conclusive: false`), so absence of a trap is not established \u2014 see the `exit-coverage-incomplete:<what>` line in `reasons`. \"clear\" is NOT a safety rating and NOT a prediction \u2014 structural risk lives in `risk_profile`. verdict semantics changed 2026-08-01 (v2): avoid = provable trap only; ok/caution are gone. 2026-08-27 (P67): a THIRD value \"unknown\" was added \u2014 it takes over the cases that used to answer \"clear\" while `liquidityCoverage.conclusive` was false. No existing value changed meaning; code branching on \"avoid\" is unaffected, and code branching on \"clear\" now gets strictly fewer, better-founded clears. 2026-09-21 (P96): a clear verdict now also requires the MEASURED sale of your position to return at least 90% of the size you asked about. Below that the answer is \"unknown\" with the reason exit-below-90pct \u2014 no trap was proven, but the exit we measured is not there at this size. Again strictly fewer clears; avoid is untouched.",
              "type": "string"
            }
          },
          "type": "object"
        },
        "type": {
          "type": "string"
        }
      },
      "required": [
        "type"
      ],
      "type": "object"
    }
  },
  "required": [
    "input"
  ],
  "type": "object"
}

This page as JSON