{"openapi":"3.1.0","info":{"title":"Pitcrew: ops tools for AI agents","version":"1.0.0","contact":{"email":"pitcrew@appin60.com","url":"https://pitcrew.lfglabs.ai"},"x-guidance":"Use /tx/explain when an EVM transaction failed or is stuck (pass chain name and tx hash). Use /x402/preflight before paying an unfamiliar x402 endpoint, or to debug why your own route is not indexed. Use /x402/audit on a whole seller origin to see every listing problem (apiKey+paid, missing x-payment-info or examples, routes without a valid 402, routes missing from the CDP Bazaar). Use /site/check to see if a website is up and its TLS is valid. Use /fetch to read a web page as clean text. Use /domain/lookup to check a domain (age, registrar, expiry, DNS, SPF/DMARC). Use /evm/address to see whether an address is an EOA, contract or EIP-7702 delegated account on 6 chains, with balances. All are GET with query parameters; invalid input returns 4xx before payment settles.","description":"Pay-per-call tools for agents: explain failed or stuck EVM transactions, preflight x402 endpoints before paying, website health checks, and page fetch to clean text. x402 v2, USDC on Base or Arbitrum. Invalid input is rejected before settlement, so you are never charged for a 4xx."},"servers":[{"url":"https://pitcrew-api.lfglabs.ai"}],"x-discovery":{"ownershipProofs":[]},"paths":{"/tx/explain":{"get":{"summary":"Explain an EVM transaction (why did it fail?)","description":"Why did my transaction fail? Give a chain and tx hash; get status, decoded method, gas used vs limit, fee, token transfers, events and, for failed transactions, the decoded revert reason (Error(string), Panic codes, custom errors resolved by signature) with a plain-language fix. Pending transactions get a stuck-transaction diagnosis (nonce gap, underpriced fee) and the replace/cancel recipe. Chains: ethereum, base, arbitrum, optimism, polygon, bsc.","operationId":"tx_explain","tags":["blockchain","transactions","debugging","evm","revert"],"parameters":[{"name":"chain","in":"query","required":true,"description":"Network name","schema":{"type":"string","enum":["ethereum","base","arbitrum","optimism","polygon","bsc"]},"example":"base"},{"name":"hash","in":"query","required":true,"description":"Transaction hash","schema":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"},"example":"0x19149f9b44efbe36f2180fda8389d811ff2de968f3391190f7544e0a55ccf8f9"}],"x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.01"}},"responses":{"200":{"description":"Result","content":{"application/json":{"example":{"status":"failed","method":"submitRecord(uint256,uint256,uint256,uint256,bytes)","revert":{"kind":"custom error","signature":"RecordAlreadyExists(uint256)"},"summary":"Failed calling submitRecord(...): custom error RecordAlreadyExists(uint256)."}}}},"400":{"description":"Invalid input (not charged)"},"402":{"description":"Payment required (x402)"}}}},"/x402/preflight":{"get":{"summary":"x402 preflight: check a paid endpoint before you pay","description":"Check any x402 paid endpoint before paying it: does it return a valid 402 challenge, which networks/tokens/prices it accepts (decoded to USD), whether amounts are valid atomic units, payTo sanity, testnet-only offers, missing Bazaar input schema, redirects and latency. Returns a verdict (payable / payable with warnings / broken / unreachable) and the exact problems. Useful for agents choosing between paid APIs and for sellers debugging why x402scan or the CDP Bazaar skipped their route.","operationId":"x402_preflight","tags":["x402","payments","agents","monitoring","trust"],"parameters":[{"name":"url","in":"query","required":true,"description":"Full URL of the x402 endpoint","schema":{"type":"string"},"example":"https://contractlens-api.appin60.com/scan"},{"name":"method","in":"query","required":false,"description":"HTTP method to probe (default GET)","schema":{"type":"string","enum":["GET","POST"]},"example":"GET"},{"name":"body","in":"query","required":false,"description":"Optional JSON body to send with a POST probe (use the route's own example input)","schema":{"type":"string"}}],"x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.005"}},"responses":{"200":{"description":"Result","content":{"application/json":{"example":{"verdict":"payable","offers":[{"network":"eip155:8453","token":"USDC","priceUsd":0.01}],"problems":[],"warnings":[]}}}},"400":{"description":"Invalid input (not charged)"},"402":{"description":"Payment required (x402)"}}}},"/x402/audit":{"get":{"summary":"x402 origin audit: why are my paid routes not listed?","description":"Audit an x402 seller origin as indexers see it: reads /openapi.json, flags missing x-payment-info, examples and apiKey-modelled payment; probes up to 12 paid routes unpaid with your own examples (valid 402? oversized header? description over CDP limit?); lists paid routes the CDP Bazaar has not indexed. Nothing is paid to the audited origin.","operationId":"x402_audit","tags":["x402","seller","discovery","bazaar","debugging"],"parameters":[{"name":"origin","in":"query","required":true,"description":"Seller origin (https://host) or hostname","schema":{"type":"string"},"example":"https://pitcrew-api.lfglabs.ai"},{"name":"maxRoutes","in":"query","required":false,"description":"Paid routes to probe (default 8)","schema":{"type":"integer","minimum":1,"maximum":12},"example":8}],"x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.02"}},"responses":{"200":{"description":"Result","content":{"application/json":{"example":{"origin":"https://example-seller.com","verdict":"needs fixes","paidRoutes":14,"problems":["14 of 14 paid routes use security scheme(s) x402 declared as type apiKey ..."],"warnings":["CDP Bazaar lists 0 resource(s) of this origin ..."],"routes":[{"method":"GET","path":"/v1/buyer","status":402,"verdict":"payable"}]}}}},"400":{"description":"Invalid input (not charged)"},"402":{"description":"Payment required (x402)"}}}},"/site/check":{"get":{"summary":"Website health check (is it up? TLS, redirects, latency)","description":"Is this website up? Checks HTTP status, redirect chain, response time, TLS certificate validity and days to expiry, security headers, page title and MX records, and returns a verdict (healthy / degraded / down) with a list of problems. Use for uptime checks, vendor due diligence and incident triage.","operationId":"site_check","tags":["uptime","monitoring","web","ssl","devops"],"parameters":[{"name":"url","in":"query","required":true,"description":"URL or hostname","schema":{"type":"string"},"example":"https://example.com"}],"x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.005"}},"responses":{"200":{"description":"Result","content":{"application/json":{"example":{"verdict":"healthy","status":200,"responseMs":210,"tls":{"daysLeft":61},"problems":[]}}}},"400":{"description":"Invalid input (not charged)"},"402":{"description":"Payment required (x402)"}}}},"/fetch":{"get":{"summary":"Fetch a web page as clean text","description":"Fetch any public web page and get clean readable text (scripts, styles and navigation stripped, headings kept), title, meta description, canonical URL and the first 40 links. Optional maxChars (1000-50000, default 20000). Follows redirects; JSON and plain text are returned as-is.","operationId":"fetch","tags":["web","scraping","extract","reader","markdown"],"parameters":[{"name":"url","in":"query","required":true,"description":"Page URL","schema":{"type":"string"},"example":"https://example.com"},{"name":"maxChars","in":"query","required":false,"schema":{"type":"integer","minimum":1000,"maximum":50000},"example":20000}],"x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.005"}},"responses":{"200":{"description":"Result","content":{"application/json":{"example":{"title":"Example Domain","text":"## Example Domain\nThis domain is for use in illustrative examples...","linkCount":1}}}},"400":{"description":"Invalid input (not charged)"},"402":{"description":"Payment required (x402)"}}}},"/domain/lookup":{"get":{"summary":"Domain lookup: age, registrar, expiry, DNS, email auth","description":"Look up a domain before trusting it: registrar, creation date and age in days, expiry, status flags and nameservers from RDAP, plus A/AAAA/MX/CAA records and email authentication (SPF, DMARC policy). Flags young domains (under 30 days), near expiry, missing SPF/DMARC and p=none. Useful for phishing and vendor checks, outreach hygiene and incident triage.","operationId":"domain_lookup","tags":["domain","dns","whois","rdap","security","email"],"parameters":[{"name":"domain","in":"query","required":true,"description":"Domain name or URL","schema":{"type":"string"},"example":"github.com"}],"x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.005"}},"responses":{"200":{"description":"Result","content":{"application/json":{"example":{"domain":"github.com","registrar":"MarkMonitor Inc.","created":"2007-10-09T18:20:50Z","ageDays":6943,"email":{"spf":"v=spf1 ...","dmarcPolicy":"quarantine"},"problems":[]}}}},"400":{"description":"Invalid input (not charged)"},"402":{"description":"Payment required (x402)"}}}},"/evm/address":{"get":{"summary":"EVM address lookup across 6 chains (EOA, contract or EIP-7702)","description":"What is this address? For Ethereum, Base, Arbitrum, Optimism, Polygon and BSC: whether it is an EOA, a contract or an EIP-7702 delegated EOA (with the delegate), native balance, transaction count and whether it is active. Check before sending funds: plain 21,000-gas ETH sends to EIP-7702 delegated accounts fail.","operationId":"evm_address","tags":["blockchain","evm","wallet","eip-7702","address"],"parameters":[{"name":"address","in":"query","required":true,"description":"EVM address","schema":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"example":"0xaaf803ddb5e9f32ef6fe3bafd1898cd2f510f74a"}],"x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":"0.005"}},"responses":{"200":{"description":"Result","content":{"application/json":{"example":{"summary":"EOA with an EIP-7702 delegation on at least one chain","chains":{"ethereum":{"kind":"EIP-7702 delegated EOA","delegate":"0xe3014e9a...","txCount":65}}}}}},"400":{"description":"Invalid input (not charged)"},"402":{"description":"Payment required (x402)"}}}}}}