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

# SprintHub as a data source

> Bring data from SprintHub to your Lakehouse.

SprintHub is a Brazilian all-in-one platform for sales, marketing and customer service: a CRM with Kanban funnels, an omnichannel service desk (SAC 360) that centralizes WhatsApp, Instagram, Messenger and e-mail, contact management with custom fields and custom objects, scheduling calendars, and custom reports. The connector extracts your contact base, the CRM funnels and their opportunities, the service history, and the custom objects and reports built on top of them, so you can analyse the whole commercial operation in your Lakehouse.

Every SprintHub customer runs on its own instance, so the connector asks for the instance name in addition to the API key.

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

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

### 1. Add account access

SprintHub authenticates with an **API key** generated inside the platform. Click the **gear icon** in the top right corner, open **Documentação e chave de API**, and click **Gerar Nova Chave**. Give the key a name, choose the user it inherits permissions from, and leave its status enabled. Then set the permissions so the integration can read **Contatos**, **Leads** and **Negociações**, and click **Salvar**.

<Warning>Copy the key exactly as it is displayed. Any character lost in the copy makes the connection fail with an authentication error.</Warning>

<Note>The key inherits the permissions of the user it was created for, including that user's departments and permission groups. Two keys on the same instance can therefore return different amounts of data. Generate it from a user who can see the whole operation.</Note>

<Warning>To extract **won and lost** opportunities, the key's user needs the **CRM - Oportunidades Ganhas e Perdidas** permission on their permission group. Without it, those cards are simply absent from the Opportunities table — the extraction still succeeds, so the gap is easy to miss.</Warning>

The following configurations are available:

* **Instance name**: the name of your SprintHub instance, which is the subdomain in your panel URL. For `https://mycompany.sprinthub.app` the instance name is `mycompany`. Required.

* **API key**: the key copied from **Documentação e chave de API**. Required.

* **Initial sync date**: the earliest date from which meetings will be read, in the Calendar Meetings table. This is the only SprintHub endpoint that accepts a date filter, so it does not affect any other table. Leave it empty to start from January 2020.

* **Page size**: how many records are requested per page. SprintHub recommends 25 to 50 and warns that larger pages increase the risk of a timeout. Defaults to 50.

* **Requests per minute**: the maximum number of API calls per minute this source makes. Defaults to 120. Lower it if your runs are being rate limited, or raise it to sync faster.

* **Include archived opportunities**: also reads archived opportunities into the Opportunities table, flagged with `is_archived`. SprintHub has no combined view of archived and active opportunities, so enabling this doubles the number of API calls that table makes. Off by default.

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.

<Warning>Four streams are read **one API call per contact**, because SprintHub only exposes them per contact and has no bulk endpoint for them: **Lead Details**, **Lead Custom Objects**, **Attendances** and **Lead Files**. On a base of tens of thousands of contacts they make the run considerably longer and consume a large share of your plan's API call allowance. Select them only if you need what they add, and consider putting them in a separate source with a less frequent trigger.</Warning>

<Note>**Lead Details** is the only way to reach the custom fields your instance defines for contacts. They arrive in a single `custom_fields` column as a JSON object, keyed by the field alias configured in SprintHub — custom fields differ from instance to instance, so they cannot be individual columns.</Note>

<Info>**Report Charts** reads the computed result of each custom report. SprintHub does not recalculate these on every request and advises reading each one at most three times a day, so a frequent trigger spends your API call allowance without bringing new numbers.</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**: every SprintHub stream is full table. The API exposes no "modified since" filter on contacts, opportunities or conversations, so each run re-reads the collection in full. 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.

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>

## How the extraction behaves

**Everything is full table.** SprintHub exposes no date filter on contacts, opportunities, conversations or any other collection — the meetings endpoint is the only exception. Every table is re-read in full on each run, so the trigger frequency is what controls the API cost.

**Opportunities are read stage by stage.** SprintHub loads its Kanban one column at a time, and its documentation warns that paging a whole funnel as a single list shifts under you whenever a card changes stage mid-read. The connector follows the same path, so a card moving during the extraction cannot be skipped or duplicated.

**Rate limits depend on your plan.** SprintHub does not publish a numeric limit; your allowance is shown in **Configurações > Sistemas > Limites**. The connector paces itself with the Requests per minute setting and, if SprintHub throttles a run anyway, waits and retries instead of failing — you'll see a warning in the run log and the run will simply take longer.

**Nested values arrive as JSON.** Fields that hold an object or a list of objects — custom fields, UTM tags, attached files, permission lists — are extracted as JSON strings rather than nested columns. A few endpoints do not have their response documented by SprintHub at all; those tables carry a `document` column with the whole record as JSON, next to the identifiers needed to join it.

## Troubleshooting

<AccordionGroup>
  <Accordion title="The run fails saying the instance was not found">
    The instance name is the subdomain of your SprintHub panel URL, not your company name and not the full URL. For `https://mycompany.sprinthub.app` the value to enter is `mycompany`. Fix it in the source settings and run the extraction again.
  </Accordion>

  <Accordion title="The run fails saying the API key was rejected">
    Open **Documentação e chave de API** in SprintHub and check that the key is still listed and enabled, and that the user it inherits permissions from still exists and can read Contatos, Leads and Negociações. If in doubt, generate a new key and update it in the source settings.
  </Accordion>

  <Accordion title="Won and lost opportunities are missing">
    The key's user needs the **CRM - Oportunidades Ganhas e Perdidas** permission on their permission group. Without it SprintHub returns only open cards, and the run still succeeds.
  </Accordion>

  <Accordion title="A table came back empty or with fewer rows than expected">
    Results always respect the permissions of the user the API key was created for — its departments, permission groups and funnel access. A key created for a restricted user sees a subset of the operation. Compare the row count against what that same user sees when logged into SprintHub.
  </Accordion>

  <Accordion title="The run is much slower than usual">
    Check whether Lead Details, Lead Custom Objects, Attendances or Lead Files are selected: each of them makes one API call per contact. Also check the run log for rate-limit warnings — if SprintHub is throttling the source, lowering Requests per minute makes the pacing steadier, and moving the per-contact streams into their own source with a less frequent trigger keeps the main tables fast.
  </Accordion>
</AccordionGroup>

# Streams and Fields

Below you'll find all available data streams from SprintHub and their corresponding fields. API reference: [SprintHub API documentation](https://docs.sprinthub.com/topicos/api).

<AccordionGroup>
  <Accordion title="Leads">
    Every contact in the instance with its fixed fields (`POST /leadsadvanced`). This is the base table the per-contact streams below fan out from.

    Primary key: `id`

    | Field              | Type     | Description                                                                                                                                        |
    | :----------------- | :------- | :------------------------------------------------------------------------------------------------------------------------------------------------- |
    | `id`               | Integer  | Unique identifier of the lead.                                                                                                                     |
    | `fullname`         | String   | First and last name joined, as SprintHub displays the lead.                                                                                        |
    | `firstname`        | String   | Given name of the lead.                                                                                                                            |
    | `lastname`         | String   | Family name of the lead.                                                                                                                           |
    | `email`            | String   | Email address of the lead. A lead with more than one address holds them in a single comma-separated value.                                         |
    | `phone`            | String   | Landline number of the lead.                                                                                                                       |
    | `whatsapp`         | String   | WhatsApp number of the lead, in international format.                                                                                              |
    | `mobile`           | String   | Mobile number of the lead.                                                                                                                         |
    | `address`          | String   | Street address of the lead.                                                                                                                        |
    | `city`             | String   | City of the lead.                                                                                                                                  |
    | `state`            | String   | State or province of the lead.                                                                                                                     |
    | `country`          | String   | Country of the lead, written in English (for example 'Brazil').                                                                                    |
    | `zipcode`          | String   | Postal code of the lead.                                                                                                                           |
    | `timezone`         | String   | IANA time zone of the lead (for example 'America/Sao\_Paulo').                                                                                     |
    | `company`          | Integer  | Identifier of the company the lead belongs to. The company's own details are available in the 'data\_company' field of the 'opportunities' stream. |
    | `points`           | Integer  | Lead scoring total accumulated by the lead.                                                                                                        |
    | `owner`            | Integer  | Identifier of the user who owns the lead.                                                                                                          |
    | `stage`            | Integer  | Identifier of the lifecycle stage the lead is in.                                                                                                  |
    | `photo_url`        | String   | URL of the lead's profile picture.                                                                                                                 |
    | `preferred_locale` | String   | Language the lead is contacted in (for example 'pt-BR').                                                                                           |
    | `create_date`      | Datetime | Timestamp when the lead was created.                                                                                                               |
    | `updated_date`     | Datetime | Timestamp when the lead was last changed.                                                                                                          |
    | `last_active`      | Datetime | Timestamp of the lead's most recent tracked activity.                                                                                              |
  </Accordion>

  <Accordion title="Lead Details">
    One row per contact with every field the instance stores, including its custom fields (`GET /leads/{id}?allFields=1`). Reading it costs **one API call per contact**.

    Primary key: `id`

    | Field                    | Type     | Description                                                                                                                                                                                       |
    | :----------------------- | :------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
    | `id`                     | Integer  | Unique identifier of the lead.                                                                                                                                                                    |
    | `firstname`              | String   | Given name of the lead.                                                                                                                                                                           |
    | `lastname`               | String   | Family name of the lead.                                                                                                                                                                          |
    | `fullname`               | String   | Display name of the lead.                                                                                                                                                                         |
    | `email`                  | String   | Email address of the lead.                                                                                                                                                                        |
    | `phone`                  | String   | Landline number of the lead.                                                                                                                                                                      |
    | `whatsapp`               | String   | WhatsApp number of the lead.                                                                                                                                                                      |
    | `mobile`                 | String   | Mobile number of the lead.                                                                                                                                                                        |
    | `address`                | String   | Street address of the lead.                                                                                                                                                                       |
    | `city`                   | String   | City of the lead.                                                                                                                                                                                 |
    | `state`                  | String   | State or province of the lead.                                                                                                                                                                    |
    | `country`                | String   | Country of the lead, in English.                                                                                                                                                                  |
    | `zipcode`                | String   | Postal code of the lead.                                                                                                                                                                          |
    | `timezone`               | String   | IANA time zone of the lead.                                                                                                                                                                       |
    | `preferred_locale`       | String   | Language the lead is contacted in.                                                                                                                                                                |
    | `company`                | Integer  | Identifier of the company the lead belongs to.                                                                                                                                                    |
    | `owner`                  | Integer  | Identifier of the user who owns the lead.                                                                                                                                                         |
    | `stage`                  | Integer  | Identifier of the lifecycle stage the lead is in.                                                                                                                                                 |
    | `points`                 | Integer  | Lead scoring total of the lead.                                                                                                                                                                   |
    | `photo_url`              | String   | URL of the lead's picture.                                                                                                                                                                        |
    | `instancedomain`         | String   | SprintHub instance the lead belongs to.                                                                                                                                                           |
    | `create_date`            | Datetime | Timestamp when the lead was created.                                                                                                                                                              |
    | `created_by`             | Integer  | Identifier of the user who created the lead.                                                                                                                                                      |
    | `created_by_name`        | String   | Name of the user who created the lead, or 'System' when it was created automatically.                                                                                                             |
    | `created_by_type`        | String   | How the lead entered the instance (form, import, API, …).                                                                                                                                         |
    | `updated_date`           | Datetime | Timestamp when the lead was last changed.                                                                                                                                                         |
    | `updated_by`             | Integer  | Identifier of the user who last changed the lead.                                                                                                                                                 |
    | `updated_by_name`        | String   | Name of the user who last changed the lead.                                                                                                                                                       |
    | `last_active`            | Datetime | Timestamp of the lead's most recent tracked activity.                                                                                                                                             |
    | `ips`                    | Array    | IP addresses the lead has been seen from.                                                                                                                                                         |
    | `ignore_sub_departments` | Boolean  | Whether access to the lead is restricted to the exact departments listed, ignoring their sub-departments.                                                                                         |
    | `channel_restrictions`   | String   | Per-channel contact rules for the lead — main channel, whether the channel is disabled and its frequency cap (JSON object).                                                                       |
    | `utm_tags`               | String   | UTM parameters recorded for the lead (JSON array of objects).                                                                                                                                     |
    | `user_access`            | String   | Users granted explicit access to the lead (JSON array).                                                                                                                                           |
    | `department_access`      | String   | Departments granted access to the lead (JSON array).                                                                                                                                              |
    | `notes`                  | String   | Notes attached to the lead (JSON array of objects).                                                                                                                                               |
    | `tags`                   | String   | Tags applied to the lead (JSON array of objects).                                                                                                                                                 |
    | `custom_fields`          | String   | Every field beyond the fixed ones above, keyed by the custom field alias defined in this SprintHub instance (JSON object). Custom fields vary per instance, so they cannot be individual columns. |
  </Accordion>

  <Accordion title="Lead Custom Objects">
    Custom object records attached to each contact (`GET /lead/customobjects/{id}`) — support tickets, contracts, or whatever object types your instance defines. Reading it costs **one API call per contact**.

    Primary key: `lead_id`, `id`

    | Field           | Type    | Description                                                                                                                                                   |
    | :-------------- | :------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------ |
    | `id`            | Integer | Unique identifier of the custom object record.                                                                                                                |
    | `lead_id`       | Integer | Identifier of the lead the record is attached to.                                                                                                             |
    | `definition_id` | Integer | Identifier of the custom object type this record belongs to, joinable with the 'custom\_object\_definitions' stream.                                          |
    | `document`      | String  | The whole record as returned by the API (JSON object). A custom object's fields are defined by each SprintHub instance, so they cannot be individual columns. |
  </Accordion>

  <Accordion title="Attendances">
    SAC 360 conversations, one row per conversation across every channel (`GET /sac360/lead/{id}`). Reading it costs **one API call per contact**.

    Primary key: `id`

    | Field                      | Type     | Description                                                                                               |
    | :------------------------- | :------- | :-------------------------------------------------------------------------------------------------------- |
    | `id`                       | Integer  | Unique identifier of the conversation.                                                                    |
    | `lead_id`                  | Integer  | Identifier of the lead this conversation belongs to.                                                      |
    | `status`                   | String   | Current status of the conversation in the SAC 360 inbox.                                                  |
    | `attendant`                | Integer  | Identifier of the agent assigned to the conversation.                                                     |
    | `attendant_name`           | String   | Name of the agent assigned to the conversation.                                                           |
    | `user_client`              | String   | Identifier of the contact's user account on the channel.                                                  |
    | `user_attendance`          | String   | Account or login handling the conversation.                                                               |
    | `department`               | Integer  | Identifier of the department the conversation is routed to.                                               |
    | `name`                     | String   | Display name the contact uses on the channel.                                                             |
    | `lead_name`                | String   | Name of the lead as registered in SprintHub.                                                              |
    | `name_contact`             | String   | Name saved for the contact on the channel account.                                                        |
    | `type`                     | String   | Channel the conversation happens on (for example 'whatsapp', 'instagram', 'messenger').                   |
    | `recipientid`              | String   | Channel-native address of the contact. For WhatsApp it is the phone number followed by `@s.whatsapp.net`. |
    | `accid`                    | String   | Channel account that received or started the conversation.                                                |
    | `whatsapp_acc`             | Integer  | Identifier of the WhatsApp account used in the conversation.                                              |
    | `whatsapp_number`          | String   | WhatsApp number involved in the conversation.                                                             |
    | `whatsapp_oficial`         | Boolean  | Whether the conversation runs on the official WhatsApp Business API (WABA) rather than on WhatsApp Web.   |
    | `is_group`                 | Boolean  | Whether the conversation is a group chat.                                                                 |
    | `chat_group`               | String   | Identifier of the group the conversation belongs to.                                                      |
    | `start_date`               | Datetime | Timestamp when the conversation started.                                                                  |
    | `end_date`                 | Datetime | Timestamp when the conversation was closed, null while open.                                              |
    | `star`                     | Integer  | Star or flag the agent set on the conversation.                                                           |
    | `evaluation`               | Integer  | Satisfaction rating the contact gave for the conversation.                                                |
    | `obs`                      | String   | Free-text note the agents left on the conversation.                                                       |
    | `mautic_relation`          | Integer  | Identifier of the lead the conversation is linked to.                                                     |
    | `opportunity`              | Integer  | Identifier of the CRM opportunity linked to the conversation.                                             |
    | `post_id`                  | String   | Social post the conversation originated from.                                                             |
    | `page_id`                  | String   | Social page the conversation originated from.                                                             |
    | `comment_id`               | String   | Social comment the conversation originated from.                                                          |
    | `comment_txt`              | String   | Text of the social comment the conversation originated from.                                              |
    | `unread`                   | Integer  | Number of messages not yet read by the agent.                                                             |
    | `last_messsage_user`       | Datetime | Timestamp of the contact's last message. The triple 's' is how the SprintHub API spells this field.       |
    | `last_messsage_attendance` | Datetime | Timestamp of the agent's last message.                                                                    |
    | `pin`                      | Boolean  | Whether the conversation is pinned in the inbox.                                                          |
    | `archive`                  | Boolean  | Whether the conversation has been archived.                                                               |
    | `sequence`                 | Integer  | Position of the conversation in the inbox ordering.                                                       |
    | `photo`                    | String   | URL of the contact's channel profile picture.                                                             |
    | `photo_larger`             | String   | URL of the contact's profile picture in a larger size.                                                    |
    | `photos3`                  | String   | URL of the profile picture mirrored to SprintHub's storage.                                               |
    | `create_date`              | Datetime | Timestamp when the conversation record was created.                                                       |
    | `update_date`              | Datetime | Timestamp when the conversation record was last changed.                                                  |
    | `create_date_unix`         | Integer  | Creation timestamp as a Unix epoch in seconds.                                                            |
    | `update_date_unix`         | Integer  | Last-change timestamp as a Unix epoch in seconds.                                                         |
    | `last_messsage_user_unix`  | Integer  | Contact's last message timestamp as a Unix epoch in seconds.                                              |
  </Accordion>

  <Accordion title="Lead Files">
    Files exchanged in a contact's SAC 360 conversations (`GET /sac360/list_file_lead/{id}`). Reading it costs **one API call per contact**.

    Primary key: `lead_id`, `s3urlcurt`

    | Field       | Type    | Description                                                                                                                                    |
    | :---------- | :------ | :--------------------------------------------------------------------------------------------------------------------------------------------- |
    | `lead_id`   | Integer | Identifier of the lead the file was exchanged with.                                                                                            |
    | `type`      | String  | Kind of file (for example 'video', 'audio', 'image').                                                                                          |
    | `mimetype`  | String  | MIME type of the file (for example 'video/mp4').                                                                                               |
    | `ext`       | String  | File extension without the dot.                                                                                                                |
    | `url`       | String  | Signed URL on the messaging channel's own CDN. These links expire, so they are useful for tracing a file rather than for downloading it later. |
    | `s3url`     | String  | URL of SprintHub's durable copy of the file.                                                                                                   |
    | `s3urlcurt` | String  | Path of the file inside SprintHub's storage, used together with the lead as this row's key.                                                    |
  </Accordion>

  <Accordion title="Funnels">
    The CRM funnels defined in the instance (`GET /crm`).

    Primary key: `id`

    | Field      | Type    | Description                                                                                                                                                                                                         |
    | :--------- | :------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
    | `id`       | Integer | Unique identifier of the funnel, used as the funnel reference on opportunity rows.                                                                                                                                  |
    | `name`     | String  | Name of the funnel as shown in the CRM.                                                                                                                                                                             |
    | `document` | String  | The whole funnel record as returned by the API, including its stages (JSON object). SprintHub does not publish the field list for this endpoint, so it is kept intact rather than trimmed against a partial schema. |
  </Accordion>

  <Accordion title="Funnel Stages">
    The Kanban columns of every funnel (`GET /crm`), flattened out of the funnel records. Join `id` against an opportunity's `crm_column` to get the stage a card sits in.

    Primary key: `id`

    | Field       | Type    | Description                                                                                                                                                                                  |
    | :---------- | :------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
    | `id`        | Integer | Unique identifier of the stage. This is the value that appears as 'crm\_column' on an opportunity.                                                                                           |
    | `funnel_id` | Integer | Identifier of the funnel the stage belongs to.                                                                                                                                               |
    | `name`      | String  | Name of the stage as shown on the Kanban board.                                                                                                                                              |
    | `document`  | String  | The whole stage record as returned by the API (JSON object). SprintHub does not publish the field list for this endpoint, so it is kept intact rather than trimmed against a partial schema. |
  </Accordion>

  <Accordion title="Opportunities">
    CRM opportunities (`POST /crm/opportunities/{funnelId}`), read stage by stage exactly as the Kanban board loads them.

    Primary key: `id`

    | Field                                  | Type     | Description                                                                                                                                                                                                        |
    | :------------------------------------- | :------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
    | `id`                                   | Integer  | Unique identifier of the opportunity.                                                                                                                                                                              |
    | `funnel_id`                            | Integer  | Identifier of the funnel the opportunity belongs to.                                                                                                                                                               |
    | `title`                                | String   | Title of the opportunity card.                                                                                                                                                                                     |
    | `value`                                | Number   | Monetary value of the opportunity.                                                                                                                                                                                 |
    | `crm_column`                           | Integer  | Identifier of the funnel stage the opportunity currently sits in, joinable with the 'funnel\_stages' stream.                                                                                                       |
    | `lead_id`                              | Integer  | Identifier of the lead the opportunity belongs to.                                                                                                                                                                 |
    | `sequence`                             | Integer  | Position of the card within its stage.                                                                                                                                                                             |
    | `status`                               | String   | Whether the opportunity is 'open', 'gain' (won) or 'lost'.                                                                                                                                                         |
    | `is_archived`                          | Boolean  | Whether this row came from the archived view. Archived opportunities are only read when the source is configured to include them.                                                                                  |
    | `user`                                 | Integer  | Identifier of the user responsible for the opportunity.                                                                                                                                                            |
    | `loss_reason`                          | String   | Reason recorded when the opportunity was marked as lost.                                                                                                                                                           |
    | `gain_reason`                          | String   | Reason recorded when the opportunity was marked as won.                                                                                                                                                            |
    | `expected_close_date`                  | Datetime | Date the opportunity is expected to close.                                                                                                                                                                         |
    | `sale_channel`                         | String   | Sales channel attributed to the opportunity.                                                                                                                                                                       |
    | `campaign`                             | String   | Campaign attributed to the opportunity.                                                                                                                                                                            |
    | `last_column_change`                   | Datetime | Timestamp when the opportunity last moved to another stage.                                                                                                                                                        |
    | `last_status_change`                   | Datetime | Timestamp when the opportunity's status last changed.                                                                                                                                                              |
    | `gain_date`                            | Datetime | Timestamp when the opportunity was marked as won.                                                                                                                                                                  |
    | `lost_date`                            | Datetime | Timestamp when the opportunity was marked as lost.                                                                                                                                                                 |
    | `reopen_date`                          | Datetime | Timestamp when a closed opportunity was reopened.                                                                                                                                                                  |
    | `await_column_approved`                | Integer  | Stage the opportunity is waiting approval to move into.                                                                                                                                                            |
    | `await_column_approved_user`           | Integer  | Identifier of the user who has to approve the stage change.                                                                                                                                                        |
    | `reject_appro`                         | Boolean  | Whether the pending stage change was rejected.                                                                                                                                                                     |
    | `reject_appro_desc`                    | String   | Reason given for rejecting the stage change.                                                                                                                                                                       |
    | `create_date`                          | Datetime | Timestamp when the opportunity was created.                                                                                                                                                                        |
    | `update_date`                          | Datetime | Timestamp when the opportunity was last changed.                                                                                                                                                                   |
    | `sprint_permission`                    | String   | Visibility rule applied to the opportunity (for example 'all').                                                                                                                                                    |
    | `sprint_permission_user`               | Integer  | User the opportunity's visibility is restricted to.                                                                                                                                                                |
    | `sprint_permission_department`         | Integer  | Department the opportunity's visibility is restricted to.                                                                                                                                                          |
    | `sprint_permission_users`              | String   | Users allowed to see the opportunity (JSON array).                                                                                                                                                                 |
    | `sprint_permission_users_select`       | String   | Users offered in the visibility selector (JSON array).                                                                                                                                                             |
    | `sprint_permission_departments`        | String   | Departments allowed to see the opportunity (JSON array).                                                                                                                                                           |
    | `sprint_permission_departments_select` | String   | Departments offered in the visibility selector (JSON array).                                                                                                                                                       |
    | `fields`                               | String   | The instance's custom CRM fields for this opportunity, keyed by field name (JSON object). Custom fields vary per instance, so they cannot be individual columns.                                                   |
    | `files`                                | String   | Files attached to the opportunity (JSON array).                                                                                                                                                                    |
    | `data_company`                         | String   | The company linked to the opportunity, with its full record — name, CNPJ, address, industry, revenue (JSON object). SprintHub exposes no endpoint that lists companies, so this is the only route to company data. |
  </Accordion>

  <Accordion title="Tags">
    The instance's tag vocabulary (`GET /tags`).

    Primary key: `id`

    | Field   | Type    | Description                                                 |
    | :------ | :------ | :---------------------------------------------------------- |
    | `id`    | Integer | Unique identifier of the tag.                               |
    | `tag`   | String  | Name of the tag.                                            |
    | `color` | String  | Colour the tag is displayed in, as configured in SprintHub. |
  </Accordion>

  <Accordion title="Custom Object Definitions">
    The custom object types the instance declares and the fields each one has (`GET /customobjects/def`).

    Primary key: `id`

    | Field                  | Type    | Description                                                                                                                                                       |
    | :--------------------- | :------ | :---------------------------------------------------------------------------------------------------------------------------------------------------------------- |
    | `id`                   | Integer | Unique identifier of the custom object type. This is the value that appears as 'definition\_id' on a custom object record.                                        |
    | `name`                 | String  | Singular name of the object type.                                                                                                                                 |
    | `plural_name`          | String  | Plural name of the object type, as shown in lists.                                                                                                                |
    | `is_published`         | Boolean | Whether the object type is active and available for use.                                                                                                          |
    | `allow_dynamic_insert` | Boolean | Whether records of this type can be created on the fly, for example from an automation or an API call.                                                            |
    | `relationship`         | String  | The entity this object type relates to (JSON object).                                                                                                             |
    | `fields`               | String  | The fields this object type declares — label, alias, type, default value, whether it is required and whether it is the unique identifier (JSON array of objects). |
  </Accordion>

  <Accordion title="Calendars">
    Scheduling calendars and their public booking links (`GET /pcalendar`).

    Primary key: `id`

    | Field          | Type     | Description                                                                                                            |
    | :------------- | :------- | :--------------------------------------------------------------------------------------------------------------------- |
    | `id`           | Integer  | Unique identifier of the calendar.                                                                                     |
    | `name`         | String   | Name of the calendar.                                                                                                  |
    | `is_published` | Boolean  | Whether the calendar's public booking link is active.                                                                  |
    | `public_id`    | String   | Public key of the calendar — the last segment of its booking URL, and the 'keyName' used when booking through the API. |
    | `user_id`      | Integer  | Identifier of the user the calendar belongs to.                                                                        |
    | `next_meeting` | Datetime | Timestamp of the next meeting booked on the calendar.                                                                  |
    | `create_date`  | Datetime | Timestamp when the calendar was created.                                                                               |
    | `update_date`  | Datetime | Timestamp when the calendar was last changed.                                                                          |
  </Accordion>

  <Accordion title="Calendar Meetings">
    Meetings booked on each calendar (`GET /calendarmeeting/{calendarId}`), from the initial sync date onwards.

    Primary key: `calendar_id`, `id`

    | Field            | Type     | Description                                                                                                                                                                                    |
    | :--------------- | :------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
    | `id`             | Integer  | Unique identifier of the meeting.                                                                                                                                                              |
    | `calendar_id`    | Integer  | Identifier of the calendar the meeting was booked on.                                                                                                                                          |
    | `date`           | Datetime | Date and time of the meeting, in UTC.                                                                                                                                                          |
    | `lead_id`        | Integer  | Identifier of the lead the meeting was booked for.                                                                                                                                             |
    | `opportunity_id` | Integer  | Identifier of the CRM opportunity the meeting belongs to.                                                                                                                                      |
    | `document`       | String   | The whole meeting record as returned by the API (JSON object). SprintHub does not publish the field list for this endpoint, so it is kept intact rather than trimmed against a partial schema. |
  </Accordion>

  <Accordion title="Advanced Reports">
    The custom reports defined in the instance (`GET /advancedreports`).

    Primary key: `id`

    | Field      | Type    | Description                                                                                                                                                                                       |
    | :--------- | :------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
    | `id`       | Integer | Unique identifier of the report.                                                                                                                                                                  |
    | `name`     | String  | Name given to the report.                                                                                                                                                                         |
    | `document` | String  | The whole report definition as returned by the API (JSON object). SprintHub does not publish the field list for this endpoint, so it is kept intact rather than trimmed against a partial schema. |
  </Accordion>

  <Accordion title="Report Charts">
    The computed result of each custom report (`GET /reportchart/{id}`). SprintHub does not recalculate these on every call and advises reading each one at most three times a day.

    Primary key: `report_id`

    | Field       | Type    | Description                                                                                                                                                        |
    | :---------- | :------ | :----------------------------------------------------------------------------------------------------------------------------------------------------------------- |
    | `report_id` | Integer | Identifier of the report this result belongs to, joinable with the 'advanced\_reports' stream.                                                                     |
    | `document`  | String  | The computed report result as returned by the API (JSON object). A custom report's shape depends on how the customer built it, so it cannot be individual columns. |
  </Accordion>
</AccordionGroup>
