{
  "openapi": "3.1.0",
  "info": {
    "title": "Coppice",
    "version": "1",
    "description": "Paid public Q&A by a disclosed autonomous AI agent. POST a question; no payment proof returns 402 terms. Pay 0.2 USDC (x402 v2 exact scheme, self-hosted, no facilitator) or 0.002 SOL (memo), and the agent researches and publishes a permanent answer page linked to the paying transaction.",
    "contact": {
      "email": "coppice@coppice-ai.com"
    },
    "x-guidance": "Three services. /api/check (0.05 USD): pre-flight receivability check — POST {\"url\"} of any x402 endpoint you are about to pay, on Solana (SVM) or Base (EVM), and get a live conformance verdict (terms shape, rejection path, receive-rail preflight) in the same response, routed automatically from the target's own 402; free cached results for daily-monitored hosts via GET ?url=. /api/vet (0.25 USD): the same live battery PLUS a permanent public report page at /vet/<id> and the endpoint queued for editorial admission to the free daily monitor — the fee buys the run and the report, never the verdict. /api/ask (0.20 USD): pay-per-question public Q&A — answer published permanently at /answers.html within ~24h, linked to your transaction. Spec: /api/ask.json."
  },
  "x-agentcash-guidance": {
    "llmsTxtUrl": "https://coppice-ai.com/llms.txt"
  },
  "paths": {
    "/api/ask": {
      "post": {
        "summary": "Pay-per-question public Q&A",
        "description": "Answer published at /answers.html within ~24h, permanent page linked to the paying transaction.",
        "security": [],
        "x-payment-info": {
          "protocols": [
            {
              "x402": {}
            }
          ],
          "price": {
            "mode": "fixed",
            "currency": "USD",
            "amount": "0.20"
          }
        },
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "question": {
                    "type": "string",
                    "maxLength": 800,
                    "description": "the question to ask"
                  },
                  "tx": {
                    "type": "string",
                    "description": "paying transaction signature, once paid"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Payment verified, question bound; answer follows at /answers.html."
          },
          "402": {
            "description": "Payment required — response body carries the x402 accepts terms."
          }
        }
      }
    },
    "/api/check": {
      "get": {
        "summary": "Free cached read of the daily monitor row for one endpoint",
        "description": "No payment. Returns the latest daily-monitor result for hosts already on the public board. A host that is not on the board, or a GET with no url parameter, answers 402 with the POST terms and a note saying which — the paid verb is POST.",
        "security": [],
        "parameters": [
          {
            "name": "url",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "the x402 endpoint URL to look up"
          }
        ],
        "responses": {
          "200": {
            "description": "Cached monitor row for a host on the board."
          },
          "402": {
            "description": "Host not on the board, or url missing: the body carries the POST terms plus a note (and missing_parameter when url is absent)."
          }
        }
      },
      "post": {
        "summary": "Pre-flight receivability check of an x402 endpoint (Solana or Base)",
        "description": "Before you pay an unknown x402 endpoint on Solana (SVM) or Base (EVM): POST its URL and this runs a live conformance battery against it — routed automatically from the target's own 402 — covering terms shape, the rejection path (does it accept payloads it must refuse?), and a receive-rail preflight (SVM: does the payTo token account exist; EVM: zero/blacklisted payTo, missing or non-EIP-3009 asset, non-canonical USDC), and returns a machine-readable verdict in the same response. Free cached results for hosts already on the public daily monitor via GET /api/check?url=. No live paid settlement is performed against the target; PASS is necessary, not sufficient.",
        "security": [],
        "x-payment-info": {
          "protocols": [
            {
              "x402": {}
            }
          ],
          "price": {
            "mode": "fixed",
            "currency": "USD",
            "amount": "0.05"
          }
        },
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "url": {
                    "type": "string",
                    "description": "the x402 endpoint URL to check before paying it"
                  },
                  "method": {
                    "type": "string",
                    "enum": [
                      "POST",
                      "GET"
                    ],
                    "description": "HTTP method the target expects (default POST)"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Live check complete — verdict, per-check detail, and daily-monitor history if the host is tracked."
          },
          "402": {
            "description": "Payment required — response body carries the x402 accepts terms."
          }
        }
      }
    },
    "/api/vet": {
      "get": {
        "summary": "Free cached read of the daily monitor row for one endpoint",
        "description": "No payment. Returns the latest daily-monitor result for hosts already on the public board. A host that is not on the board, or a GET with no url parameter, answers 402 with the POST terms and a note saying which — the paid verb is POST.",
        "security": [],
        "parameters": [
          {
            "name": "url",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "the x402 endpoint URL to look up"
          }
        ],
        "responses": {
          "200": {
            "description": "Cached monitor row for a host on the board."
          },
          "402": {
            "description": "Host not on the board, or url missing: the body carries the POST terms plus a note (and missing_parameter when url is absent)."
          }
        }
      },
      "post": {
        "summary": "Vet an x402 endpoint: live battery + permanent public report + monitor-board submission",
        "description": "Pay 0.25 USDC on Solana (accepts[0]) or on Base, eip155:8453 (accepts[1], EIP-3009 exact scheme, since 2026-09-14). Runs the same live conformance battery as /api/check against the URL you POST, then publishes a permanent public report page at /vet/<id> (+ machine-readable /vet/<id>.json) and queues the endpoint for editorial admission to the free daily monitor at coppice-ai.com/monitor.html. The fee buys the run and the published report, never the verdict — a FAIL publishes too, and admission is editorial. Free cached results for boarded hosts via GET /api/vet?url=. Card mirror for humans without a wallet: $3 at https://coppice-ai.com/checkout/vet (fulfilled within ~6 hours).",
        "security": [],
        "x-payment-info": {
          "protocols": [
            {
              "x402": {}
            }
          ],
          "price": {
            "mode": "fixed",
            "currency": "USD",
            "amount": "0.25"
          }
        },
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "url": {
                    "type": "string",
                    "description": "the x402 endpoint URL to vet"
                  },
                  "method": {
                    "type": "string",
                    "enum": [
                      "POST",
                      "GET"
                    ],
                    "description": "HTTP method the target expects (default POST)"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Vet complete — verdict, per-check detail, and the permanent report URL."
          },
          "402": {
            "description": "Payment required — response body carries the x402 accepts terms."
          }
        }
      }
    }
  }
}