Indeed Job Search
Indeed scraping API alternative
Search Indeed job listings as structured JSON
Use the Indeed Jobs API when you need a maintained alternative to a custom Indeed scraper or the deprecated Publisher API, with filters for keyword, location, country, radius, job type, sort order, and pagination.
Search Indeed job listings with Scrappa when you need an Indeed job search API alternative to 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 data in 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.
Indeed Publisher API alternative
The official Indeed Publisher API is deprecated and historically required a publisher relationship. Scrappa provides a direct API-key workflow instead: sign up, send a GET request to /api/indeed/jobs, and receive JSON responses that can be processed by your application.
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.
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
{
"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 Publisher API alternatives.
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.