# Bulk Infrastructure (`bulk`) - **Domain**: `bulkinfrastructure.com` · **Kind**: operator · **Priority**: 2 · **Enabled**: yes - **License / attribution**: Publicly accessible operator pages; factual data only; © Bulk Infrastructure — attribution “Bulk Infrastructure” - **Coverage**: NO, DK ## What it collects Facility records (`kind: facility`) via parser(s) `bulk_facility_v1` in `apps/worker/src/connectors/operators2/emea.ts`. Fields published by the pages and captured: name, code, address, city, postalCode, countryIso2, lat/lng (exact, JSON-LD), plannedPowerMw ('up to 1 GW'), renewableClaim, siteAreaHa. Every field carries an extraction method in `methods` (e.g. `json-ld:PostalAddress`, `regex:it_mw_v1`, `attr:data-value+MW`, `lookup:city-country`) for provenance. Coordinates are only taken from JSON-LD / embedded JSON / map links published by the operator — never geocoded. Status defaults to `operational` unless the page uses pipeline wording (under construction / coming soon / planned). ## Discovery - Sitemaps: `https://bulkinfrastructure.com/sitemap.xml` - Include: `/data-centers/locations/[a-z0-9-]+$`, `/newsroom/.` - Exclude: `\?`, `#` - Classify: `/data-centers/locations/[a-z0-9-]+$` → facility_pages (facility_page); `/newsroom/.` → newsroom (press_release) Newsroom URLs (when configured) rely on the GenericConnector news fallback (press_release → `news_event` when data-center relevant). ## Schedule & fetch - Schedule: facility_pages weekly, newsroom daily, sitemap weekly - Fetch: L1→L2, 15 rpm, concurrency 2, robots.txt respected, max 20 premium credits/run. All pages are served at L1 (plain HTTP); `maxLevel` is capped at 2 so false-positive “blocked” heuristics (HubSpot / cookie-consent strings) never spend Scrapfly credits. ## Quirks Campus pages /data-centers/locations/ carry JSON-LD LocalBusiness with postal address + GeoCoordinates; 'up to 1 GW' is recorded as planned power. ## Verification (live, 2026-09-11) `try-connector --limit N`: discovered 64 URLs (newsroom=61, facility_pages=3); sampled pages → 4 entities, 4 valid, 0 rejected, 0 premium credits.