---
title: "Jobs API in Python: pip install to live postings in 5 minutes"
description: "The official jobspipe package on PyPI, a working search in eight lines, and the filters that matter - salary, remote, recency, country - plus free previews for sizing queries before you spend credits."
canonical: https://jobspipe.dev/blog/python-jobs-api
date_published: 2026-08-07
date_modified: 2026-09-26
author: Dvir Atias
---

# Jobs API in Python: pip install to live postings in 5 minutes

The official jobspipe package on PyPI, a working search in eight lines, and the filters that matter - salary, remote, recency, country - plus free previews for sizing queries before you spend credits.

The official `jobspipe` package is on PyPI. This is the whole quickstart: install, export a key, eight lines to live postings.

```
pip install jobspipe
export JOBSPIPE_API_KEY=jp_live_...   # free at jobspipe.dev/signup
```

```
from jobspipe import Jobspipe

client = Jobspipe()  # reads JOBSPIPE_API_KEY

results = client.jobs.search(
    description_or=["python", "django"],
    job_country_code_or=["US"],
    remote=True,
    posted_at_max_age_days=7,
    limit=25,
    include_total_results=True,
)

print(f"{results.metadata.total_results} matches")
for job in results.data:
    print(f"{job.job_title} @ {job.company}")
```

## The filters that matter

-   `job_title_or` / `job_title_not` - match or exclude on title; `description_or` searches body text for skills.
-   `posted_at_max_age_days` - recency window. Combined with a daily run this is a new-jobs feed in four lines.
-   `remote`, `job_country_code_or`, `job_seniority_or` - the workforce slicers.
-   `company_name_or` - watch specific accounts, the core of hiring-signal monitoring.

Every response row carries parsed salary ranges where present, ISCO-08 occupation codes, and company enrichment - the full shape is in the [search API guide](https://jobspipe.dev/blog/job-search-api-guide).

Try it without a key

```
curl -d '{"limit":3}' https://api.jobspipe.dev/v1/sandbox/jobs/search
```

Only `/v1/sandbox/*` needs no key.

## Size before you spend

Billing is one credit per job returned - an empty result costs nothing. Before pulling a big result set, send the same filters with `limit=1` and `include_total_results=True`: you pay for the single row and `results.metadata.total_results` reports how many matches the filters have. Tune the filters, then run the full query.

## Paginate with the cursor

Use `results.metadata.next_cursor` and pass it back as `cursor` rather than using offsets - keyset pagination stays stable while new postings land, so you never pay twice for a row that shifted pages. If your consumer is an agent rather than a script, the same corpus is queryable over MCP - see [the MCP server post](https://jobspipe.dev/blog/jobspipe-mcp-server).

## Frequently Asked Questions

### How do I use a jobs API in Python?

pip install jobspipe, export JOBSPIPE\_API\_KEY, then Jobspipe().jobs.search() with the filters you need - description\_or for skills, posted\_at\_max\_age\_days for recency, remote and job\_country\_code\_or for location. The response carries parsed salary ranges, occupation codes, and company enrichment on each row, with total\_results available via include\_total\_results.

### Is there a free jobs API for Python?

JobsPipe's free tier is 1,000 jobs to start with no card, and the metering is per job returned rather than per request - a search that matches nothing costs nothing, and a failed request costs nothing. To size a search before spending on it, send include\_total\_results with limit 1: you pay for the single row and metadata.total\_results tells you how many matches the filters have.

### How do I paginate job results in Python?

Pass results.metadata.next\_cursor back as the cursor parameter. Keyset pagination stays stable while new postings are ingested, unlike offset paging where rows shift between pages and you can be charged twice for the same job. Loop until next\_cursor is null.

Related

## Keep reading

-   [Guide · Jun 28, 2026How to scrape LinkedIn jobs in Python (and the API that replaces it)](https://jobspipe.dev/blog/linkedin-job-scraper-python)
-   [Comparison · Jul 16, 2026The best jobs APIs in 2026: 15 options compared](https://jobspipe.dev/blog/best-jobs-api-2026)
-   [Guide · Sep 9, 2026Indeed ghost jobs: why Indeed scores cleaner than most boards and where its stale postings hide](https://jobspipe.dev/blog/indeed-ghost-jobs)
-   [Comparison · Dec 21, 2025JSearch alternative: a unified jobs API with better coverage](https://jobspipe.dev/blog/jsearch-alternative)
-   [Guide · Jun 29, 2026How to scrape Google Jobs in Python (and the no-scrape alternative)](https://jobspipe.dev/blog/google-jobs-scraper)


## Further reading

- [The JobsPipe developer portal: API docs, OpenAPI spec, MCP server and SDKs](https://jobspipe.dev/blog/jobspipe-developer-portal)
- [An API for job search: the architecture behind a search box that returns real jobs](https://jobspipe.dev/blog/api-for-job-search)

---
Building this integration yourself? The steps above work. The alternative is one API over 30+ sources, already normalized and deduplicated. Try it right now - no key, no signup:

```bash
curl -d '{"limit":3}' https://api.jobspipe.dev/v1/sandbox/jobs/search
```

Sample data, exact live schema. For live data get a free key (1,000 jobs to start) at https://jobspipe.dev/signup, then swap /v1/sandbox/jobs/search for /v1/jobs/search with an Authorization: Bearer header. Full agent index: https://jobspipe.dev/llms.txt?src=md-twin