{"openapi":"3.1.0","info":{"title":"Marlowe Guardian API","version":"4.0.0","summary":"Vet a token before you buy it, on Solana, Base and Robinhood Chain.","description":"Keyless, read-only token safety scans. Every scan returns a verdict (PASS, WARN, BLOCK or UNKNOWN), a 0 to 100 score, structured findings and live market data. Not financial advice."},"servers":[{"url":"https://marlowetrade.xyz"}],"tags":[{"name":"scan"},{"name":"discovery"},{"name":"meta"}],"paths":{"/api/scan/{chain}/{address}":{"get":{"tags":["scan"],"operationId":"scanToken","summary":"Scan one token","parameters":[{"name":"chain","in":"path","required":true,"schema":{"type":"string","enum":["solana","base","robinhood"],"description":"Chain the token lives on."}},{"name":"address","in":"path","required":true,"schema":{"type":"string"},"description":"Solana mint (base58) or EVM contract address (0x, 40 hex characters)."},{"name":"fresh","in":"query","required":false,"schema":{"type":"boolean"},"description":"Skip the 60 second cache and read the token again."}],"responses":{"200":{"description":"The scan result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScanResult"}}}},"400":{"description":"Invalid address for the chain.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Scan failed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/scan/{address}":{"get":{"tags":["scan"],"operationId":"scanTokenInferred","summary":"Scan one token, chain inferred from the address","parameters":[{"name":"address","in":"path","required":true,"schema":{"type":"string"},"description":"Solana mint (base58) or EVM contract address (0x, 40 hex characters)."},{"name":"chain","in":"query","required":false,"schema":{"type":"string","enum":["solana","base","robinhood"],"description":"Chain the token lives on."},"description":"Defaults to solana for base58 addresses and base for 0x addresses."},{"name":"fresh","in":"query","required":false,"schema":{"type":"boolean"},"description":"Skip the 60 second cache and read the token again."}],"responses":{"200":{"description":"The scan result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScanResult"}}}},"400":{"description":"Invalid address.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/scan-batch":{"get":{"tags":["scan"],"operationId":"scanBatch","summary":"Scan up to 10 tokens on one chain","parameters":[{"name":"chain","in":"query","required":false,"schema":{"type":"string","enum":["solana","base","robinhood"],"description":"Chain the token lives on."},"description":"Defaults to solana for base58 addresses and base for 0x addresses."},{"name":"addresses","in":"query","required":true,"schema":{"type":"string"},"description":"Comma separated addresses (alias: mints)."}],"responses":{"200":{"description":"Results in request order.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchResult"}}}},"400":{"description":"No valid address.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"tags":["scan"],"operationId":"scanBatchPost","summary":"Scan up to 10 tokens, chains may be mixed","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["tokens"],"properties":{"chain":{"type":"string","enum":["solana","base","robinhood"],"description":"Chain the token lives on."},"tokens":{"type":"array","maxItems":10,"items":{"oneOf":[{"type":"string"},{"type":"object","required":["address"],"properties":{"chain":{"type":"string","enum":["solana","base","robinhood"],"description":"Chain the token lives on."},"address":{"type":"string"}}}]}}}}}}},"responses":{"200":{"description":"Results in request order.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchResult"}}}},"400":{"description":"No valid token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/search":{"get":{"tags":["discovery"],"operationId":"searchTokens","summary":"Find a token by name, symbol or address","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":2}},{"name":"chain","in":"query","schema":{"type":"string","enum":["solana","base","robinhood"],"description":"Chain the token lives on."}}],"responses":{"200":{"description":"Matches, most liquid first.","content":{"application/json":{"schema":{"type":"object","properties":{"results":{"type":"array","items":{"$ref":"#/components/schemas/SearchHit"}}}}}}},"429":{"description":"Rate limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/radar":{"get":{"tags":["discovery"],"operationId":"getRadar","summary":"Trending tokens, each already scanned","parameters":[{"name":"chain","in":"query","schema":{"type":"string","enum":["solana","base","robinhood"],"description":"Chain the token lives on."}}],"responses":{"200":{"description":"Radar for the chain.","content":{"application/json":{"schema":{"type":"object","properties":{"chain":{"type":"string","enum":["solana","base","robinhood"],"description":"Chain the token lives on."},"at":{"type":"integer"},"tokens":{"type":"array","items":{"type":"object","additionalProperties":true}}}}}}}}}},"/api/recent":{"get":{"tags":["discovery"],"operationId":"getRecent","summary":"Recently scanned tokens","parameters":[{"name":"chain","in":"query","schema":{"type":"string","enum":["solana","base","robinhood"],"description":"Chain the token lives on."}}],"responses":{"200":{"description":"Latest distinct tokens.","content":{"application/json":{"schema":{"type":"object","properties":{"tokens":{"type":"array","items":{"type":"object","additionalProperties":true}}}}}}}}}},"/api/chains":{"get":{"tags":["meta"],"operationId":"listChains","summary":"Supported chains","responses":{"200":{"description":"Chains.","content":{"application/json":{"schema":{"type":"object","properties":{"chains":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","enum":["solana","base","robinhood"],"description":"Chain the token lives on."},"label":{"type":"string"},"kind":{"type":"string"},"chainId":{"type":["integer","null"]}}}}}}}}}}}},"/api/stats":{"get":{"tags":["meta"],"operationId":"getStats","summary":"Usage counters","responses":{"200":{"description":"Counters.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}}},"/api/status":{"get":{"tags":["meta"],"operationId":"getStatus","summary":"Upstream source health","responses":{"200":{"description":"Per source: up, down or idle.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}}},"/badge/{chain}/{address}.svg":{"get":{"tags":["scan"],"operationId":"getBadge","summary":"Embeddable verdict badge","parameters":[{"name":"chain","in":"path","required":true,"schema":{"type":"string","enum":["solana","base","robinhood"],"description":"Chain the token lives on."}},{"name":"address","in":"path","required":true,"schema":{"type":"string"},"description":"Solana mint (base58) or EVM contract address (0x, 40 hex characters)."}],"responses":{"200":{"description":"SVG badge.","content":{"image/svg+xml":{"schema":{"type":"string"}}}}}}},"/health":{"get":{"tags":["meta"],"operationId":"health","summary":"Liveness","responses":{"200":{"description":"Alive.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"version":{"type":"string"}}}}}}}}}},"components":{"schemas":{"Error":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["invalid_address","invalid_request","rate_limited","scan_failed","not_found","search_failed"]},"message":{"type":"string"},"retryAfter":{"type":"integer"}}}}},"Finding":{"type":"object","required":["level","text"],"properties":{"level":{"type":"string","enum":["danger","caution","note","pass"]},"text":{"type":"string"}}},"ScanResult":{"type":"object","required":["chain","address","verdict","score","summary","findings","reasons","checks"],"properties":{"chain":{"type":"string","enum":["solana","base","robinhood"],"description":"Chain the token lives on."},"chainLabel":{"type":"string"},"address":{"type":"string"},"mint":{"type":"string","description":"Same as address, kept for older clients."},"at":{"type":"string","format":"date-time"},"verdict":{"type":"string","enum":["PASS","WARN","BLOCK","UNKNOWN"],"description":"PASS is 75 to 100, WARN is 35 to 74, BLOCK is 0 to 34. UNKNOWN means nothing could be read."},"score":{"type":["integer","null"],"minimum":0,"maximum":100},"summary":{"type":"string","description":"One sentence an agent can read aloud."},"findings":{"type":"array","items":{"$ref":"#/components/schemas/Finding"}},"reasons":{"type":"array","items":{"type":"string"},"description":"The same findings as prefixed strings, kept for older clients."},"token":{"type":"object","properties":{"name":{"type":["string","null"]},"symbol":{"type":["string","null"]}}},"checks":{"type":"object","additionalProperties":true,"description":"Raw checks. Solana: mintAuthority, freezeAuthority, extensions, top10Pct, lpLocked. EVM: owner, verified, buyTaxPct, sellTaxPct, lpLockedPct, flags."},"market":{"type":["object","null"],"additionalProperties":true,"description":"Price, liquidity, volume, 24h change, pool age and impact1PctUsd, the estimated position size that moves the price about 1 percent."},"links":{"type":"object","properties":{"page":{"type":"string"},"dexscreener":{"type":"string"},"explorer":{"type":"string"},"badge":{"type":"string"}}},"cached":{"type":"boolean"},"ageSeconds":{"type":"integer"}}},"BatchResult":{"type":"object","properties":{"results":{"type":"array","items":{"$ref":"#/components/schemas/ScanResult"}}}},"SearchHit":{"type":"object","properties":{"chain":{"type":"string","enum":["solana","base","robinhood"],"description":"Chain the token lives on."},"chainLabel":{"type":"string"},"address":{"type":"string"},"name":{"type":["string","null"]},"symbol":{"type":["string","null"]},"priceUsd":{"type":["number","null"]},"liquidityUsd":{"type":["number","null"]},"volume24hUsd":{"type":["number","null"]},"marketCapUsd":{"type":["number","null"]},"change24h":{"type":["number","null"]}}}},"headers":{"RateLimitLimit":{"description":"Requests allowed per minute.","schema":{"type":"integer"}},"RateLimitRemaining":{"description":"Requests left in the window.","schema":{"type":"integer"}},"RateLimitReset":{"description":"Seconds until the window frees a slot.","schema":{"type":"integer"}}}},"x-mcp":{"url":"https://marlowetrade.xyz/mcp","transport":"streamable-http","tools":["scan_token","scan_tokens","search_token","get_radar","list_chains"]}}