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

# Twygo as a data source

> Bring your Twygo users, courses, enrollments, progress, questionnaires and companies to Nekt.

Twygo is a Brazilian learning management system (LMS) for corporate training and online courses. This connector reads your organization's data through the Twygo API 2.0: users, contents (courses and learning paths) and their activities, enrollments with progress and scores, progress per activity, questionnaires with their questions, attempts and answers, likes, "my list" bookmarks, and business customers (companies) with their discount grants.

> [!NOTE]
>
> The connector only reads data. It never creates, changes or deletes users, contents, enrollments or companies in Twygo.

## Before you start

* **You need a Twygo administrator.** The connector uses the API token of your organization, which only an administrator can generate.
* **Every table is read in full on every sync.** Twygo's API has no filter by update date, so each sync reads the current state of every table. Large organizations (many users or many questionnaire answers) take longer to sync.
* **Some tables depend on your Twygo plan.** When a feature is not included in your organization's Twygo contract (for example, companies and discount grants), Twygo refuses to share it. Those tables are skipped and marked as failed in the run, and the other tables keep syncing. Ask Twygo to enable the feature, or deselect those tables.
* **Magic links are not stored.** Twygo returns a login link (magic link) for each user and enrollment. Anyone who opens it is logged in as that user, so the connector does not load it.

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

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

### 1. Add account access

The connector signs in with your organization's **API token** (API 2.0). The token is fixed: it does not expire and does not need to be renewed. It identifies your organization, so no organization ID is needed.

To generate it:

1. Sign in to Twygo as an administrator.
2. Go to **Configurações > Integrações > API** (the page `https://twygoead.com/o/<your organization ID>/integrations`).
3. Generate the API token and copy it.

See [Twygo's authentication guide](https://twygo.docs.buildwithfern.com/v2/guias/autenticacao).

> [!WARNING]
>
> The token gives access to all the data of your organization. Keep it safe. If you generate a new token in Twygo, update it in the source as well.

The following configurations are available:

* **API Token**: The Twygo API 2.0 token of your organization.

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**: every Twygo table is synced as **Full table**: each sync brings the current state of the data, so records deleted in Twygo also leave your catalog.

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

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 | Description |
| - | - | - |
| Users | `users` | Users of the organization and their registration data. |
| Contents | `contents` | Courses, learning paths and other contents. |
| Content Activities | `content_activities` | One row per activity of each content. |
| Attendees (enrollments) | `attendees` | Enrollments with status, progress, scores and certificates. |
| Activities Attendees | `activities_attendees` | When each user started and concluded each activity. |
| Questionnaires | `questionnaires` | Questionnaires (surveys and tests). |
| Questionnaire Questions | `questionnaire_questions` | One row per question, with its options. |
| Questionnaire Attempts | `questionnaire_attempts` | Each attempt of a user at a questionnaire. |
| Answers | `answers` | Each answer given in an attempt. |
| Likes | `likes` | Likes on contents, active and removed. |
| Bookmarks | `bookmarks` | Contents saved to "my list", active and removed. |
| Companies | `companies` | Business customers and their enrollment summary. Depends on the companies feature of your Twygo plan. |
| Company Grants | `company_grants` | Discount grants. Depends on the grants (concessões) feature of your Twygo plan. |
| Company Grant Links | `company_grant_links` | Grants linked to each company. Depends on the companies and grants features of your Twygo plan. |

Every table also has an `additional_fields` column: any field Twygo returns that is not mapped to its own column, as a JSON object.

## Fields by stream

Fields marked **String (JSON)** hold a JSON value; use your SQL engine's JSON functions to read them.

### People

> [accordion] Users
>
> Every user of the organization: learners, managers and administrators, with their registration data. Read in full on every sync.
>
> Table: `users` · Primary key: `user_id` · Sync: Full table
>
> | Field | Type | Description |
> | :- | :- | :- |
> | `user_id` | Integer | Unique identifier of the user in Twygo. |
> | `professional_id` | Integer | ID of the professional record linked to the user. |
> | `name` | String | Full name of the user. |
> | `email` | String | Email address of the user. |
> | `document_1` | String | First document of the user (CPF in Brazil), as registered. |
> | `document_2` | String | Second document of the user (RG in Brazil), as registered. |
> | `enterprise` | String | Company the user informed in the registration. |
> | `phone` | String | Main phone number. |
> | `phone_2` | String | Secondary phone number. |
> | `cell_phone` | String | Mobile phone number. |
> | `role` | String | Job title of the user. |
> | `industry` | String | Line of business of the user. |
> | `cep` | String | Postal code (CEP) of the address. |
> | `address` | String | Street of the address. |
> | `number` | String | Number of the address. |
> | `complement` | String | Complement of the address. |
> | `neighborhood` | String | Neighborhood of the address. |
> | `city` | String | City of the address. |
> | `state` | String | State of the address. |
> | `country` | String | Country of the address. |
> | `department` | String | Department of the user. |
> | `situation` | String | Situation of the user in Twygo: active or inactive. |
> | `is_manager` | Boolean | Whether the user has the manager profile. |
> | `created_at` | Datetime | Date and time the user was created. |
> | `updated_at` | Datetime | Date and time of the last update of the user. |
> | `spaces` | String (JSON) | Organizations (spaces) the user has access to, including additional environments (JSON array of objects with space\_id and space\_name). |
> | `team_leader` | String (JSON) | Team leader(s) of the user (JSON with team\_leader\_id, team\_leader\_name and team\_leader\_email). |
> | `additional_fields` | String (JSON) | Fields the Twygo API returned that this connector does not map to a column, kept as a JSON object (null when there are none). |

### Learning content

> [accordion] Contents
>
> Courses, learning paths and other contents (events) of the organization. Read in full on every sync.
>
> Table: `contents` · Primary key: `content_id` · Sync: Full table
>
> | Field | Type | Description |
> | :- | :- | :- |
> | `content_id` | Integer | Unique identifier of the content (event) in Twygo. |
> | `content_type` | String | Type of the content (course, learning path, etc.). |
> | `name` | String | Name of the content. |
> | `description` | String | Description of the content. |
> | `date_time_start` | Datetime | Start date and time of the content. |
> | `date_time_end` | Datetime | End date and time of the content. |
> | `publication_date` | Datetime | Publication date of the content. |
> | `course_type` | String | Type of the course. |
> | `synchronism` | String | Synchronism of the content (synchronous or asynchronous), as a translated label. |
> | `modality` | String | Modality of the content (online, in person, etc.). |
> | `hours` | String | Workload (hours) of the content, as Twygo returns it. |
> | `channel` | String | Distribution channel of the content. |
> | `class_number` | String | Class (cohort) number. |
> | `days_to_expire` | Integer | Days the enrollment stays valid after it starts. |
> | `venue` | String | Venue of the content, for in-person events. |
> | `email` | String | Contact email of the content. |
> | `situation` | String | Situation of the content, as a translated label. |
> | `trial_days` | Integer | Number of trial days. |
> | `access_level` | String | Access level of the content. |
> | `value` | Number | Price of the content. |
> | `installments` | Integer | Number of installments the price can be split into. |
> | `link` | String | Access link of the content, on the organization's domain. |
> | `banner_url` | String | Public URL of the content's card image (null when there is none). |
> | `learning_experience_id` | Integer | ID of the learning experience linked to the content (null when there is none). |
> | `learning_experience_name` | String | Name of the learning experience; without one, the content type (e.g. Curso). |
> | `classification_id` | Integer | ID of the classification of the content (null when it has none). |
> | `classification_name` | String | Name of the classification of the content. |
> | `categories` | String (JSON) | Categories of the content (JSON array of objects with category\_id and name). |
> | `team` | String (JSON) | Team of the content: speakers and managers (JSON array of objects with id, name, email and role). |
> | `activities` | String (JSON) | Activities of the content (JSON array of objects); also available one per row in content\_activities. |
> | `competencies` | String (JSON) | Competencies of the content (JSON array of objects with competency\_id and competency\_title). |
> | `additional_fields` | String (JSON) | Fields the Twygo API returned that this connector does not map to a column, kept as a JSON object (null when there are none). |

> [accordion] Content Activities
>
> One row per activity of each content (videos, questionnaires, documents...), taken from the contents list. Read in full on every sync.
>
> Table: `content_activities` · Primary key: `content_id`, `activity_id` · Sync: Full table
>
> | Field | Type | Description |
> | :- | :- | :- |
> | `content_id` | Integer | ID of the content the activity belongs to. |
> | `activity_id` | Integer | Unique identifier of the activity. |
> | `sequence` | Integer | Position of the activity in the content. |
> | `title` | String | Title of the activity. |
> | `activity_type` | String | Type of the activity. |
> | `status` | String | Status of the activity. |
> | `situation` | String | Situation of the activity in the learning path. |
> | `briefing` | String | Short description of the activity. |
> | `external_provider` | String | External provider of the activity. |
> | `minimum_permanence_time` | Integer | Minimum time the participant must stay in the activity. |
> | `weight` | Number | Weight of the activity (the API calls it wheight). |
> | `questionary_id` | Integer | ID of the questionnaire of the activity, when it is one. |
> | `minimum_score` | Number | Minimum score of the activity. |
> | `final_score_ratio` | Number | Share of the activity in the final score. |
> | `attempts` | Integer | Number of attempts allowed. |
> | `question_draw` | String | How questions are drawn. |
> | `question_list_method` | String | How questions are listed. |
> | `approval_required` | Boolean | Whether the activity is required to pass the learning path. |
> | `approval_criteria` | String | Approval criterion of the activity in the learning path. |
> | `additional_fields` | String (JSON) | Fields the Twygo API returned that this connector does not map to a column, kept as a JSON object (null when there are none). |

### Enrollments and progress

> [accordion] Attendees (enrollments)
>
> Enrollments of users in contents, with their status, progress, scores, approval and completion dates and certificates. Read in full on every sync.
>
> Table: `attendees` · Primary key: `attendee_id` · Sync: Full table
>
> | Field | Type | Description |
> | :- | :- | :- |
> | `attendee_id` | Integer | Unique identifier of the enrollment (attendee) in Twygo. |
> | `user_id` | Integer | ID of the enrolled user. |
> | `content_id` | Integer | ID of the content the user is enrolled in. |
> | `origin_organization_id` | Integer | ID of the Twygo organization (environment) the record comes from. |
> | `origin_organization_name` | String | Name of the Twygo organization (environment) the record comes from. |
> | `origin_corporate_name` | String | Corporate name of the Twygo organization (environment) the record comes from. |
> | `status` | String | Status of the enrollment (e.g. pending, confirmed, rejected, reversed, payment\_overdue, refund\_solicitation). |
> | `progress` | Number | Progress of the user in the content, in percent. |
> | `score` | Number | Total weighted score of the user in the content. |
> | `questionary_average` | Number | Average of the user's questionnaire scores in the content. |
> | `attendance_score` | Number | Attendance score of the user in the content. |
> | `approved_at` | Datetime | Date and time the user was approved in the content. |
> | `completed_at` | Datetime | Date and time the user completed the content. |
> | `created_at` | Datetime | Date and time the enrollment was created. |
> | `certificates` | String (JSON) | Certificates issued for the enrollment (JSON array of objects with certificate\_id, certificate\_situation, issuing and expiration dates and link). |
> | `additional_fields` | String (JSON) | Fields the Twygo API returned that this connector does not map to a column, kept as a JSON object (null when there are none). |

> [accordion] Activities Attendees (progress per activity)
>
> When each user started and concluded each activity of a content. Read in full on every sync.
>
> Table: `activities_attendees` · Primary key: `activity_attendee_id` · Sync: Full table
>
> | Field | Type | Description |
> | :- | :- | :- |
> | `activity_attendee_id` | Integer | Unique identifier of the user's participation in the activity. |
> | `user_id` | Integer | ID of the user. |
> | `content_id` | Integer | ID of the content (course) of the activity. |
> | `activity_id` | Integer | ID of the activity. |
> | `questionary_id` | Integer | ID of the questionnaire of the activity, when it is one. |
> | `origin_organization_id` | Integer | ID of the Twygo organization (environment) the record comes from. |
> | `origin_organization_name` | String | Name of the Twygo organization (environment) the record comes from. |
> | `origin_corporate_name` | String | Corporate name of the Twygo organization (environment) the record comes from. |
> | `started_at` | Datetime | Date and time the user started the activity. |
> | `concluded_at` | Datetime | Date and time the user concluded the activity (null while not concluded). |
> | `additional_fields` | String (JSON) | Fields the Twygo API returned that this connector does not map to a column, kept as a JSON object (null when there are none). |

### Questionnaires

> [accordion] Questionnaires
>
> Questionnaires (surveys and tests) of the organization. Read in full on every sync.
>
> Table: `questionnaires` · Primary key: `questionnaire_id` · Sync: Full table
>
> | Field | Type | Description |
> | :- | :- | :- |
> | `questionnaire_id` | Integer | Unique identifier of the questionnaire. |
> | `name` | String | Name of the questionnaire. |
> | `type` | String | Type of the questionnaire: survey (research) or test. |
> | `created_at` | Datetime | Date and time the questionnaire was created. |
> | `updated_at` | Datetime | Date and time of the last update of the questionnaire. |
> | `categories1` | String (JSON) | First category classification of the questionnaire (JSON array). |
> | `categories2` | String (JSON) | Second category classification of the questionnaire (JSON array). |
> | `questions` | String (JSON) | Questions of the questionnaire with their options (JSON array); also available one per row in questionnaire\_questions. |
> | `additional_fields` | String (JSON) | Fields the Twygo API returned that this connector does not map to a column, kept as a JSON object (null when there are none). |

> [accordion] Questionnaire Questions
>
> One row per question of each questionnaire, with its answer options. Read in full on every sync.
>
> Table: `questionnaire_questions` · Primary key: `questionnaire_id`, `question_id` · Sync: Full table
>
> | Field | Type | Description |
> | :- | :- | :- |
> | `questionnaire_id` | Integer | ID of the questionnaire the question belongs to. |
> | `question_id` | Integer | Unique identifier of the question. |
> | `sequence` | Integer | Position of the question in the questionnaire. |
> | `title` | String | Title of the question. |
> | `description` | String | Detailed description of the question. |
> | `explanation` | String | Explanation or additional information about the question. |
> | `type` | String | Type of the question (e.g. single, multiple, text). |
> | `is_required` | Boolean | Whether an answer is required. |
> | `situation` | String | Situation of the question: active or disabled. |
> | `options` | String (JSON) | Answer options (JSON array of objects with option\_id, description and is\_correct). |
> | `additional_fields` | String (JSON) | Fields the Twygo API returned that this connector does not map to a column, kept as a JSON object (null when there are none). |

> [accordion] Questionnaire Attempts
>
> Each attempt of a user at a questionnaire, with the number of correct answers. Read in full on every sync.
>
> Table: `questionnaire_attempts` · Primary key: `questionnaire_attempt_id` · Sync: Full table
>
> | Field | Type | Description |
> | :- | :- | :- |
> | `questionnaire_attempt_id` | Integer | Unique identifier of the attempt (questionnary\_attempt\_id in the API). |
> | `questionnaire_id` | Integer | ID of the questionnaire. |
> | `user_id` | Integer | ID of the user who made the attempt. |
> | `activity_id` | Integer | ID of the activity the questionnaire belongs to. |
> | `activity_attendee_id` | Integer | ID of the user's participation in the activity (see activities\_attendees). |
> | `origin_organization_id` | Integer | ID of the Twygo organization (environment) the record comes from. |
> | `origin_organization_name` | String | Name of the Twygo organization (environment) the record comes from. |
> | `origin_corporate_name` | String | Corporate name of the Twygo organization (environment) the record comes from. |
> | `completion_date` | Datetime | Date and time the attempt was finished. |
> | `correct_answers` | Integer | Number of correct answers. |
> | `total_answers` | Integer | Number of answers given. |
> | `required_percent_for_approval` | Number | Minimum percent of correct answers required for approval. |
> | `situation` | String | Situation of the attempt. |
> | `additional_fields` | String (JSON) | Fields the Twygo API returned that this connector does not map to a column, kept as a JSON object (null when there are none). |

> [accordion] Answers
>
> Each answer given in a questionnaire attempt. Read in full on every sync.
>
> Table: `answers` · Primary key: `answer_id` · Sync: Full table
>
> | Field | Type | Description |
> | :- | :- | :- |
> | `answer_id` | Integer | Unique identifier of the answer. |
> | `questionnaire_id` | Integer | ID of the questionnaire. |
> | `questionnaire_attempt_id` | Integer | ID of the attempt the answer belongs to (questionnaires\_attempt\_id in the API). |
> | `question_id` | Integer | ID of the question answered. |
> | `origin_organization_id` | Integer | ID of the Twygo organization (environment) the record comes from. |
> | `origin_organization_name` | String | Name of the Twygo organization (environment) the record comes from. |
> | `origin_corporate_name` | String | Corporate name of the Twygo organization (environment) the record comes from. |
> | `options_id` | String | ID of the selected option, for multiple-choice questions (a JSON array when several were selected; null for text questions). |
> | `answer_text` | String | Text of the answer, or the description of the selected option. |
> | `situation` | String | Situation of the answer: is\_waiting\_review, correct or incorrect (surveys are always correct). |
> | `answer_review` | String | Reviewer's comment on the answer. |
> | `answer_date` | Datetime | Date and time of the answer. |
> | `additional_fields` | String (JSON) | Fields the Twygo API returned that this connector does not map to a column, kept as a JSON object (null when there are none). |

### Engagement

> [accordion] Likes
>
> Likes of users on contents, active and removed. Read in full on every sync.
>
> Table: `likes` · Primary key: `user_id`, `content_id`, `liked` · Sync: Full table
>
> | Field | Type | Description |
> | :- | :- | :- |
> | `user_id` | Integer | ID of the user who liked the content. |
> | `content_id` | Integer | ID of the content liked. |
> | `liked` | Datetime | Date and time the content was liked. |
> | `unliked` | Datetime | Date and time the like was removed (null while it is active). |
> | `origin_organization_id` | Integer | ID of the Twygo organization (environment) the record comes from. |
> | `origin_organization_name` | String | Name of the Twygo organization (environment) the record comes from. |
> | `origin_corporate_name` | String | Corporate name of the Twygo organization (environment) the record comes from. |
> | `additional_fields` | String (JSON) | Fields the Twygo API returned that this connector does not map to a column, kept as a JSON object (null when there are none). |

> [accordion] Bookmarks (my list)
>
> Contents users saved to "my list", active and removed. Read in full on every sync.
>
> Table: `bookmarks` · Primary key: `bookmark_id` · Sync: Full table
>
> | Field | Type | Description |
> | :- | :- | :- |
> | `bookmark_id` | Integer | Unique identifier of the bookmark. |
> | `user_id` | Integer | ID of the user who saved the content. |
> | `content_id` | Integer | ID of the content saved. |
> | `origin_organization_id` | Integer | ID of the Twygo organization (environment) the record comes from. |
> | `origin_organization_name` | String | Name of the Twygo organization (environment) the record comes from. |
> | `origin_corporate_name` | String | Corporate name of the Twygo organization (environment) the record comes from. |
> | `bookmarked` | Datetime | Date and time the content was added to the user's list. |
> | `unbookmarked` | Datetime | Date and time the content was removed from the user's list (null while it is in the list). |
> | `additional_fields` | String (JSON) | Fields the Twygo API returned that this connector does not map to a column, kept as a JSON object (null when there are none). |

### Companies and grants

> [accordion] Companies
>
> Business customers of the organization, with a summary of their employees' enrollments. Read in full on every sync.
>
> Table: `companies` · Primary key: `id` · Sync: Full table
>
> | Field | Type | Description |
> | :- | :- | :- |
> | `id` | Integer | Unique identifier of the company in Twygo. |
> | `cnpj` | String | CNPJ (Brazilian company tax ID) of the company. |
> | `company_name` | String | Legal (corporate) name of the company. |
> | `trading_name` | String | Trading name of the company. |
> | `site` | String | Website of the company. |
> | `business_line` | String | Line of business of the company. |
> | `number_of_employees` | String | Number of employees (range), as registered. |
> | `certificate_model_id` | Integer | ID of the certificate model used for the company's employees. |
> | `created_at` | Datetime | Date and time the company was created. |
> | `updated_at` | Datetime | Date and time of the last update of the company. |
> | `subscriptions_active` | Integer | Number of active enrollments of the company's employees. |
> | `subscriptions_pending` | Integer | Number of pending enrollments of the company's employees. |
> | `subscriptions_canceled` | Integer | Number of canceled enrollments of the company's employees. |
> | `grant` | String (JSON) | Summary of the discount grants of the company (JSON object; null when the grants feature is not available to the organization). |
> | `categories` | String (JSON) | Categories of the company (JSON array of objects with category\_id and name). |
> | `additional_fields` | String (JSON) | Fields the Twygo API returned that this connector does not map to a column, kept as a JSON object (null when there are none). |

> [accordion] Company Grants
>
> Discount grants of the organization, which can be shared between companies. Read in full on every sync.
>
> Table: `company_grants` · Primary key: `id` · Sync: Full table
>
> | Field | Type | Description |
> | :- | :- | :- |
> | `id` | Integer | Unique identifier of the grant. |
> | `name` | String | Name of the grant. |
> | `grant_type` | String | Scope of the grant: general, specific\_contents or classification. |
> | `discount_percentage` | Number | Discount percentage the grant gives. |
> | `active` | Boolean | Whether the grant is active. |
> | `companies_count` | Integer | Number of companies linked to the grant. |
> | `items_count` | Integer | Number of items (contents or categories) in the grant's scope. |
> | `additional_fields` | String (JSON) | Fields the Twygo API returned that this connector does not map to a column, kept as a JSON object (null when there are none). |

> [accordion] Company Grant Links
>
> The grants linked to each company, with the contents or categories they cover. Read with one request per company. Read in full on every sync.
>
> Table: `company_grant_links` · Primary key: `company_id`, `grant_id` · Sync: Full table
>
> | Field | Type | Description |
> | :- | :- | :- |
> | `company_id` | Integer | ID of the company. |
> | `grant_id` | Integer | ID of the grant linked to the company (see company\_grants). |
> | `name` | String | Name of the grant. |
> | `grant_type` | String | Scope of the grant: general, specific\_contents or classification. |
> | `discount_percentage` | Number | Discount percentage the grant gives. |
> | `active` | Boolean | Whether the grant is active. |
> | `contents` | String (JSON) | Contents in the grant's scope, for specific\_contents grants (JSON array of objects with id, name and kind). |
> | `categories` | String (JSON) | Categories in the grant's scope, for classification grants (JSON array). |
> | `additional_fields` | String (JSON) | Fields the Twygo API returned that this connector does not map to a column, kept as a JSON object (null when there are none). |

## Implementation notes

* **Full reads.** Twygo's API has no filter by update date, so every table is read in full on every sync. A table is only replaced once it was read completely: when Twygo fails or answers inconsistently in the middle of a table, that table keeps the data of the previous sync and the run says which table failed.
* **Changes during a sync.** Twygo returns its lists page by page, so a record created, changed or deleted while a list is being read can shift the others between pages. To avoid missing records, the connector reads every list at least twice and combines the reads, reading again while a read still finds records the earlier ones missed. If a list keeps changing in a way the reads cannot settle, that table fails instead of loading with gaps, and the next sync tries again. In rare cases a record changed during the sync only appears in the next sync, and a record deleted during the sync may still appear until the next sync.
* **Likes without a date.** Likes are identified by user, content and like date. A like Twygo returns without a like date is not loaded, and the sync log says how many.
* **Empty answers.** If a table that had records in the previous sync suddenly comes back empty, the sync stops that table instead of emptying it. If the data really was removed in Twygo, run a Full sync of the source to accept the empty table.
* **Tables Twygo refuses or does not offer.** When Twygo answers that a feature is not available for your organization, or that the token's user is inactive, the tables of that feature are skipped and marked as failed, and the sync log names them. The same happens, with a "not found" message, when Twygo does not offer one of the lists for your organization. If no selected table can be read, or the token is invalid, the run fails.
* **Rate limits.** Twygo does not document a request limit. The connector sends one request at a time and waits and retries when Twygo asks it to slow down.


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