{
  "openapi": "3.1.2",
  "info": {
    "title": "GeezerKeeper Referral Exit-Route Reference API",
    "version": "1.2.0",
    "description": "Public, read-only reference data for agents helping U.S. families organize unwanted contact after a senior-care referral search. These endpoints never accept personal information and never submit requests.",
    "termsOfService": "https://geezerkeeper.com/terms.html",
    "contact": {
      "name": "GeezerKeeper corrections",
      "email": "corrections@geezerkeeper.com",
      "url": "https://geezerkeeper.com/routes/"
    },
    "license": {
      "name": "CC BY 4.0",
      "identifier": "CC-BY-4.0",
      "url": "https://creativecommons.org/licenses/by/4.0/"
    }
  },
  "servers": [
    {
      "url": "https://geezerkeeper.com",
      "description": "Production"
    }
  ],
  "security": [],
  "tags": [
    {
      "name": "Reference data",
      "description": "Maintained, privacy-safe facts and unfilled templates."
    }
  ],
  "paths": {
    "/routes.json": {
      "get": {
        "operationId": "getReferralExitRoutes",
        "summary": "Get verified senior-care referral exit routes",
        "description": "Returns maintained policy, preference-center, privacy-contact, and provider-follow-up facts. Verify the linked primary source before use.",
        "tags": ["Reference data"],
        "responses": {
          "200": {
            "description": "Current route registry",
            "content": {
              "application/json": {
                "schema": { "$ref": "#/components/schemas/RouteRegistry" }
              }
            }
          },
          "404": {
            "description": "Reference file not found"
          }
        }
      }
    },
    "/reported-numbers.json": {
      "get": {
        "operationId": "getReportedNumbers",
        "summary": "Get cautious, source-linked reported-number associations",
        "responses": {
          "200": {
            "description": "Reported-number evidence with explicit ownership-verification and spoofing boundaries",
            "content": { "application/json": { "schema": { "type": "object" } } }
          }
        }
      }
    },
    "/reported-numbers.csv": {
      "get": {
        "operationId": "getReportedNumbersCsv",
        "summary": "Download the reported-number evidence as CSV",
        "tags": ["Reference data"],
        "responses": {
          "200": {
            "description": "Spreadsheet-ready evidence export with uncertainty fields",
            "content": { "text/csv": { "schema": { "type": "string" } } }
          }
        }
      }
    },
    "/feed.json": {
      "get": {
        "operationId": "getReportedNumberJsonFeed",
        "summary": "Subscribe to reported-number evidence through JSON Feed",
        "tags": ["Reference data"],
        "responses": {
          "200": {
            "description": "JSON Feed 1.1 representation of the evidence registry",
            "content": { "application/feed+json": { "schema": { "type": "object", "additionalProperties": true } } }
          }
        }
      }
    },
    "/feed.xml": {
      "get": {
        "operationId": "getReportedNumberAtomFeed",
        "summary": "Subscribe to reported-number evidence through Atom",
        "tags": ["Reference data"],
        "responses": {
          "200": {
            "description": "Atom 1.0 representation of the evidence registry",
            "content": { "application/atom+xml": { "schema": { "type": "string" } } }
          }
        }
      }
    },
    "/request-templates.json": {
      "get": {
        "operationId": "getPrivacySafeRequestTemplates",
        "summary": "Get unfilled stop-contact request templates",
        "description": "Returns templates with bracketed placeholders. Replace placeholders locally; never send completed text or personal information to GeezerKeeper.",
        "tags": ["Reference data"],
        "responses": {
          "200": {
            "description": "Unfilled templates and data boundary",
            "content": {
              "application/json": {
                "schema": { "$ref": "#/components/schemas/RequestTemplateRegistry" }
              }
            }
          },
          "404": {
            "description": "Reference file not found"
          }
        }
      }
    },
    "/offer.json": {
      "get": {
        "operationId": "getGeezerKeeperOfferFit",
        "summary": "Get free, consumer, and professional product-fit rules",
        "description": "Returns current prices, purchase URLs, fit signals, delivery details, and privacy boundaries.",
        "tags": ["Reference data"],
        "responses": {
          "200": {
            "description": "Current GeezerKeeper product-fit data",
            "content": {
              "application/json": {
                "schema": { "type": "object", "additionalProperties": true }
              }
            }
          },
          "404": {
            "description": "Reference file not found"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "RouteRegistry": {
        "type": "object",
        "required": ["schemaVersion", "reviewedAt", "routes", "disclaimer"],
        "properties": {
          "schemaVersion": { "type": "string" },
          "reviewedAt": { "type": "string", "format": "date" },
          "disclaimer": { "type": "string" },
          "routes": { "type": "array", "items": { "$ref": "#/components/schemas/ExitRoute" } }
        },
        "additionalProperties": true
      },
      "ExitRoute": {
        "type": "object",
        "required": ["id", "name", "privacyPolicyUrl", "guideUrl", "reviewedAt"],
        "properties": {
          "id": { "type": "string", "enum": ["apfm", "caring", "seniorly"] },
          "name": { "type": "string" },
          "privacyPolicyUrl": { "type": "string", "format": "uri" },
          "controlUrl": { "type": "string", "format": "uri" },
          "privacyEmail": { "type": "string", "format": "email" },
          "privacyPhone": { "type": "string" },
          "requestSubject": { "type": "string" },
          "textOptOut": { "type": "string" },
          "providerFollowup": { "type": "string" },
          "guideUrl": { "type": "string", "format": "uri" },
          "reviewedAt": { "type": "string", "format": "date" }
        },
        "additionalProperties": true
      },
      "RequestTemplateRegistry": {
        "type": "object",
        "required": ["schemaVersion", "templateOnly", "dataBoundary", "templates", "disclaimer"],
        "properties": {
          "schemaVersion": { "type": "string" },
          "templateOnly": { "type": "boolean", "const": true },
          "dataBoundary": {
            "type": "object",
            "required": ["acceptsPersonalInformation", "submitsRequests", "instruction"],
            "properties": {
              "acceptsPersonalInformation": { "type": "boolean", "const": false },
              "submitsRequests": { "type": "boolean", "const": false },
              "instruction": { "type": "string" }
            }
          },
          "templates": { "type": "object", "additionalProperties": true },
          "disclaimer": { "type": "string" }
        },
        "additionalProperties": true
      }
    }
  },
  "x-mcp-server": {
    "transport": "streamable-http",
    "url": "https://geezerkeeper.com/mcp",
    "authentication": "none",
    "publicmcpVersion": "0.3",
    "dataBoundary": "Read-only; business identity and coverage tools accept no input, and other tools accept enumerated route, service, and workflow choices only, never personal information."
  }
}
