{
  "openapi": "3.0.1",
  "info": {
    "title": "MLS Data API - RESO Web API Listings, Agents, Offices",
    "description": "Query MLS listing data through a RESO certified Web API: properties with price, status, beds, baths, area and days on market, agents and brokerages, open houses and rooms, plus the lookup vocabulary, the MLS attribution text you must display, location autocomplete and boundaries.",
    "version": "0.1",
    "x-build-id": "DHVKcoqsZGeeLv3eN"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/nabeelbaghoor~reso-mls-data-api/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-nabeelbaghoor-reso-mls-data-api",
        "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/nabeelbaghoor~reso-mls-data-api/runs": {
      "post": {
        "operationId": "runs-sync-nabeelbaghoor-reso-mls-data-api",
        "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/nabeelbaghoor~reso-mls-data-api/run-sync": {
      "post": {
        "operationId": "run-sync-nabeelbaghoor-reso-mls-data-api",
        "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": {
          "mode": {
            "title": "What to do",
            "enum": [
              "search",
              "record",
              "disclaimer",
              "autocomplete",
              "agentStats",
              "neighbourhoods",
              "zipcodes",
              "schoolDistricts"
            ],
            "type": "string",
            "description": "Search queries one RESO resource with an OData filter and pages through the whole result. Record reads listings, agents or offices by key. Disclaimer returns the MLS attribution text a public site has to display. Autocomplete suggests cities, counties, ZIP codes and streets from a prefix. Agent statistics summarise closed listings for an agent or office. Neighbourhoods, ZIP codes and school districts return boundaries.",
            "default": "search"
          },
          "resource": {
            "title": "Resource",
            "enum": [
              "Property",
              "Member",
              "Office",
              "OpenHouse",
              "PropertyRooms",
              "Field",
              "Lookup"
            ],
            "type": "string",
            "description": "Which RESO resource to query in search and record modes. Property is listings, Member is agents, Office is brokerages, OpenHouse is scheduled open houses, PropertyRooms is room level detail. Field and Lookup are the metadata resources: Field lists the fields your feed publishes and Lookup lists the values each one accepts, which is how you find out what to filter on.",
            "default": "Property"
          },
          "filter": {
            "title": "OData filter",
            "type": "string",
            "description": "An OData $filter expression, passed to the provider verbatim. For example StandardStatus eq 'Active' and ListPrice ge 500000, or RFModificationTimestamp ge 2026-09-01T00:00:00Z for an incremental sync. In agent statistics mode this is required and must name either ListAgentMlsId or ListOfficeMlsId."
          },
          "select": {
            "title": "Fields to return",
            "type": "array",
            "description": "One RESO field name per line to narrow the payload, for example ListingId or ListPrice. Leave empty for every field the feed publishes. Narrowing this is the single most effective way to avoid a gateway timeout on a large query.",
            "items": {
              "type": "string"
            }
          },
          "expand": {
            "title": "Related data to expand",
            "type": "array",
            "description": "One related collection per line, for example Media or OpenHouse. Expanded collections are returned as a count plus the first media link rather than as nested JSON, so a listing with forty photos stays one readable row.",
            "items": {
              "type": "string"
            }
          },
          "orderBy": {
            "title": "Order by",
            "type": "string",
            "description": "An OData $orderby expression, for example RFModificationTimestamp desc. Ordering on the feed timestamp is what makes an incremental sync resumable."
          },
          "includeCount": {
            "title": "Ask for the total count",
            "type": "boolean",
            "description": "Ask the provider how many records match in total. Reported in the log on the first page, so you can tell a filter that matched three records from one that matched three hundred thousand.",
            "default": false
          },
          "pageSize": {
            "title": "Records per page",
            "type": "integer",
            "description": "How many records to ask for per page, up to 200. The provider enforces its own ceiling and refuses an over-large page outright rather than trimming it, so this stays conservative. Paging then follows the provider's own continuation link until the row cap is reached.",
            "default": 200
          },
          "recordKeys": {
            "title": "Record keys",
            "type": "array",
            "description": "One record key per line for record mode. Which key depends on the resource: ListingKey for Property, MemberKey for Member, OfficeKey for Office.",
            "items": {
              "type": "string"
            }
          },
          "searchPrefixes": {
            "title": "Autocomplete prefixes",
            "type": "array",
            "description": "One prefix per line for autocomplete mode. Matching is by prefix on exact field values across city, county, state, ZIP code, subdivision, MLS area, street name and unparsed address, scoped to the feeds your credential is permitted.",
            "items": {
              "type": "string"
            }
          },
          "metrics": {
            "title": "Statistics to return",
            "type": "array",
            "description": "Which closed listing metrics to return. Leave empty for both.",
            "items": {
              "type": "string",
              "enum": [
                "avg_closed_price",
                "count_closed"
              ],
              "enumTitles": [
                "Average closed price",
                "Closed listing count"
              ]
            }
          },
          "neighbourhoodNames": {
            "title": "Neighbourhood names",
            "type": "array",
            "description": "One neighbourhood name per line for neighbourhood mode.",
            "items": {
              "type": "string"
            }
          },
          "zipcodes": {
            "title": "ZIP codes",
            "type": "array",
            "description": "One five digit ZIP code per line for ZIP code mode.",
            "items": {
              "type": "string"
            }
          },
          "points": {
            "title": "Points",
            "type": "array",
            "description": "One \"latitude,longitude\" pair per line for school district mode, in that order. The provider's own body takes longitude first and a swapped pair returns a real district somewhere else in the country rather than an error, so the order is fixed for you here.",
            "items": {
              "type": "string"
            }
          },
          "includeGeometry": {
            "title": "Include boundary geometry",
            "type": "boolean",
            "description": "Return the actual boundary polygon alongside the attributes. Off by default because a district boundary is thousands of coordinates and belongs in a map layer rather than in a spreadsheet cell.",
            "default": false
          },
          "geometrySimplifyRatio": {
            "title": "Geometry simplification",
            "type": "number",
            "description": "How much to downsample a returned boundary, between 0 and 0.5. Higher is coarser and much smaller. Only used when boundary geometry is switched on.",
            "default": 0.1
          },
          "geoLimit": {
            "title": "Boundaries per request",
            "type": "integer",
            "description": "How many boundary records to return per request, between 1 and 100.",
            "default": 10
          },
          "clientId": {
            "title": "Client ID",
            "type": "string",
            "description": "Your own client ID from the provider dashboard. Note that a wrong client ID or secret gets the caller blocked for five minutes, so this actor never retries a refused credential."
          },
          "clientSecret": {
            "title": "Client secret",
            "type": "string",
            "description": "Your own client secret from the provider dashboard. Stored encrypted and never written into the dataset. Can also be supplied as the DATA_API_KEY environment secret."
          },
          "maxResults": {
            "title": "Maximum rows",
            "type": "integer",
            "description": "Stop after this many rows. Counts every row: listings, agents, offices, suggestions and boundaries alike.",
            "default": 100
          },
          "requestsPerMinute": {
            "title": "Requests per minute",
            "type": "integer",
            "description": "How fast to call the data endpoints. Plans allow between 10 and 20 requests per second, so 300 per minute sits inside the slowest of them. Lower it if you see rate limiting.",
            "default": 300
          },
          "baseUrl": {
            "title": "API host",
            "type": "string",
            "description": "Overrides the host the API is called on. Leave empty unless the provider has given you a different one."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}