---
title: "Fetch job application data from SmartRecruiters ATS API"
description: "A go-to guide to fetching job application data from the SmartRecruiters ATS API. Includes prerequisites, key API endpoints, Python examples, common pitfalls, FAQs, and how Knit simplifies SmartRecruiters integrations."
source_url: "https://www.getknit.dev/blog/fetch-job-application-data-from-smartrecruiters-ats-api"
page_type: "blog"
---

_This is an educational blog post from Knit's blog: “Fetch job application data from SmartRecruiters ATS API”._

# Fetch job application data from SmartRecruiters ATS API

## **Introduction**

SmartRecruiters is widely adopted for modern talent acquisition, but pulling structured, reliable job application data from its API can still be a bottleneck for engineering and operations teams. This guide breaks down the exact workflow for retrieving candidate and application records from the [SmartRecruiters ATS API](https://www.getknit.dev/integration/smartrecruiters), without the clutter.  

It’s part of our broader ATS API deep-dive series, which unpacks authentication, rate limits, pagination models, and end-to-end integration strategies. If you want the full ecosystem-level overview, you can explore the main guide [here](https://www.getknit.dev/blog/ats-integration-guide).

### **Prerequisites**

*   SmartRecruiters API access with valid credentials
*   A Python environment with the `requests` library installed

### **Key API Endpoints**

*   **List all candidates:**  
    `GET https://api.smartrecruiters.com/candidates`
*   **Get a candidate’s job application:**  
    `GET https://api.smartrecruiters.com/candidates/{id}/jobs/{jobId}`

### **1\. Fetch All Candidates**

```
import requests

headers = {'accept': 'application/json'}
params = {'limit': 10}

response = requests.get(
    'https://api.smartrecruiters.com/candidates',
    headers=headers,
    params=params
)

if response.status_code == 200:
    candidates = response.json()['content']
    for c in candidates:
        print(c['id'], c['firstName'], c['lastName'])
```

### **2\. Fetch a Candidate’s Application for a Specific Job**

```
candidate_id = 'candidate_id_here'
job_id = 'job_id_here'

response = requests.get(
    f'https://api.smartrecruiters.com/candidates/{candidate_id}/jobs/{job_id}',
    headers=headers
)

if response.status_code == 200:
    application_details = response.json()
    print(application_details)
```

## **Common Pitfalls to Avoid**

Teams often underestimate SmartRecruiters’ API nuances. These issues show up repeatedly:

1.  Skipping pagination and assuming a single response contains the full dataset
2.  Ignoring rate-limit headers, leading to throttling and temporary API locks
3.  Using stale or incorrect candidate/job IDs
4.  Not validating non-200 status codes before parsing data
5.  Allowing API credentials to remain hardcoded or unrotated
6.  Assuming older field names are still supported (SmartRecruiters retires fields frequently)
7.  Pulling large datasets without batching, risking timeouts and inconsistent reads
8.  Overlooking network-level failures in production environments

## **Frequently Asked Questions**

**1\. What’s the maximum number of candidates per request?**  
Up to 100 records.

**2\. How do I paginate candidate results?**  
Use the `nextPageId` field from the API response to fetch subsequent pages.

**3\. What does a 403 error typically indicate?**  
Insufficient permissions or incorrect credentials.

**4\. Can I filter candidates by geo-location?**  
Yes, SmartRecruiters supports filtering via the `location` parameter.

**5\. Can I fetch candidates by status (e.g., NEW, IN\_REVIEW)?**  
Yes, via the `status` query parameter.

**6\. How often should API credentials be rotated?**  
Follow your org’s security policy, typically every 60–90 days.

**7\. What date format does SmartRecruiters use?**  
ISO 8601 (e.g., `2024-01-01T12:45:00Z`).

## **How Knit Simplifies SmartRecruiters Integrations**

Instead of building and maintaining a custom [SmartRecruiters ATS API](https://www.getknit.dev/integration/smartrecruiters) integration stack, you can plug into Knit once and unlock a fully managed connector. Knit handles the authentication lifecycle, rate-limit management, schema normalization, monitoring, and ongoing API maintenance, freeing up engineering cycles and reducing integration risk.


## Related pages

- [How Knit works](https://md.getknit.dev/how-knit-works)
- [Unified API product](https://md.getknit.dev/products/unified-api)
