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

# Dropbox Personal

> Sync files from your personal Dropbox account

<div className="max-w-2xl mx-auto mt-12">
  <div className="p-6 border rounded-lg bg-blue-50">
    <div className="flex items-center mb-4">
      <img src="https://mintcdn.com/pipeshub/8k-iBPRh1yJZHQe1/logo/dropbox.png?fit=max&auto=format&n=8k-iBPRh1yJZHQe1&q=85&s=0744ad48a6ebbbaf04901f0d853f5b21" alt="Dropbox Personal Logo" className="w-8 h-8 mr-3 object-contain flex-shrink-0" width="554" height="554" data-path="logo/dropbox.png" />

      <h2 className="text-2xl text-indigo-800 font-semibold m-0">Dropbox Personal</h2>
    </div>

    <p className="text-lg text-gray-700 mb-4">Sync files and folders from individual accounts</p>

    <div className="flex items-center gap-2">
      <span className="px-3 py-1 bg-green-100 text-green-800 rounded-full text-sm font-medium">
        ✅ Ready
      </span>

      <span className="px-3 py-1 bg-blue-100 text-blue-800 rounded-full text-sm font-medium">
        📚 Documentation Available
      </span>
    </div>
  </div>
</div>

## Overview

The Dropbox Personal connector allows you to sync files and folders from a single, individual Dropbox account. Unlike the Team connector, this focuses on your personal "Home" drive and does not import organization-wide team structures or groups.

***

## Configuration Guide

<AccordionGroup>
  <Accordion title="Understanding Dropbox Personal API" icon="info">
    ### User Client

    This connector uses the **Dropbox User Client**. It is designed to interact with a specific user's account data. It treats the root of your Dropbox as the "Record Group" (Drive) and syncs content recursively from there.

    ### APIs Documentation

    * **Dropbox HTTP API:** [https://www.dropbox.com/developers/documentation/http/documentation](https://www.dropbox.com/developers/documentation/http/documentation)

    ### Concept of Cursor

    A **cursor** is a short string that acts like a bookmark for keeping track of changes in a folder.

    1. When you first list the contents of a folder, the API response includes a cursor.
    2. This cursor represents the exact state of that folder at that moment.
    3. Instead of re-downloading the entire list of files to check for changes, the connector passes that cursor to the `/files/list_folder/continue` endpoint.
    4. The API then returns only the files and folders that have been added, modified, or deleted since the last sync.

    This makes syncing highly efficient as you only process the differences.
  </Accordion>

  <Accordion title="Create Dropbox App" icon="rocket">
    This guide will walk you through creating a Dropbox application to connect your personal account to PipesHub.

    ### Step 1: Create a Dropbox App

    1. Navigate to the [Dropbox App Console](https://www.dropbox.com/developers/apps) and sign in with your Dropbox credentials.
    2. Click the **Create app** button on the top right.

    <img src="https://mintcdn.com/pipeshub/Vq3u-FQEW1A2QMMd/images/connectors/dropbox/db1.png?fit=max&auto=format&n=Vq3u-FQEW1A2QMMd&q=85&s=7ba8f39a6ff84411ccb5ef5db9cc4e9f" alt="Dropbox Create App" style={{ display: 'block', margin: '0 auto' }} width="90%" data-path="images/connectors/dropbox/db1.png" />

    3. Configure your new app with the following settings:
       * **Choose an API:** Select **Scoped access**.
       * **Type of access:** Select **Full Dropbox**. (This allows access to all files in your account, not just a specific app folder).
       * **Name your app:** Enter a unique name, for example, "Pipeshub Personal Connector".

    4. Click **Create app**. You will be redirected to your new app's settings page.

    ### Step 2: Configure Permissions

    1. On your app's page, navigate to the **Permissions** tab.

    <img src="https://mintcdn.com/pipeshub/Vq3u-FQEW1A2QMMd/images/connectors/dropbox/db2.png?fit=max&auto=format&n=Vq3u-FQEW1A2QMMd&q=85&s=57949a3d3f826e4bdd2879572d43b569" alt="Dropbox Permissions" style={{ display: 'block', margin: '0 auto' }} width="90%" data-path="images/connectors/dropbox/db2.png" />

    2. You must enable the following **Individual Scopes** by checking their boxes to allow PipesHub to access your data:

       * `account_info.read` (Required to identify your user ID and email)

       * `files.content.read` (Required to download file content)

       * `files.metadata.read` (Required to track file names, types, and updates)

       * `sharing.read` (Required to detect shared link permissions)

       * `sharing.write` (Required to create preview links)

       > **Note:** You do **not** need to check any "Team Scopes" as this connector is for individual accounts only.

    3. Click **Submit** at the bottom of the page to save these changes.

    ### Step 3: Configure Redirect URI

    1. Go to the **Settings** tab and find the **OAuth 2** section.
    2. Add the following URL to the **Redirect URIs** field (replace `{your_pipeshub_base_url}` with your actual domain):

    ```
    http://{your_pipeshub_base_url}/connectors/oauth/callback/Dropbox%20Personal
    ```

    > **Important:** Ensure the URL matches exactly what is configured in your connector code (specifically the `Dropbox%20Personal` suffix).

    3. Click **Add** to save the URI.

    <img src="https://mintcdn.com/pipeshub/09K5IFzzxv6GZ67T/images/connectors/dropbox/dbp1.png?fit=max&auto=format&n=09K5IFzzxv6GZ67T&q=85&s=2eb52b6f47eb99d085705c9e54b2a4df" alt="Dropbox Redirect URI" style={{ display: 'block', margin: '0 auto' }} width="90%" data-path="images/connectors/dropbox/dbp1.png" />

    ### Step 4: Copy App Key and Secret

    1. While in the **Settings** tab, locate the **App key** and **App secret**.
    2. Click **Show** to reveal the secret.
    3. Copy these credentials for the next step.
  </Accordion>

  <Accordion title="Connect to PipesHub" icon="plug">
    ### Step 1: Configure Connection

    1. Navigate to **Workspace Settings** > Under **Personal** section in sidebar > **Your Connectors** in your application.

    <div style={{ textAlign: "center" }}>
      <img src="https://mintcdn.com/pipeshub/peqXiQTHnfn36LHG/images/connectors/common/go_to_workspace_settings.png?fit=max&auto=format&n=peqXiQTHnfn36LHG&q=85&s=664212df297af991dde25b2cac7ebaef" alt="Go to Workspace Settings" style={{ display: 'block', margin: '0 auto' }} width="90%" data-path="images/connectors/common/go_to_workspace_settings.png" />
    </div>

    2. You will see a list of connectors with Individual Setup.

    <div style={{ textAlign: "center", padding: "5px" }}>
      <img src="https://mintcdn.com/pipeshub/peqXiQTHnfn36LHG/images/connectors/common/personal_connectors_list.png?fit=max&auto=format&n=peqXiQTHnfn36LHG&q=85&s=299362d18b7b15df7a33631b710201fc" alt="Connector registry" style={{ display: 'block', margin: '0 auto' }} width="80%" data-path="images/connectors/common/personal_connectors_list.png" />
    </div>

    3. Search for the **Dropbox** connector and click on **Setup** to configure a connector instance.

    4. In the configuration dialog that opens:
       * Enter an **Instance Name** for your connector (e.g., "Dropbox Personal")
       * Enter the **App key** from your Dropbox App Console
       * Enter the **App secret** from your Dropbox App Console
       * Click on the **Next** button to save the configuration and move to Authorize page.

    <div style={{ textAlign: "center" }}>
      <img src="https://mintcdn.com/pipeshub/5fEFsRT92LLHDL9o/images/connectors/dropbox/dropbox_personal_configuration.png?fit=max&auto=format&n=5fEFsRT92LLHDL9o&q=85&s=ea2672d45207cb69222512db34e76862" alt="Dropbox Configuration" width="90%" data-path="images/connectors/dropbox/dropbox_personal_configuration.png" />
    </div>

    ### Step 2: Authorize Dropbox

    1. In the Authorize page that opens:
       * Click on **Authenticate Dropbox to Proceed** button
       * You will be redirected to Dropbox's consent screen where you need to sign in and grant permission for Dropbox and related document access

    <div style={{ textAlign: "center" }}>
      <img src="https://mintcdn.com/pipeshub/5fEFsRT92LLHDL9o/images/connectors/dropbox/dropbox_personal_consent_screen.png?fit=max&auto=format&n=5fEFsRT92LLHDL9o&q=85&s=e1ac0cb2610673c68e29b5f656f6a8fc" alt="Dropbox consent screen for Dropbox connector" width="90%" data-path="images/connectors/dropbox/dropbox_personal_consent_screen.png" />
    </div>

    <Warning>
      **Important:** Authorize using the same email address as your PipesHub account. Using a different email will cause permission issues on the PipesHub platform.
    </Warning>

    <Note>
      Configuring OAuth App can only be performed by Admins. If you are not an Admin, you must request an Admin to configure the OAuth App for you. You can then access configured OAuth Apps via a dropdown menu.
    </Note>

    2. After giving consent, you can click on **Continue to configuration** to configure connector settings. More about it in the next section.
  </Accordion>

  <Accordion title="Connector Settings" icon="gear">
    ## Sync Settings

    Sync settings allow you to control how the connector syncs data from Dropbox.

    **Sync Strategy:**

    * **Scheduled** - The connector will automatically sync data from Dropbox at the scheduled interval.
    * **Manual** - The connector will sync data from Dropbox only when Admin manually triggers the sync from the connector settings page.

    **Sync Interval:**
    How often the connector syncs data (default: 60 minutes).

    ### Sync Filters

    Sync filters control which files are fetched from Dropbox. Files that don't match are skipped entirely. Folders are always synced regardless of these settings to preserve directory structure.

    ### Created Date

    Filters files by when they were created. Accepts operators like `Last 365 Days`, `Is After`, `Is Before`, or `Is Between` for a specific range.

    For example, set `Last 365 Days` to fetch only files created in the last year.

    ### Modified Date

    Same as Created Date but filters by the file's last modified timestamp. Use `Last 30 Days` or `Is After` to limit sync to recently updated files.

    ### File Extensions

    Extensions filter support 2 options: `In` (only sync listed extensions) or `Not In` (sync everything except listed extensions). After selecting your desired option, you can select your desired extensions from a list of supported extensions.

    <Note>
      Unsupported extensions are excluded under `In` and allowed through under `Not In`.
    </Note>

    ***

    ## Indexing Filters

    Indexing filters control which synced files are made searchable. Unlike sync filters, these don't prevent files from being fetched — files are still recorded in the system but their indexing status is set to **Manual Indexing**.

    They can be manually indexed later from the **All Records** section.

    ### Manual Indexing

    When enabled, files are synced but not automatically indexed. They won't appear in search results until explicitly indexed.

    This can allow you to explicitly control which files and folders are indexed for search, by going to the **All Records** section and indexing the records manually.

    ### Index Shared Items

    When enabled, files shared with others are indexed alongside personal files. Disable this to exclude shared content and index only files originating from a user's own drive.

    <div style={{ textAlign: "center" }}>
      <img src="https://mintcdn.com/pipeshub/5fEFsRT92LLHDL9o/images/connectors/dropbox/dropbox_filters_example.png?fit=max&auto=format&n=5fEFsRT92LLHDL9o&q=85&s=4056816c093075604199fae45b6f34c5" alt="Dropbox Configuration" width="90%" data-path="images/connectors/dropbox/dropbox_filters_example.png" />
    </div>
  </Accordion>
</AccordionGroup>

***

## Connector Workflow

<AccordionGroup>
  <Accordion title="Synchronization Process" icon="sync">
    ### How Does Dropbox Personal Connector Work?

    The `DropboxIndividualConnector` inherits from `BaseConnector` but is simplified for single-user contexts. It implements the standard lifecycle methods:

    * `init`
    * `_get_current_user_info`
    * `run_sync`
    * `_run_sync_with_cursor`
    * `_process_dropbox_items_generator`

    ### Connector Initialization

    The workflow is straightforward compared to the Teams version.
    **`run_sync`** - Syncs 3 main elements:

    1. **User Identity** (The account owner)
    2. **Record Group** (The "Personal Drive")
    3. **Files and Folders** (Recursive sync)

    The system uses an **Incremental component** which saves a **'cursor'** in the database.

    * **Full Sync:** If no cursor is initialized, it runs a full sync.
    * **Incremental Sync:** If a cursor exists, it only fetches the delta (changes).

    ***

    ## User & Record Group Sync Workflow

    Unlike the Team connector which iterates through member directories, this connector focuses on the authenticated user.

    ### Identity Resolution

    The sync begins by calling `users/get_current_account`. This verifies the token and retrieves the `account_id` and `email` of the owner.

    ### Drive Creation

    Once the user is identified, the system ensures a "Record Group" exists:

    * **Name:** "Dropbox - `{User Email}`"
    * **Type:** Drive
    * **Permission:** The user is assigned as the **OWNER**.

    ***

    ## Files and Folders Sync Workflow

    ### Workflow Overview

    1. **Cursor Check:** The connector checks `dropbox_cursor_sync_point` to see if a previous sync has occurred.
    2. **Data Fetching:**

    * **Full Sync:** If no cursor exists, it calls `files/list_folder` with `recursive=True` to fetch the entire drive hierarchy.
    * **Incremental Sync:** If a cursor exists, it calls `files/list_folder/continue`. Dropbox returns only items that changed since the last run.

    3. **Generator Processing:** The results are passed to `_process_dropbox_items_generator` which yields items one by one to manage memory usage.

    ### Detailed Item Processing

    For each entry, the system determines the specific metadata type and handles it accordingly:

    1. **File Metadata (`FileMetadata`)**:

    * **Duplicate Check:** Calls `get_record_by_external_id` to see if the file is already in the database.
    * **Metadata Extraction:** Extracts MimeType (based on extension) and `server_modified` timestamps.
    * **Preview Generation:** Attempts to generate a web-viewable link using `sharing/create_shared_link_with_settings`.

    2. **Folder Metadata (`FolderMetadata`)**:

    * Processed similarly to files but marked as a container type to maintain directory structure.

    3. **Deleted Metadata (`DeletedMetadata`)**:

    * If Dropbox sends a deletion event, the record is flagged for removal.

    ### Database Updates

    * **New Records:** Batched (default 100) and sent to `on_new_records`.
    * **Updates:** If the file hash or name changed, `on_record_content_update` or `on_record_metadata_update` is triggered.
    * **Deletions:** Records marked as deleted are removed via `on_record_deleted`.

    ***

    ## Sharing & Permissions Sync

    ### Simplified Model

    Unlike the Teams connector which maps complex organizational roles (e.g., Editor, Viewer, Commenter), the Personal connector uses a simplified permission model.

    1. **Default Ownership:** Since this connector syncs a private drive, the authenticated user is automatically assigned **OWNER** permissions for every file and folder.
    2. **Shared Links:** The connector uses `sharing.read` to detect if a file has shared links. While it does not import the list of external users, it ensures the file metadata reflects that it is shared.
  </Accordion>
</AccordionGroup>

***

## FAQ

<AccordionGroup>
  <Accordion title="Queries not returning results. What could be wrong?">
    There are three common causes:

    1. **Email mismatch** - The email used during connector authentication doesn't match your PipesHub account email. This causes permission issues preventing you from accessing synced data.
       * **Fix:** Reconfigure the connector and authenticate using the same email as your PipesHub account.

    2. **Records show in "All Records" but not in search** - Documents display in the All Records section but don't appear in search query results.
       * **Fix:** Verify sync filters in the connector settings and ensure indexing has completed. Check that the data matches your search query criteria.

    3. **Data not yet indexed** - The connector is still syncing or hasn't completed the initial indexing process.
       * **Fix:** Go to **Settings > Connectors**, check the sync status, and wait for indexing to complete.
  </Accordion>
</AccordionGroup>
