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

# Dripify as a data source

> Bring your Dripify LinkedIn campaigns, their daily numbers, leads and each lead's activity to Nekt.

Dripify is a LinkedIn prospecting automation tool: it runs campaigns that send connection requests, messages and follow-ups to lists of leads, and reports how many leads accepted and replied. This connector brings your campaigns, a daily snapshot of each campaign's numbers, your lead lists and leads, every action Dripify recorded on each lead, your tags and your teams to the Catalog, so you can follow your campaigns over time next to your other data.

> [!NOTE]
>
> The connector only reads data. It never creates, changes or deletes anything in Dripify.

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

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

### 1. Add account access

The connector uses a Dripify **API key**. The Dripify API is available on the **Pro, Advanced and Enterprise** plans. To create a key:

1. Log in to Dripify with the user whose campaigns you want to bring. The API returns that user's campaigns and leads, and the teams that user belongs to.
2. Open **Settings > API & Integrations**, find the **API Key** block and click **Generate**.
3. Copy the key. If you revoke it later, every integration that uses it stops working.

The following configurations are available:

* **API Key**: the key generated above.

* **Start Date** (advanced): Lead Activity and Lead Details only read leads whose most recent action is on or after this date. Leave it empty to read every lead.

* **Max Requests per Run** (advanced): (Default: 4000) the most requests one run may make, from 20 to 5000. A run also never goes past what is left of the day's 5,000 requests (UTC), counting the earlier runs of the same day.

* **Max Requests per Minute** (advanced): (Default: 50) how many requests per minute each run may make, from 1 to 60.

* **Lookback Hours** (advanced): (Default: 6) when Lead Activity and Lead Details have no leads pending, each run also reads again the leads whose most recent action is up to this many hours before the most recent action already read, to catch actions Dripify records late.

> [!WARNING]
>
> Dripify allows **5,000 requests per day** and **60 per minute** for each API key, shared with every other integration that uses the same key. Each run stops at **Max Requests per Run**, and the connector counts the requests of all its runs of the same day (UTC) so they stay under 5,000 together. If the key is also used by another tool, lower **Max Requests per Run** to leave room for it.

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]
>
> **Lead Activity** and **Lead Details** cost **one request per lead**: Dripify has no way to list what changed, so each run reads only the leads that had a new action since the previous run (usually a few hundred a day). The **first run**, however, reads every lead that was ever contacted. When an account has more leads than one run can read, the run reads as many as it can, oldest first, and keeps them; the next runs continue right after the last lead read until every lead is read. With the default settings, an account with 10,000 contacted leads takes about 3 runs with Lead Activity alone, or about 6 with both streams. Set a recent **Start Date** to read less history.
>
> While leads are still pending, a run that read some of them **succeeds with a warning** in its log (how many leads were read, how many are pending, and up to which date the data is complete). A run is marked as **failed** when a lead stream could not read any lead at all, or when leads have been pending for more than **7 days**: raise **Max Requests per Run**, set a more recent **Start Date** or deselect Lead Details.

> [!NOTE]
>
> The other streams cost about one request per campaign, plus one request per 100 leads for Leads and for Campaign Leads. A typical daily run of an account with 30 campaigns, 10,000 leads and about 150 leads with new actions makes about 700 requests and takes about 14 minutes.

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**: Campaign Statistics, Lead Activity and Lead Details are INCREMENTAL, which is the recommended type for them. The other streams are FULL\_TABLE: they are read in full on every run, so their tables always show the current state. Read more about Sync Types [here](https://docs.nekt.com/get-started/core-concepts/types-of-sync).

> [!WARNING]
>
> Dripify only gives each campaign's numbers **as they are now**, with no history. **Campaign Statistics** builds the history itself, keeping one row per campaign per day; the day (`snapshot_date`) is the UTC day of the run, and when several runs happen on the same UTC day, the last one wins. A full sync of this stream (or an [Additional Full Sync](https://docs.nekt.com/get-started/core-concepts/types-of-sync#additional-full-sync)) replaces the table with today's row only, and the earlier days cannot be read again from Dripify. Do not use full syncs on this stream.

> [!NOTE]
>
> Lead Details is refreshed when the lead has a new action. A change without an action, such as a lead paused by hand, appears with the lead's next action, or with a full sync of Lead Details when every lead fits in one run's **Max Requests per Run** (a full sync that does not fit is not done, and the table is kept as it was). Tags are always current in Leads and Campaign Leads. A lead that was never contacted (no action yet) appears in Leads and Campaign Leads, and in Lead Details and Lead Activity only after its first action.

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. **Once a day** is recommended: Campaign Statistics keeps one row per campaign per day, and the daily request limit is shared by all runs of the day.

> [!WARNING]
>
> While the first runs are still reading the leads' history, a schedule with **several runs per day** spends the day's 5,000 requests in the first run, so the next runs of that day fail before reading anything. Three failed runs in a row pause the source. During that period keep **one run per day**, or lower **Max Requests per Run** so that all the runs of a day fit in 5,000 requests.

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). Avoid it for this source: it would erase the history of Campaign Statistics, and a full sync of Lead Activity or Lead Details reads every lead again, so it is only done when every lead fits in one run's **Max Requests per Run** (otherwise it is skipped with an error and those tables are kept).

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.

> [!NOTE]
>
> Each run first checks the API key with one request. If the key was revoked, the plan does not include the API, or the API is switched off for the account, the run stops before writing anything and the log says what to check. If a run reaches its request limit or Dripify's daily limit while reading a table that is replaced in full, the run stops before writing that table, so it is never replaced by a partial read. If Dripify answers 'not found' for a campaign or team that it still lists, the run stops instead of treating it as deleted. For leads, a 'not found' only counts as a deleted lead when Dripify still answers for another lead on the same request and the lead answers 'not found' once more; otherwise the run stops.

# 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 |
| - | - | - |
| Campaigns | `campaigns` | Every campaign of the account, with its status. |
| Campaign Statistics | `campaign_statistics` | One snapshot per campaign per day (UTC) of the campaign's numbers: total and contacted leads, acceptance and reply rates, and where its leads stand. |
| Lead Lists | `lead_lists` | The lead lists of every campaign. |
| Tags | `tags` | The tags of your account. |
| Custom Lead Fields | `custom_lead_fields` | The definitions of your custom lead fields. |
| Teams | `teams` | The teams your user belongs to, with team-wide numbers when you own or manage the team. |
| Team Members | `team_members` | Members of the teams you own or manage, with each member's acceptance and reply rates. |
| Leads | `leads` | Every lead, once each, with its most recent action and tags. |
| Campaign Leads | `campaign_leads` | The leads of each campaign, one row per campaign and lead. |
| Lead Activity | `lead_activity` | Every action recorded on each lead, one row per action. Costs one request per lead with new actions. |
| Lead Details | `lead_details` | The full profile of each contacted lead, including emails, company and its state in each campaign. Costs one request per lead with new actions. |

Lists of objects (tags, the lead's campaigns) are JSON text. Every timestamp is in UTC. Rates are percents.

> [!NOTE]
>
> Dripify's documentation does not say how draft or locked campaigns answer on their statistics and lead lists. This is checked on the first real run: if Dripify answers 'not found' for such a campaign while still listing it, the Campaign Statistics and Lead Lists runs stop with an error, and Nekt support adjusts the connector.

> [!NOTE]
>
> The connector does not bring the text of LinkedIn conversations: Dripify reads them from LinkedIn on every request, which does not fit its daily request limit for a whole account.

## Fields by stream

> **Campaigns**
>
> Every campaign of the account.
>
> Table: `campaigns` · Primary key: `id` · Sync: Full table
>
> | Field | Type | Description |
> | :- | :- | :- |
> | `id` | Integer | Unique identifier of the campaign in Dripify. |
> | `name` | String | Name of the campaign. |
> | `status` | String | Run state of the campaign: DRAFT, NOT\_ACTIVE or ACTIVE. |
> | `locked` | Boolean | Whether the campaign is locked, for example because the plan's limit was reached. |
> | `created_at` | Datetime | When the campaign was created (UTC). |

> **Campaign Statistics**
>
> One snapshot per campaign per day (UTC) of the numbers the Dripify campaign screen shows: leads, contacted leads, acceptance and reply rates, and where the campaign's leads stand. The last run of each UTC day wins.
>
> Table: `campaign_statistics` · Primary key: `campaign_id`, `snapshot_date` · Sync: Incremental (`snapshot_at`), one row per campaign per day
>
> | Field | Type | Description |
> | :- | :- | :- |
> | `campaign_id` | Integer | Identifier of the campaign the statistics belong to. |
> | `snapshot_date` | Date | Day (UTC) the snapshot was taken; one row per campaign per day, the last run of the day wins. |
> | `snapshot_at` | Datetime | When the sync that took the snapshot started (UTC), used as the incremental replication key. |
> | `total_leads` | Integer | Every lead loaded into the campaign (leads still being collected are only in leads\_uploading). |
> | `contacted_leads` | Integer | Unique leads that received at least one outreach step. |
> | `acceptance_rate` | Decimal | Percent of sent connection requests that were accepted (one decimal place). |
> | `acceptance_rate_leads` | Integer | Leads that accepted the connection request. |
> | `reply_rate` | Decimal | Percent of sent messages that got a reply (one decimal place). |
> | `reply_rate_leads` | Integer | Leads that replied. |
> | `lead_lists_count` | Integer | Number of lead lists in the campaign. |
> | `active` | Boolean | Whether the campaign was running. |
> | `search_active` | Boolean | Whether the campaign was still collecting leads. |
> | `transfer_active` | Boolean | Whether a lead transfer into the campaign was in progress. |
> | `leads_in_progress` | Integer | Leads in the sequence (ready for processing, minus waiting and getting ready). |
> | `leads_finished` | Integer | Leads that reached the end of the sequence. |
> | `leads_failed` | Integer | Leads whose sequence ended with an error. |
> | `leads_blacklisted` | Integer | Blacklisted leads, whatever their status (excluded from the other lead counters). |
> | `leads_getting_ready` | Integer | Leads collected but not yet started. |
> | `leads_waiting` | Integer | Leads waiting for their next step to come due. |
> | `leads_paused` | Integer | Leads put on hold. |
> | `leads_uploading` | Integer | Leads still being collected, not yet part of total\_leads. |
> | `leads_transferred` | Integer | Leads transferred into this campaign from another one. |

> **Lead Lists**
>
> The lead lists of every campaign and how far each one has got with collecting its leads.
>
> Table: `lead_lists` · Primary key: `id` · Sync: Full table
>
> | Field | Type | Description |
> | :- | :- | :- |
> | `id` | Integer | Unique identifier of the lead list. |
> | `campaign_id` | Integer | Identifier of the campaign the lead list belongs to. |
> | `name` | String | Name of the lead list. |
> | `created_at` | Datetime | When the lead list was created (UTC). |
> | `total_leads_count` | Integer | How many leads have been collected into the list so far. |
> | `leads_number_to_collect` | Integer | Target size the list is collecting towards. |
> | `search_status` | String | How far the list has got with collecting its leads: READY\_FOR\_SEARCH, SEARCH\_COMPLETE, SEARCH\_PAUSED, READY\_FOR\_TRANSFER or READY\_FOR\_RELOADING. |

> **Tags**
>
> The tags of your account.
>
> Table: `tags` · Primary key: `id` · Sync: Full table
>
> | Field | Type | Description |
> | :- | :- | :- |
> | `id` | Integer | Unique identifier of the tag. |
> | `name` | String | Name of the tag. |
> | `color_id` | Integer | Identifier of the tag's color in Dripify. |
> | `created_at` | Datetime | When the tag was created (UTC; Dripify sends epoch milliseconds). |
> | `is_default` | Boolean | Whether this is one of the account's default tags. |

> **Custom Lead Fields**
>
> The definitions of your custom lead fields (archived fields are not listed).
>
> Table: `custom_lead_fields` · Primary key: `id` · Sync: Full table
>
> | Field | Type | Description |
> | :- | :- | :- |
> | `id` | Integer | Unique identifier of the custom lead field. |
> | `name` | String | Display name of the custom lead field. |

> **Teams**
>
> The teams your user belongs to, with the team-wide campaign numbers when you own or manage the team.
>
> Table: `teams` · Primary key: `id` · Sync: Full table
>
> | Field | Type | Description |
> | :- | :- | :- |
> | `id` | Integer | Unique identifier of the team. |
> | `name` | String | Name of the team. |
> | `caller_role` | String | Role of the API key's user in the team: OWNER, MANAGER or USER. |
> | `members_count` | Integer | Number of members in the team (only for OWNER or MANAGER; null for USER). |
> | `active_campaigns_count` | Integer | Active campaigns across all team members (only for OWNER or MANAGER; null for USER). |
> | `unread_messages_count` | Integer | Unread messages across the team (only for OWNER or MANAGER; null for USER). |
> | `acceptance_rate` | Decimal | Average LinkedIn invite acceptance rate across members with an active subscription and a running campaign, in percent (only for OWNER or MANAGER; null for USER). |
> | `reply_rate` | Decimal | Average LinkedIn reply rate across members with an active subscription and a running campaign, in percent (only for OWNER or MANAGER; null for USER). |

> **Team Members**
>
> The members of the teams you own or manage, with each member's campaign numbers.
>
> Table: `team_members` · Primary key: `team_id`, `user_id` · Sync: Full table
>
> | Field | Type | Description |
> | :- | :- | :- |
> | `team_id` | Integer | Identifier of the team. |
> | `user_id` | String | Dripify user identifier of the member. |
> | `first_name` | String | Member's first name (null if their account is no longer readable). |
> | `last_name` | String | Member's last name (null if their account is no longer readable). |
> | `picture_url` | String | Member's LinkedIn profile picture URL. |
> | `role` | String | Member's role in the team: OWNER, MANAGER or USER. |
> | `last_active_at` | Datetime | When the member's Dripify session was last seen (sign-in activity, not campaign activity). |
> | `active_campaigns_count` | Integer | Campaigns the member is currently running. |
> | `acceptance_rate` | Decimal | LinkedIn invite acceptance across the member's campaigns, in percent. |
> | `reply_rate` | Decimal | LinkedIn reply rate across the member's campaigns, in percent. |
> | `unread_messages_count` | Integer | Conversations with unread messages across the member's campaigns. |

> **Leads**
>
> Every lead of the account, once each, with its most recent action and tags.
>
> Table: `leads` · Primary key: `id` · Sync: Full table
>
> | Field | Type | Description |
> | :- | :- | :- |
> | `id` | Integer | Dripify's unique identifier of the lead. |
> | `linkedin_profile_url` | String | LinkedIn profile URL of the lead, as built by Dripify. |
> | `public_id` | String | LinkedIn public vanity slug the profile URL is built from. |
> | `first_name` | String | Lead's first name. |
> | `last_name` | String | Lead's last name. |
> | `picture_url` | String | Lead's profile photo URL. |
> | `occupation` | String | Lead's LinkedIn headline. |
> | `location` | String | Lead's free-text location. |
> | `blacklisted` | Boolean | Whether the lead is blacklisted and no longer contacted. |
> | `last_action_type` | String | Kind of the most recent action recorded against the lead (for example CONNECT\_SENT, MESSAGE\_RESPONDED). |
> | `last_action_at` | Datetime | When the most recent action recorded against the lead happened (UTC). |
> | `tags` | String (JSON) | Tags currently applied to the lead (JSON array of objects with id and name). |

> **Campaign Leads**
>
> The leads of each campaign: one row per campaign and lead, so a lead in two campaigns appears twice.
>
> Table: `campaign_leads` · Primary key: `campaign_id`, `id` · Sync: Full table
>
> | Field | Type | Description |
> | :- | :- | :- |
> | `campaign_id` | Integer | Identifier of the campaign the lead belongs to. |
> | `id` | Integer | Dripify's unique identifier of the lead. |
> | `linkedin_profile_url` | String | LinkedIn profile URL of the lead, as built by Dripify. |
> | `public_id` | String | LinkedIn public vanity slug the profile URL is built from. |
> | `first_name` | String | Lead's first name. |
> | `last_name` | String | Lead's last name. |
> | `picture_url` | String | Lead's profile photo URL. |
> | `occupation` | String | Lead's LinkedIn headline. |
> | `location` | String | Lead's free-text location. |
> | `blacklisted` | Boolean | Whether the lead is blacklisted and no longer contacted. |
> | `last_action_type` | String | Kind of the most recent action recorded against the lead (for example CONNECT\_SENT, MESSAGE\_RESPONDED). |
> | `last_action_at` | Datetime | When the most recent action recorded against the lead happened (UTC). |
> | `tags` | String (JSON) | Tags currently applied to the lead (JSON array of objects with id and name). |

> **Lead Activity**
>
> Every action Dripify recorded on each lead (connection requests, acceptances, messages, replies, profile views, errors), one row per action.
>
> Table: `lead_activity` · Primary key: `event_id` · Sync: Incremental (`lead_last_action_at`)
>
> | Field | Type | Description |
> | :- | :- | :- |
> | `event_id` | String | Identifier of the action built by the connector (Dripify gives actions no id): a hash of the lead, campaign, action kind, error, time and, for identical actions, their position among them. |
> | `lead_id` | Integer | Identifier of the lead the action happened to. |
> | `campaign_id` | Integer | Identifier of the campaign the action happened in. |
> | `campaign_name` | String | Name of the campaign the action happened in. |
> | `sequence_event_type` | String | Kind of action (for example CONNECT\_SENT, INVITE\_ACCEPTED, MESSAGE\_SENT, MESSAGE\_RESPONDED, PROFILE\_VIEWED); new kinds appear as Dripify grows. |
> | `error` | String | Why the action failed (for example OUT\_OF\_CONNECTIONS); null for actions that succeeded. |
> | `created_at` | Datetime | When the action happened (UTC). |
> | `lead_last_action_at` | Datetime | The lead's most recent action time when its activity was read (UTC), used as the incremental replication key. |

> **Lead Details**
>
> The full profile of each lead that Dripify has acted on (a lead never contacted appears after its first action): job title, company, emails, phone, location and the lead's state in each of its campaigns.
>
> Table: `lead_details` · Primary key: `id` · Sync: Incremental (`last_action_at`)
>
> | Field | Type | Description |
> | :- | :- | :- |
> | `id` | Integer | Dripify's unique identifier of the lead. |
> | `linkedin_profile_url` | String | LinkedIn profile URL of the lead, as built by Dripify. |
> | `public_id` | String | LinkedIn public vanity slug the profile URL is built from. |
> | `first_name` | String | Lead's first name. |
> | `last_name` | String | Lead's last name. |
> | `picture_url` | String | Lead's profile photo URL. |
> | `occupation` | String | Lead's LinkedIn headline. |
> | `title` | String | Lead's current job title. |
> | `company` | String | Lead's current company name. |
> | `location` | String | Lead's free-text location (used when city and country are empty). |
> | `city` | String | Lead's city. |
> | `country` | String | Lead's country. |
> | `website` | String | Lead's own website. |
> | `connections_count` | Integer | How many LinkedIn connections the lead has. |
> | `premium` | Boolean | Whether the lead has LinkedIn Premium. |
> | `updated_at` | Datetime | When Dripify last refreshed the lead's profile data (UTC). |
> | `email` | String | Lead's LinkedIn email, when visible in Dripify (usually after connecting, or for Open Profiles). |
> | `email_bounced` | Boolean | Whether an email sent to the LinkedIn email bounced. |
> | `email_alternative` | String | Lead's corporate email, once found with Dripify's Find email. |
> | `email_alternative_bounced` | Boolean | Whether an email sent to the corporate email bounced. |
> | `email_manual` | String | Custom email entered for the lead in Dripify. |
> | `email_manual_bounced` | Boolean | Whether an email sent to the custom email bounced. |
> | `phone` | String | Lead's phone number, when visible in Dripify. |
> | `email_found_at` | Datetime | When an email was last found for the lead (UTC). |
> | `email_alternative_searched_at` | Datetime | When the corporate email was last searched for (UTC). |
> | `blacklisted` | Boolean | Whether the lead is blacklisted and no longer contacted. |
> | `lead_in_campaigns` | String (JSON) | Every campaign the lead belongs to and the lead's state in each (JSON array of objects with campaignId, campaignName and leadInCampaignStatus: READY\_FOR\_PROCESSING, PROCESSING\_ENDED, PROCESS\_CORRUPTED or PROCESSING\_PAUSED). |
> | `tags` | String (JSON) | Tags currently applied to the lead (JSON array of objects with id and name). |
> | `last_action_type` | String | Kind of the most recent action recorded against the lead when it was read. |
> | `last_action_at` | Datetime | When the most recent action recorded against the lead happened, as of when it was read (UTC); used as the incremental replication key. |


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