{"openapi":"3.1.0","info":{"title":"Action402 API","version":"0.1.0","description":"Paid webhook and API execution for autonomous agents using x402 payments on Base."},"servers":[{"url":"https://action402.vercel.app"}],"paths":{"/api/execute/webhook":{"post":{"summary":"Execute one paid webhook/API action","description":"Protected by x402 when X402_ENABLED=true. Executes one outbound HTTPS request and returns a signed receipt.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["url"],"properties":{"url":{"type":"string","format":"uri","description":"Absolute HTTPS URL to call."},"method":{"type":"string","enum":["POST","PUT","PATCH","DELETE"],"default":"POST"},"headers":{"type":"object","additionalProperties":{"type":["string","number","boolean"]},"description":"Optional outbound headers. Hop-by-hop and proxy headers are stripped."},"body":{"description":"JSON body forwarded to the target endpoint."},"idempotencyKey":{"type":"string","minLength":1,"maxLength":160,"description":"Caller-provided key used to replay the same completed job instead of executing twice."},"retry":{"type":"object","additionalProperties":false,"properties":{"attempts":{"type":"integer","minimum":1,"maximum":3,"default":1},"backoffMs":{"type":"integer","minimum":0,"maximum":5000,"default":250}}},"timeoutMs":{"type":"integer","minimum":1000,"maximum":12000,"default":12000}}},"examples":{"basic":{"value":{"url":"https://example.com/webhook","method":"POST","body":{"event":"agent.test","ok":true},"idempotencyKey":"agent-test-001","retry":{"attempts":2,"backoffMs":300}}}}}}},"responses":{"200":{"description":"Execution succeeded","content":{"application/json":{"schema":{"type":"object","required":["mode","idempotentReplay","job","receipt","links"],"properties":{"mode":{"type":"string","enum":["demo","x402"]},"idempotentReplay":{"type":"boolean"},"job":{"type":"object","required":["id","status","attempts"],"properties":{"id":{"type":"string"},"status":{"type":"string","enum":["succeeded","failed"]},"attempts":{"type":"integer"}}},"receipt":{"type":"object","properties":{"id":{"type":"string"},"signature":{"type":"string"},"replay":{"type":"boolean"}}},"links":{"type":"object","required":["job","receipt"],"properties":{"job":{"type":"string"},"receipt":{"type":"string"}}}}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"402":{"description":"Payment required by x402 middleware"},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"502":{"description":"Target execution failed","content":{"application/json":{"schema":{"type":"object","required":["mode","idempotentReplay","job","receipt","links"],"properties":{"mode":{"type":"string","enum":["demo","x402"]},"idempotentReplay":{"type":"boolean"},"job":{"type":"object","required":["id","status","attempts"],"properties":{"id":{"type":"string"},"status":{"type":"string","enum":["succeeded","failed"]},"attempts":{"type":"integer"}}},"receipt":{"type":"object","properties":{"id":{"type":"string"},"signature":{"type":"string"},"replay":{"type":"boolean"}}},"links":{"type":"object","required":["job","receipt"],"properties":{"job":{"type":"string"},"receipt":{"type":"string"}}}}}}}}}}},"/api/jobs/{id}":{"get":{"summary":"Fetch job status","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Job found"},"404":{"description":"Job not found","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}}}}},"/api/receipts/{id}":{"get":{"summary":"Fetch and verify receipt","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Receipt found"},"404":{"description":"Receipt not found","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}}}}},"/api/verify/jobs/{id}":{"get":{"summary":"Verify job and receipt consistency","description":"Returns an agent-readable proof report covering receipt signature validity plus consistency between the stored job and its linked receipt.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Verification report","content":{"application/json":{"schema":{"type":"object","required":["ok","receiptId","jobId","signatureVerified","checks"],"properties":{"ok":{"type":"boolean"},"jobId":{"type":["string","null"]},"receiptId":{"type":["string","null"]},"keyId":{"type":["string","null"]},"signatureVerified":{"type":"boolean"},"checks":{"type":"array","items":{"type":"object","required":["name","ok"],"properties":{"name":{"type":"string"},"ok":{"type":"boolean"},"details":{}}}}}}}}},"404":{"description":"Job or receipt not found","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"409":{"description":"Job exists but no receipt is linked yet","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}}}}},"/api/verify/receipts/{id}":{"get":{"summary":"Verify receipt proof report","description":"Returns receipt signature checks and, when the linked job is still retained, full job/receipt consistency checks.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Verification report","content":{"application/json":{"schema":{"type":"object","required":["ok","receiptId","jobId","signatureVerified","checks"],"properties":{"ok":{"type":"boolean"},"jobId":{"type":["string","null"]},"receiptId":{"type":["string","null"]},"keyId":{"type":["string","null"]},"signatureVerified":{"type":"boolean"},"checks":{"type":"array","items":{"type":"object","required":["name","ok"],"properties":{"name":{"type":"string"},"ok":{"type":"boolean"},"details":{}}}}}}}}},"404":{"description":"Receipt not found","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}}}}},"/api/proofs/recent":{"get":{"summary":"Fetch recent public verified proof examples","description":"Returns recent verified proof summaries with sensitive target, header, body, hash, and signature details redacted.","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":50,"default":10}}],"responses":{"200":{"description":"Recent public proof summaries","content":{"application/json":{"schema":{"type":"object","required":["ok","redactionPolicy","proofs"],"properties":{"ok":{"type":"boolean"},"redactionPolicy":{"type":"object"},"proofs":{"type":"array","items":{"type":"object","required":["jobId","receiptId","status","method","attempts","receiptVerified","links"],"properties":{"jobId":{"type":"string"},"receiptId":{"type":["string","null"]},"status":{"type":"string","enum":["running","succeeded","failed"]},"method":{"type":"string"},"attempts":{"type":"integer"},"responseStatus":{"type":["integer","null"]},"responseOk":{"type":"boolean"},"receiptVerified":{"type":"boolean"},"errorCategory":{"type":["string","null"]},"createdAt":{"type":"string"},"updatedAt":{"type":"string"},"publicFieldsOnly":{"type":"boolean"},"links":{"type":"object","properties":{"job":{"type":"string"},"receipt":{"type":["string","null"]},"verifyJob":{"type":"string"},"verifyReceipt":{"type":["string","null"]}}}}}}}}}}}}}},"/api/monitoring/executions":{"get":{"summary":"Fetch execution monitoring summary","description":"Returns durable execution counters, recent failure summaries, and process-level request metrics.","parameters":[{"name":"windowMs","in":"query","required":false,"schema":{"type":"integer","minimum":60000,"default":86400000}}],"responses":{"200":{"description":"Execution monitoring summary","content":{"application/json":{"schema":{"type":"object","required":["ok","status","windowMs","failureRate","stats","recentFailures"],"properties":{"ok":{"type":"boolean"},"status":{"type":"string","enum":["ok","attention"]},"windowMs":{"type":"integer"},"failureRate":{"type":"number"},"stats":{"type":"object","properties":{"total":{"type":"integer"},"succeeded":{"type":"integer"},"failed":{"type":"integer"},"running":{"type":"integer"},"recentTotal":{"type":"integer"},"recentSucceeded":{"type":"integer"},"recentFailed":{"type":"integer"},"recentRunning":{"type":"integer"},"lastUpdatedAt":{"type":["string","null"]}}},"recentFailures":{"type":"array","items":{"type":"object","required":["jobId","receiptId","status","method","attempts","receiptVerified","links"],"properties":{"jobId":{"type":"string"},"receiptId":{"type":["string","null"]},"status":{"type":"string","enum":["running","succeeded","failed"]},"method":{"type":"string"},"attempts":{"type":"integer"},"responseStatus":{"type":["integer","null"]},"responseOk":{"type":"boolean"},"receiptVerified":{"type":"boolean"},"errorCategory":{"type":["string","null"]},"createdAt":{"type":"string"},"updatedAt":{"type":"string"},"publicFieldsOnly":{"type":"boolean"},"links":{"type":"object","properties":{"job":{"type":"string"},"receipt":{"type":["string","null"]},"verifyJob":{"type":"string"},"verifyReceipt":{"type":["string","null"]}}}}}}}}}}}}}},"/api/trust":{"get":{"summary":"Fetch public trust summary","description":"Returns redacted public trust signals for agents evaluating whether to use the paid execution route.","responses":{"200":{"description":"Trust summary","content":{"application/json":{"schema":{"type":"object","required":["ok","status","x402","storage","execution","proofExamples","trustSignals"],"properties":{"ok":{"type":"boolean"},"status":{"type":"string","enum":["ok","attention"]},"x402":{"type":"object","properties":{"enabled":{"type":"boolean"},"scheme":{"type":"string"},"network":{"type":"string"},"price":{"type":"string"}}},"storage":{"type":"object","properties":{"driver":{"type":"string"},"durable":{"type":"boolean"},"jobs":{"type":"integer"},"receipts":{"type":"integer"}}},"execution":{"type":"object","properties":{"windowMs":{"type":"integer"},"recentFailureRate":{"type":"number"},"stats":{"type":"object"}}},"proofExamples":{"type":"object","properties":{"recentVerifiedProofs":{"type":"integer"},"latestVerifiedProofAt":{"type":["string","null"]}}},"trustSignals":{"type":"array","items":{"type":"string"}}}}}}}}}},"/api/capabilities":{"get":{"summary":"Fetch agent-readable service capabilities","responses":{"200":{"description":"Capabilities document"}}}},"/api/bazaar":{"get":{"summary":"Fetch Bazaar metadata","responses":{"200":{"description":"Bazaar metadata"}}}},"/health":{"get":{"summary":"Health check","responses":{"200":{"description":"Service is running"}}}}},"components":{"schemas":{"WebhookRequest":{"type":"object","additionalProperties":false,"required":["url"],"properties":{"url":{"type":"string","format":"uri","description":"Absolute HTTPS URL to call."},"method":{"type":"string","enum":["POST","PUT","PATCH","DELETE"],"default":"POST"},"headers":{"type":"object","additionalProperties":{"type":["string","number","boolean"]},"description":"Optional outbound headers. Hop-by-hop and proxy headers are stripped."},"body":{"description":"JSON body forwarded to the target endpoint."},"idempotencyKey":{"type":"string","minLength":1,"maxLength":160,"description":"Caller-provided key used to replay the same completed job instead of executing twice."},"retry":{"type":"object","additionalProperties":false,"properties":{"attempts":{"type":"integer","minimum":1,"maximum":3,"default":1},"backoffMs":{"type":"integer","minimum":0,"maximum":5000,"default":250}}},"timeoutMs":{"type":"integer","minimum":1000,"maximum":12000,"default":12000}}},"ExecuteWebhookResponse":{"type":"object","required":["mode","idempotentReplay","job","receipt","links"],"properties":{"mode":{"type":"string","enum":["demo","x402"]},"idempotentReplay":{"type":"boolean"},"job":{"type":"object","required":["id","status","attempts"],"properties":{"id":{"type":"string"},"status":{"type":"string","enum":["succeeded","failed"]},"attempts":{"type":"integer"}}},"receipt":{"type":"object","properties":{"id":{"type":"string"},"signature":{"type":"string"},"replay":{"type":"boolean"}}},"links":{"type":"object","required":["job","receipt"],"properties":{"job":{"type":"string"},"receipt":{"type":"string"}}}}},"VerificationReport":{"type":"object","required":["ok","receiptId","jobId","signatureVerified","checks"],"properties":{"ok":{"type":"boolean"},"jobId":{"type":["string","null"]},"receiptId":{"type":["string","null"]},"keyId":{"type":["string","null"]},"signatureVerified":{"type":"boolean"},"checks":{"type":"array","items":{"type":"object","required":["name","ok"],"properties":{"name":{"type":"string"},"ok":{"type":"boolean"},"details":{}}}}}},"PublicProofSummary":{"type":"object","required":["jobId","receiptId","status","method","attempts","receiptVerified","links"],"properties":{"jobId":{"type":"string"},"receiptId":{"type":["string","null"]},"status":{"type":"string","enum":["running","succeeded","failed"]},"method":{"type":"string"},"attempts":{"type":"integer"},"responseStatus":{"type":["integer","null"]},"responseOk":{"type":"boolean"},"receiptVerified":{"type":"boolean"},"errorCategory":{"type":["string","null"]},"createdAt":{"type":"string"},"updatedAt":{"type":"string"},"publicFieldsOnly":{"type":"boolean"},"links":{"type":"object","properties":{"job":{"type":"string"},"receipt":{"type":["string","null"]},"verifyJob":{"type":"string"},"verifyReceipt":{"type":["string","null"]}}}}},"MonitoringResponse":{"type":"object","required":["ok","status","windowMs","failureRate","stats","recentFailures"],"properties":{"ok":{"type":"boolean"},"status":{"type":"string","enum":["ok","attention"]},"windowMs":{"type":"integer"},"failureRate":{"type":"number"},"stats":{"type":"object","properties":{"total":{"type":"integer"},"succeeded":{"type":"integer"},"failed":{"type":"integer"},"running":{"type":"integer"},"recentTotal":{"type":"integer"},"recentSucceeded":{"type":"integer"},"recentFailed":{"type":"integer"},"recentRunning":{"type":"integer"},"lastUpdatedAt":{"type":["string","null"]}}},"recentFailures":{"type":"array","items":{"type":"object","required":["jobId","receiptId","status","method","attempts","receiptVerified","links"],"properties":{"jobId":{"type":"string"},"receiptId":{"type":["string","null"]},"status":{"type":"string","enum":["running","succeeded","failed"]},"method":{"type":"string"},"attempts":{"type":"integer"},"responseStatus":{"type":["integer","null"]},"responseOk":{"type":"boolean"},"receiptVerified":{"type":"boolean"},"errorCategory":{"type":["string","null"]},"createdAt":{"type":"string"},"updatedAt":{"type":"string"},"publicFieldsOnly":{"type":"boolean"},"links":{"type":"object","properties":{"job":{"type":"string"},"receipt":{"type":["string","null"]},"verifyJob":{"type":"string"},"verifyReceipt":{"type":["string","null"]}}}}}}}},"TrustResponse":{"type":"object","required":["ok","status","x402","storage","execution","proofExamples","trustSignals"],"properties":{"ok":{"type":"boolean"},"status":{"type":"string","enum":["ok","attention"]},"x402":{"type":"object","properties":{"enabled":{"type":"boolean"},"scheme":{"type":"string"},"network":{"type":"string"},"price":{"type":"string"}}},"storage":{"type":"object","properties":{"driver":{"type":"string"},"durable":{"type":"boolean"},"jobs":{"type":"integer"},"receipts":{"type":"integer"}}},"execution":{"type":"object","properties":{"windowMs":{"type":"integer"},"recentFailureRate":{"type":"number"},"stats":{"type":"object"}}},"proofExamples":{"type":"object","properties":{"recentVerifiedProofs":{"type":"integer"},"latestVerifiedProofAt":{"type":["string","null"]}}},"trustSignals":{"type":"array","items":{"type":"string"}}}},"Error":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}}