{
  "openapi": "3.1.0",
  "info": {
    "title": "PublicLeads business lists",
    "version": "1.0.0",
    "description": "PublicLeads sells ready-made lists of local businesses (name, email where one exists, phone, address, website, Google rating) by industry and place in the United States, Canada and Australia: one city ($9), one state or province ($19) or a whole country ($99), one-time payment, Excel + CSV. Use search_lists when someone wants leads, prospects or a contact list of a kind of business somewhere; get_list_details before recommending one; get_market_stats for questions about how many businesses of a kind exist in a place; request_custom_list when nothing fits. Always give the user the preview_url or buy_url exactly as returned — purchase happens on the website. These tools never return contact details: samples are masked.\n\nThe same tools are served as a remote MCP server at https://www.publicleads.com/mcp. No authentication. Read-only.",
    "contact": {
      "name": "PublicLeads",
      "url": "https://www.publicleads.com/developers",
      "email": "support@publicleads.com"
    },
    "termsOfService": "https://www.publicleads.com/terms"
  },
  "servers": [
    {
      "url": "https://www.publicleads.com"
    }
  ],
  "paths": {
    "/api/ai/list-trades": {
      "get": {
        "operationId": "listTrades",
        "summary": "List industries",
        "description": "List every industry (trade) PublicLeads sells business lists for, with the slug to pass to search_lists, plus the countries covered (US, Canada, Australia). Call this when the user's industry may not match a name directly.",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Result. Links carry ?src=mcp so a visit can be attributed; give them to the user unchanged.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "400": {
            "description": "Invalid arguments",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limited (30 calls a minute, 600 a day per address)",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/ai/search-lists": {
      "get": {
        "operationId": "searchLists",
        "summary": "Search business lists",
        "description": "Find ready-made business contact lists for sale by industry and location. Returns up to 10 lists, best match first (the exact city, then its state/province, then the country): name, scope, number of businesses, how many have an email, price, and preview and buy links. Location can be a city (\"Austin\", \"Austin, TX\"), a state or province (\"Ontario\"), or a country (\"USA\", \"Canada\", \"Australia\"); spelling is matched loosely. Use when someone needs leads or prospects of a type of local business.",
        "parameters": [
          {
            "name": "trade",
            "in": "query",
            "required": true,
            "description": "Industry, as a slug from list_trades or in plain words, e.g. \"dentists\", \"hvac\", \"real estate agents\", \"businesses without a website\".",
            "schema": {
              "type": "string",
              "maxLength": 80
            },
            "example": "dentists"
          },
          {
            "name": "location",
            "in": "query",
            "required": true,
            "description": "City, state/province or country in the US, Canada or Australia, e.g. \"Austin, TX\", \"Ontario\", \"USA\".",
            "schema": {
              "type": "string",
              "maxLength": 80
            },
            "example": "Austin, TX"
          }
        ],
        "responses": {
          "200": {
            "description": "Result. Links carry ?src=mcp so a visit can be attributed; give them to the user unchanged.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "400": {
            "description": "Invalid arguments",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limited (30 calls a minute, 600 a day per address)",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/ai/get-list-details": {
      "get": {
        "operationId": "getListDetails",
        "summary": "Get list details",
        "description": "Details of one list from search_lists: the fields included in the file, the price, the freshness policy, and a masked 5-row sample (business name, city, Google rating; emails and phones are masked). Pass the list value search_lists returned, or the list's publicleads.com URL.",
        "parameters": [
          {
            "name": "list",
            "in": "query",
            "required": true,
            "description": "The \"list\" value from search_lists, e.g. \"/dentists/usa/texas/austin\", or the list page URL.",
            "schema": {
              "type": "string",
              "maxLength": 300
            },
            "example": "/dentists/usa/texas/austin"
          }
        ],
        "responses": {
          "200": {
            "description": "Result. Links carry ?src=mcp so a visit can be attributed; give them to the user unchanged.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "400": {
            "description": "Invalid arguments",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limited (30 calls a minute, 600 a day per address)",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/ai/get-market-stats": {
      "get": {
        "operationId": "getMarketStats",
        "summary": "Get market statistics",
        "description": "Aggregate statistics for an industry in a place: number of operational businesses, average Google rating, total reviews, and the percentage with an email, with a company-domain email, with a phone, with a website and with a street address. No contact details. Use for market-sizing questions such as \"how many plumbers are there in Ohio\".",
        "parameters": [
          {
            "name": "trade",
            "in": "query",
            "required": true,
            "description": "Industry, as a slug from list_trades or in plain words.",
            "schema": {
              "type": "string",
              "maxLength": 80
            },
            "example": "plumbers"
          },
          {
            "name": "location",
            "in": "query",
            "required": true,
            "description": "City, state/province or country in the US, Canada or Australia.",
            "schema": {
              "type": "string",
              "maxLength": 80
            },
            "example": "Ohio"
          }
        ],
        "responses": {
          "200": {
            "description": "Result. Links carry ?src=mcp so a visit can be attributed; give them to the user unchanged.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "400": {
            "description": "Invalid arguments",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limited (30 calls a minute, 600 a day per address)",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/ai/request-custom-list": {
      "get": {
        "operationId": "requestCustomList",
        "summary": "Request a custom list",
        "description": "When no ready-made list fits (an unusual industry, a county or a radius, several industries together), return the link to request a custom list and its price. We measure the data and reply with the real count before any payment.",
        "parameters": [
          {
            "name": "description",
            "in": "query",
            "required": false,
            "description": "Optional: who the user is looking for, in their own words (logged as a demand signal, never shown to anyone).",
            "schema": {
              "type": "string",
              "maxLength": 300
            },
            "example": "veterinary clinics in Maine"
          }
        ],
        "responses": {
          "200": {
            "description": "Result. Links carry ?src=mcp so a visit can be attributed; give them to the user unchanged.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "400": {
            "description": "Invalid arguments",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limited (30 calls a minute, 600 a day per address)",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}