---
title: "Developer guide to get job application data from Teamtailor ATS API"
description: "Learn how to retrieve job application data using the Teamtailor ATS API. This guide covers required endpoints, Python examples, common pitfalls, FAQs, and integration best practices."
source_url: "https://www.getknit.dev/blog/developer-guide-to-get-job-application-data-from-teamtailor-ats-api"
page_type: "blog"
---

_This is an educational blog post from Knit's blog: “Developer guide to get job application data from Teamtailor ATS API”._

# Developer guide to get job application data from Teamtailor ATS API

## Introduction

This article is part of an ongoing series that covers the **Teamtailor API** in depth. The focus here is narrow and practical: how to retrieve **job application data** using the Teamtailor ATS API.

If you are building integrations for recruiting analytics, internal dashboards, or downstream HR systems, job application data is the operational backbone. This guide walks through the exact endpoints and steps required to fetch candidate and application data reliably.

For a broader overview of the Teamtailor API, including authentication, rate limits, and overall API structure, refer to the full guide [here.](https://www.getknit.dev/blog/teamtailor-api-directory-YZ2QuV)

### Prerequisites

Before making API calls, ensure the following are in place:

*   A valid **Teamtailor API key** with permissions to access candidates and job applications.
*   Basic familiarity with making HTTP requests using Python.
*   The `requests` library installed in your Python environment.

### API Endpoints

*   **List Candidates**  
    `GET https://api.teamtailor.com/v1/candidates`
*   **List Job Applications**  
    `GET https://api.teamtailor.com/v1/job-applications`

#### Step 1: Fetch Candidate Data

```
import requests

headers = {
    'Authorization': 'Token token=YOUR_API_KEY',
    'X-Api-Version': '20240404'
}

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

if response.status_code == 200:
    candidates = response.json()['data']
else:
    print('Failed to fetch candidates', response.status_code)
```

#### Step 2: Fetch Job Application Data for All Candidates

```
response = requests.get(
    'https://api.teamtailor.com/v1/job-applications',
    headers=headers
)

if response.status_code == 200:
    job_applications = response.json()['data']
else:
    print('Failed to fetch job applications', response.status_code)
```

#### Step 3: Fetch Job Application Data for a Specific Candidate

```
candidate_id = 'SPECIFIC_CANDIDATE_ID'
url = f'https://api.teamtailor.com/v1/candidates/{candidate_id}/job-applications'

response = requests.get(url, headers=headers)

if response.status_code == 200:
    specific_candidate_applications = response.json()['data']
else:
    print('Failed to fetch job applications for candidate', response.status_code)
```

## Common Pitfalls

Teams typically run into issues not because the API is complex, but because basics are overlooked. Watch out for the following:

1.  Missing or incorrect `X-Api-Version` in request headers.
2.  Forgetting to replace `YOUR_API_KEY` with a valid API key.
3.  Ignoring pagination when working with large candidate or application volumes.
4.  Exceeding rate limits due to unthrottled requests.
5.  Not validating HTTP response codes before parsing data.
6.  Assuming every candidate has at least one job application.
7.  Hard-coding API keys instead of securing them externally.

## Frequently Asked Questions

1.  **What is the rate limit for the Teamtailor API?**  
    Rate limits are defined by Teamtailor and can vary. Refer to the official API documentation or contact Teamtailor support for exact limits.
2.  **How is pagination handled in Teamtailor API responses?**  
    Pagination details are included in the `links` object of the response. Use these links to fetch subsequent pages.
3.  **Can job applications be filtered by stage?**  
    Yes. Use query parameters such as `filter[stage-type]` when calling the job applications endpoint.
4.  **What information is returned in a job application object?**  
    Job application responses include metadata such as `created-at`, `updated-at`, and relationships to candidates and jobs.
5.  **Can job applications be updated via the API?**  
    Yes, provided your API key has the required permissions. Updates are performed using the appropriate `PATCH` endpoints.
6.  **Is a sandbox or test environment available?**  
    Sandbox availability depends on your Teamtailor plan. Contact Teamtailor support for confirmation.
7.  **What is the recommended way to store the API key?**  
    Store API keys in environment variables or a secure secrets manager. Never commit them directly to source code.

## Knit for Teamtailor ATS API Integration

If you want to avoid managing authentication, versioning, and long-term maintenance yourself, **Knit** provides a streamlined alternative.

By integrating with [Knit](https://www.getknit.dev/integration/teamtailor) once, you gain consistent access to the Teamtailor API without handling token management or endpoint upkeep. Knit abstracts the operational complexity while ensuring stable and reliable data access across your integrations.


## Related pages

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