Indeed Jobs API
Indeed scraping API alternative
Use Scrappa as an Indeed API alternative for job listings
This page is for developers searching for an Indeed API alternative, Indeed job search API documentation, or a maintained replacement for the deprecated Publisher API. Query Indeed listings by keyword, location, country, radius, job type, sort order, and pagination cursor, then receive normalized JSON.
Search Indeed job listings with Scrappa when you need an Indeed API alternative for job search data or a maintained replacement for the deprecated official Indeed Publisher API. Scrappa is not affiliated with or endorsed by Indeed, and this endpoint is not an official Indeed API. It returns structured job listing data as JSON for developer workflows.
When to use this Indeed jobs API
Use this endpoint when you need to search Indeed by keyword, location, country, radius, job type, sort order, and cursor pagination without maintaining a custom Indeed scraper. It is built for job board aggregation, recruiting intelligence, labor market analytics, salary research, and monitoring new postings across cities or countries.
Each response includes normalized job listing fields such as title, company, location, salary when available, posting date, apply URL, pagination metadata, and source metadata. That makes it easier to load Indeed results into a database, workflow automation, applicant tracking process, or analytics pipeline.
How to use Scrappa as an Indeed API alternative
The official Indeed Publisher API is deprecated and historically required a publisher relationship. Scrappa provides a direct API-key workflow instead: create a Scrappa account, send a GET request to /api/indeed/jobs, and receive JSON responses that can be processed by your application. Use the authentication docs when adding the x-api-key header, or test the endpoint first in the API playground.
What the Indeed jobs response returns
The endpoint is designed for applications that need records instead of raw search-result HTML. Use query and location for the core search, add country, hl, and gl for localized results, then paginate with cursor when a workflow needs more listings. Store the normalized company, location, salary, apply URL, and pagination fields directly in your job board, recruiting database, saved-search alert, or labor-market analysis pipeline.
For broader job search coverage, compare this page with the Google Jobs API documentation, which aggregates job listings from many sources, and the LinkedIn Jobs Search API documentation, which focuses on public LinkedIn job pages. The Indeed Jobs API overview explains use cases, pricing, and related job data endpoints.
Example workflows
- Build a job board that searches Indeed listings by role and location.
- Track competitor hiring by monitoring company names and target keywords.
- Collect salary ranges and location patterns for compensation research.
- Enrich recruiting dashboards with fresh job listing data and apply URLs.
- Compare Indeed results with Google Jobs and LinkedIn Jobs coverage.
Implementation playbook
What teams build with this endpoint
Job board aggregation
Search Indeed by role, city, country, and job type, then store normalized titles, companies, locations, apply URLs, and pagination cursors alongside other job data sources.
Recruiting intelligence
Monitor competitor hiring, location demand, and fresh postings by running repeatable Indeed searches without maintaining a browser scraper or Publisher API integration.
Salary and market research
Collect salary fields when available, combine them with company and location metadata, and feed compensation dashboards, saved searches, or labor-market analytics.
Run this endpoint
Endpoint
https://scrappa.co/api/indeed/jobs?query=software+engineer&location=Berlin&country=DE&job_type=full_time&limit=20
https://scrappa.co/api/indeed/jobs?query=software+engineer&location=Berlin&country=DE&job_type=full_time&limit=20
x-api-key
query
= software engineer
{
"success": true,
"data": {
"jobs": [
{
"id": "a1b2c3d4e5f6",
"title": "Senior Software Engineer",
"company": {
"name": "TechCorp Inc.",
"logo": "https://d2q79iu7y748jz.cloudfront.net/s/_squarelogo/128x128/techcorp.png",
"website": "https://www.techcorp.com"
},
"location": {
"city": "San Francisco",
...
Parameters
Start with the required fields, then add optional filters only when your use case needs them.
Runnable path
1 required parameter needed before sending a request.
10 optional filters available.
string
Required
Job search query
software engineer
string
Optional
Location for job search
Berlin
string
Optional
2-letter country code (e.g., US, UK, DE)
DE
integer
Optional
Search radius (0-100)
10
string
Optional
Radius unit (MILES or KILOMETERS)
example
string
Optional
Job type (full_time, part_time, contract, internship, remote)
full_time
string
Optional
Sort order (relevance or date)
relevance
integer
Optional
Results per page (1-100)
20
string
Optional
Pagination cursor from previous response
0
string
Optional
Interface language for results. 2-letter language code (e.g., en, de, fr, es). Default: en
en
string
Optional
Geolocation/country for localized results. 2-letter country code (e.g., US, DE, GB, FR). Default: US
us
Request Examples
<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://scrappa.co/api/indeed/jobs?query=software+engineer&location=Berlin&country=DE&job_type=full_time&limit=20",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"x-api-key: YOUR_API_KEY_HERE"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}
<?php
use Illuminate\Support\Facades\Http;
$response = Http::timeout(30)
->withHeaders(['x-api-key' => 'YOUR_API_KEY_HERE'])
->get('https://scrappa.co/api/indeed/jobs?query=software+engineer&location=Berlin&country=DE&job_type=full_time&limit=20');
if ($response->successful()) {
echo $response->body();
} else {
echo "Error: " . $response->status();
}
const options = {
method: 'GET',
headers: {
'x-api-key': 'YOUR_API_KEY_HERE'
}
};
fetch('https://scrappa.co/api/indeed/jobs?query=software+engineer&location=Berlin&country=DE&job_type=full_time&limit=20', options)
.then(response => {
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
return response.text();
})
.then(data => console.log(data))
.catch(error => console.error('Error:', error));
const axios = require('axios');
const options = {
method: 'GET',
url: 'https://scrappa.co/api/indeed/jobs?query=software+engineer&location=Berlin&country=DE&job_type=full_time&limit=20',
headers: {
x-api-key: 'YOUR_API_KEY_HERE',
}
};
try {
const response = await axios(options);
console.log(response.data);
} catch (error) {
console.error('Error:', error.message);
}
require 'net/http'
require 'uri'
uri = URI.parse("https://scrappa.co/api/indeed/jobs?query=software+engineer&location=Berlin&country=DE&job_type=full_time&limit=20")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = uri.scheme == 'https'
request = Net::HTTP::Get.new(uri.request_uri)
request['x-api-key'] = 'YOUR_API_KEY_HERE'
begin
response = http.request(request)
puts response.body
rescue => e
puts "Error: #{e.message}"
end
import http.client
import json
conn = http.client.HTTPSConnection("scrappa.co")
headers = {
'x-api-key': 'YOUR_API_KEY_HERE',
}
try:
conn.request("GET", "/api/indeed/jobs?query=software+engineer&location=Berlin&country=DE&job_type=full_time&limit=20", headers=headers)
res = conn.getresponse()
data = res.read()
print(data.decode("utf-8"))
except Exception as e:
print(f"Error: {e}")
finally:
conn.close()
import requests
headers = {
'x-api-key': 'YOUR_API_KEY_HERE',
}
try:
response = requests.get('https://scrappa.co/api/indeed/jobs?query=software+engineer&location=Berlin&country=DE&job_type=full_time&limit=20', headers=headers)
response.raise_for_status()
print(response.text)
except requests.exceptions.RequestException as e:
print(f"Error: {e}")
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import java.io.IOException;
public class ApiExample {
public static void main(String[] args) {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://scrappa.co/api/indeed/jobs?query=software+engineer&location=Berlin&country=DE&job_type=full_time&limit=20")
.addHeader("x-api-key", "YOUR_API_KEY_HERE")
.build();
try (Response response = client.newCall(request).execute()) {
if (response.isSuccessful()) {
System.out.println(response.body().string());
} else {
System.out.println("Error: " + response.code());
}
} catch (IOException e) {
System.out.println("Error: " + e.getMessage());
}
}
}
package main
import (
"fmt"
"net/http"
"io/ioutil"
)
func main() {
client := &http.Client{}
req, err := http.NewRequest("GET", "https://scrappa.co/api/indeed/jobs?query=software+engineer&location=Berlin&country=DE&job_type=full_time&limit=20", nil)
if err != nil {
fmt.Println("Error creating request:", err)
return
}
req.Header.Set("x-api-key", "YOUR_API_KEY_HERE")
resp, err := client.Do(req)
if err != nil {
fmt.Println("Error making request:", err)
return
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println("Error reading response:", err)
return
}
fmt.Println(string(body))
}
#!/bin/bash
curl -X GET \
-H "x-api-key: YOUR_API_KEY_HERE" \
"https://scrappa.co/api/indeed/jobs?query=software+engineer&location=Berlin&country=DE&job_type=full_time&limit=20"
using System;
using System.Net.Http;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
using var client = new HttpClient();
client.DefaultRequestHeaders.Add("x-api-key", "YOUR_API_KEY_HERE");
try
{
var response = await client.SendAsync(new HttpRequestMessage(HttpMethod.Get, "https://scrappa.co/api/indeed/jobs?query=software+engineer&location=Berlin&country=DE&job_type=full_time&limit=20"));
var content = await response.Content.ReadAsStringAsync();
Console.WriteLine(content);
}
catch (Exception ex)
{
Console.WriteLine($"Error: {ex.Message}");
}
}
}
import axios from 'axios';
async function run(): Promise<void> {
try {
const response = await axios({
method: 'GET',
url: 'https://scrappa.co/api/indeed/jobs?query=software+engineer&location=Berlin&country=DE&job_type=full_time&limit=20',
headers: {
'x-api-key': 'YOUR_API_KEY_HERE',
},
});
console.log(response.data);
} catch (error) {
console.error('Error:', error);
}
}
void run();
use reqwest::Client;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = Client::new();
let response = client
.get("https://scrappa.co/api/indeed/jobs?query=software+engineer&location=Berlin&country=DE&job_type=full_time&limit=20")
.header("x-api-key", "YOUR_API_KEY_HERE")
.send()
.await?;
println!("{}", response.text().await?);
Ok(())
}
Response Schema
Example response fields are illustrative; inspect the JSON before integrating.
Example response fields
Scan these fields before integrating.
success
data
{
"success": true,
"data": {
"jobs": [
{
"id": "a1b2c3d4e5f6",
"title": "Senior Software Engineer",
"company": {
"name": "TechCorp Inc.",
"logo": "https://d2q79iu7y748jz.cloudfront.net/s/_squarelogo/128x128/techcorp.png",
"website": "https://www.techcorp.com"
},
"location": {
"city": "San Francisco",
"state": "CA",
"country": "US",
"formatted": "San Francisco, CA",
"is_remote": false
},
"date_published": "2026-02-01 10:30:00",
"apply_url": "https://www.indeed.com/viewjob?jk=a1b2c3d4e5f6"
}
],
"pagination": {
"next_cursor": "eyJwYWdlIjoxfQ==",
"has_more": true
},
"metadata": {
"total_results": 20,
"timestamp": "2026-02-03T00:00:00Z"
}
}
}
Generate Code with AI
Copy a ready-made prompt with all the endpoint details, parameters, and example responses. Paste it into ChatGPT, Claude, or any AI assistant to instantly generate working code.
Indeed Jobs API FAQ
Answers for developers looking for Indeed job search API documentation and teams evaluating Indeed API alternatives.
Is Scrappa an Indeed API alternative?
Yes. Scrappa is an unofficial Indeed API alternative for teams that need job listing search results as JSON. It is useful when the deprecated Publisher API is unavailable or when you want API-key authentication without an affiliate approval process.
Is this an official Indeed API?
No. Scrappa is not affiliated with or endorsed by Indeed. The endpoint is an unofficial API that returns structured Indeed job listing data for developer workflows.
Can I use this instead of the deprecated Indeed Publisher API?
Yes. Scrappa is designed as an API-key based alternative for teams that need Indeed job search data without a Publisher API account or affiliate approval process.
What filters does the Indeed Jobs API support?
The endpoint supports query, location, country, radius, radius unit, job type, sort order, limit, pagination cursor, interface language, and geolocation parameters.
When should I use Google Jobs or LinkedIn Jobs instead?
Use Google Jobs when you want aggregated listings from multiple job sources, and use LinkedIn Jobs Search when public LinkedIn job pages are the primary source you need to monitor.
Related job API docs
Indeed Jobs API overview
Compare Indeed job search use cases, pricing, filters, and endpoint coverage.