{
  "openapi": "3.0.1",
  "info": {
    "title": "HAR.com Texas Real Estate Agent Scraper — Realtor Leads",
    "description": "76,042 Texas real-estate agents from HAR.com: name, brokerage, office address, phone (100% fill), city/ZIP, star rating, recent listing activity, languages, Platinum status, bio and photo. Filter by city, ZIP, brokerage, rating or Platinum. No email/license — read the honest limits.",
    "version": "0.1",
    "x-build-id": "zVJgv8xfICODXOVDz"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/scrapersdelight~har-com-agent-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-scrapersdelight-har-com-agent-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/scrapersdelight~har-com-agent-scraper/runs": {
      "post": {
        "operationId": "runs-sync-scrapersdelight-har-com-agent-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/scrapersdelight~har-com-agent-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-scrapersdelight-har-com-agent-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "properties": {
          "maxItems": {
            "title": "Max results",
            "minimum": 1,
            "type": "integer",
            "description": "How many agent records to return, and your hard cost cap: 50 = $0.15, 1,000 = $3.00, 5,000 = $15. One record is one profile page fetched. HAR publishes 76,042 agent profiles in total. Leave it alone and you get the 50-agent smoke test ($0.15) — raise it for a real pull.",
            "default": 50
          },
          "cities": {
            "title": "Cities (optional)",
            "type": "array",
            "description": "Keep only agents whose office is in these Texas cities (case-insensitive, exact match on the city HAR prints — e.g. Houston, San Antonio, Katy, Sugar Land, Pearland, Cypress). IMPORTANT: the profile URL carries no city, so this filter runs AFTER each page is fetched. A common city is cheap; a small town can cost many fetches per row. You are billed only for agents RETURNED, never for a page a filter discarded. Leave empty for every city.",
            "items": {
              "type": "string"
            }
          },
          "zipCodes": {
            "title": "ZIP codes (optional)",
            "type": "array",
            "description": "Keep only agents whose office ZIP is in this list. Post-fetch filter, same cost note as Cities. Leave empty for every ZIP.",
            "items": {
              "type": "string"
            }
          },
          "brokerageKeys": {
            "title": "Brokerage keys (optional)",
            "type": "array",
            "description": "Keep only agents at these brokerages, by HAR office key (the broker_XXXXX code in a brokerage URL, e.g. NXRA01 from har.com/nx-realty/broker_nxra01). Returned on every row as brokerageKey, so run once unfiltered, read the keys off the brokerages you want, then re-run with them. Post-fetch filter. Leave empty for every brokerage.",
            "items": {
              "type": "string"
            }
          },
          "profileUrls": {
            "title": "Profile URLs — paste them here instead",
            "type": "array",
            "description": "Paste exact HAR agent URLs (https://www.har.com/{name}/agent_{key}) to re-scrape or refresh a list you already have. This skips the sitemap entirely and overrides the filters. Anything that is not a HAR agent profile URL is skipped with a warning naming the first bad one; if none of them are usable the Actor falls back to the sitemap. Leave empty for the normal directory crawl.",
            "items": {
              "type": "string"
            }
          },
          "withPhoneOnly": {
            "title": "Only agents with a published phone",
            "type": "boolean",
            "description": "Keep only agents whose profile lists a phone number. Cheap — phone fill measured 97.8% (226/231) on an unfiltered directory pull and 100% on a Platinum pull, so almost nothing is discarded.",
            "default": false
          },
          "platinumOnly": {
            "title": "Only Platinum agents",
            "type": "boolean",
            "description": "Keep only HAR Platinum agents (a paid membership tier — richer profiles, more listings). Measured 22.5% of the directory (52/231; the rate swings 0-42% by sitemap offset, and the ABoR chunk has none), so budget roughly 4-5 pages fetched per row kept.",
            "default": false
          },
          "ratedOnly": {
            "title": "Only agents with client ratings",
            "type": "boolean",
            "description": "Keep only agents who carry at least one completed client survey. HAR ratings are sparse — measured 4.3% of the open directory (10/231) and 25.0% of Platinum agents — so this is an expensive filter: budget ~23 pages fetched per row kept unless you also set Platinum.",
            "default": false
          },
          "minRating": {
            "title": "Minimum star rating",
            "enum": [
              "0",
              "3",
              "3.5",
              "4",
              "4.5",
              "5"
            ],
            "type": "string",
            "description": "Drop agents rated below this. Implies a rating exists, so it discards every unrated agent — expensive, same caveat as \"Only agents with client ratings\" (4.3% of the directory carries a rating). HAR scores are two-decimal CER values (4.97, 4.94, 4.85), so 4.5+ keeps almost every rated agent. \"Any rating\" keeps everyone.",
            "default": "0"
          },
          "minListingsSold": {
            "title": "Minimum recent listings sold",
            "minimum": 0,
            "type": "integer",
            "description": "Drop agents with fewer recent SOLD listings than this — a proxy for how active the agent is. The sold counter is present on 39.0% of directory profiles (90/231) and 80.0% of Platinum profiles; a floor discards agents who show none. 0 = keep everyone.",
            "default": 0
          },
          "includeBio": {
            "title": "Include the agent bio",
            "type": "boolean",
            "description": "Include the agent's OWN written profile bio — measured present on 26.4% of directory profiles and 78.3% of Platinum profiles. HAR pastes a canned 'Contact {name} if you are in the process of buying…' placeholder into the bio block for agents who wrote nothing; that is HAR's template, not the agent's words, so it is never shipped (it was 112 of the 173 non-null directory bios). Turn off for a slimmer spreadsheet; price does not change.",
            "default": true
          },
          "includeLanguages": {
            "title": "Include languages spoken",
            "type": "boolean",
            "description": "Include the list of languages the agent speaks (measured present on 7.4% of directory profiles and 36.7% of Platinum profiles — HAR only prints a Languages block when the agent filled one in). Price does not change.",
            "default": true
          },
          "includeDesignations": {
            "title": "Include designations",
            "type": "boolean",
            "description": "Include professional designations (ABR, CRS, GRI, CLHMS, SIOR, CIPS … 25 distinct codes seen) where HAR renders a Designations section. Measured on 9.1% of directory profiles and 61.7% of Platinum profiles. Price does not change.",
            "default": true
          },
          "skip": {
            "title": "Skip (paging across runs)",
            "minimum": 0,
            "type": "integer",
            "description": "Skip this many agents before collecting. Enumeration order is stable, so a maxItems=1000 run followed by skip=1000 continues where the first stopped instead of re-buying the same agents. All 76,042 agent URLs are unique. With a lead-quality filter on, set skip to the \"pages fetched\" figure the previous run printed, not maxItems.",
            "default": 0
          },
          "maxConcurrency": {
            "title": "Concurrency",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "Parallel profile fetches, each on its own warmed residential session. 5 is the tested default. HAR sits behind PerimeterX; each worker warms a session on the homepage to mint the bot cookie and re-warms after ~12 profiles or on a block, so pushing concurrency higher mainly burns more residential proxy sessions.",
            "default": 5
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Leave it on Apify Proxy with the RESIDENTIAL group and country US — that is the ONLY rung that clears HAR's PerimeterX wall (measured: datacenter and non-US residential are blocked 100%). The Actor forces RESIDENTIAL-US automatically; this box only lets you supply your own proxyUrls if you have a better residential pool.",
            "default": {
              "useApifyProxy": true,
              "apifyProxyGroups": [
                "RESIDENTIAL"
              ],
              "apifyProxyCountry": "US"
            }
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}