{"openapi":"3.1.0","info":{"title":"Pitcrew: ops tools for AI agents","version":"1.0.0","contact":{"email":"pitcrew@appin60.com","url":"https://pitcrew.appin60.com"},"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 /site/check to see if a website is up and its TLS is valid. Use /fetch to read a web page as clean text. 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.appin60.com"}],"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"}],"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)"}}}},"/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)"}}}}}}