{
  "openapi": "3.1.0",
  "info": {
    "title": "63Digital site content",
    "version": "1.0.0",
    "summary": "Read 63digital.com as an agent: any page as Markdown, the llms.txt files, the Updates feed and the sitemap.",
    "description": "Everything is public, read-only and needs no authentication, except POST /api/enquiries, which takes an access token obtained per /auth.md. For structured access (services, case studies, guides, search) use the MCP server at /mcp — see /.well-known/mcp/server-card.json. Human-readable documentation: /agents/.",
    "contact": {
      "name": "63Digital Ltd",
      "email": "hello@63digital.com",
      "url": "https://63digital.com/contact/"
    }
  },
  "servers": [
    {
      "url": "/"
    }
  ],
  "paths": {
    "/{path}": {
      "get": {
        "operationId": "getPage",
        "summary": "Any page on the site, as HTML or Markdown",
        "description": "Send Accept: text/markdown to get the page's main content as Markdown, with YAML front matter (title, description, url). Browsers get HTML.",
        "parameters": [
          {
            "name": "path",
            "in": "path",
            "required": true,
            "description": "The page path, e.g. services/ or work/kcr-academy/ (pages end in a slash).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Accept",
            "in": "header",
            "required": false,
            "schema": {
              "type": "string",
              "example": "text/markdown"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The page.",
            "headers": {
              "x-markdown-tokens": {
                "description": "Estimated token count of the Markdown.",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "text/markdown": {
                "schema": {
                  "type": "string"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "description": "No such page."
          }
        }
      }
    },
    "/llms.txt": {
      "get": {
        "operationId": "getLlmsTxt",
        "summary": "One-line-per-page map of the site for LLMs (llmstxt.org)",
        "responses": {
          "200": {
            "description": "The map.",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/llms-full.txt": {
      "get": {
        "operationId": "getLlmsFullTxt",
        "summary": "Every public page as Markdown, in one file",
        "responses": {
          "200": {
            "description": "The full content.",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/updates/rss.xml": {
      "get": {
        "operationId": "getUpdatesFeed",
        "summary": "RSS 2.0 feed of the Updates blog, newest first",
        "responses": {
          "200": {
            "description": "The feed.",
            "content": {
              "application/rss+xml": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/sitemap.xml": {
      "get": {
        "operationId": "getSitemap",
        "summary": "XML sitemap of every public page",
        "responses": {
          "200": {
            "description": "The sitemap.",
            "content": {
              "application/xml": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/api/enquiries": {
      "post": {
        "operationId": "sendEnquiry",
        "summary": "Send 63Digital a project enquiry from a verified email address",
        "security": [
          {
            "agentAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "name",
                  "message"
                ],
                "properties": {
                  "name": {
                    "type": "string",
                    "maxLength": 200
                  },
                  "message": {
                    "type": "string",
                    "maxLength": 5000
                  },
                  "phone": {
                    "type": "string"
                  },
                  "company": {
                    "type": "string"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Sent; 63Digital will reply to the verified email."
          },
          "400": {
            "description": "Invalid enquiry or daily limit reached."
          },
          "401": {
            "description": "Missing or invalid access token; WWW-Authenticate points at the protected resource metadata."
          }
        }
      }
    },
    "/coffee/buy": {
      "post": {
        "operationId": "buyCoffee",
        "summary": "Buy 63Digital a coffee (£3.00)",
        "description": "Machine Payments Protocol (https://mpp.dev): the first call returns 402 with a WWW-Authenticate: Payment challenge (method stripe, intent charge); retry with Authorization: Payment <credential> carrying a Stripe Shared Payment Token. Success returns a Payment-Receipt header.",
        "x-payment-info": {
          "intent": "charge",
          "method": "stripe",
          "amount": "300",
          "currency": "gbp",
          "description": "Buy 63Digital a coffee (£3.00)"
        },
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {}
            }
          }
        },
        "responses": {
          "200": {
            "description": "Paid. Payment-Receipt header carries the receipt.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "status": {
                      "type": "string",
                      "const": "paid"
                    },
                    "product": {
                      "type": "string"
                    },
                    "amount": {
                      "type": "integer"
                    },
                    "currency": {
                      "type": "string"
                    },
                    "payment_intent": {
                      "type": "string"
                    },
                    "message": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "402": {
            "description": "Payment Required: WWW-Authenticate: Payment challenge (problem+json body)."
          }
        }
      }
    },
    "/api/v1/coffee": {
      "get": {
        "summary": "Buy 63Digital a coffee in USDC (x402)",
        "description": "x402 v2: answers 402 with a base64 PAYMENT-REQUIRED header (scheme exact, USDC on Base). Retry with a PAYMENT-SIGNATURE header carrying the signed payment payload; a settled payment returns 200 with a PAYMENT-RESPONSE header. Also served at /api/v1.",
        "operationId": "buyCoffeeX402",
        "parameters": [
          {
            "name": "PAYMENT-SIGNATURE",
            "in": "header",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Base64 x402 v2 PaymentPayload."
          }
        ],
        "responses": {
          "200": {
            "description": "Paid: a JSON thank-you with the on-chain transaction hash."
          },
          "402": {
            "description": "Payment required: x402 PaymentRequired JSON (also in the PAYMENT-REQUIRED header)."
          },
          "503": {
            "description": "x402 payments aren't switched on."
          }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "agentAuth": {
        "type": "http",
        "scheme": "bearer",
        "description": "Access token (scope enquiries.send) from the auth.md service_auth flow: https://63digital.com/auth.md"
      }
    }
  },
  "x-service-info": {
    "categories": [
      "payments"
    ],
    "docs": {
      "homepage": "/coffee/",
      "apiReference": "/agents/",
      "llms": "/llms.txt"
    }
  }
}
