> ## Documentation Index
> Fetch the complete documentation index at: https://docs.nekt.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Qulture.Rocks as a data source

> Bring your Qulture.Rocks employee contracts and user import history to Nekt.

Qulture.Rocks is a people management platform for performance reviews, OKRs, feedbacks and 1:1s. This connector reads your company's data through the Qulture.Rocks User API and brings your employee contracts (active and inactive employees, with job, area, department, supervisor, dates and custom fields) and the history of user imports, with the errors of each imported user.

> [!NOTE]
>
> The connector only reads data. It never creates, changes or deactivates users in Qulture.Rocks.

> [!WARNING]
>
> Performance reviews, objectives (OKRs), feedbacks and other product data are **not available yet**. Qulture.Rocks serves them through a separate API (the Platform API, with its own token), which this connector does not read yet.

## Configuring Qulture.Rocks as a Source

In the [Sources](https://app.nekt.ai/sources) tab, click on the "Add source" button located on the top right of your screen. Then, select the Qulture.Rocks option from the list of connectors.

Click **Next** and you'll be prompted to add your access.

### 1. Add account access

The connector uses the **User API token** of Qulture.Rocks. To get it, log in to Qulture.Rocks as an **administrator**, open the **Organização** profile, go to **Integrações** in the left menu and scroll down to the API section. Next to **API de usuários**, click **Regerar** and copy the token.

* **User API Token**: the token you copied.
* **Start Date**: the earliest date synced for user imports. Imports created before this date are not read. Contracts are always read whole, whatever the date.

> [!WARNING]
>
> Use the **API de usuários** token. The **API da plataforma** token does not work with this connector. Regenerating a token invalidates the previous one, so update every integration that used it, including this source.

> [!TIP]
>
> The token has administrator rights in Qulture.Rocks. Store it only in the source configuration; Nekt keeps it encrypted.

Once you're done, click **Next**.

### 2. Select streams

Choose which data streams you want to sync. For faster extractions, select only the streams that are relevant to your analysis. You can select entire groups of streams or pick specific ones.

> Tip: The stream can be found more easily by typing its name.

Select the streams and click **Next**.

### 3. Configure data streams

Customize how you want your data to appear in your catalog. Select the desired layer where the data will be placed, a folder to organize it inside the layer, a name for each table (which will effectively contain the fetched data) and the type of sync.

* **Layer**: choose between the existing layers on your catalog. This is where you will find your new extracted tables as the extraction runs successfully.
* **Folder**: a folder can be created inside the selected layer to group all tables being created from this new data source.
* **Table name**: we suggest a name, but feel free to customize it. You have the option to add a **prefix** to all tables at once and make this process faster!
* **Sync Type**: keep the suggested type. User import items is **Incremental**: each sync reads only the imports created since the previous one. Contracts and user imports are **Full table**: the Qulture.Rocks API cannot list what changed since a date, so each sync reads them whole and replaces the table.

Once you are done configuring, click **Next**.

### 4. Configure data source

Describe your data source for easy identification within your organization, not exceeding 140 characters.

To define your [Trigger](https://docs.nekt.com/runs/scheduling-and-triggers.md), consider how often you want data to be extracted from this source. This decision usually depends on how frequently you need the new table data updated (every day, once a week, or only at specific times). Employee data changes slowly, so a daily sync works well.

Optionally, you can configure Delta Log Retention and determine for how long we should store old states of this table as it gets updated. Read more about this resource [here](https://docs.nekt.com/get-started/core-concepts/resource-control).

Once you are ready, click **Next** to finalize the setup.

### 5. Check your new source

You can view your new source on the [Sources](https://app.nekt.ai/sources) page. If needed, manually trigger the source extraction by clicking on the arrow button. Once executed, your data will appear in your Catalog.

> [!WARNING]
>
> For you to be able to see it on your [Catalog](https://app.nekt.ai/catalog), you need at least one successful source run.

# Streams and Fields

## Available streams

The table below lists every stream, its **slug** (the exact identifier to pass when creating the source via API) and a short description.

| Stream | Slug | Sync | Description |
| - | - | - | - |
| Contracts | `contracts` | Full table | Employees of the company (one contract per employee), active and inactive, with personal, job and hierarchy data. |
| User imports | `user_importers` | Full table | Bulk user imports (creation or update of users) created since the Start Date, with their state and progress. |
| User import items | `user_importer_items` | Incremental | The users sent in each import, with the data sent and the errors of each one. |

To rebuild the hierarchy, join `contracts.supervisor_id` with `contracts.id`. To see the import of each item, join `user_importer_items.user_importer_id` with `user_importers.id`.

## Fields by stream

Fields marked String (JSON) hold a nested object or list as JSON text; use your warehouse's JSON functions to read them.

> [accordion] Contracts
>
> The employees of the company: one contract per person and company, active and inactive.
>
> Table: `contracts` · Primary key: `id` · Sync: Full table
>
> | Field | Type | Description |
> | :- | :- | :- |
> | `id` | Integer | Unique identifier of the contract (the employee's link to the company). |
> | `company_id` | Integer | Identifier of the company in Qulture.Rocks. |
> | `user_id` | Integer | Identifier of the person (user) who holds the contract. |
> | `active` | Boolean | True for an active contract; false for an inactive (terminated or deactivated) one. |
> | `blocked` | Boolean | True when the contract is blocked: it appears as active but cannot log in nor receive e-mails. |
> | `name` | String | Full name of the employee. |
> | `nickname` | String | Nickname of the employee. |
> | `email` | String | E-mail of the employee. |
> | `username` | String | Username of the employee, when the company identifies users by username. |
> | `identifier` | String | Custom identifier of the employee set by the company. |
> | `external_uid` | String | External identifier used as login for single sign-on. |
> | `cpf` | String | CPF of the employee, digits only. |
> | `rg` | String | RG of the employee. |
> | `sex` | String | Sex of the employee (`female`, `male`). |
> | `gender` | String | Gender of the employee (for example `cis_woman`, `non_binary`, `rather_not_answer`). |
> | `birth_date` | Date | Birth date of the employee. |
> | `admission_date` | Date | Admission (hiring) date. |
> | `last_career_move_date` | Date | Date of the last career move (promotion, role change). |
> | `termination_date` | Date | Termination date; empty while employed. |
> | `termination_reason` | String | Reason of the termination (`voluntary`, `involuntary`). |
> | `termination_cause` | String | Cause of the termination (for example `career_opportunity`, `remuneration`, `staff_reduction`). |
> | `role` | String | Access role in Qulture.Rocks (for example `member`, `admin`). |
> | `job_title` | String | Job title. |
> | `level` | String | Level (seniority). |
> | `area` | String | Area. |
> | `department` | String | Department. |
> | `location` | String | Location (office, city). |
> | `country` | String | Country. |
> | `education` | String | Education level. |
> | `salary_range` | String | Salary range, as registered in Qulture.Rocks. |
> | `supervisor_id` | Integer | Contract `id` of the direct supervisor (leader); empty when there is none. |
> | `tags` | String (JSON) | Tags (groups) the employee belongs to. |
> | `objectives_average_by_cycle` | String (JSON) | Average progress of the employee's objectives (OKRs) per cycle, keyed by cycle id. |
> | `created_at` | Datetime | Date and time the contract was created. |
> | `updated_at` | Datetime | Date and time the contract was last updated, when Qulture.Rocks provides it. |
> | `last_invitation_sent_at` | Datetime | Date and time the last invitation to the platform was sent. |
> | `user_name` | String | Name of the user who holds the contract. |
> | `user_email` | String | Login e-mail of the user. |
> | `user_preferred_language` | String | Preferred language of the user (`pt`, `en`, `es`). |
> | `user_sign_in_count` | Integer | How many times the user has signed in. |
> | `user_created_at` | Datetime | Date and time the user was created. |
> | `user_profile_picture_cloudinary_id` | String | Identifier of the user's profile picture. |
> | `user_profile_picture_url` | String | Address of the user's profile picture; empty without a picture. |
> | `extra_fields` | String (JSON) | Every other field Qulture.Rocks sent for the contract, such as custom contract fields, keyed by the field's key. |

> [accordion] User imports
>
> Bulk user imports (creation or update of users through a spreadsheet, the API or Qulture.Rocks' native user sync) created since the Start Date.
>
> Table: `user_importers` · Primary key: `id` · Sync: Full table
>
> | Field | Type | Description |
> | :- | :- | :- |
> | `id` | Integer | Unique identifier of the import. |
> | `company_id` | Integer | Identifier of the company in Qulture.Rocks. |
> | `state` | String | State of the import (for example `enqueued`, `done`); users are only created or updated once it is `done`. |
> | `user_importer_data_id` | Integer | Identifier of the data file of the import. |
> | `created_at` | Datetime | Date and time the import was created. |
> | `updated_at` | Datetime | Date and time the import was last updated, when Qulture.Rocks provides it. |
> | `progress` | String | Progress as Qulture.Rocks shows it (for example `100.0%`). |
> | `progress_percent` | Number | Progress as a number from 0 to 100. |
> | `import_errors` | String (JSON) | Errors of the import as a whole. |
> | `extra_fields` | String (JSON) | Every other field Qulture.Rocks sent for the import. |

> [accordion] User import items
>
> The users sent in each import, with the data sent and their errors.
>
> Table: `user_importer_items` · Primary key: `id` · Sync: Incremental (by `user_importer_created_at`)
>
> | Field | Type | Description |
> | :- | :- | :- |
> | `id` | Integer | Unique identifier of the item (one user sent in one import). |
> | `user_importer_id` | Integer | Identifier of the import (`user_importers.id`). |
> | `company_id` | Integer | Identifier of the company in Qulture.Rocks. |
> | `state` | String | State of the item (for example `done`). |
> | `uid` | Integer | Identifier Qulture.Rocks gives to the user created or updated by the item. |
> | `data` | String (JSON) | The user data sent in the import (name, e-mail, tags, supervisor...). |
> | `import_errors` | String (JSON) | Errors of this item, as a list of `[field, error]` pairs; empty when the user was imported. |
> | `created_at` | Datetime | Date and time the item was created, when Qulture.Rocks provides it. |
> | `updated_at` | Datetime | Date and time the item was last updated, when Qulture.Rocks provides it. |
> | `user_importer_state` | String | State of the item's import when it was read. |
> | `user_importer_created_at` | Datetime | Date and time the item's import was created; the incremental replication key. |
> | `extra_fields` | String (JSON) | Every other field Qulture.Rocks sent for the item. |

## Implementation Notes

### Data Quality Considerations

* **Active and inactive employees.** Each sync reads the active and the inactive contracts and loads both; use `active` to filter.
* **Custom fields.** Custom contract fields (for example "T-shirt size") come in `extra_fields`, keyed by the field's key. Any field Qulture.Rocks adds later also lands there until it gets its own column.
* **Full table tables are never half updated.** The connector reads all the contracts and all the user imports before writing any of them. If employees are removed or renamed while the contracts are read and some may have been missed, the list is read again; if it never settles, the table is not updated in that sync and the next sync tries again. Employees created during a sync come with the next one. A contracts table that suddenly comes back empty is not emptied either: the sync fails for that table. If the data really was removed, run a full sync of the source to accept it.
* **User import items are loaded import by import.** If a sync fails in the middle, the items already loaded stay and the next sync reads the same imports again; nothing is duplicated, because rows are merged by `id`.
* **Imports still running.** Items of an import that has not ended (for example `enqueued`) are read again in the next syncs until it ends. An import still not ended seven days after it was created no longer holds the following syncs back. If an import is deleted while a sync runs, its users are not loaded and the sync log says so.
* **Passwords are never loaded.** Any password-related value sent in an import (for example a password prefix) is replaced by `[redacted]` in `data`.
* **Permissions.** If the token may read the contracts but not the user imports (or the other way around), the tables it cannot read are skipped and shown as failed, the sync log names them, and the other tables keep syncing.
* **Performance reviews, OKRs and feedbacks are not available yet.** They come from the Qulture.Rocks Platform API, which this connector does not read yet. Only the per-cycle objectives average of each employee (`objectives_average_by_cycle`) is available today.

### API Limits & Performance

* Qulture.Rocks publishes no rate limit. The connector makes at most 300 requests per minute and, when Qulture.Rocks asks it to slow down, waits and tells you in the sync log.
* Contracts are read 50 per request. User import items are read one import at a time.
* Companies that use Qulture.Rocks' native user sync get two imports a day, each with the whole user base, so `user_importer_items` can grow quickly. Deselect it if you do not need the import history, or choose a recent Start Date.

## Troubleshooting

| Error or symptom | What it means | What to do |
| :- | :- | :- |
| "Qulture.Rocks rejected the User API token of this source" | The token is wrong, was regenerated, or is the Platform API token. | As an administrator, go to Organização > Integrações, click Regerar next to API de usuários and update the source with the new token. |
| "This source has no Qulture.Rocks User API token" | The token field is empty. | Fill in the User API Token of the source. |
| "Qulture.Rocks does not allow the User API token of this source to read ..." | The token may not read the contracts or the user imports; those tables were skipped. | Generate the token with an administrator account (Organização > Integrações > API de usuários), or deselect those tables. |
| "Qulture.Rocks answered the user imports list with exactly N records again, but some imports read before are no longer in it" | The list of imports looks cut by a size limit. The user imports tables were kept. | Contact Nekt support. |
| "Qulture.Rocks is limiting how fast this sync may read" | Qulture.Rocks asked the connector to slow down. | No action needed; the sync waits and continues. |
| "The list of ... contracts kept changing in Qulture.Rocks while it was read" | Employees were being created or changed during the whole sync. The table was kept. | No action needed; the next sync tries again. If it repeats, schedule the source at a quieter time. |
| "Qulture.Rocks returned no 'contracts' records at all, although the previous sync read N" | Qulture.Rocks returned an empty list for a table that had rows. The table was kept. | If the data really was removed, run a full sync of the source. Otherwise run the sync again later. |
| "Could not reach Qulture.Rocks" or "Qulture.Rocks kept failing" | Qulture.Rocks did not answer, or answered with errors, after several attempts. | Usually temporary; the next sync tries again. |
| "... in a format this connector does not recognize", "kept answering pages with nothing new" or "in pages that cannot be walked" | The Qulture.Rocks API changed or answered in an unexpected way. | Contact Nekt support. |

## Skills for agents

<Snippet file="agent-skills-intro.mdx" />

> [card] [Download Qulture.Rocks skills file](https://docs.nekt.com/sources/qulture-rocks.md)
>
> Qulture.Rocks connector documentation as plain markdown, for use in AI agent contexts.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.