# DR Real Estate Instagram Scraper (`medina-labs/dr-instagram-realestate-scraper`) Actor

Scrapes Instagram posts from Dominican Republic real estate agents (Punta Cana, Cap Cana, Santo Domingo, Las Terrenas) and pre-processes them with mechanical extraction (detected prices, phones, hashtags) so you can plug in your own LLM or business logic for final structuring.

- **URL**: https://apify.com/medina-labs/dr-instagram-realestate-scraper.md
- **Developed by:** [Max Medina](https://apify.com/medina-labs) (community)
- **Categories:** Social media, Real estate, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-usage

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## DR Real Estate Instagram Scraper

**English** · [Español](#español)

Scrapes Instagram posts from Dominican Republic real estate agents (Punta Cana,
Cap Cana, Santo Domingo, Las Terrenas, etc.) and applies lightweight mechanical
pre-processing — **no LLM involved**. It's designed as a data-collection layer:
you bring your own structuring logic (an LLM, your own regex, or manual review)
on top of the clean, consistent fields this Actor produces.

### Why this exists

Most real estate inventory in the Dominican Republic — especially around
Punta Cana / Cap Cana — is listed by individual agents on Instagram rather
than on centralized property portals. This Actor targets that specific gap.

### What it does

1. Takes a list of Instagram usernames (individual agents work best — brand
   umbrella accounts like the parent `apartamentosrd` skew heavily
   institutional/marketing content with a much lower listing ratio).
2. Calls `apify/instagram-post-scraper` as a sub-actor to fetch recent posts.
3. Runs each post through mechanical extraction:
   - Detected USD prices (regex on `US$X,XXX` / `USD X,XXX` patterns)
   - Detected Dominican phone numbers
   - Hashtags
   - Zone name mentions (matched against a fixed list of known DR zones)
   - A `likelyListing` boolean flag
4. Pushes one row per post to the output dataset.

### What it does NOT do (by design)

- **No LLM extraction.** It won't tell you the actual bedroom count, whether
  a price is a reservation deposit vs. the final sale price, or parse prices
  that only appear baked into an image (not in the caption or Instagram's
  auto-generated alt text). Validated against a 271-post real sample, the
  mechanical `likelyListing` flag lands close to true listing rate (~30%),
  but it is a signal, not a guarantee — false positives/negatives exist.
- **No image OCR / vision.** Only text (caption + Instagram's auto alt text)
  is analyzed.
- **No listing deduplication** across accounts or over time.

If you want fully structured fields (exact price, bedrooms, m², zone,
confidence score), the recommended pattern is to pipe this Actor's dataset
through your own LLM call afterward — the `captionRaw` and `altTextRaw`
fields carry everything needed for that.

### Input

| Field | Type | Description |
|---|---|---|
| `instagramUsernames` | array of strings | Instagram usernames to scrape (no `@`) |
| `resultsLimitPerAccount` | integer | Max posts per account (default 20) |
| `onlyLikelyListings` | boolean | Drop posts without listing signals (default false) |

### Output (one row per post)

```json
{
  "instagramUsername": "nathalydls.apartamentosrd",
  "agentFullName": "Nathaly de los Santos | Asesora Inmobiliaria | Inversiones",
  "postUrl": "https://www.instagram.com/p/DaQLsYxhrOa/",
  "postTimestamp": "2026-07-01T14:00:11.000Z",
  "postType": "Video",
  "captionRaw": "...",
  "altTextRaw": "...",
  "likesCount": 12,
  "commentsCount": 0,
  "detectedPricesUsd": [170000],
  "detectedPhone": "849-459-2321",
  "detectedHashtags": ["Naco", "ApartamentoEnVenta"],
  "mentionedZones": ["Santo Domingo", "Naco"],
  "likelyListing": true,
  "captionWordCount": 110,
  "scrapedAt": "2026-07-17T15:01:34.506Z"
}
```

### Finding good target accounts

Individual agent sub-accounts under a brand (e.g. `[name].apartamentosrd`)
tend to have a much higher listing ratio than the parent brand account.
Look at who the parent account tags/mentions, or check its "Followed by"
list, to discover these agent accounts.

### Cost

This Actor's only paid dependency is `apify/instagram-post-scraper`
(Apify's own actor, pay-per-event at ~$0.0017 per post — about 37% cheaper
than the generic `apify/instagram-scraper`, with identical data quality
validated against a 15-post side-by-side test). All processing after that
is local and free.

***

## Español

[English](#dr-real-estate-instagram-scraper) · **Español**

Extrae publicaciones de Instagram de agentes inmobiliarios de la República
Dominicana (Punta Cana, Cap Cana, Santo Domingo, Las Terrenas, etc.) y aplica
un pre-procesamiento mecánico ligero — **sin usar ningún LLM**. Está diseñado
como una capa de recolección de datos: tú aportas tu propia lógica de
estructuración (un LLM, tus propias expresiones regulares o revisión manual)
sobre los campos limpios y consistentes que produce este Actor.

### Por qué existe

La mayor parte del inventario inmobiliario en la República Dominicana —
especialmente en la zona de Punta Cana / Cap Cana — la publican agentes
individuales en Instagram y no en portales inmobiliarios centralizados. Este
Actor apunta específicamente a ese vacío.

### Qué hace

1. Recibe una lista de nombres de usuario de Instagram (los agentes
   individuales funcionan mejor; las cuentas paraguas de marca como la cuenta
   matriz `apartamentosrd` tienden a contenido institucional/marketing con una
   proporción de listados mucho menor).
2. Llama a `apify/instagram-post-scraper` como sub-actor para obtener las
   publicaciones recientes.
3. Procesa cada publicación con extracción mecánica:
   - Precios en USD detectados (regex sobre patrones `US$X,XXX` / `USD X,XXX`)
   - Números de teléfono dominicanos detectados
   - Hashtags
   - Menciones de nombres de zonas (contra una lista fija de zonas conocidas de RD)
   - Un indicador booleano `likelyListing`
4. Envía una fila por publicación al dataset de salida.

### Qué NO hace (por diseño)

- **Sin extracción con LLM.** No te dirá la cantidad real de habitaciones, si
  un precio es un depósito de reserva o el precio final de venta, ni analizará
  precios que solo aparecen incrustados en una imagen (no en el texto ni en el
  texto alternativo automático de Instagram). Validado contra una muestra real
  de 271 publicaciones, el indicador `likelyListing` se acerca a la tasa real
  de listados (~30%), pero es una señal, no una garantía: existen falsos
  positivos/negativos.
- **Sin OCR / visión por computadora.** Solo se analiza texto (descripción +
  texto alternativo automático de Instagram).
- **Sin deduplicación de listados** entre cuentas o a lo largo del tiempo.

Si quieres campos totalmente estructurados (precio exacto, habitaciones, m²,
zona, puntuación de confianza), el patrón recomendado es pasar el dataset de
este Actor por tu propia llamada a un LLM después — los campos `captionRaw` y
`altTextRaw` contienen todo lo necesario para eso.

### Entrada

| Campo | Tipo | Descripción |
|---|---|---|
| `instagramUsernames` | arreglo de textos | Nombres de usuario de Instagram a extraer (sin `@`) |
| `resultsLimitPerAccount` | entero | Máx. publicaciones por cuenta (por defecto 20) |
| `onlyLikelyListings` | booleano | Descarta publicaciones sin señales de listado (por defecto false) |

### Salida (una fila por publicación)

Ver el ejemplo JSON en la sección en inglés más arriba. Los campos son los
mismos independientemente del idioma.

### Encontrar buenas cuentas objetivo

Las sub-cuentas de agentes individuales bajo una marca (p. ej.
`[nombre].apartamentosrd`) suelen tener una proporción de listados mucho mayor
que la cuenta matriz de la marca. Mira a quién etiqueta/menciona la cuenta
matriz, o revisa su lista de "Seguida por", para descubrir estas cuentas de
agentes.

### Costo

La única dependencia de pago de este Actor es `apify/instagram-post-scraper`
(actor propio de Apify, pago por evento a ~$0.0017 por publicación — cerca de
37% más barato que el genérico `apify/instagram-scraper`, con calidad de datos
idéntica validada en una prueba lado a lado de 15 publicaciones). Todo el
procesamiento posterior es local y gratuito.

# Actor input Schema

## `instagramUsernames` (type: `array`):

List of Dominican Republic real estate agent Instagram usernames to scrape (without @). Example: nathalydls.apartamentosrd | Lista de nombres de usuario de Instagram de agentes inmobiliarios de República Dominicana a extraer (sin @). Ejemplo: nathalydls.apartamentosrd

## `resultsLimitPerAccount` (type: `integer`):

Maximum number of recent posts to scrape per Instagram account. | Número máximo de publicaciones recientes a extraer por cuenta de Instagram.

## `onlyLikelyListings` (type: `boolean`):

If enabled, posts that don't contain listing signals (price, bedrooms, m², etc.) are dropped from the output dataset. If disabled, all posts are included with the likelyListing flag so you can filter yourself. | Si se activa, las publicaciones sin señales de listado (precio, habitaciones, m², etc.) se descartan del dataset de salida. Si se desactiva, se incluyen todas las publicaciones con el indicador likelyListing para que filtres por tu cuenta.

## Actor input object example

```json
{
  "instagramUsernames": [
    "tucasard.samary",
    "olesya.kuidanova"
  ],
  "resultsLimitPerAccount": 20,
  "onlyLikelyListings": false
}
```

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "instagramUsernames": [
        "tucasard.samary",
        "olesya.kuidanova"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("medina-labs/dr-instagram-realestate-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "instagramUsernames": [
        "tucasard.samary",
        "olesya.kuidanova",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("medina-labs/dr-instagram-realestate-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "instagramUsernames": [
    "tucasard.samary",
    "olesya.kuidanova"
  ]
}' |
apify call medina-labs/dr-instagram-realestate-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,medina-labs/dr-instagram-realestate-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/2srwhYcka8lK0QqoP/builds/ib4LDdopwGI4Wajdn/openapi.json
