DEV Community

Cover image for Indeed Data API: Extract Structured JSON in 2026
AlterLab
AlterLab

Posted on • Originally published at alterlab.io

Indeed Data API: Extract Structured JSON in 2026

Disclaimer: This guide covers extracting publicly accessible data. Always review a site's robots.txt and Terms of Service before scraping.

When building data pipelines for labor market intelligence, treating job boards as raw HTML sources is a losing battle. Selectors change, layouts undergo aggressive A/B testing, and maintenance becomes a full-time engineering job. You need an Indeed data API approach—a system that accepts a URL and returns validated, typed JSON without forcing you to manage headless browser clusters or debug XPath queries.

This guide details how to implement structured extraction for public job listings, bypassing manual DOM parsing in favor of schema-driven data retrieval. We will cover the mechanics of defining strict data schemas, executing API calls for extraction, and scaling your infrastructure for high-throughput async processing.

Why use Indeed data?

Public job market data fuels a variety of critical engineering and analytical use cases. Consuming this information reliably requires treating the target site as a programmatic resource rather than a visual document.

Labor Market Analytics
Data engineering teams ingest job listings to build macro-level analytics dashboards. By tracking the volume of open roles across specific geographies, analysts can benchmark salaries and identify shifts in skill demand. Extracting this data reliably means piping it directly into columnar databases like Snowflake or ClickHouse. For this to work without constant data cleaning steps, the incoming data stream must be strictly structured.

AI Training and RAG Pipelines
Large Language Models (LLMs) and Retrieval-Augmented Generation (RAG) systems require clean, domain-specific text to function correctly. Feeding raw HTML into a vector database pollutes the context window with navigation elements, footer links, and JavaScript snippets. Extracting purely the core job description, requirements, and metadata into a clean JSON object ensures that your AI agents retrieve high signal-to-noise context.

Competitive Intelligence
Tracking competitors' hiring patterns reveals their strategic roadmap. If a competitor suddenly opens ten requisitions for Go developers and Kubernetes administrators, they are likely migrating their backend infrastructure. Automating the extraction of this data allows you to trigger alerts based on specific keywords or roles appearing in public listings.

By centralizing these extraction tasks into a single data layer, cross-functional teams can share the same robust data foundation. Data engineers can write simple Python wrappers around the pipeline, while frontend developers can trigger extractions directly from Next.js or Node.js backends without needing to build separate microservices for web scraping.

What data can you extract?

When accessing public job listings, you typically want a standardized set of fields regardless of how the page renders. An effective indeed api structured data extraction focuses on mapping visual content to specific keys in a database schema.

  • job_title: The explicit role being hired for. This needs to be stripped of superfluous tags like "(Remote)" or "URGENT" that recruiters sometimes append.
  • company: The organization posting the role.
  • location: The geographic requirement. This field often requires parsing to determine if the role is hybrid, fully remote, or on-site.
  • salary: Extracted compensation ranges. On public pages, this might be presented as "$100k-$120k a year" or "$50/hr". A robust extraction schema can pull this raw string for downstream normalization.
  • posted_date: The recency of the listing, crucial for determining if a role is actively being recruited or if it is a stale listing left online.
  • employment_type: Classification such as full-time, contract, part-time, or freelance.
  • requirements: An array of specific technical skills or qualifications demanded by the listing.

The extraction approach

Traditional web extraction relies on brittle, imperative pipelines. You spin up a headless browser using Playwright or Puppeteer, fetch the raw HTML, and pass it through DOM parsers like BeautifulSoup or Cheerio. You then maintain extensive dictionaries of XPath and CSS selectors. When the target site ships a minor UI update or changes a class name from div.job-desc to div.card-body, your pipeline breaks silently. The script returns null values, and data quality degrades until an engineer manually inspects the DOM and deploys a patch.

When evaluating infrastructure, consider the hidden costs of managing browser clusters. Headless Chrome requires significant memory overhead per instance. Deploying this on Kubernetes means managing resource limits, handling browser crashes, and dealing with zombie processes. Furthermore, accessing job boards at scale requires a vast, rotating proxy pool to distribute requests and avoid IP-based rate limiting. When you combine proxy management, container orchestration, and DOM parsing maintenance, data extraction quickly becomes an infrastructure problem rather than a data problem.

A data API flips this model to declarative extraction. Instead of telling the system how to find the data via selectors, you tell it what data you want via a JSON schema. The underlying engine handles proxy rotation, headless browser rendering, and network routing. It then applies an LLM to map the unstructured visual content directly to your exact schema.

This turns fragile web extraction into a predictable function call. By offloading the rendering and parsing layer, your engineering team can focus on data transformation and storage rather than maintaining scraper scripts. Before diving into the implementation, make sure you have your environment set up and API keys provisioned by checking our Getting started guide.

Quick start with the Extract API

The AlterLab Extract API eliminates the need for manual HTML parsing. It expects two primary arguments: the target URL and a JSON schema describing your desired output format. When you submit the request, the API returns a response payload containing the extracted data mapped precisely to your schema.

Here is how to perform an indeed json extraction in Python.

```python title="extract_indeed-com.py" {5-12}

client = alterlab.Client("YOUR_API_KEY")

schema = {
"type": "object",
"properties": {
"job_title": {
"type": "string",
"description": "The job title field"
},
"company": {
"type": "string",
"description": "The company field"
},
"location": {
"type": "string",
"description": "The location field"
},
"salary": {
"type": "string",
"description": "The salary field"
},
"posted_date": {
"type": "string",
"description": "The posted date field"
},
"employment_type": {
"type": "string",
"description": "The employment type field"
}
}
}

result = client.extract(
url="https://indeed.com/example-page",
schema=schema,
)
print(result.data)




If you prefer operating directly from the command line, integrating via shell scripts, or using a different language ecosystem, you can hit the HTTP endpoint directly using cURL.



```bash title="Terminal" {2-3}
curl -X POST https://api.alterlab.io/v1/extract \
  -H "X-API-Key: YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://indeed.com/example-page",
    "schema": {"properties": {"job_title": {"type": "string"}, "company": {"type": "string"}, "location": {"type": "string"}}}
  }'
Enter fullscreen mode Exit fullscreen mode

The response is strictly validated against the provided schema, guaranteeing that your downstream systems receive the exact types they expect. For comprehensive parameter details, including advanced routing options and timeout configurations, refer to the Extract API docs.

Define your schema

The schema is the contract for your indeed data extraction python pipeline. By utilizing standard JSON Schema definitions, you enforce data types (strings, integers, arrays, booleans) and ensure that the API returns clean, structured data ready for insertion.

JSON Schema supports complex types and nested objects. If a job posting lists multiple distinct qualifications, you can define an array of strings in your schema. The AI engine will parse the bulleted list on the page and populate the array accordingly. You can even specify required fields to ensure that the API throws a validation error if a critical piece of data, such as the job title, is missing from the page. This fail-fast mechanism prevents malformed data from silently entering your database.

When defining your schema, the description fields act as subtle prompts for the underlying AI extraction engine. If a field on the page is ambiguous, the description helps the engine disambiguate and select the correct text node. You can also define specific enums, forcing the extraction engine to categorize data into predefined buckets, which is exceptionally useful for fields like employment_type.

When you execute the API call shown above, the response payload maps precisely to your defined properties. You no longer need to write complex regular expressions to strip whitespace, handle missing DOM nodes, or remove errant HTML tags.

```json title="Output.json" {2-7}
{
"job_title": "Senior Data Engineer",
"company": "TechLogix",
"location": "Remote",
"salary": "$140,000 - $160,000",
"posted_date": "2026-05-06",
"employment_type": "Full-time"
}




This predictable output allows you to immediately pipe the results into a relational database or a NoSQL store without requiring an intermediate transformation layer in your pipeline. The data is clean, typed, and ready for analysis.

## Handle pagination and scale

Extracting a single public job posting is a trivial exercise. Operating a production data pipeline that processes thousands of records daily requires a robust architecture designed for concurrency and batching.

To orchestrate a complete pipeline, your system requires two distinct phases: discovery and extraction. In the discovery phase, you target the search result pages. You pass a simple schema to the API requesting an array of URLs found on the search page. Once the discovery phase returns a list of target job URLs, you pass those URLs into the batch extraction phase to retrieve the deep structured data from each specific posting.

For high-volume **extract indeed data** workloads, you should avoid maintaining long-lived HTTP connections that block your worker threads. Instead, implement the async batch extraction pattern. This architectural design offloads the concurrency management, proxy rotation, and queuing logic entirely to the API platform.



```python title="batch_extract.py" {11-15}

client = alterlab.Client("YOUR_API_KEY")

urls = [
    "https://indeed.com/example-job-1",
    "https://indeed.com/example-job-2",
    "https://indeed.com/example-job-3"
]

# Submit an asynchronous batch job
job = client.batch.create(
    urls=urls,
    schema=schema,
    webhook_url="https://your-server.com/webhooks/indeed-data"
)

print(f"Batch job {job.id} initialized. Waiting for webhook delivery.")
Enter fullscreen mode Exit fullscreen mode

Handling failures at scale is also critical. Network timeouts, target site rate limits, and temporary routing issues are inevitable when processing thousands of pages. The batch API automatically implements exponential backoff and retry logic internally. If an individual URL fails after exhausting all retries, the webhook payload will include detailed error metadata, allowing your dead-letter queue to log the failure for manual review without halting the broader batch process.

By utilizing webhooks, your backend system receives a POST request containing the structured JSON payload as soon as each extraction finishes. This event-driven architecture scales horizontally. As your extraction volume grows, you simply spin up more webhook handlers to process the incoming JSON payloads and write them to your data warehouse. You only pay for successful extractions, allowing your pipeline costs to scale linearly with your data acquisition. Review the AlterLab pricing to model infrastructure costs for large-scale async pipelines.

Key takeaways

To build resilient, scalable systems that interact with jobs data api endpoints, engineering teams must move away from imperative DOM parsing and CSS selectors.

  1. Adopt Declarative Extraction: Define your exact data requirements using standard JSON Schema.
  2. Abstract the Infrastructure: Delegate the execution, rendering, and parsing layers to an LLM-backed data API.
  3. Design for Scale: Manage high-throughput workloads via asynchronous batching and webhook deliveries.

Implementing this schema-driven approach minimizes infrastructure maintenance overhead and guarantees type-safe data ingestion for your enterprise analytics and AI applications.

Top comments (0)