---
title: "How to fetch job application data from SAP SuccessFactors ATS API using Python"
description: "A hands-on guide to fetching job application data from the SAP SuccessFactors API, including prerequisites, endpoints, Python examples, common pitfalls, FAQs, and how to simplify integration using Knit."
source_url: "https://www.getknit.dev/blog/how-to-fetch-job-application-data-from-sap-successfactors-ats-api-using-python"
page_type: "blog"
---

_This is an educational blog post from Knit's blog: “How to fetch job application data from SAP SuccessFactors ATS API using Python”._

# How to fetch job application data from SAP SuccessFactors ATS API using Python

## **Introduction**

[SAP SuccessFactors](https://md.getknit.dev/mcp-servers/sap-successfactors-mcp-server) is very popular in enterprise HR stacks, but its APIs can feel unintuitive if you're pulling structured recruiting data at scale. This guide cuts through that friction. It’s part of our broader deep-dive series on ATS APIs, where we break down authentication, rate limits, payload structures, and common integration hurdles. If you want the full ATS API guide, you’ll find it [here](https://www.getknit.dev/blog/ats-integration-guide).

Here, we focus specifically on how to extract job application data, cleanly, consistently, from [SAP SuccessFactors ATS API](https://developers.getknit.dev/docs/successfactors-ats-usecases).

### **Prerequisites**

Before you get started, lock in the basics:

*   Valid [SAP SuccessFactors](https://md.getknit.dev/mcp-servers/sap-successfactors-mcp-server) API access and permissions
*   Client ID and Client Secret
*   Python environment with `requests` installed

### **Key API Endpoints**

*   OAuth Token: `/oauth/token`
*   Job Applications: `/odata/v2/JobApplication`

### **1\. Generate an OAuth Token**

```
import requests

client_id = 'your_client_id'
client_secret = 'your_client_secret'
auth_url = 'https://api.successfactors.com/oauth/token'

auth_response = requests.post(
    auth_url,
    data={'grant_type': 'client_credentials'},
    auth=(client_id, client_secret)
)

access_token = auth_response.json().get('access_token')
```

### **2\. Fetch Job Application Data for One Candidate**

```
candidate_id = 'specific_candidate_id'
job_application_url = f'https://api.successfactors.com/odata/v2/JobApplication?$filter=candidateId eq {candidate_id}'

headers = {'Authorization': f'Bearer {access_token}'}
response = requests.get(job_application_url, headers=headers)

job_application_data = response.json()
```

### **3\. Fetch Job Application Data for All Candidates**

```
job_application_url_all = 'https://api.successfactors.com/odata/v2/JobApplication'
response_all = requests.get(job_application_url_all, headers=headers)

all_job_applications = response_all.json()
```

## **Common Pitfalls (and How to Avoid Them)**

1.  **Auth token failures**  
    Usually caused by incorrect Client ID/Secret or an expired token. Tokens expire faster than most teams expect, refresh aggressively.
2.  **Under-scoped API permissions**  
    SuccessFactors is strict. If you don’t have granular permissions, your calls will fail even with a valid token.
3.  **Incorrect base URL or endpoint paths**  
    One wrong region or environment (prod, preview, sandbox) = instant 404.
4.  **Ignoring pagination**  
    SuccessFactors returns limited rows per page. If you’re not paginating, you’re only seeing a fraction of your data.
5.  **JSON parsing issues**  
    Nested fields in OData responses can break naive scripts. Validate before processing.
6.  **Rate-limit throttling**  
    SAP doesn’t always declare limits cleanly. Add backoff logic to avoid silent failures.
7.  **Mismatched filtering syntax**  
    OData filters (`$filter`) are unforgiving, typos cause empty payloads instead of errors.

## **Frequently Asked Questions**

**1\. How do I get my Client ID and Secret?**  
Your SAP SuccessFactors admin must provision them from the OAuth client configuration panel.

**2\. Why am I getting a 401?**  
Your token is invalid or expired. Regenerate and ensure you're passing the Authorization header correctly.

**3\. Can I filter job applications by status or other fields?**  
Yes. SuccessFactors supports OData filters, e.g.,  
`$filter=applicationStatus eq 'IN_PROGRESS'`.

**4\. How long does the OAuth token stay valid?**  
Depends on your tenant configuration. Always check `expires_in` and refresh proactively.

**5\. Is there a limit on how many applications I can fetch?**  
Yes, pagination applies. Use `$top`, `$skip`, and `nextLink`.

**6\. What format should I expect in the response?**  
JSON (OData v2 format), often deeply nested.

**7\. How do I handle rate limits?**  
Implement exponential backoff and log all throttling events.

## **Knit for SAP SuccessFactors API Integration**

If you want the fast lane, Knit abstracts the heavy lifting. One integration gives you clean, normalized SuccessFactors data, without wrestling with auth flows, token refresh cycles, endpoint nuances, or ongoing maintenance. You plug in once with Knit's [SAP SuccessFactors ATS API](https://www.getknit.dev/integration/sap-successfactors-ats); and Knit handles the plumbing, monitoring, and updates across the entire lifecycle.


## Related pages

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