Romania Mall Store Directory — All Malls, Unified Schema avatar

Romania Mall Store Directory — All Malls, Unified Schema

Pricing

from $3.00 / 1,000 store record extracteds

Go to Apify Store
Romania Mall Store Directory — All Malls, Unified Schema

Romania Mall Store Directory — All Malls, Unified Schema

Extract every store from Romania's major malls (NEPI, AFI, Iulius, Sun Plaza, Baneasa, ParkLake, Veranda, Colosseum). Unified 19-field schema with mall, floor, category, phone and anchor-tenant flags.

Pricing

from $3.00 / 1,000 store record extracteds

Rating

0.0

(0)

Developer

Oaida Adrian

Oaida Adrian

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

Share

Romania Mall Store Directory

Extract public mall tenant directories from the configured Romanian mall registry into a consistent 20-field dataset. Sources include NEPI Rockcastle, AFI Europe, Iulius Group, Sun Plaza, Băneasa, ParkLake, Veranda and Colosseum.

A default run is a small demo, not a full-country crawl: {} selects only mega-mall-bucuresti. Registry membership is not a guarantee that a source is reachable or that its directory is complete. Inspect the run's COVERAGE key-value record alongside the dataset.

Input

Quick demo (also the effective empty-input default)

{
"malls": ["mega-mall-bucuresti"],
"extractDetails": false,
"mallTimeoutSeconds": 75
}

Explicit full Romanian registry

{"country": "ro", "malls": ["all"], "mallTimeoutSeconds": 75}

{"malls":["all"]} also selects the whole Romanian registry. country:"ro" alone still means a demo, because that value is also injected by the input schema. Full runs are sequential and may take much longer than a demo; configure an adequate overall Actor run timeout.

Explicit mall subset

{"malls": ["mega-mall-bucuresti", "afi-cotroceni"], "extractDetails": true, "mallTimeoutSeconds": 120}
FieldTypeDefaultMeaning
countrystringroOnly Romania is supported; other values fail validation
mallsarray[]Specific mall IDs, or ["all"] for the registry
includeAnchorbooleantrueInclude anchor tenants; false filters them out before saving/billing
extractDetailsbooleanfalseVisit optional detail pages; slower and consumes the same per-mall budget
mallTimeoutSecondsinteger75Source time budget per mall, from 1 to 300 seconds
outputstringjsonNative dataset JSON; csv/xlsx are Console export choices, not separate files generated by the Actor

An empty or omitted malls list selects only Mega Mall. To crawl the Romanian registry, explicitly pass malls:["all"]. Unknown mall IDs fail validation; duplicate IDs are crawled once. This actor does not accept country/operator list filters; the multi-country sibling is darknezz/mall-store-directory.

Execution, deadlines and partial results

  • Each completed mall's records are normalized, anchor-filtered, deduplicated by (mall_id, normalized store_name), and pushed before the next mall starts. Previously saved malls survive a later source failure or run timeout.
  • After a successful dataset push, one awaited store-extracted charge is requested with count equal to that batch's saved unique records. Filtered rows, duplicates and failed pushes are not charged by this code. Dataset writes and billing are not one atomic transaction; a platform interruption between them cannot be made exactly-once by this Actor.
  • The per-mall budget includes robots fetching, network calls, retries, backoff, pacing, pagination and optional details. HTTP timeouts and lock waits are clamped to the remaining thread-local deadline; expiry prevents further requests. Permanent HTTP 400 responses are not retried. Transient connection errors/statuses retain retry handling; impersonated requests retain WAF fingerprint rotation.
  • A daemon-thread watchdog additionally bounds waiting for a DNS/native-library call that ignores its timeout. This avoids the default executor's indefinite shutdown wait. Python cannot forcibly kill an in-flight thread: a timed-out call may finish later, but cannot publish/bill late records or begin further budget-aware requests, and cannot prevent process exit.
  • A timed-out mall's not-yet-returned rows are not saved. There is no within-mall streaming or resume checkpoint. Dataset/KV/billing operations are outside the source budget, and the platform's overall run timeout still applies.
  • Source exceptions, empty results and timeouts do not discard other malls. If the entire run saves zero records, it writes the coverage manifest and fails. Dataset storage errors are fatal and reported when KV storage remains available.

Coverage manifest

The default key-value store's COVERAGE record is written before sources start, before each mall, after each mall, and at normal completion. It contains:

  • requestedMallCount, attemptedMallCount, mallsWithRecords, recordsPushed, mallTimeoutSeconds, executionFinished;
  • per-mall mall_id, status, recordsExtracted (before filtering/deduplication), recordsPushed, httpFailures, error, and elapsed source time;
  • coverageStatus: partial when there are known gaps, otherwise unverified;
  • fullCoverage: false: returning rows alone never certifies a complete tenant directory.

Per-mall statuses are pending, running, returned, partial, empty, failed, timeout, no_adapter, or dataset_error. returned means only that an adapter returned rows without a detected HTTP gap. Failed source requests, invalid JSON, exhausted WAF attempts and robots exclusions are recorded; a recovered fallback can still leave a conservative partial warning. Parser omissions or sources that silently truncate can remain undetected; inspect source totals independently when completeness matters.

executionFinished describes orchestration, not source completeness. A killed run can leave running/pending entries and an older checkpoint; dataset storage is authoritative if termination occurs between a push and the next KV update. Missing tenants must not be interpreted as closures from an incomplete run.

Output

Each item contains:

mall_id, mall_name, mall_city, mall_address, mall_country, mall_operator,
store_name, store_brand, category, floor, unit_number,
website, phone, email, opening_hours, store_url,
anchor_tenant, first_seen, last_seen, is_closed

Unpublished values are generally empty strings. anchor_tenant and is_closed are booleans. Detail availability differs by source; index APIs may supply available detail even with extractDetails:false.

first_seen/last_seen are adapter-generated run timestamps, not durable cross-run history. The Actor does not maintain snapshot diffs or automatically flag disappeared stores as closed. is_closed is an adapter-specific source mapping/default and may also reflect an opening-soon flag; do not use it alone as evidence of permanent closure. Build independently verified historical analysis downstream.

Limitations and pricing

  • ParkLake and other sources may serve WAF challenges or block datacenter traffic. This Actor exposes no proxy input or automatic residential-proxy configuration; no egress choice guarantees success.
  • A full-registry request attempts the configured malls, not every mall or every store in a country. Registry and source structures change over time.
  • A small budget, especially with detail extraction, can time out a mall. Increase mallTimeoutSeconds within the allowed range or split a large request into explicit mall subsets.
  • The code requests the store-extracted event per saved record. Consult the Actor's current Apify pricing for event and platform costs; no fixed full-run cost or record count is guaranteed.

Local tests

$uv run --no-project --with 'apify~=3.4.0' --with 'beautifulsoup4~=4.12' --with 'requests~=2.31' --with 'curl_cffi>=0.16.0' --with 'lxml~=5.0' python -m unittest discover -s tests -v

Execution tests use an in-memory Actor and controlled HTTP responses; the subprocess regression verifies that a permanently blocked worker cannot prevent exit. They perform no Apify API writes and do not establish live source coverage.