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

# SleekFlow as a data source

> Bring data from SleekFlow to your Lakehouse.

SleekFlow is an omnichannel messaging and social CRM platform that brings WhatsApp, Instagram, Facebook Messenger, LINE, WeChat, SMS and live chat into one shared inbox, with contacts, broadcasts and automation. The connector reads your SleekFlow account through the SleekFlow Platform API and brings your contacts, conversations and their messages, labels, staff, teams, contact lists, broadcasts with their delivery statistics, saved replies, connected channels and daily conversation analytics to your Lakehouse.

## Configuring SleekFlow 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 SleekFlow 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 SleekFlow **Platform API key**. Only users with Admin access in SleekFlow can see it: in SleekFlow, open **Integrations**, find **Platform API** under **Direct API**, click **Connect** and copy the key shown under **Your unique API key**. The connector only reads data: it never sends messages or changes anything in your account.

> [!NOTE]
>
> The Platform API is available on SleekFlow's Premium and Enterprise plans. If you click **Refresh API key** in SleekFlow, the previous key stops working and the source must be updated with the new one.

> [!WARNING]
>
> Every SleekFlow plan has a monthly limit of API calls, shared by the Platform API, Zapier and Make, and reset on your subscription renewal date. The connector is built to spend as little as possible and never more than **Max API calls per run** on contacts and messages (see API Limits & Performance at the end of this page), and it reports how many calls each sync made. The Messages stream is the one that costs the most: one call per conversation with new activity. A sync that fails still spends the calls it made before failing.

The following configurations are available:

* **API Key**: the SleekFlow Platform API key. Required.

* **Region**: (Default: Auto-detect) the region where your SleekFlow account is hosted: Hong Kong, United States, Singapore, West Europe or UAE North. With **Auto-detect**, the connector checks every region on each sync (5 API calls) and requires exactly one of them to accept the key (a region that does not answer does not stop the sync); once the run log tells you the region, select it here to make a single check. Required.

* **Start Date**: contacts and conversations updated, messages sent and daily analytics from this date on are extracted. An earlier date means a longer first sync and more API calls (about one per conversation for the Messages stream). Required.

* **Max API calls per run**: (Default: 1500, advanced) Contacts and Messages stop when a sync has made this many SleekFlow API calls and continue from that point in the next syncs. A first sync of an account with many conversations is therefore spread over several syncs (see API Limits & Performance). Required.

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.

> [!NOTE]
>
> Messages costs one API call per conversation with new activity since the previous sync. Every other stream costs one or a few calls per sync. If you only need volumes (messages sent and received, active conversations, response times), Conversation Analytics Daily gives them at one call per sync.

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**: use INCREMENTAL for Contacts, Conversations, Messages and Conversation Analytics Daily: each sync then reads only what changed since the previous one. Labels, Staff, Teams, Contact Lists, Broadcasts, Saved Replies and Channels are FULL\_TABLE: each sync reads their current state. Read more about Sync Types [here](https://docs.nekt.com/get-started/core-concepts/types-of-sync).

> [!NOTE]
>
> A full sync replaces the table, so it cannot stop halfway: a full sync of Messages (one API call per conversation updated since the Start Date) or of Contacts that needs more calls than **Max API calls per run** is refused, and that stream fails in that sync. Prefer incremental syncs for Contacts, Conversations and Messages.

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), 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). A daily sync is usually enough and keeps API usage predictable.

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).
* An **Additional [Full Sync](https://docs.nekt.com/get-started/core-concepts/types-of-sync#additional-full-sync)** is only needed if you want contacts deleted in SleekFlow to disappear from your tables. On Messages it costs one API call per conversation updated since the Start Date and must fit in **Max API calls per run**, so prefer an occasional manual full sync over a frequent schedule.

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 |
| - | - | - |
| Contacts | `contacts` | Every contact with its labels and all contact properties (custom fields). Incremental. |
| Conversations | `conversations` | One conversation per contact thread, in every status (open, pending, closed), with assignee, team and labels. Incremental. |
| Messages | `messages` | Every message of the conversations, sent and received, with channel, type, delivery status and sender. Incremental. |
| Labels | `labels` | Labels (hashtags) of the account. |
| Staff | `staff` | Staff users (agents) of the account. |
| Teams | `teams` | Teams and their members. |
| Contact Lists | `contact_lists` | Contact lists of the account. |
| Broadcasts | `broadcasts` | Broadcasts (campaigns) with their delivery statistics. |
| Saved Replies | `saved_replies` | Saved (quick) replies. |
| Channels | `channels` | Messaging channels connected to the account (WhatsApp numbers, Facebook pages...). |
| Conversation Analytics Daily | `conversation_analytics_daily` | One row per day with conversation, message and broadcast figures and response times. Incremental. |

## Fields by stream

All dates are in UTC. Nested values (contact properties, assignee, attached files, channel settings) are JSON strings. Attributes SleekFlow returns beyond the documented ones are kept in each table's `extra_fields` column.

> **Contacts**
>
> Every contact updated since the Start Date, with its labels and every contact property of the account (lead stage, contact owner, lists, your own custom fields). `custom_fields_by_name` holds the same properties keyed by name, for simpler queries.
>
> Primary key: `id` · Replication key: `updated_at`
>
> | Field | Type | Description |
> | :- | :- | :- |
> | `id` | String | Contact ID (userProfileId) in SleekFlow. |
> | `first_name` | String | First name of the contact. |
> | `last_name` | String | Last name of the contact. |
> | `phone_number` | String | Phone number in international format, without the + sign. |
> | `email` | String | Email address of the contact. |
> | `created_at` | Datetime | When the contact was created (UTC). |
> | `updated_at` | Datetime | When the contact was last updated (UTC); used as the incremental replication key. |
> | `labels` | Array (String) | Labels (tags) applied to the contact. |
> | `custom_fields` | String (JSON) | Every contact property of the account (lead stage, contact owner, lists, last channel, your own custom fields...) as a JSON array of objects with customFieldId, customFieldName and customValue. |
> | `custom_fields_by_name` | String (JSON) | The same contact properties as a JSON object keyed by property name (customFieldName -> customValue), for simpler queries. |
> | `extra_fields` | String (JSON) | Any other attribute SleekFlow returns for the contact, as a JSON object. |

> **Conversations**
>
> One row per conversation (SleekFlow keeps one conversation per contact thread), in every status, with its assignee, collaborators, team and labels. A conversation is read again whenever it has new activity (`updated_time`) or changes status (`modified_at`).
>
> Primary key: `conversation_id` · Replication key: `last_changed_at`
>
> | Field | Type | Description |
> | :- | :- | :- |
> | `conversation_id` | String | Conversation ID (one conversation per contact thread). |
> | `company_id` | String | ID of the SleekFlow company (account) the conversation belongs to. |
> | `status` | String | Conversation status: open, pending (snoozed) or closed. |
> | `channels` | Array (String) | Messaging channels used in the conversation (whatsappcloudapi, facebook, line...). |
> | `last_message_channel` | String | Channel of the last message of the conversation. |
> | `message_group_name` | String | Group name of the conversation. |
> | `contact_id` | String | ID of the contact of the conversation; matches contacts.id. |
> | `contact_first_name` | String | First name of the contact. |
> | `contact_last_name` | String | Last name of the contact. |
> | `contact` | String (JSON) | Contact information embedded in the conversation (channel accounts, custom fields, lists), as a JSON object. |
> | `assignee_id` | String | User ID of the staff member the conversation is assigned to. |
> | `assignee_name` | String | Name of the staff member the conversation is assigned to. |
> | `assignee_email` | String | Email of the staff member the conversation is assigned to. |
> | `assignee` | String (JSON) | Assignee details (user info, role, position, status), as a JSON object. |
> | `collaborator_ids` | Array (String) | User IDs of the collaborators (additional assignees) of the conversation. |
> | `collaborators` | String (JSON) | Collaborators (additional assignees) of the conversation with their details, as a JSON array. |
> | `assigned_team_id` | Integer | ID of the team the conversation is assigned to; matches teams.team\_id. |
> | `assigned_team_name` | String | Name of the team the conversation is assigned to. |
> | `assigned_team` | String (JSON) | Assigned team details (members, default channels), as a JSON object. |
> | `labels` | Array (String) | Labels (hashtags) applied to the conversation. |
> | `label_ids` | Array (String) | IDs of the labels applied to the conversation; match labels.id. |
> | `conversation_hashtags` | String (JSON) | Labels applied to the conversation with their colors, as a JSON array. |
> | `unread_message_count` | Integer | Number of unread messages in the conversation (at the time of extraction). |
> | `last_message_id` | Integer | ID of the last message of the conversation; matches messages.id. |
> | `is_sandbox` | Boolean | Whether the conversation belongs to a demo (sandbox) contact. |
> | `is_bookmarked` | Boolean | Whether the conversation is bookmarked. |
> | `updated_time` | Datetime | When the conversation last had activity (UTC). |
> | `modified_at` | Datetime | When the conversation status last changed (UTC). |
> | `last_changed_at` | Datetime | The later of updated\_time and modified\_at (UTC); used as the incremental replication key. |
> | `extra_fields` | String (JSON) | Any other attribute SleekFlow returns for the conversation, as a JSON object. |

> **Messages**
>
> Every message, sent and received, of the conversations with activity since the previous sync: channel, type, content, delivery status and the staff member who sent it. Join with Conversations on `conversation_id`.
>
> Primary key: `id` · Replication key: `created_at`
>
> | Field | Type | Description |
> | :- | :- | :- |
> | `id` | Integer | Message ID. |
> | `conversation_id` | String | ID of the conversation the message belongs to; matches conversations.conversation\_id. |
> | `company_id` | String | ID of the SleekFlow company (account). |
> | `message_unique_id` | String | Unique ID of the message on its channel, when the channel provides one. |
> | `message_checksum` | String | Checksum of the message. |
> | `channel` | String | Channel of the message (whatsappcloudapi, whatsapp360dialog, facebook, line, sms, note...). |
> | `channel_name` | String | Channel name as SleekFlow reports it. |
> | `message_type` | String | Type of the message: text, file, template, interactive... |
> | `delivery_type` | String | How the message was sent: Normal, Broadcast, AutomatedMessage, ReadMore, QuickReply... |
> | `message_content` | String | Text content of the message. |
> | `status` | String | Delivery status of the message (Sent, Received, Read, Failed...), as of the last time it was extracted. |
> | `is_sent_from_sleekflow` | Boolean | Whether the message was sent from SleekFlow (outbound) rather than received from the contact. |
> | `is_sandbox` | Boolean | Whether this is a demo (sandbox) message. |
> | `is_from_import` | Boolean | Whether the message was imported into SleekFlow. |
> | `sender_id` | String | User ID of the staff member who sent the message, for messages sent from SleekFlow. |
> | `sender_name` | String | Display name of the staff member who sent the message. |
> | `sender` | String (JSON) | Staff sender details, as a JSON object. |
> | `dynamic_channel_sender` | String (JSON) | Channel-level sender and receiver identities of the message, as a JSON object. |
> | `receivers` | String (JSON) | Channel-specific receiver/sender objects of the message (e.g. whatsappCloudApiReceiver), as a JSON object. |
> | `uploaded_files` | String (JSON) | Files attached to the message (file name, MIME type, temporary download URL), as a JSON array. |
> | `translation_results` | String (JSON) | Translations of the message, as a JSON array. |
> | `analytic_tags` | Array (String) | Analytic tags attached to the message when it was sent through the API. |
> | `timestamp` | Integer | Unix time (seconds) when the message was first sent or received. |
> | `sent_at` | Datetime | timestamp as a UTC date-time. |
> | `created_at` | Datetime | When SleekFlow stored the message (UTC), or its send time when SleekFlow omits it; used as the incremental replication key. |
> | `updated_at` | Datetime | When the message was last updated, e.g. a delivery status change (UTC). |
> | `extra_fields` | String (JSON) | Any other attribute SleekFlow returns for the message, as a JSON object. |

> **Labels**
>
> Labels (hashtags) of the account. Read in full on every sync.
>
> Primary key: `id` · Full table
>
> | Field | Type | Description |
> | :- | :- | :- |
> | `id` | String | Label ID. |
> | `hashtag` | String | Label name. |
> | `hash_tag_color` | String | Display color of the label in SleekFlow. |
> | `hash_tag_type` | String | Label type as SleekFlow reports it. |
> | `count` | Integer | Number of conversations with the label, as SleekFlow reports it. |
> | `extra_fields` | String (JSON) | Any other attribute SleekFlow returns for the label, as a JSON object. |

> **Staff**
>
> Staff users (agents) of the account. `user_id` matches `assignee_id` in Conversations and `sender_id` in Messages. Read in full on every sync.
>
> Primary key: `staff_id` · Full table
>
> | Field | Type | Description |
> | :- | :- | :- |
> | `staff_id` | Integer | Staff ID; matches teams.member\_staff\_ids. |
> | `user_id` | String | User ID of the staff member; matches conversations.assignee\_id and messages.sender\_id. |
> | `first_name` | String | First name. |
> | `last_name` | String | Last name. |
> | `display_name` | String | Display name. |
> | `user_name` | String | User name (usually the login email). |
> | `email` | String | Email address. |
> | `phone_number` | String | Phone number. |
> | `email_confirmed` | Boolean | Whether the email address is confirmed. |
> | `role_type` | String | Role of the staff member as SleekFlow reports it (admin, team admin, staff). |
> | `position` | String | Position (job title) shown on the staff page. |
> | `time_zone_info` | String (JSON) | Time zone settings of the staff member, as a JSON object. |
> | `created_at` | Datetime | When the staff user was created (UTC). |
> | `last_login_at` | Datetime | Last login time (UTC). |
> | `extra_fields` | String (JSON) | Any other attribute SleekFlow returns for the staff user, as a JSON object. |

> **Teams**
>
> Teams and the staff IDs of their members. Read in full on every sync.
>
> Primary key: `team_id` · Full table
>
> | Field | Type | Description |
> | :- | :- | :- |
> | `team_id` | Integer | Team ID; matches conversations.assigned\_team\_id. |
> | `team_name` | String | Team name. |
> | `member_staff_ids` | Array (Integer) | Staff IDs of the team members; match staff.staff\_id. |
> | `last_updated_at` | Datetime | When the team was last updated (UTC). |
> | `extra_fields` | String (JSON) | Any other attribute SleekFlow returns for the team, as a JSON object. |

> **Contact Lists**
>
> Contact lists of the account with their contact counts. Read in full on every sync.
>
> Primary key: `id` · Full table
>
> | Field | Type | Description |
> | :- | :- | :- |
> | `id` | Integer | Contact list ID. |
> | `company_id` | String | ID of the SleekFlow company (account). |
> | `name` | String | Name of the list (importName in the API). |
> | `status` | String | Status of the list (e.g. of its import). |
> | `total_contact_count` | Integer | Number of contacts in the list. |
> | `is_imported` | Boolean | Whether the list was created by an import. |
> | `imported_count` | Integer | Contacts created by the import. |
> | `updated_count` | Integer | Contacts updated by the import. |
> | `failed_count` | Integer | Rows that failed in the import. |
> | `is_bookmarked` | Boolean | Whether the list is bookmarked. |
> | `order` | Integer | Display order of the list. |
> | `created_at` | Datetime | When the list was created (UTC). |
> | `created_by` | String (JSON) | Staff member who created or imported the list, as a JSON object. |
> | `imported_contact_ids` | Array (String) | Contact IDs listed by the API under importedUserProfiles (the contacts added by the import). |
> | `extra_fields` | String (JSON) | Any other attribute SleekFlow returns for the list, as a JSON object. |

> **Broadcasts**
>
> Broadcasts (campaigns), including drafts, with their delivery statistics. Read in full on every sync, so the statistics are always current.
>
> Primary key: `id` · Full table
>
> | Field | Type | Description |
> | :- | :- | :- |
> | `id` | String | Broadcast ID. |
> | `broadcast_name` | String | Name of the broadcast. |
> | `status` | String | Status of the broadcast (draft, scheduled, Sent...). |
> | `channels` | Array (String) | Channels the broadcast is sent through. |
> | `saved_by` | String | Name of the staff member who last saved the broadcast. |
> | `sent_at` | Datetime | When the broadcast was sent (UTC); empty for drafts. |
> | `updated_at` | Datetime | When the broadcast was last updated (UTC). |
> | `sent_count` | Integer | Recipients the broadcast was sent to. |
> | `delivered_count` | Integer | Recipients the broadcast was delivered to. |
> | `read_count` | Integer | Recipients who read the broadcast. |
> | `replied_count` | Integer | Recipients who replied to the broadcast. |
> | `failed_count` | Integer | Recipients the broadcast failed for. |
> | `statistics_updated_at` | Datetime | When the delivery statistics were last updated (UTC). |
> | `statistics` | String (JSON) | The delivery statistics as SleekFlow returns them, as a JSON object. |
> | `extra_fields` | String (JSON) | Any other attribute SleekFlow returns for the broadcast, as a JSON object. |

> **Saved Replies**
>
> Saved (quick) replies available to the team. Read in full on every sync.
>
> Primary key: `id` · Full table
>
> | Field | Type | Description |
> | :- | :- | :- |
> | `id` | Integer | Saved reply ID. |
> | `name` | String | Name (shortcut) of the saved reply. |
> | `text` | String | Text of the saved reply. |
> | `order` | Integer | Display order. |
> | `extra_fields` | String (JSON) | Any other attribute SleekFlow returns for the saved reply, as a JSON object. |

> **Channels**
>
> One row per messaging channel connected to the account (WhatsApp numbers, Facebook pages, LINE, SMS, e-commerce integrations). Credentials found in the channel settings are never stored. Read in full on every sync.
>
> Primary key: `channel_type`, `channel_key` · Full table
>
> | Field | Type | Description |
> | :- | :- | :- |
> | `channel_type` | String | Channel group as the API names it (whatsApp, whatsappCloudApi, facebook, line, sms...). |
> | `channel_key` | String | Identifier of the channel within its group (page ID, sender number, channel ID, or name when there is none). |
> | `name` | String | Name of the channel. |
> | `status` | String | Status of the channel, when the API reports one. |
> | `connected_at` | Datetime | When the channel was connected (UTC), when the API reports it. |
> | `company_name` | String | Name of the SleekFlow company (account). |
> | `details` | String (JSON) | All settings of the channel returned by the API (credentials removed), as a JSON object. |

> **Conversation Analytics Daily**
>
> One row per day with the account's figures as SleekFlow's analytics report them: contacts, conversations, new enquiries, messages sent and received, automated messages, broadcast results, active agents and response times.
>
> Primary key: `date` · Replication key: `date`
>
> | Field | Type | Description |
> | :- | :- | :- |
> | `date` | Date | Day the figures refer to; used as the incremental replication key. |
> | `date_time` | String | dateTime of the row exactly as SleekFlow returns it. |
> | `response_time_for_first_messages` | String | Response time to first messages, as SleekFlow returns it (d.hh:mm:ss). |
> | `response_time_for_first_messages_seconds` | Number | response\_time\_for\_first\_messages in seconds. |
> | `response_time_for_all_messages` | String | Response time to all messages, as SleekFlow returns it (d.hh:mm:ss). |
> | `response_time_for_all_messages_seconds` | Number | response\_time\_for\_all\_messages in seconds. |
> | `number_of_contacts` | Integer | Contacts counted for the day. |
> | `number_of_contacts_average` | Number | Average of number\_of\_contacts over the period, as SleekFlow reports it. |
> | `number_of_all_conversations` | Integer | All conversations of the day. |
> | `number_of_all_conversations_average` | Number | Average of number\_of\_all\_conversations over the period. |
> | `number_of_active_conversations` | Integer | Conversations with activity during the day. |
> | `number_of_active_conversations_average` | Number | Average of number\_of\_active\_conversations over the period. |
> | `number_of_new_enquiries` | Integer | New enquiries (conversations started by contacts) during the day. |
> | `number_of_new_enquiries_average` | Number | Average of number\_of\_new\_enquiries over the period. |
> | `number_of_messages_sent` | Integer | Messages sent during the day. |
> | `number_of_messages_sent_average` | Number | Average of number\_of\_messages\_sent over the period. |
> | `number_of_messages_received` | Integer | Messages received during the day. |
> | `number_of_messages_received_average` | Number | Average of number\_of\_messages\_received over the period. |
> | `number_of_automated_messages` | Integer | Automated messages sent during the day. |
> | `number_of_broadcast_sent` | Integer | Broadcast messages sent during the day. |
> | `number_of_broadcast_bounced` | Integer | Broadcast messages that bounced during the day. |
> | `number_of_broadcast_delivered` | Integer | Broadcast messages delivered during the day. |
> | `number_of_broadcast_read` | Integer | Broadcast messages read during the day. |
> | `number_of_broadcast_replied` | Integer | Broadcast messages replied to during the day. |
> | `active_agents` | Integer | Staff members active during the day. |
> | `number_of_unique_active_conversations` | Integer | Unique conversations with activity during the day. |
> | `number_of_unique_active_conversations_average` | Number | Average of number\_of\_unique\_active\_conversations over the period. |
> | `number_of_unique_conversations` | Integer | Unique conversations of the day. |
> | `number_of_unique_conversations_average` | Number | Average of number\_of\_unique\_conversations over the period. |
> | `extra_fields` | String (JSON) | Any other figure SleekFlow returns for the day, as a JSON object. |

## Implementation Notes

### Data Quality Considerations

* Contacts and conversations are read by their last update time; messages are read for the conversations that changed since the previous complete pass. Every sync re-reads the last 30 minutes before the previous one, so changes that SleekFlow records with a short delay are not missed.
* Conversations that change while the list is being read (for example, a closed conversation reopened by a new message) are listed again before the sync moves on, so their messages are not missed. Messages are read from the start of the previous pass's window, so a conversation an earlier sync could not see still gets all its messages.
* A conversation is only counted as done once all its messages were read; a sync that stops on the call limit continues from the next conversation.
* If SleekFlow does not accept listing conversations in the pending (snoozed) status, the connector lists every status at once instead; if that is refused too, the sync fails rather than leaving those conversations and their messages out.
* A message's delivery `status` (Sent, Delivered, Read...) is the value at the time the message was extracted. SleekFlow has no way to read a single message again, so the status is only refreshed when its conversation has new activity. Use broadcast statistics or Conversation Analytics Daily for delivery rates.
* When SleekFlow answers "not found" for the messages of a conversation that was just listed, the connector treats the conversation as deleted during the sync, skips it and says so in the run log. This behavior of the API was not confirmed on a real account.
* Contacts, conversations and messages deleted in SleekFlow stay in the tables after incremental syncs. A full sync of Contacts removes deleted contacts; a full sync of Conversations and Messages does the same for them, at a high API cost for Messages.
* Conversation Analytics Daily stops two days before the current date, so that every day it reads is already complete in every time zone, and it re-reads the last three days on every sync. Each day is dated from the period SleekFlow says it returned or, when that period is not usable, from the date of each row; if the days cannot be matched, that stream fails instead of saving days with the wrong date (it is synced last, so the other streams are not affected).
* File URLs in Messages (`uploaded_files`) are temporary download links generated by SleekFlow; download the files if you need to keep them.

### API Limits & Performance

Calls made by each sync, which count toward your SleekFlow plan's monthly API call limit:

| Part of the sync | Incremental sync | Full sync |
| :- | :- | :- |
| Key check (also reads Staff) | 1 (5 with Region set to Auto-detect) | same |
| Labels, Teams, Channels | 1 each | 1 each |
| Contact Lists, Broadcasts, Saved Replies | 1 or 2 each, plus 1 per 80 records | same |
| Conversation Analytics Daily | 1 | 1 per 31 days since the Start Date |
| Contacts | about 1 per 200 changed contacts | about 1 per 200 contacts updated since the Start Date |
| Conversations (also used by Messages) | 6 to 12, plus 6 to re-check what changed during the sync, plus about 1 per 980 changed conversations | same, plus about 1 per 980 conversations updated since the Start Date |
| Messages | 1 per conversation with new activity | 1 per conversation updated since the Start Date |

* A quiet daily sync costs about 30 calls; each conversation with new activity adds one. With the default **Max API calls per run** (1,500), a daily sync stays under about 45,000 calls a month. Each sync ends with a line in the run log saying how many calls it made.
* Every table that is replaced on each sync (Staff, Labels, Teams, Channels, Saved Replies, Contact Lists, Broadcasts, and any stream set to full sync) is read completely before the connector sends it. If SleekFlow answers with errors, rejects the key or refuses more calls while it is being read, that stream is not sent, the other streams still sync, and the sync fails at the end: sync it again.

### When a sync succeeds or fails

* **Succeeds** when everything was read, and also when Contacts or Messages stopped on **Max API calls per run** (or because SleekFlow refused more calls) while the sync made progress. The run log then warns how much is left, for example "messages of 1,500 of 4,200 conversations read, 2,700 pending", and the next syncs continue from there. When both have a backlog, Contacts leave part of the limit (40%) to Messages, so both move forward.
* **Fails** when neither Contacts nor Messages could make any progress, when one of them has had work pending for more than 7 days (raise **Max API calls per run**, sync more often or use a more recent Start Date), when listing the conversations alone needs more calls than the whole limit allows, or when a stream fails (SleekFlow errors while reading it). The other streams are synced first, and the failure is reported at the end; the stream that failed must be synced again.
* A sync that fails still uses the API calls it made before failing.
* If a sync is interrupted for another reason while it is writing a table that is replaced on each sync (for example, during a full sync), that table can be left incomplete until the next successful run. Run the sync again until it succeeds.

## Troubleshooting

| Error or symptom | What it means | What to do |
| :- | :- | :- |
| The run fails saying SleekFlow did not accept the API key | The key is wrong or was refreshed in SleekFlow, the plan does not include the Platform API, or the Region does not match the account. | Copy the current key from Integrations > Direct API > Platform API, and set Region to Auto-detect or to your account's region. |
| The run fails saying more than one region accepted the key, or that a region returned no users | Auto-detect could not tell where the account is, or the selected region is not the account's. | Select your account's region in the source settings. |
| A warning says a stream stopped before the end | The sync reached **Max API calls per run**; the rest is read in the next syncs. | Nothing, or raise **Max API calls per run** to catch up faster. |
| The run fails saying a stream could not make any progress, or has had data pending for more than 7 days | The limit per sync is too low for the amount of new data. | Raise **Max API calls per run**, sync more often, or use a more recent Start Date. |
| The run fails saying SleekFlow is refusing more API calls | The plan's monthly API call limit is used up, by Nekt or by other integrations (Zapier, Make). | Wait for the subscription renewal date, lower **Max API calls per run**, sync less often, deselect Messages, or ask SleekFlow for a higher limit. |
| The run fails saying SleekFlow refused the request of a stream | The plan or the key's permissions do not include that data. | Deselect the stream named in the message, or ask SleekFlow to enable it. |
| The run fails saying a stream failed and must be synced again | That stream could not be read completely (SleekFlow errors, the call limit, or a full sync larger than **Max API calls per run**); the other streams were synced. | Follow the reason given in the message and run the sync again. |
| The run fails saying a list kept changing while it was being read | Many records changed in SleekFlow during the sync. | Run the sync again later. |
| A warning says some conversations could not be found | Those conversations were deleted in SleekFlow during the sync. | Nothing to do. |


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