{
  "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": "ukiMfqiMU1djP3xld"
  },
  "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": "Cities to pull agents from. THIS IS A CHEAP PRE-FILTER: har.com publishes a per-city agent listing, and the Actor ships har.com's own index of 1,752 Texas city names, so it enumerates only agents already listed in your cities and never downloads a profile that cannot match. Costs about 4.2 KB of proxy per candidate found. Spelling is forgiving - \"Katy\", \"katy\", \"Katy, TX\" and \"Sugar Land\" all resolve. Rows come from har.com's own city listing, which files an agent under every city they WORK, so a returned agent's office address may sit in a neighbouring town (measured: 7 of the first 8 agents har.com lists under Katy also self-report city Katy; the 8th works Katy from a Houston office). A name har.com does not index falls back to the old, slow post-fetch scan, bounded by \"Max profiles examined\", and the run status says so.",
            "items": {
              "type": "string"
            }
          },
          "zipCodes": {
            "title": "ZIP codes (optional)",
            "type": "array",
            "description": "ZIP codes to restrict the pull to. Also a cheap PRE-FILTER: har.com publishes a per-ZIP agent listing, so the Actor enumerates only the agents in these ZIPs and fetches nothing else (about 4.2 KB of proxy per candidate found). Cost scales with the number of matching agents, not with the 76,042-agent register. Rows come from har.com's own per-ZIP listing, which files an agent under every ZIP they work - so a returned agent's office address ZIP may differ from the ZIP you asked for. If you set both ZIP codes and Cities, the ZIP list sources the crawl and the city name is then checked on each profile (the intersection), which makes the city half a post-fetch filter again - use one or the other for the cheapest run.",
            "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
          },
          "maxProfilesExamined": {
            "title": "Max profiles examined",
            "minimum": 0,
            "type": "integer",
            "description": "Safety budget for POST-FETCH filters - brokerage key, phone/Platinum/rated, minimum rating, minimum sold, and any city name har.com does not index. Each profile examined costs about $0.0005 of residential proxy (63.5 KB at the measured $8.00/GB) whether or not it matches, so a filter that keeps fewer than about 1 in 5 profiles cannot pay for itself. This caps what such a run can spend before it stops and tells you what happened. 0 = automatic (8x your maxItems, floor 60, ceiling 1200). Ignored when Cities and ZIP codes are the only filters, or when you paste explicit profile URLs, because those fetch only rows that already match.",
            "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}