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, 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.

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}

Step-by-Step Process

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 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.

#1 in Ease of Integrations

Trusted by businesses to streamline and simplify integrations seamlessly with GetKnit.