Skip to content
Scrappa Get API key

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

Indeed Jobs API 1 credit/request

Endpoint

GET https://scrappa.co/api/indeed/jobs?query=software+engineer&location=Berlin&country=DE&job_type=full_time&limit=20
Request preview GET
https://scrappa.co/api/indeed/jobs?query=software+engineer&location=Berlin&country=DE&job_type=full_time&limit=20
Auth header x-api-key
Cost 1 credit/request
query = software engineer
Response preview 200 OK
{
    "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.

query string Required

Job search query

Example value software engineer
location string Optional

Location for job search

Example value Berlin
country string Optional

2-letter country code (e.g., US, UK, DE)

Example value DE
radius integer Optional

Search radius (0-100)

Example value 10
radius_unit string Optional

Radius unit (MILES or KILOMETERS)

Example value example
job_type string Optional

Job type (full_time, part_time, contract, internship, remote)

Example value full_time
sort string Optional

Sort order (relevance or date)

Example value relevance
limit integer Optional

Results per page (1-100)

Example value 20
cursor string Optional

Pagination cursor from previous response

Example value 0
hl string Optional

Interface language for results. 2-letter language code (e.g., en, de, fr, es). Default: en

Example value en
gl string Optional

Geolocation/country for localized results. 2-letter country code (e.g., US, DE, GB, FR). Default: US

Example value 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
JSON Response
200 OK
{
    "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.

Try It Live

Test this endpoint in our interactive playground with real data.