> ## 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.

# Sine as a data source

> Bring data from Sine by Honeywell to your Lakehouse.

Sine by Honeywell is a visitor, contractor and workplace-compliance platform: visitors check in at your sites from a kiosk, the web or a mobile app, hosts are notified of their arrival, and contractors go through pre-approval workflows before coming on site. The connector extracts your sites, visitor types, hosts and host groups, the companies registered in Sine, your workflow responses and the history of finished visits (passes), so you can analyze who visits your sites, when, for how long and whom they come to see.

Access to the Sine API is not enabled by default: Sine Support turns on the **Public API** feature for your account, and then a Sine admin generates the credential.

## Configuring Sine 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 Sine option from the list of connectors.

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

### 1. Add account access

Sine authenticates with an OAuth 2.0 **client credential**: a **Client ID** and a **Client Secret** generated for your Sine team. The connector exchanges them for a short-lived access token on every sync, so there is nothing to renew on your side.

<Steps>
  <Step title="Enable the Public API">
    Contact Sine Support and ask them to enable the **Public API** feature for your Sine account.
  </Step>

  <Step title="Generate the credential">
    In the Sine Dashboard, open the **Admin** app, click **Settings** in the side menu and open the **API keys** tab. In the **Public API credentials** section, generate a new set of client credentials.
  </Step>

  <Step title="Find your Team ID">
    In the same Admin app, go to **Settings > Team Details** and copy your **Team ID**.
  </Step>
</Steps>

<Warning>Sine shows the Client Secret only once, when the credential is generated. Store it safely; if it is lost, generate a new credential and update the source. We recommend a credential dedicated to Nekt, so revoking it never disturbs your other integrations.</Warning>

The following configurations are available:

* **Client ID**: the identifier of the Public API credential generated in Sine. Required.

* **Client Secret**: the secret generated together with the Client ID. Required.

* **Team ID**: your Sine Team ID, found under **Sine Admin > Settings > Team Details**. Required.

* **Start Date**: the earliest date from which records will be synced: companies and workflow responses updated from this date on, and passes created from this date on. Leave it empty to extract the full history. Sine only returns the passes of the last 12 months, so older visits cannot be extracted.

* **Lookback Days**: how many days are re-read before the last sync point on every run. Sine only lists a pass once the visitor checks out or the pass expires, so recent days are read again to pick up visits that were still open during the previous sync. The default is 7.

* **Requests Per Minute**: how fast the connector may call Sine. The default is 60 requests per minute.

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.

<Info>The Visitor Types and Hosts streams are read site by site, so they cost one request per site on every sync. The Passes stream is listed as a preview feature in Sine's API documentation: if it is not available for your account yet, it is skipped with a warning on the run log and the rest of the sync proceeds normally.</Info>

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**: Companies, Workflow Responses and Passes support INCREMENTAL. Sites, Visitor Types, Hosts and Host Groups are small reference tables and are always read in full (FULL\_TABLE). Read more about Sync Types [here](https://docs.nekt.com/get-started/core-concepts/types-of-sync).

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/get-started/core-concepts/triggers), 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).

Optionally, you can define some additional settings:

* 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).
* Determine when to execute an **Additional [Full Sync](https://docs.nekt.com/get-started/core-concepts/types-of-sync#additional-full-sync)**. This will complement the incremental data extractions, ensuring that your data is completely synchronized with your source every once in a while.

<Note>Sine returns the date and time of each pass without a time zone (usually the local time of the site). The connector keeps them exactly as Sine sends them (`issued_date`, `issued_time`, `checkout_date`, `checkout_time`) and also combines them into `issued_at` and `checked_out_at`, which carry no time zone either. A pass that stays open for longer than the **Lookback Days** is only picked up by a full sync, so scheduling an occasional additional full sync is recommended if you issue long-lived passes.</Note>

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.</Warning>

# Streams and Fields

Below you'll find all available data streams from Sine and their corresponding fields. API reference: [Sine API](https://developer.sine.co/api).

<AccordionGroup>
  <Accordion title="Sites">
    Every site (physical location) of your team (`GET /sites`).

    Primary key: `id`

    | Field       | Type   | Description                              |
    | :---------- | :----- | :--------------------------------------- |
    | `id`        | String | Unique identifier (UUID) of the site.    |
    | `name`      | String | Name of the site.                        |
    | `address`   | String | Address (physical location) of the site. |
    | `latitude`  | Number | Latitude of the site location.           |
    | `longitude` | Number | Longitude of the site location.          |
  </Accordion>

  <Accordion title="Visitor Types">
    The visitor types configured on each site, such as Visitor or Delivery (`GET /sites/{siteId}`). One row per site and visitor type.

    Primary key: `site_id`, `id`

    | Field           | Type    | Description                                                            |
    | :-------------- | :------ | :--------------------------------------------------------------------- |
    | `site_id`       | String  | Identifier of the site the visitor type belongs to.                    |
    | `id`            | String  | Unique identifier (UUID) of the visitor type.                          |
    | `name`          | String  | Name of the visitor type (e.g. Visitor, Delivery).                     |
    | `host_required` | Boolean | Whether a valid host must be chosen on check-in for this visitor type. |
  </Accordion>

  <Accordion title="Hosts">
    The hosts (staff members visitors come to see) registered on each site (`GET /sites/{siteId}/hosts`). A host registered on several sites appears once per site.

    Primary key: `site_id`, `id`

    | Field             | Type   | Description                                                    |
    | :---------------- | :----- | :------------------------------------------------------------- |
    | `site_id`         | String | Identifier of the site the host is registered on.              |
    | `id`              | String | Unique identifier (UUID) of the host.                          |
    | `first_name`      | String | First name of the host.                                        |
    | `last_name`       | String | Last name of the host.                                         |
    | `email`           | String | Email address of the host.                                     |
    | `host_group_name` | String | Name of the host group the host belongs to, when there is one. |
  </Accordion>

  <Accordion title="Host Groups">
    Team-wide and site-specific host groups (`GET /hosts/groups`).

    Primary key: `id`

    | Field       | Type    | Description                                                                |
    | :---------- | :------ | :------------------------------------------------------------------------- |
    | `id`        | String  | Unique identifier (UUID) of the host group.                                |
    | `name`      | String  | Display name of the host group.                                            |
    | `private`   | Boolean | Whether the host group is marked as private in Sine.                       |
    | `site_id`   | String  | Identifier of the site the group is scoped to; empty for team-wide groups. |
    | `site_name` | String  | Name of the site the group is scoped to; empty for team-wide groups.       |
  </Accordion>

  <Accordion title="Companies">
    Companies registered in Sine, such as contractors and suppliers (`GET /companies/team/{teamId}`). Synced by their last update.

    Primary key: `id` · Replication key: `updated_at`

    | Field                  | Type     | Description                                                                                                         |
    | :--------------------- | :------- | :------------------------------------------------------------------------------------------------------------------ |
    | `id`                   | String   | Unique identifier of the company.                                                                                   |
    | `team_id`              | String   | Identifier of the Sine team.                                                                                        |
    | `name`                 | String   | Name of the company.                                                                                                |
    | `status`               | String   | Status of the company: active, inactive, pending or blocked.                                                        |
    | `identifier_type`      | String   | Type of the company's business identifier (e.g. a tax or registration number).                                      |
    | `identifier_value`     | String   | Value of the company's business identifier.                                                                         |
    | `address`              | String   | Address of the company.                                                                                             |
    | `contact_name`         | String   | Name of the company's contact person.                                                                               |
    | `contact_email`        | String   | Email address of the company's contact.                                                                             |
    | `contact_phone_number` | String   | Phone number of the company's contact.                                                                              |
    | `website`              | String   | Website of the company.                                                                                             |
    | `admin_notes`          | String   | Notes about the company left by Sine admins.                                                                        |
    | `tags`                 | Array    | Names of the tags applied to the company.                                                                           |
    | `additional_fields`    | String   | Custom fields configured for companies, with their values (JSON array of objects with id, name, value and type).    |
    | `created_at`           | Datetime | When the company was created.                                                                                       |
    | `updated_at`           | Datetime | When the company was last updated (creation time if it was never updated); used as the incremental replication key. |
  </Accordion>

  <Accordion title="Workflow Responses">
    Applications submitted to your Sine workflows, such as contractor pre-approvals and inductions, with their approval state (`GET /workflows/response/team/{teamId}`). Synced by their last update.

    Primary key: `response_id` · Replication key: `updated_at`

    | Field               | Type     | Description                                                                                                                            |
    | :------------------ | :------- | :------------------------------------------------------------------------------------------------------------------------------------- |
    | `response_id`       | String   | Unique identifier of the workflow response.                                                                                            |
    | `response_uuid`     | String   | UUID of the workflow response.                                                                                                         |
    | `workflow_id`       | String   | Identifier of the workflow the response was submitted to.                                                                              |
    | `workflow_uuid`     | String   | UUID of the workflow.                                                                                                                  |
    | `workflow_name`     | String   | Name of the workflow.                                                                                                                  |
    | `team_id`           | String   | Identifier of the Sine team.                                                                                                           |
    | `unique_identifier` | String   | Unique identifier of the applicant within the workflow.                                                                                |
    | `state`             | String   | State of the response: pending, accepted, rejected, invalidated or expired.                                                            |
    | `start_date`        | Datetime | Start of the period the response is valid for.                                                                                         |
    | `end_date`          | Datetime | End of the period the response is valid for.                                                                                           |
    | `expiry_date`       | Datetime | When the approval expires.                                                                                                             |
    | `is_auto_approved`  | Boolean  | Whether the response was approved automatically.                                                                                       |
    | `company_name`      | String   | Name of the company the applicant applied on behalf of.                                                                                |
    | `note`              | String   | Note left on the response.                                                                                                             |
    | `tags`              | Array    | Names of the tags applied to the response.                                                                                             |
    | `approved_by`       | String   | Approval actions taken on the response (JSON array of objects with action, state, firstName, lastName, email, date and message).       |
    | `rejected_by`       | String   | Rejection actions taken on the response (JSON array of objects with action, state, firstName, lastName, email, date and message).      |
    | `applicants`        | String   | People the response was submitted for (JSON array of objects with isPrimaryApplicant, firstName, lastName, email, mobile and company). |
    | `sites`             | String   | Sites the response grants access to (JSON array of objects with id, name and address).                                                 |
    | `forms`             | String   | Forms filled in as part of the response (JSON array of objects with formResponseId, type and userDetails).                             |
    | `created_at`        | Datetime | When the response was created.                                                                                                         |
    | `updated_at`        | Datetime | When the response was last updated (creation time if it was never updated); used as the incremental replication key.                   |
  </Accordion>

  <Accordion title="Passes (visit history)">
    Every finished visit: passes that were checked out or expired, with visitor, host, site, check-in and check-out times and the answers to the check-in and sign-out forms (`POST /passes/`). Sine only returns passes created in the last 12 months, and only once they are no longer active.

    Primary key: `pass_key` · Replication key: `issued_at`

    | Field                       | Type     | Description                                                                                                                                                                          |
    | :-------------------------- | :------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
    | `pass_key`                  | String   | Identifier of the pass: the pass ID when Sine returns one, otherwise a hash computed by the connector from the visitor, site, host and issue date and time.                          |
    | `first_name`                | String   | First name of the visitor.                                                                                                                                                           |
    | `last_name`                 | String   | Last name of the visitor.                                                                                                                                                            |
    | `email`                     | String   | Email address of the visitor.                                                                                                                                                        |
    | `mobile`                    | String   | Mobile phone number of the visitor.                                                                                                                                                  |
    | `company`                   | String   | Company the visitor represents.                                                                                                                                                      |
    | `pass_type`                 | String   | Type of pass, i.e. the visitor type chosen on check-in (e.g. Visitor).                                                                                                               |
    | `entry_type`                | String   | How the visitor checked in (e.g. SineWeb).                                                                                                                                           |
    | `site_name`                 | String   | Name of the site that was visited.                                                                                                                                                   |
    | `status`                    | String   | Final status of the pass (e.g. checked out, expired).                                                                                                                                |
    | `issued_at`                 | Datetime | When the pass was issued, built from issued\_date and issued\_time. Sine returns these without a time zone (usually the site's local time). Used as the incremental replication key. |
    | `issued_date`               | String   | Date the pass was issued, exactly as returned by Sine (e.g. 21/12/2025).                                                                                                             |
    | `issued_time`               | String   | Time the pass was issued, exactly as returned by Sine (e.g. 08:35:02).                                                                                                               |
    | `pending_time`              | Integer  | Minutes the pass waited for approval before being accepted or rejected.                                                                                                              |
    | `accepted_or_rejected_time` | String   | Time the pass was accepted or rejected, as returned by Sine.                                                                                                                         |
    | `accepted_or_rejected_by`   | String   | Who accepted or rejected the pass.                                                                                                                                                   |
    | `checked_out_at`            | Datetime | When the visitor checked out, built from checkout\_date and checkout\_time (no time zone, like issued\_at).                                                                          |
    | `checkout_date`             | String   | Date the visitor checked out, exactly as returned by Sine.                                                                                                                           |
    | `checkout_time`             | String   | Time the visitor checked out, exactly as returned by Sine.                                                                                                                           |
    | `duration`                  | Integer  | Length of the visit in minutes, as calculated by Sine.                                                                                                                               |
    | `host_first_name`           | String   | First name of the host visited.                                                                                                                                                      |
    | `host_last_name`            | String   | Last name of the host visited.                                                                                                                                                       |
    | `host_group`                | String   | Host group of the host visited.                                                                                                                                                      |
    | `zone`                      | String   | Zone of the site the pass was issued for.                                                                                                                                            |
    | `notes`                     | String   | Notes recorded on the pass.                                                                                                                                                          |
    | `check_in_form_responses`   | String   | Answers given on the check-in form (JSON array of objects with label and value).                                                                                                     |
    | `sign_out_form_responses`   | String   | Answers given on the sign-out form (JSON array of objects with label and value).                                                                                                     |
  </Accordion>
</AccordionGroup>
