Analyzing hiring patterns in emerging labor markets often breaks down when job boards lack standard API endpoints or enforce inconsistent metadata schemas. For data engineers tracking workforce shifts in Nigeria, MyJobMag serves as a primary aggregator. However, manually querying every regional hub or relying on basic string searches leaves structural gaps—such as missing employment types or inconsistent state designations across local employers.

Programmatic extraction requires navigating multiple browse axes while maintaining accurate data schemas. By leveraging structural fallbacks across categorical endpoints, you can build reliable datasets for regional employment trends without managing complex scraping infrastructure.

Handling Structural Gaps in Multi-Axis Aggregation

Scraping job listings across different geographical levels introduces specific data hygiene challenges. On MyJobMag, listings vary depending on how an employer posts a position. A job listing might explicitly specify a state like Lagos in its metadata, while another posting in the same state might only supply a city name or rely on the category page context.

The MyJobMag Scraper addresses this by supporting thirteen distinct operation modes. Instead of running a generic, prone-to-miss keyword search, you can isolate collection across ten specific browse axes:

  • Geographical filters: byLocation (38 state options), byRegion (6 geopolitical zones), and byCity (100 specific city options).
  • Categorical filters: byField (51 job functions), byIndustry (38 industry options), byEducation, byType, byDate, byCompany, and byTitle.
  • Specialized endpoints: search (full-text search), byFeatured (curated listings), and byUrls (direct target list).

A key technical detail lies in how the scraper handles incomplete structured data on individual job pages. When browsing a dedicated axis—such as using mode="byType" with employmentType="remote"—the scraper applies mode-implied fallbacks. If an individual posting omits its explicit remote flag in its on-page schema, the scraper injects the target filter value into the output record. This ensures downstream analysis scripts receive complete categorical context without losing track of how the record was selected.

Conversely, the actor does not overwrite explicit on-page listings with filter defaults. For example, MyJobMag's upstream platform occasionally cross-lists a job based in Ebonyi state under a Lagos location page. Rather than silently overwriting the location string to match the requested filter, the scraper preserves the actual on-page details (addressLocality and addressRegion), exposing upstream data quirks directly in the scraped dataset.

Constructing Regional Ingestion Pipelines

To build a clean pipeline that extracts full details across regional zones, configure the actor's input payload to match your target taxonomy. The schema accepts granular controls that let you target specific subsets before initiating payload parsing.

For instance, if you need to extract full listing text for technology roles across the South-West geopolitical zone, you combine mode, region, and secondary string matching.

Here is a Python configuration using the Apify API client to execute a targeted extraction:

from apify_client import ApifyClient client = ApifyClient("YOUR_API_KEY") run_input = { "mode": "byRegion", "region": "south-west", "containsKeyword": "developer", "includeFullDetails": True, "maxItems": 100 } run = client.actor("crawlerbros/myjobmag-scraper").call(run_input=run_input) for item in client.dataset(run["defaultDatasetId"]).iterate_items(): print(f"Title: {item.get('title')}") print(f"Location: {item.get('location')}") print(f"Posted: {item.get('datePosted')}") print("---") 

Setting includeFullDetails to true instructs the scraper to follow each candidate URL from the initial listing page. This extra step parses the underlying page DOM to extract comprehensive fields, including descriptionHtml, descriptionText, validThrough, industry, educationLevel, and companyLogoUrl. Omitting empty values ensures output JSON payloads contain only valid, populated attributes rather than null-padded objects.

Step-by-Step Dataset Extraction

Setting up an automated run requires defining the precise entry parameters for the input schema.

  1. Select the Extraction Mode: Choose the core mode that matches your primary aggregation axis (search, byLocation, byRegion, byCity, byField, etc.).
  2. Define Mode-Specific Parameters: Supply the parameter string matching your chosen mode. If mode is set to byLocation, populate location with a state key like "abuja" or "lagos". If using mode="byCompany", pass a string like "pz-cussons" to the companySlug field.
  3. Apply Substring Filters: Optionally pass a value to containsKeyword. This performs an additional case-insensitive filter across the title, company name, and body text across all operational modes.
  4. Configure Payload Depth: Set includeFullDetails to true if your analysis requires complete job descriptions and ISO 8601 timestamps (datePosted, validThrough). Set it to false if you only need index-level fields like title, companyName, and sourceUrl.
  5. Set Execution Boundaries: Pass an integer to maxItems (ranging from 1 to 1000) to place a hard cap on emitted records and control dataset size.
{ "mode": "byField", "field": "research-data-analysis", "employmentType": "full-time", "containsKeyword": "analyst", "includeFullDetails": true, "maxItems": 50 } 

The resulting output matches a predictable schema structure ready for database ingestion:

{ "title": "Senior Data Analyst", "companyName": "Example Enterprise", "location": "Lagos", "addressLocality": "Ikeja", "addressRegion": "Lagos", "addressCountry": "NG", "category": "Research / Data Analysis", "employmentType": "full-time", "datePosted": "2026-03-28T08:00:00Z", "descriptionText": "Full role details and operational requirements...", "sourceUrl": "https://www.myjobmag.com/job/senior-data-analyst", "recordType": "job", "scrapedAt": "2026-03-30T10:15:00Z" } 

Platform Pricing Dynamics

Event pricing for the actor operates on a fixed per-event structure tied to dataset emissions and run initialization. Each dataset output record generated as a "result" event costs $0.005 on the FREE tier ($0.00433 on BRONZE, $0.00367 on SILVER, and $0.003 on GOLD, PLATINUM, and DIAMOND tiers).

An "Actor Start" charge incurs $0.005 per GB of memory allocated to the run upon execution. Platform usage for the run is billed separately at your Apify plan's rates.

When calculating expected costs for large extraction runs, evaluate the volume of records required against your target dataset boundaries. Fetching 500 records on a standard execution generates 500 "result" events alongside the single "Actor Start" event, with any platform usage calculated independently by the platform billing system.

Inherent Extraction Limitations

While the actor normalizes metadata across diverse browse targets, it cannot synthesize information that employers omit entirely from their listings. If an employer submits a job listing without specifying salary ranges, explicit education requirements, or precise localized addresses, those key-value pairs are omitted from the output JSON rather than populated with placeholder strings. Pipelines expecting deterministic, fully-populated schemas for every record must handle variable dictionary keys downstream.

How do your downstream data pipelines reconcile conflicting geographic designations when cross-referencing multi-source labor market feeds?

Everything above runs on MyJobMag Scraper. Start with a small input and a low result limit before you widen the run -- the output shape is easier to check that way.

Prices quoted above are this Actor's published pay-per-event rates on the Apify Store, read from the Apify platform API on 2026-10-08. Check the Actor page for the current rates.