{
  "openapi": "3.0.1",
  "info": {
    "title": "meQasa Scraper - Ghana Real Estate Listings & Prices",
    "description": "Ghanaian property adverts from meQasa: asking price in cedis with the portal's dollar equivalent, bedrooms, bathrooms, floor area, locality, photo count, listing age and the advertiser behind each advert. Search 113 named localities or all of Ghana, or open single adverts for the full seller text, t",
    "version": "1.0",
    "x-build-id": "JWwmJewCBPURTNVdh"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/sian.agency~meqasa-property-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-sian.agency-meqasa-property-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/sian.agency~meqasa-property-scraper/runs": {
      "post": {
        "operationId": "runs-sync-sian.agency-meqasa-property-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/sian.agency~meqasa-property-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-sian.agency-meqasa-property-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": {
          "operation": {
            "title": "🎯 What to do",
            "enum": [
              "search",
              "detail"
            ],
            "type": "string",
            "description": "Property Search walks the portal's result grid and returns 16 adverts per request, each already carrying price, size, locality and the advertiser. Property Detail takes advert addresses you already have and opens each one for the seller's full text, the amenity list, every photo, the dollar equivalent and the listing dates. One operation per run.",
            "default": "search"
          },
          "dealType": {
            "title": "🤝 For sale or for rent",
            "enum": [
              "sale",
              "rent"
            ],
            "type": "string",
            "description": "Sale adverts carry an asking price, rent adverts a rent with its period, and every row is labelled either way. These are the only two the portal's search accepts — any other value makes it answer with an error rather than a result set, so no third option is offered. Nationally there are about 20,300 sale adverts and 12,000 rent adverts.",
            "default": "sale"
          },
          "propertyType": {
            "title": "🏠 Property type",
            "enum": [
              "all",
              "House",
              "Apartment",
              "Land",
              "Townhouse",
              "Office",
              "Shop",
              "Warehouse",
              "Retail",
              "Commercial space",
              "Studio apartment",
              "Guest house",
              "Hotel",
              "Beachhouse"
            ],
            "type": "string",
            "description": "Houses and apartments are the deep sections: 8,193 houses and 1,041 apartments for sale, 4,704 houses and 5,869 apartments for rent. Land is the single largest sale section at 10,477 plots. Note that All types means everything EXCEPT land — that is the portal's own behaviour, not a choice made here, so run Land as its own pass if you want plots. The long tail — hotels, beach houses, guest houses — holds a few dozen adverts each nationally, so pair those with All of Ghana rather than one…",
            "default": "all"
          },
          "location": {
            "title": "📍 Where",
            "enum": [
              "",
              "Accra",
              "New Dome",
              "Legon",
              "East Legon",
              "Cantonments",
              "Spintex",
              "Airport Area",
              "Airport Residential Area",
              "East Legon Hills",
              "Tse Addo",
              "Adjiringanor",
              "East Airport",
              "Ho",
              "Oyarifa",
              "Tema",
              "Labone",
              "Ridge",
              "Dzorwulu",
              "Adenta",
              "Ashaley Botwe",
              "Lakeside Estate",
              "Trasacco",
              "Sakumono",
              "Achimota",
              "Osu",
              "Community 25",
              "North Legon",
              "Haatso",
              "Ogbojo",
              "Abelemkpe",
              "Kwabenya",
              "School Junction",
              "Roman Ridge",
              "Amasaman",
              "Lashibi",
              "West Legon",
              "Airport Hills",
              "North Ridge",
              "Ayi Mensah",
              "West Trasacco",
              "Pokuase",
              "Teshie",
              "Ashongman",
              "Agbogba",
              "Kumasi",
              "Westlands",
              "Dome",
              "Tantra",
              "Dansoman",
              "Kasoa",
              "Nanakrom",
              "Aburi",
              "Amrahia",
              "American House",
              "Afienya",
              "Madina",
              "Shiashie",
              "Tesano",
              "Labadi",
              "Ablekuma",
              "Oyibi",
              "Pantang",
              "Prampram",
              "Airport West",
              "West Airport",
              "Nmai Dzor",
              "Kaneshie",
              "East Cantonments",
              "Ofankor",
              "Oyarifa Rd",
              "Ringway",
              "Kokrobite",
              "North Kaneshie",
              "South La",
              "Kanda",
              "Nungua",
              "Batsona",
              "Gbawe",
              "La",
              "New Legon",
              "Dome Pillar 2",
              "Katamanso",
              "Abokobi",
              "Bortianor",
              "New Achimota",
              "Weija",
              "Atomic",
              "Takoradi",
              "Taifa",
              "Awoshie",
              "Soko",
              "ACP Estate",
              "Asylum Down",
              "Greda Estate",
              "Kuntunse",
              "Mataheko",
              "McCarthy Hill",
              "South Labadi",
              "Asokore Mampong",
              "Trade Fair",
              "Dawhenya",
              "Kokomlemle",
              "Klagon",
              "Community 22",
              "Devtraco Estates",
              "Emefs Estates",
              "Lapaz",
              "Nsawam",
              "Odorkor",
              "Community 16",
              "Haatso-Atomic Rd",
              "Manet Court",
              "Airport City"
            ],
            "type": "string",
            "description": "All of Ghana, or one named locality. This list is the portal's own place index with every value checked against the live site: of the 412 names its search box will accept, 253 return adverts and 159 return nothing at all. The 113 offered here are the ones carrying ten adverts or more, which is 98.7% of everything the portal attributes to a place. Searching a broad name includes the smaller places inside it — Accra returns East Legon, Osu and Cantonments stock as well.",
            "default": ""
          },
          "keyword": {
            "title": "🔎 Keyword",
            "type": "string",
            "description": "Optional free text matched against the advert description — 'pool' narrows the national sale set from 9,857 to 2,642, 'gated' to 2,019. Leave it empty for everything. A word the adverts do not use returns nothing rather than being ignored, so a zero-row run here means the word is genuinely absent, not that the filter was dropped.",
            "default": ""
          },
          "bedrooms": {
            "title": "🛏️ Bedrooms",
            "enum": [
              "",
              "1",
              "2",
              "3",
              "4",
              "5",
              "6",
              "7",
              "8",
              "9",
              "10"
            ],
            "type": "string",
            "description": "An EXACT bedroom count, not a minimum — 3 returns 2,491 national sale adverts and 4 returns 4,270, and the two sets do not overlap. Land, offices and warehouses mostly carry no bedroom count at all, so pair this with a residential property type.",
            "default": ""
          },
          "minBathrooms": {
            "title": "🚿 Bathrooms (minimum)",
            "enum": [
              "",
              "1",
              "2",
              "3",
              "4",
              "5",
              "6"
            ],
            "type": "string",
            "description": "Unlike bedrooms, this one is a minimum: 1+ returns 9,838 national sale adverts, 3+ returns 9,004 and 5+ returns 5,250. That asymmetry is the portal's, not this actor's.",
            "default": ""
          },
          "priceMin": {
            "title": "💰 Minimum price (GHS)",
            "type": "integer",
            "description": "Asking price floor in Ghana cedis. Every advert on meQasa is quoted in cedis, including the ones the seller priced in dollars, so this window is always in GHS. For rent adverts it filters the rent, at whatever period the advert uses. Leave both price fields at 0 for no price filter.",
            "default": 0
          },
          "priceMax": {
            "title": "💰 Maximum price (GHS)",
            "type": "integer",
            "description": "Asking price ceiling in Ghana cedis. 0 means no ceiling. As a sense of scale, 2,482 of the 9,857 national sale adverts sit between GHS 500,000 and GHS 2,000,000, and 7,406 are above GHS 2,000,000.",
            "default": 0
          },
          "areaMin": {
            "title": "📐 Minimum floor area (m²)",
            "type": "integer",
            "description": "Floor area floor in square metres. Sending an area window at all excludes the handful of adverts that publish no area, so it narrows slightly even at its widest. 0 in both area fields means no area filter.",
            "default": 0
          },
          "areaMax": {
            "title": "📐 Maximum floor area (m²)",
            "type": "integer",
            "description": "Floor area ceiling in square metres. 0 means no ceiling. Nationally 7,180 sale adverts are under 100 m², 3,875 between 100 and 500 m², and 1,336 above 500 m².",
            "default": 0
          },
          "rentPeriod": {
            "title": "📅 Rent period",
            "enum": [
              "",
              "longrent",
              "shortrent",
              "weekrent",
              "dayrent"
            ],
            "type": "string",
            "description": "Rent adverts only; ignored on a sale search. Of the 11,958 national rent adverts, 11,318 are long lets, 3,772 short lets, 289 daily and 58 weekly — the categories overlap because an advert can be offered on more than one term.",
            "default": ""
          },
          "furnishedOnly": {
            "title": "🛋️ Furnished only",
            "type": "boolean",
            "description": "Rent adverts only. 4,356 of the 11,958 national rent adverts are marked furnished. The portal has no matching 'unfurnished only' switch, so leaving this off returns both.",
            "default": false
          },
          "ownerDirectOnly": {
            "title": "🙋 Owner-direct only",
            "type": "boolean",
            "description": "Only adverts the portal marks as for-sale-by-owner rather than listed through an agency. This is a small, high-signal slice: 58 of the 9,857 national sale adverts. Turn it on when you want sellers you can approach directly, and expect tens of rows, not thousands.",
            "default": false
          },
          "maxItems": {
            "title": "🔢 Maximum adverts",
            "type": "integer",
            "description": "Stop after this many adverts. The run also stops on its own when the selection runs out, so this is a ceiling rather than a target. Each request returns 16 adverts, so 100 is about seven requests. Set it high for a full sweep — the biggest single selection on the portal is about 10,500 adverts.",
            "default": 100
          },
          "propertyUrl": {
            "title": "🔗 Advert address",
            "type": "string",
            "description": "Property Detail only. The full address of one meQasa advert, as it appears in the browser. The bare reference number is not enough on its own — the address carries the property type and locality the portal needs to find the page.",
            "default": ""
          },
          "propertyUrls": {
            "title": "🔗 Advert addresses",
            "type": "array",
            "description": "Property Detail only. A list of meQasa advert addresses to open in one run. Each one is charged as a single detail row, and an advert that has been sold, rented or withdrawn comes back as an error row that is never charged.",
            "default": [],
            "items": {
              "type": "string"
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}