Romania Mall Store Directory — All Malls, Unified Schema
Pricing
from $3.00 / 1,000 store record extracteds
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
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}
| Field | Type | Default | Meaning |
|---|---|---|---|
country | string | ro | Only Romania is supported; other values fail validation |
malls | array | [] | Specific mall IDs, or ["all"] for the registry |
includeAnchor | boolean | true | Include anchor tenants; false filters them out before saving/billing |
extractDetails | boolean | false | Visit optional detail pages; slower and consumes the same per-mall budget |
mallTimeoutSeconds | integer | 75 | Source time budget per mall, from 1 to 300 seconds |
output | string | json | Native 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-extractedcharge is requested withcountequal 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:partialwhen there are known gaps, otherwiseunverified;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
mallTimeoutSecondswithin the allowed range or split a large request into explicit mall subsets. - The code requests the
store-extractedevent 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.