{"openapi":"3.1.0","info":{"title":"Lorg Check","version":"2026.10","summary":"Safety checks before money moves on Base and Ethereum: is this token a trap, is this address one you shouldn't pay? Signed allow, caution or block answers for AI agents and trading platforms.","description":"Call a check before your agent or your users buy a token or send money to an address. The answer says allow, caution or block, an action (proceed, limit_exposure, do_not_proceed), one sentence to show a person, and the reasons, and it is signed (Ed25519; keys at /v1/keys).\n\nTwo ways to pay: per call over x402, in USDC on Base (eip155:8453), with no account and a charge only when an answer is given; or an API key: a free one by signing in with GitHub (100 checks a day, https://lorglabs.com/get-a-key.html), or a platform's with more room (ask info@lorglabs.com).\n\nThe same checks are MCP tools at /mcp: connect with OAuth (sign in with GitHub; ChatGPT, Claude and most clients do it when the server is added), or send an API key.\n\nAn allow is not a guarantee: nothing that should stop the trade was found at the moment of the check.","contact":{"name":"Lorg Labs","email":"info@lorglabs.com"},"termsOfService":"https://lorglabs.com/terms.html","x-guidance":"Before buying a token, POST {\"chain\": \"base\", \"address\": \"0x…\", \"amount_usd\": 250} to /v1/check/token (amount_usd, the trade's size, is optional); before paying an address, POST {\"chain\": \"base\", \"address\": \"0x…\"} to /v1/check/quick. Chains: base, ethereum. Pay per call over x402, or send an API key (Authorization: Bearer lorg_…). Act on `action` in the answer (proceed, limit_exposure, do_not_proceed) and show `summary` to the person. A 503 CHECKS_INCOMPLETE is no verdict and no charge: do not proceed."},"servers":[{"url":"https://api.lorglabs.com"}],"tags":[{"name":"checks","description":"Paid checks."},{"name":"free","description":"Free endpoints."}],"paths":{"/v1/check/quick":{"post":{"operationId":"checkAddress","summary":"Check a wallet or contract before paying it","description":"Is this address safe to pay? Sanctions lists, scam labels, EIP-7702 sweeper wallets, address-poisoning look-alikes and where the wallet's first funds came from. A signed allow, caution or block, an action and the reasons. Costs $0.01 a call over x402, in USDC on Base (eip155:8453). Charged only when an answer is given; or call it with a free API key (100 checks a day: https://lorglabs.com/get-a-key.html). Read `action` in the answer.","tags":["checks"],"x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.01"}},"security":[{},{"apiKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"chain":{"type":"string","enum":["base","ethereum"],"description":"The chain the address is on. A chain ID is accepted too (8453 or eip155:8453 for base, 1 or eip155:1 for ethereum)."},"address":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"The wallet or contract address: 0x followed by 40 hex characters."},"context":{"type":"string","enum":["swap","pay","hold"],"description":"Optional: what you are about to do. Echoed back in the answer; it doesn't change the checks."}},"required":["chain","address"]},"example":{"chain":"base","address":"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045"}}}},"responses":{"200":{"description":"The answer, signed.","content":{"application/json":{"schema":{"type":"object","properties":{"request_id":{"type":"string","description":"This request's id; it is inside the signed body."},"verdict":{"type":"string","enum":["allow","caution","block"]},"risk_score":{"type":"integer","minimum":0,"maximum":100},"confidence":{"type":"string","enum":["high","medium","low"]},"action":{"type":"string","enum":["proceed","limit_exposure","do_not_proceed"],"description":"What to do: the field an agent acts on."},"summary":{"type":"string","description":"One plain sentence that can be shown to a person."},"reasons":{"type":"array","description":"Most serious first. Codes and their meanings: GET /v1/reasons.","items":{"type":"object","properties":{"code":{"type":"string"},"severity":{"type":"string","enum":["critical","high","medium","low","info"]},"detail":{"type":"string"}},"required":["code","severity","detail"]}},"address_type":{"type":"string","enum":["wallet","delegated_wallet","contract","unknown"]},"wallet":{"type":"object","description":"A wallet's history (quick check)."},"token":{"type":"object","description":"Token check: name, symbol, age, launchpad, the main pool, the simulated round trip, and the sized trade when amount_usd was given."},"checks_run":{"type":"array","items":{"type":"string"}},"checks_failed":{"type":"array","items":{"type":"string"},"description":"Checks that could not be completed. An answer with failed checks is never allow on their account."},"chain":{"type":"string"},"address":{"type":"string"},"context":{"type":"string"},"amount_usd":{"type":"number"},"block":{"type":["integer","null"],"description":"The block the answer was computed at."},"as_of":{"type":"string","format":"date-time"},"ruleset":{"type":"string"},"cached":{"type":"boolean","description":"Served from a short cache (at most 30 s for most tokens); as_of says when it was computed."},"signature":{"type":"object","description":"Ed25519 over the answer; the public key is at GET /v1/keys.","properties":{"alg":{"type":"string"},"key_id":{"type":"string"},"sig":{"type":"string"}}}},"required":["request_id","verdict","risk_score","confidence","action","summary","reasons","checks_run","checks_failed","chain","address","as_of","ruleset","cached","signature"]},"example":{"request_id":"01a138bd-2da9-741f-9b1a-273ed560d051","verdict":"allow","risk_score":0,"confidence":"high","action":"proceed","summary":"No risk signals found.","reasons":[{"code":"DELEGATED_WALLET","severity":"info","detail":"Wallet delegates its code to 0x5a7fc11397e9a8ad41bf10bf13f22b0a63f96f6d (EIP-7702)."}],"address_type":"delegated_wallet","wallet":{"outgoing_tx_count":70,"first_seen":"2023-07-30T12:40:39.000Z","age_days":1171.7},"checks_run":["sanctions","labels","wallet_profile","wallet_history","wallet_delegate","funding"],"checks_failed":[],"chain":"base","address":"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045","block":52581968,"as_of":"2026-10-14T04:48:04.579Z","ruleset":"2026.10","cached":false,"signature":{"alg":"Ed25519","key_id":"FXoyt82j…","sig":"base64url Ed25519 signature over the answer (GET /v1/keys)"}}}}},"400":{"description":"The request is malformed (INVALID_REQUEST, INVALID_ADDRESS, UNSUPPORTED_CHAIN, ...). Refused before any payment is asked for.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"},"details":{"type":"object"}},"required":["code","message","request_id"]}},"required":["error"]}}}},"402":{"description":"Payment required: the PAYMENT-REQUIRED header (base64 JSON, x402 v2) gives the price in USDC atomic units, the network and the address to pay. Sign the payment and send the request again with a PAYMENT-SIGNATURE header."},"429":{"description":"Over a limit (RATE_LIMITED): wait for Retry-After. Callers without a key: 30 requests a minute per IP address.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"},"details":{"type":"object"}},"required":["code","message","request_id"]}},"required":["error"]}}}},"503":{"description":"CHECKS_INCOMPLETE: a required check failed, so there is no verdict (unknown). Not charged. Do not proceed; retry after Retry-After.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"},"details":{"type":"object"}},"required":["code","message","request_id"]}},"required":["error"]}}}}}}},"/v1/check/token":{"post":{"operationId":"checkToken","summary":"Check a token before buying it","description":"Is this token safe to buy? Simulates a buy and sell-back through the token's real pool (at your trade size, if given), reads what its creator can still do (mint, hidden mint, pause, upgrade), who can pull the liquidity, the holders, and whether the creator was paid by a wallet behind earlier rugs. A signed allow, caution or block, an action and the reasons. Costs $0.03 a call over x402, in USDC on Base (eip155:8453). Charged only when an answer is given; or call it with a free API key (100 checks a day: https://lorglabs.com/get-a-key.html). Read `action` in the answer.","tags":["checks"],"x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.03"}},"security":[{},{"apiKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"chain":{"type":"string","enum":["base","ethereum"],"description":"The chain the address is on. A chain ID is accepted too (8453 or eip155:8453 for base, 1 or eip155:1 for ethereum)."},"address":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"The token's contract address: 0x followed by 40 hex characters."},"context":{"type":"string","enum":["swap","pay","hold"],"description":"Optional: what you are about to do. Echoed back in the answer; it doesn't change the checks."},"amount_usd":{"type":"number","minimum":0.01,"maximum":1000000000,"description":"Optional: the size of the trade you intend, in US dollars. The check then also buys and sells that amount in simulation, and says so (EXIT_LIQUIDITY_INSUFFICIENT, action limit_exposure) when the pool is too small for it or the token limits the size of a sale. Give it whenever you know the size."}},"required":["chain","address"]},"example":{"chain":"base","address":"0x4ed4E862860beD51a9570b96d89aF5E1B0Efefed","amount_usd":250}}}},"responses":{"200":{"description":"The answer, signed.","content":{"application/json":{"schema":{"type":"object","properties":{"request_id":{"type":"string","description":"This request's id; it is inside the signed body."},"verdict":{"type":"string","enum":["allow","caution","block"]},"risk_score":{"type":"integer","minimum":0,"maximum":100},"confidence":{"type":"string","enum":["high","medium","low"]},"action":{"type":"string","enum":["proceed","limit_exposure","do_not_proceed"],"description":"What to do: the field an agent acts on."},"summary":{"type":"string","description":"One plain sentence that can be shown to a person."},"reasons":{"type":"array","description":"Most serious first. Codes and their meanings: GET /v1/reasons.","items":{"type":"object","properties":{"code":{"type":"string"},"severity":{"type":"string","enum":["critical","high","medium","low","info"]},"detail":{"type":"string"}},"required":["code","severity","detail"]}},"address_type":{"type":"string","enum":["wallet","delegated_wallet","contract","unknown"]},"wallet":{"type":"object","description":"A wallet's history (quick check)."},"token":{"type":"object","description":"Token check: name, symbol, age, launchpad, the main pool, the simulated round trip, and the sized trade when amount_usd was given."},"checks_run":{"type":"array","items":{"type":"string"}},"checks_failed":{"type":"array","items":{"type":"string"},"description":"Checks that could not be completed. An answer with failed checks is never allow on their account."},"chain":{"type":"string"},"address":{"type":"string"},"context":{"type":"string"},"amount_usd":{"type":"number"},"block":{"type":["integer","null"],"description":"The block the answer was computed at."},"as_of":{"type":"string","format":"date-time"},"ruleset":{"type":"string"},"cached":{"type":"boolean","description":"Served from a short cache (at most 30 s for most tokens); as_of says when it was computed."},"signature":{"type":"object","description":"Ed25519 over the answer; the public key is at GET /v1/keys.","properties":{"alg":{"type":"string"},"key_id":{"type":"string"},"sig":{"type":"string"}}}},"required":["request_id","verdict","risk_score","confidence","action","summary","reasons","checks_run","checks_failed","chain","address","as_of","ruleset","cached","signature"]},"example":{"request_id":"01a138bd-2aa6-7946-be8c-8958884270fb","verdict":"block","risk_score":100,"confidence":"high","action":"do_not_proceed","summary":"Do not proceed. The token's creator (0x0f24…e4d8) can transfer 10× the total supply: tokens can be created without a mint and sold into the pool. The deployer (0x0f24…e4d8) was first funded by 0xde8eb937cb5475eee5ac96dce6ba2d18e439c473, a wallet that funded the creators of tokens that were rugged.","reasons":[{"code":"HIDDEN_MINT","severity":"critical","detail":"The token's creator (0x0f24…e4d8) can transfer 10× the total supply: tokens can be created without a mint and sold into the pool."},{"code":"DEPLOYER_RUG_FUNDED","severity":"high","detail":"The deployer (0x0f24…e4d8) was first funded by 0xde8eb937cb5475eee5ac96dce6ba2d18e439c473, a wallet that funded the creators of tokens that were rugged."},{"code":"NEW_TOKEN","severity":"medium","detail":"Token contract was created 1 hour ago."}],"address_type":"contract","token":{"name":"Delta","symbol":"DELTA","age_days":0,"launchpad":null,"main_pool":{"dex":"uniswap_v2","quote":"WETH","id":"0xa864cf9899c68ddb80018fbd238baff5165da41f","liquidity_usd":14039},"simulation":{"buy_tax_pct":0,"sell_tax_pct":0,"round_trip_loss_pct":0.6,"sold":true}},"checks_run":["sanctions","labels","contract","source","deployer","copycat","liquidity","holders","lp_lock","hidden_mint","simulation"],"checks_failed":[],"chain":"base","address":"0xE546173916467211B9D238Fb24DB6a63E240EB40","block":52581968,"as_of":"2026-10-14T04:48:03.815Z","ruleset":"2026.10","cached":false,"signature":{"alg":"Ed25519","key_id":"FXoyt82j…","sig":"base64url Ed25519 signature over the answer (GET /v1/keys)"}}}}},"400":{"description":"The request is malformed (INVALID_REQUEST, INVALID_ADDRESS, UNSUPPORTED_CHAIN, ...). Refused before any payment is asked for.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"},"details":{"type":"object"}},"required":["code","message","request_id"]}},"required":["error"]}}}},"402":{"description":"Payment required: the PAYMENT-REQUIRED header (base64 JSON, x402 v2) gives the price in USDC atomic units, the network and the address to pay. Sign the payment and send the request again with a PAYMENT-SIGNATURE header."},"429":{"description":"Over a limit (RATE_LIMITED): wait for Retry-After. Callers without a key: 30 requests a minute per IP address.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"},"details":{"type":"object"}},"required":["code","message","request_id"]}},"required":["error"]}}}},"503":{"description":"CHECKS_INCOMPLETE: a required check failed, so there is no verdict (unknown). Not charged. Do not proceed; retry after Retry-After.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"},"details":{"type":"object"}},"required":["code","message","request_id"]}},"required":["error"]}}}}}}},"/v1/pricing":{"get":{"summary":"Prices, payment details, limits, caching and billing rules","description":"The full commercial terms of the API in one document.","tags":["free"],"security":[],"responses":{"200":{"description":"JSON.","content":{"application/json":{}}}}}},"/v1/reasons":{"get":{"summary":"Every reason code, its severity and meaning","tags":["free"],"security":[],"responses":{"200":{"description":"JSON.","content":{"application/json":{}}}}}},"/v1/keys":{"get":{"summary":"The public keys that verify a signed answer (JWKS)","tags":["free"],"security":[],"responses":{"200":{"description":"JSON.","content":{"application/json":{}}}}}},"/v1/health":{"get":{"summary":"Whether the service is ready to answer","tags":["free"],"security":[],"responses":{"200":{"description":"JSON.","content":{"application/json":{}}}}}},"/v1/stats":{"get":{"summary":"Running totals: checks run, blocks, money behind blocked trades","tags":["free"],"security":[],"responses":{"200":{"description":"JSON.","content":{"application/json":{}}}}}},"/v1/track-record":{"get":{"summary":"New launches we checked without being asked, each answer signed and dated in Bitcoin, and what became of them","tags":["free"],"security":[],"responses":{"200":{"description":"JSON.","content":{"application/json":{}}}}}},"/v1/usage":{"get":{"summary":"What an API key has been used for, and where it stands against its limits","tags":["free"],"security":[{"apiKey":[]}],"responses":{"200":{"description":"JSON.","content":{"application/json":{}}}}}},"/v1/report":{"post":{"summary":"Tell us an answer was wrong","tags":["free"],"security":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"expected":{"type":"string","enum":["allow","caution","block"]},"request_id":{"type":"string","description":"The request_id of the answer you think was wrong."},"chain":{"type":"string"},"address":{"type":"string"},"note":{"type":"string","maxLength":1000}},"required":["expected"]}}}},"responses":{"200":{"description":"Received."},"400":{"description":"Malformed.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"},"details":{"type":"object"}},"required":["code","message","request_id"]}},"required":["error"]}}}},"429":{"description":"Over a limit.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"},"details":{"type":"object"}},"required":["code","message","request_id"]}},"required":["error"]}}}}}}},"/mcp":{"post":{"summary":"The checks as MCP tools (Streamable HTTP, stateless, JSON-RPC 2.0)","description":"Tools: check_token, check_address. Every message needs credentials: an OAuth access token (sign in with GitHub; see /.well-known/oauth-protected-resource/mcp) or an API key. Without them, 401 with WWW-Authenticate.","tags":["checks"],"security":[{"apiKey":[]}],"responses":{"200":{"description":"JSON-RPC response."}}}}},"components":{"securitySchemes":{"apiKey":{"type":"http","scheme":"bearer","description":"An API key (lorg_…). A free one: sign in with GitHub at https://lorglabs.com/get-a-key.html (100 checks a day, 10 a minute). A platform that needs more: ask info@lorglabs.com. Calls with a key are never charged over x402."}}},"externalDocs":{"description":"Prices, limits and billing rules","url":"https://api.lorglabs.com/v1/pricing"},"x-agentcash-provenance":{"ownershipProofs":["0x631db021d6b6f6e5ed469279aa4cd800a5f5b66cd927495507af00359a1a7ea559cc1a1cc8dc99962d3c0309f99a21a6bdd8e746a63185165b4d8de9ae66e9c21b"]},"x-discovery":{"ownershipProofs":["0x631db021d6b6f6e5ed469279aa4cd800a5f5b66cd927495507af00359a1a7ea559cc1a1cc8dc99962d3c0309f99a21a6bdd8e746a63185165b4d8de9ae66e9c21b"]}}