# Bamboo HR

Omnata's BambooHR plugin replicates company information, employee records, and employee-related tables from BambooHR to Snowflake.

### Authentication

#### API Key

The BambooHR API uses HTTP Basic authentication with an API key in place of a username. Each request is authenticated and authorized as if the user who generated the key were making it directly — that user's permissions determine which fields and employees Omnata can read.

For detailed instructions on generating an API key, see the [BambooHR authentication documentation](https://documentation.bamboohr.com/docs/getting-started#section-authentication).

{% hint style="info" %}
We recommend creating a dedicated BambooHR user with read-only access to the data you want to sync, then generating the API key against that user.
{% endhint %}

The following fields are required to create a connection in the Omnata UI:

<table><thead><tr><th>Field</th><th>Required</th><th>Description</th><th data-hidden>Default</th></tr></thead><tbody><tr><td>API Key</td><td>Yes</td><td>The API key generated for your BambooHR user. Stored as a Snowflake secret.</td><td>—</td></tr><tr><td>Company Domain</td><td>Yes</td><td>The subdomain used to access your BambooHR account (e.g. <code>mycompany</code> for <code>https://mycompany.bamboohr.com</code>).</td><td>—</td></tr></tbody></table>

### Inbound Syncs

The BambooHR plugin supports the following stream categories:

* **Company Information** — top-level company details (legal name, display name, address, phone).
* **Employees** — core employee records (`id`, `employeeNumber`, `displayName`, `firstName`, `lastName`, `preferredName`, `nickname`, `pronouns`, `terminationDate`, `hireDate`, photo metadata, etc.).
* **Employee-related tables** — per-employee tabular data, dynamically discovered from your BambooHR account's `tabularfields` endpoint.

#### Available employee-related tables

The list of employee-related tables is fetched live from your BambooHR account, so the streams you see depend on which features and tables are enabled there. Common examples include:

* `bonus`
* `compensation`
* `contacts`
* `dependents`
* `earnings`
* `emergency_contacts`
* `employee_assets`
* `employee_certifications`
* `employment_status`
* `job_info`

#### Sync strategies

All BambooHR streams currently use **Full Refresh**. The BambooHR API does not expose change-tracking endpoints suitable for general-purpose incremental syncs of these objects, so Omnata re-reads the full set on each run.

Because all streams currently run as Full Refresh, the only thing that determines whether hard-deleted employees disappear from Snowflake is your **Write Strategy**:

| Write Strategy     | Behaviour for hard-deleted employees                               |
| ------------------ | ------------------------------------------------------------------ |
| **Replace**        | Snowflake table is rebuilt each run — deleted employees disappear. |
| **Merge / Append** | Deleted employees remain in Snowflake indefinitely (stale).        |

For the `employees` stream specifically, **terminations are not deletions** — terminated employees stay in BambooHR and continue to be synced. Filter by `terminationDate IS NOT NULL` in your downstream models if you want to exclude them.

### Outbound Syncs

Outbound syncs to BambooHR are not currently supported. [Contact us](https://omnata.com/contact-us) if this is a use case you'd like to discuss.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.omnata.com/omnata-product-documentation/omnata-sync-for-snowflake/apps/bamboo-hr.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
