mirrored listing x402 eip155:8453eip155:137eip155:42161solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp

Plexa /v1/pretrade/check — pre-trade token safety check on Base: can you still sell this t

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. Alias: same engine and price as /v1/pretrade/check.

Do you run api.getplexa.com? This listing was mirrored from Coinbase's public Bazaar. Claim it in 30 seconds — no account required — and it becomes verified, permanently overriding the mirrored copy.

Claim this listing
50000 (raw units)
price
1
calls / 30d
1
unique payers
2026-09-01
updated

Provider

api.getplexa.com · discovered, not yet claimed by its owner

Payment (x402 accepts[])

[
  {
    "scheme": "exact",
    "network": "eip155:8453",
    "payTo": "0xd993eAfBA87cFfa2ca2CFF5A56EF89034575A7ef",
    "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
    "amount": "50000",
    "maxTimeoutSeconds": 300
  },
  {
    "scheme": "exact",
    "network": "eip155:137",
    "payTo": "0xd993eAfBA87cFfa2ca2CFF5A56EF89034575A7ef",
    "asset": "0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359",
    "amount": "50000",
    "maxTimeoutSeconds": 300
  },
  {
    "scheme": "exact",
    "network": "eip155:42161",
    "payTo": "0xd993eAfBA87cFfa2ca2CFF5A56EF89034575A7ef",
    "asset": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831",
    "amount": "50000",
    "maxTimeoutSeconds": 300
  },
  {
    "scheme": "exact",
    "network": "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",
    "payTo": "D6FqEyoFvkgGy4PpJjckHc3xRXhzL6mWQ25gz4rkVLor",
    "asset": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
    "amount": "50000",
    "maxTimeoutSeconds": 300
  }
]

Output schema

{
  "bazaar": {
    "info": {
      "input": {
        "body": {
          "sizeUSD": "1000",
          "token": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"
        },
        "bodyType": "json",
        "method": "POST",
        "type": "http"
      },
      "output": {
        "example": {
          "confidence": "medium",
          "coverage": {
            "axesExpected": 5,
            "axesReporting": 4
          },
          "liquidityCoverage": {
            "asOfBlock": 49784814,
            "asOfBlockFirst": 49784813,
            "conclusive": true,
            "factoriesChecked": 13,
            "poolsFound": 32,
            "singletonPoolsCounted": 1,
            "singletonPoolsHooked": 0,
            "singletonPoolsRejected": 0,
            "singletonPoolsSeen": 1,
            "singletonScanTruncated": false,
            "unmeasuredVenueNames": [],
            "unmeasuredVenues": 0,
            "venuesUnread": 0
          },
          "market": {
            "holderCount": 5223863,
            "marketCapUsd": 542587444,
            "priceUsdSpot": 2277.76,
            "volume24hUsd": 551324354.8699999
          },
          "quote": {
            "confidence": "high",
            "direction": "buy",
            "executablePrice": 0.0005214424247520731
          },
          "reasons": [
            "no provable trap detected. This is NOT a safety rating: it means none of the checks that can PROVE a trap (NO_EXIT_VENUE, EXIT_LIQUIDITY_DRAINED, TRADING_DISABLED) fired at this block, AND the liquidity sweep reached a conclusion (liquidityCoverage.conclusive). Structural risk — age, holder concentration, liquidity depth, transfer restrictions — is reported in risk_profile and can still be severe",
            "could not check F_CONC — reported as unknown, never as clean; confidence reduced accordingly"
          ],
          "risk_profile": {
            "age": {
              "ageDays": 1143.6,
              "genesisBlock": 381217
            },
            "concentration": {
              "ageSec": null,
              "source": null,
              "stale": null,
              "top10SharePct": null,
              "top1SharePct": null
            },
            "liquidity": {
              "exitLiquidityUsd": 81553087.89,
              "poolCount": 32,
              "venueCount": 13
            },
            "oracle": {
              "deviationBps": 16,
              "source": "chainlink:ETH / USD"
            },
            "transferability": {
              "fingerprints": "none",
              "hasBlacklist": false,
              "tradingEnabled": null
            }
          },
          "sources": {
            "*": "measured",
            "market": "vendor:dexscreener+goplus",
            "market.holderCount": "vendor:goplus",
            "risk_profile.concentration": "unavailable:holder-axis-produced-nothing"
          },
          "triggers": [],
          "ts": 1786358976434,
          "validUntil": 1786358979434,
          "verdict": "clear"
        },
        "type": "json"
      }
    },
    "schema": {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "properties": {
        "input": {
          "additionalProperties": false,
          "properties": {
            "body": {
              "additionalProperties": false,
              "examples": [
                {
                  "sizeUSD": "1000",
                  "token": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"
                }
              ],
              "properties": {
                "chain": {
                  "description": "Optional, default \"base\". One of: base | polygon | matic | arbitrum | arbitrum-one | arb | eip155:8453 | eip155:137 | eip155:42161 — 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) — 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`) — 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\" — 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 — 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 — 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 — see the `exit-coverage-incomplete:<what>` line in `reasons`. \"clear\" is NOT a safety rating and NOT a prediction — 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 — 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.",
                  "type": "string"
                }
              },
              "type": "object"
            },
            "type": {
              "type": "string"
            }
          },
          "required": [
            "type"
          ],
          "type": "object"
        }
      },
      "required": [
        "input"
      ],
      "type": "object"
    }
  },
  "builder-code": {
    "info": {
      "a": "bc_g9x4yzn7"
    },
    "schema": {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "additionalProperties": false,
      "properties": {
        "a": {
          "description": "App builder code",
          "pattern": "^[a-z0-9_]{1,32}$",
          "type": "string"
        },
        "s": {
          "description": "Service builder codes",
          "items": {
            "pattern": "^[a-z0-9_]{1,32}$",
            "type": "string"
          },
          "type": "array"
        },
        "w": {
          "description": "Wallet builder code",
          "pattern": "^[a-z0-9_]{1,32}$",
          "type": "string"
        }
      },
      "type": "object"
    }
  }
}

Use it

curl

curl "https://api.getplexa.com/v1/rug-check"
# -> 402 Payment Required, accepts[] lists how to pay
# retry with a PAYMENT-SIGNATURE (or PAYMENT header) once paid

JavaScript

const res = await fetch("https://api.getplexa.com/v1/rug-check");
if (res.status === 402) {
  const { accepts } = await res.json();
  // pay one of accepts[] via an x402 client, then retry with the payment header
}

Python

import httpx
res = httpx.get("https://api.getplexa.com/v1/rug-check")
if res.status_code == 402:
    accepts = res.json()["accepts"]
    # pay one of accepts[] via an x402 client, then retry with the payment header

Machine-readable

Everything on this page is also available as clean JSON at /resources/6298.json, and this resource appears in /discovery/resources and /discovery/search.