Introduction
If you're building HR workflows, scaling recruiting ops, or stitching together multiple ATS systems, BambooHR’s ATS API is a solid lever to pull. This guide distills the exact process for fetching job application data, without wading through generic documentation.
It’s part of a broader deep-dive series on the comprehensive ATS API covering authentication flows, rate-limit behavior, and real-world integration patterns. If you want the full ecosystem view, the master guide is available on the Knit blog.
Prerequisites
Before you start calling the API, make sure you’ve locked in the basics:
- Active BambooHR API credentials
- API access enabled for your BambooHR account
- Comfort with REST APIs and JSON structures
- A Python environment with
requestsinstalled
API Endpoints
Here are the two BambooHR ATS endpoints you’ll use most frequently:
- Get all applications
GET https://api.bamboohr.com/api/gateway.php/{companyDomain}/v1/applicant_tracking/applications - Get application details
GET https://api.bamboohr.com/api/gateway.php/{companyDomain}/v1/applicant_tracking/applications/{applicationId}
Step-by-Step Guide
1. Retrieve All Job Applications
import requests
def get_all_applications(company_domain, api_key):
url = f"https://api.bamboohr.com/api/gateway.php/{company_domain}/v1/applicant_tracking/applications"
headers = {
"accept": "application/json",
"authorization": f"Basic {api_key}"
}
response = requests.get(url, headers=headers)
return response.json()
# Example
applications = get_all_applications("mycompany", "your_api_key")
print(applications)2. Retrieve Application Details
import requests
def get_application_details(company_domain, application_id, api_key):
url = f"https://api.bamboohr.com/api/gateway.php/{company_domain}/v1/applicant_tracking/applications/{application_id}"
headers = {
"accept": "application/json",
"authorization": f"Basic {api_key}"
}
response = requests.get(url, headers=headers)
return response.json()
# Example
application_details = get_application_details("mycompany", 48, "your_api_key")
print(application_details)Common Pitfalls to Watch Out For
Most integration failures come from operational blind spots, not code. Watch these closely:
- Rate limits sneak up fast, especially in high-volume orgs. Build retry logic early.
- Basic Auth mishandling is common. Always encode and store credentials securely.
- Pagination is easy to miss when fetching all applications, don’t assume one-page responses.
- Attachments require extra requests; resumes and cover letters aren’t always bundled.
- Structure drift, BambooHR’s ATS schema can vary across accounts. Don’t hardcode fields.
- Timeouts happen if you’re pulling heavy datasets; set generous timeouts and retries.
FAQs
1. What is BambooHR ATS?
It’s BambooHR’s built-in applicant tracking system for managing candidates, roles, and application workflows.
2. How do I authenticate?
Using Basic Auth with your API key.
3. Can I filter by job ID?
Yes, pass a jobId query parameter when listing applications.
4. What format does the API return?
JSON.
5. Does BambooHR paginate application results?
Yes, depending on volume. Always check for pagination keys.
6. Can I access uploaded documents?
Yes, resumes, cover letters, and attachments appear as file IDs you can fetch separately.
7. How should I handle API errors?
Check HTTP status codes and include fallback logic for 400s, 401s, and 429s.
A Faster Way: Using Knit for BambooHR ATS Integration
If you don’t want to maintain authentication flows, rate-limit handling, schema variations, and long-term BambooHR ATS API upkeep, Knit simplifies the entire stack. Integrating once with Knit gives you unified authentication, automatic schema normalization, zero-maintenance updates every time BambooHR changes something and easy access to application, employee, and hiring-related datasets
If you want to avoid the heavy lifting of maintaining these integrations long-term, Knit handles the full lifecycle so your engineering team can focus elsewhere.




