{
  "openapi": "3.1.0",
  "info": {
    "title": "Moltline Studio API",
    "version": "1.0.0",
    "description": "Agent-facing API for Moltline Studio: MCP fleet health and agent-native purchase of the All-Access license.",
    "contact": {
      "email": "support@moltlinestudio.com",
      "url": "https://moltlinestudio.com"
    }
  },
  "servers": [
    {
      "url": "https://moltlinestudio.com"
    }
  ],
  "x-service-info": {
    "name": "Moltline Studio",
    "categories": [
      "ai-tools",
      "software-licenses",
      "mcp-servers"
    ]
  },
  "paths": {
    "/api/premium/all-access": {
      "post": {
        "operationId": "purchaseAllAccess",
        "summary": "Purchase a Moltline All-Access license (x402 protected)",
        "description": "Returns HTTP 402 with x402 payment requirements (USDC on Base). After settlement, the license key is delivered by email; see /auth.md.",
        "x-payment-info": {
          "intent": "charge",
          "method": "tempo",
          "amount": "19.00",
          "currency": "USD",
          "description": "Moltline All-Access \u2014 one month. Unlocks premium tools on all 14 Moltline MCP servers."
        },
        "responses": {
          "402": {
            "description": "Payment required \u2014 body contains x402 payment requirements."
          },
          "200": {
            "description": "License issued."
          }
        }
      }
    },
    "/auth.md": {
      "get": {
        "operationId": "getAuthGuide",
        "summary": "Agent registration and authentication guide",
        "responses": {
          "200": {
            "description": "Markdown guide."
          }
        }
      }
    },
    "/api/agent-check": {
      "post": {
        "operationId": "scanAgentReadiness",
        "summary": "Score any public domain against 21 agent-readiness checks",
        "description": "Free and unauthenticated. Fetches only public URLs on the target domain and returns a score out of 21 with a per-check explanation and the exact remediation for each failure. Fair use is twelve scans per hour per client address. Use this to find out whether an autonomous agent can discover, read, use and pay a website. Do not use it as a general URL fetcher: it only ever requests a fixed list of well-known paths, and it refuses any hostname that resolves to a non-public address.",
        "security": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "domain"
                ],
                "properties": {
                  "domain": {
                    "type": "string",
                    "maxLength": 300,
                    "description": "A public hostname, for example example.com. A full URL is accepted and reduced to its host.",
                    "examples": [
                      "example.com"
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Scan complete.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string",
                      "description": "Permanent identifier for this result."
                    },
                    "domain": {
                      "type": "string"
                    },
                    "score": {
                      "type": "integer",
                      "minimum": 0,
                      "maximum": 21
                    },
                    "total": {
                      "type": "integer"
                    },
                    "grade": {
                      "type": "string",
                      "enum": [
                        "A",
                        "B",
                        "C",
                        "D",
                        "F"
                      ]
                    },
                    "scanned_at": {
                      "type": "string",
                      "format": "date-time"
                    },
                    "categories": {
                      "type": "object",
                      "additionalProperties": {
                        "type": "string"
                      }
                    },
                    "checks": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "id": {
                            "type": "string"
                          },
                          "category": {
                            "type": "string"
                          },
                          "title": {
                            "type": "string"
                          },
                          "passed": {
                            "type": "boolean"
                          },
                          "detail": {
                            "type": "string"
                          },
                          "fix": {
                            "type": "string"
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "The domain could not be scanned."
          },
          "429": {
            "description": "Fair-use limit reached."
          },
          "503": {
            "description": "The scanner is busy; retry shortly."
          },
          "504": {
            "description": "The target did not respond in time."
          }
        }
      }
    },
    "/api/agent-check/{resultId}": {
      "get": {
        "operationId": "getAgentReadinessResult",
        "summary": "Retrieve a stored scan result by id",
        "description": "Returns the same object as scanAgentReadiness. Result ids are twelve lowercase hex characters.",
        "security": [],
        "parameters": [
          {
            "name": "resultId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[a-f0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The stored result."
          },
          "404": {
            "description": "No such result."
          }
        }
      }
    },
    "/badge/{resultId}.svg": {
      "get": {
        "operationId": "getAgentReadinessBadge",
        "summary": "SVG badge for a stored scan result",
        "description": "An embeddable badge showing the score. Cacheable for one hour.",
        "security": [],
        "parameters": [
          {
            "name": "resultId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[a-f0-9]{12}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Badge.",
            "content": {
              "image/svg+xml": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "description": "No such result."
          }
        }
      }
    }
  }
}