---
title: "How to fetch job application data from ADP Workforce Now ATS API"
description: "A ready to use guide to retrieving job application data from the ADP Workforce Now ATS API. Covers prerequisites, key endpoints, OAuth setup, code examples, common pitfalls, and FAQs. Ideal for developers integrating ADP ATS data into their HR workflows."
source_url: "https://www.getknit.dev/blog/how-to-fetch-job-application-data-from-adp-workforce-now-ats-api"
page_type: "blog"
---

_This is an educational blog post from Knit's blog: “How to fetch job application data from ADP Workforce Now ATS API”._

# How to fetch job application data from ADP Workforce Now ATS API

## **Introduction**

If you're building hiring workflows, analytics dashboards, or HR automations, pulling data directly from the [ADP Workforce Now ATS API](https://developers.getknit.dev/docs/adp-workforcenow-ats-usecases) is a non-negotiable capability. This guide cuts past the fluff and gets straight to how you can fetch job application data reliably, securely, and at scale.

This article is part of a broader series on the ATS API, including deep dives on authentication, rate limits, pagination, and best practices. You can explore the complete guide [here](https://www.getknit.dev/blog/ats-integration-guide).

## **Prerequisites**

Before you start calling the API, make sure you have:

*   Valid OAuth 2.0 credentials (Client ID + Client Secret)
*   Understanding of REST and JSON structures
*   A Python environment with `requests` installed

## **Useful Endpoints**

*   Get all job applications → `/staffing/v2/job-applications`
*   Get a specific application → `/staffing/v2/job-applications/{job-application-id}`

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

```
import requests

def get_oauth_token(client_id, client_secret):
    url = 'https://auth.adp.com/oauth/v2/token'
    headers = {'Content-Type': 'application/x-www-form-urlencoded'}
    data = {'grant_type': 'client_credentials'}
    response = requests.post(url, headers=headers, data=data, auth=(client_id, client_secret))
    return response.json().get('access_token')
```

### **2\. Fetch All Job Applications**

```
def get_all_job_applications(token):
    url = 'https://api.adp.com/staffing/v2/job-applications'
    headers = {
        'Authorization': f'Bearer {token}',
        'Content-Type': 'application/json',
        'roleCode': 'practitioner'
    }
    params = {'$select': 'itemID,jobRequisitionReference,applicationStatusCode'}
    response = requests.get(url, headers=headers, params=params)
    return response.json()
```

### **3\. Fetch a Single Job Application**

```
def get_job_application(token, job_application_id):
    url = f'https://api.adp.com/staffing/v2/job-applications/{job_application_id}'
    headers = {
        'Authorization': f'Bearer {token}',
        'Content-Type': 'application/json',
        'roleCode': 'practitioner'
    }
    response = requests.get(url, headers=headers)
    return response.json()
```

## **Common Pitfalls**

Developers integrating [ADP Workforce Now](https://md.getknit.dev/integration/adp-workforce-now-hris) often trip over the same issues. Keep these in check:

**1\. Token expiry sneaking up on you**  
ADP tokens expire quickly; build auto-refresh into your workflow.

**2\. Missing or incorrect `roleCode`**  
This header is mandatory and impacts what data you can see.

**3\. Pagination confusion**  
ADP won’t return everything in one shot, use `$top` and `$skip`.

**4\. Throttling during bulk fetches**  
ADP rate limits aggressively. Queue/batch your requests.

**5\. Complex nested JSON**  
Prepare to map multi-level objects; flattening the response helps.

**6\. Environment mismatches**  
ADP sandbox and production behave differently, test both.

**7\. Silent permission failures**  
Sometimes the API returns fewer fields simply because your role doesn’t have access.

## **FAQs**

**1\. Why do I need the `roleCode` header?**  
It determines your access level and controls which data fields ADP exposes.

**2\. Can I filter the job applications?**  
Yes. Use `$filter`, `$select`, `$orderby`, and other OData-style parameters.

**3\. What format does the API return?**  
All responses are JSON, often with deeply nested structures.

**4\. Is there a limit on how many applications I can fetch at once?**  
Yes. Use `$top` for batch size and `$skip` for pagination.

**5\. How do I handle ADP rate limits?**  
Implement retries with exponential backoff and stagger API calls.

**6\. Does ADP provide historical application data?**  
Only if your org's data retention settings allow it.

**7\. How do I debug API errors more effectively?**  
Check status codes, error objects, and verify your scopes + permissions.

## **Knit: Faster ADP Workforce Now ATS Integration**

Connecting directly to [ADP Workforce Now ATS API](https://www.getknit.dev/integration/adp-workforce-now-ats) often becomes a maintenance-heavy project, OAuth rotation, permission handling, schema changes, and rate limits add real engineering drag. Knit removes this overhead. A single integration gives you:

*   Clean, unified [ADP Workforce Now](https://md.getknit.dev/integration/adp-workforce-now-hris) ATS data
*   Automated token refresh + authentication
*   Continuous schema maintenance
*   Built-in monitoring and retries
*   Zero upkeep on your side


## Related pages

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