Employment Hero Python API Docs | dltHub

Build a Employment Hero-to-database pipeline in Python using dlt with AI Workbench support for Claude Code, Cursor, and Codex.

Last updated:

Employment Hero is a cloud HR and payroll platform offering a RESTful API to access HR, payroll, workforce and related organisational data. The REST API base URL is https://api.employmenthero.com and All requests require a Bearer token obtained through OAuth 2.0..

dlt is an open-source Python library that handles authentication, pagination, and schema evolution automatically. dlthub provides AI context files that enable code assistants to generate production-ready pipelines. Install with uv pip install "dlt[workspace]" and start loading Employment Hero data in under 10 minutes.


What data can I load from Employment Hero?

Here are some of the endpoints you can load from Employment Hero:

ResourceEndpointMethodData selectorDescription
employees/api/v1/organisations/:organisation_id/employeesGETdata.itemsList employees (paginated)
employee/api/v1/organisations/:organisation_id/employees/:idGETdataGet single employee
organisations/api/v1/organisationsGETdata.itemsList organisations (paginated)
employing_entities/api/v1/organisations/:organisation_id/employing_entitiesGETdata.itemsList employing entities (paginated)
documents/api/v1/organisations/:organisation_id/employees/:employee_id/documentsGETdata.itemsEmployee documents (paginated)
payslips/api/v1/organisations/:organisation_id/employees/:employee_id/payslipsGETdata.itemsEmployee payslips (paginated)
rostered_shifts/api/v1/organisations/:organisation_id/rostered_shiftsGETdata.itemsList rostered shifts (paginated)
employment_histories/api/v1/organisations/:organisation_id/employees/:employee_id/employment_historiesGETdata.itemsEmployee employment histories (paginated)
superannuation_detail/api/v2/organisations/:organisation_id/employees/:employee_id/superannuation_detailGETdataEmployee superannuation detail (region-aware)
bank_accounts/api/v2/organisations/:organisation_id/employees/:employee_id/bank_accountsGETdataEmployee bank accounts (region-aware)

How do I authenticate with the Employment Hero API?

Register an OAuth2 application in the Employment Hero Developer Portal to obtain client_id and client_secret. Include an Authorization header with "Bearer <access_token>" on all API requests.

1. Get your credentials

  1. Sign in to Employment Hero and open the Developer Portal (menu under profile). 2) Create a new OAuth2 application: provide a name, select required scopes, and set redirect URI(s). 3) Save the generated Client ID and Client Secret. 4) Use the OAuth authorize endpoint to obtain an authorization code and exchange it at the token endpoint to receive access and refresh tokens.

2. Add them to .dlt/secrets.toml

[sources.employment_hero_source] client_id = "your_client_id_here" client_secret = "your_client_secret_here" refresh_token = "your_refresh_token_here"

dlt reads this automatically at runtime — never hardcode tokens in your pipeline script. For production environments, see setting up credentials with dlt for environment variable and vault-based options.


How do I set up and run the pipeline?

Set up a virtual environment and install dlt:

uv venv && source .venv/bin/activate uv pip install "dlt[workspace]"

1. Install the dlt AI Workbench:

dlt ai init --agent <your-agent> # <agent>: claude | cursor | codex

This installs project rules, a secrets management skill, appropriate ignore files, and configures the dlt MCP server for your agent. Learn more →

2. Install the rest-api-pipeline toolkit:

dlt ai toolkit rest-api-pipeline install

This loads the skills and context about dlt the agent uses to build the pipeline iteratively, efficiently, and safely. The agent uses MCP tools to inspect credentials — it never needs to read your secrets.toml directly. Learn more →

3. Start LLM-assisted coding:

Use /find-source to load data from the Employment Hero API into DuckDB.

The rest-api-pipeline toolkit takes over from here — it reads relevant API documentation, presents you with options for which endpoints to load, and follows a structured workflow to scaffold, debug, and validate the pipeline step by step.

4. Run the pipeline:

python employment_hero_pipeline.py

If everything is configured correctly, you'll see output like this:

Pipeline employment_hero_pipeline load step completed in 0.26 seconds 1 load package(s) were loaded to destination duckdb and into dataset employment_hero_data The duckdb destination used duckdb:/employment_hero.duckdb location to store data Load package 1749667187.541553 is LOADED and contains no failed jobs

Inspect your pipeline and data:

dlt pipeline employment_hero_pipeline show

This opens the Pipeline Dashboard where you can verify pipeline state, load metrics, schema (tables, columns, types), and query the loaded data directly.


Python pipeline example

This example loads employees and organisations from the Employment Hero API into DuckDB. It mirrors the endpoint and data selector configuration from the table above:

import dlt from dlt.sources.rest_api import RESTAPIConfig, rest_api_resources @dlt.source def employment_hero_source(client_token=dlt.secrets.value): config: RESTAPIConfig = { "client": { "base_url": "https://api.employmenthero.com", "auth": { "type": "bearer", "token": client_token, }, }, "resources": [ {"name": "employees", "endpoint": {"path": "api/v1/organisations/:organisation_id/employees", "data_selector": "data.items"}}, {"name": "organisations", "endpoint": {"path": "api/v1/organisations", "data_selector": "data.items"}} ], } yield from rest_api_resources(config) def get_data() -> None: pipeline = dlt.pipeline( pipeline_name="employment_hero_pipeline", destination="duckdb", dataset_name="employment_hero_data", ) load_info = pipeline.run(employment_hero_source()) print(load_info)

To add more endpoints, append entries from the resource table to the "resources" list using the same name, path, and data_selector pattern.


How do I query the loaded data?

Once the pipeline runs, dlt creates one table per resource. You can query with Python or SQL.

Python (pandas DataFrame):

import dlt data = dlt.pipeline("employment_hero_pipeline").dataset() sessions_df = data.employees.df() print(sessions_df.head())

SQL (DuckDB example):

SELECT * FROM employment_hero_data.employees LIMIT 10;

In a marimo or Jupyter notebook:

import dlt data = dlt.pipeline("employment_hero_pipeline").dataset() data.employees.df().head()

See how to explore your data in marimo Notebooks and how to query your data in Python with dataset.


What destinations can I load Employment Hero data to?

dlt supports loading into any of these destinations — only the destination parameter changes:

DestinationExample value
DuckDB (local, default)"duckdb"
PostgreSQL"postgres"
BigQuery"bigquery"
Snowflake"snowflake"
Redshift"redshift"
Databricks"databricks"
Filesystem (S3, GCS, Azure)"filesystem"

Change the destination in dlt.pipeline(destination="snowflake") and add credentials in .dlt/secrets.toml. See the full destinations list.


Troubleshooting

Authentication failures

If you receive 401 Unauthorized: verify your Authorization header is set to Bearer <access_token>. Tokens expire after 15 minutes; use the refresh token at the token endpoint to obtain a new access token.

Permission / scope errors (403)

A 403 response indicates missing scopes or insufficient user permissions. Ensure the OAuth app includes the required scopes and that the authorizing user has admin rights.

Rate limiting (429)

The API returns 429 Too Many Requests when the rate limit is exceeded. Implement exponential backoff and respect the item_per_page pagination limits. Retry after the time specified in the Retry-After header.

Pagination quirks

List endpoints wrap results in data.items and provide pagination metadata (page_index, item_per_page, total_items, total_pages). Use these fields to iterate through pages. Single‑resource v2 endpoints return a top‑level data object rather than an items array.

Common HTTP errors

Employment Hero uses standard HTTP status codes: 400 Bad Request, 401 Unauthorized, 403 Forbidden, 404 Not Found, 406 Not Acceptable, 422 Unprocessable Entity, 429 Too Many Requests, 5xx Server errors. Examine the response body for error details.

Ensure that the API key is valid to avoid 401 Unauthorized errors. Also, verify endpoint paths and parameters to avoid 404 Not Found errors.


Next steps

Continue your data engineering journey with the other toolkits of the dltHub AI Workbench:

  • data-exploration — Build custom notebooks, charts, and dashboards for deeper analysis with marimo notebooks.
  • dlthub-runtime — Deploy, schedule, and monitor your pipeline in production.
dlt ai toolkit data-exploration install dlt ai toolkit dlthub-runtime install

Was this page helpful?

Community Hub

Need more dlt context for Employment Hero?

Request dlt skills, commands, AGENT.md files, and AI-native context.