> For the complete documentation index, see [llms.txt](https://docs.graphlit.dev/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.graphlit.dev/platform/feeds.md).

# Feeds

Graphlit connects to **30+ data sources** with automatic sync. OAuth, API keys, or public sources.

{% hint style="info" %}
**API terminology**: In the Graphlit API, these are called **feeds** (you create them with `createFeed()`).

**Feed** = A connection that continuously syncs data from a source (Slack, S3, RSS, etc.)\
**Connector** = Optional per-user auth credential storage (smaller, used with feeds)

**Authentication**: Feeds support OAuth (Slack, Gmail), API keys (S3, Tavily), or public access (RSS, web crawls).
{% endhint %}

{% hint style="success" %}
**Connect once, search forever** - Automatic sync across all your tools via configurable polling schedules (30 seconds to hours). No manual uploads.
{% endhint %}

***

## How Feeds Work

<table data-view="cards"><thead><tr><th></th><th></th></tr></thead><tbody><tr><td><strong>No manual uploads</strong></td><td>Set up once, content syncs automatically</td></tr><tr><td><strong>Configurable polling</strong></td><td>Schedule policies from 30 seconds to hours between checks</td></tr><tr><td><strong>OAuth handled</strong></td><td>No token management, Graphlit handles auth refresh</td></tr><tr><td><strong>Incremental updates</strong></td><td>Only new/changed content syncs (not full re-ingest)</td></tr><tr><td><strong>Deduplication</strong></td><td>Same file in Slack and Drive = one copy in your knowledge base</td></tr></tbody></table>

### Listing modes (Past vs New)

Many feeds support `Past` vs `New` listing modes:

* `Past`: backfill existing items, then continue polling for new items
* `New`: only ingest items created after the feed is created

Some sources use specialized listing enums (e.g., `EmailListingTypes`, `CalendarListingTypes`) or date filters.

### Sync mode (Archive vs Mirror)

Feeds support an optional `syncMode`:

* `ARCHIVE`: preserve ingested content even if the source deletes it
* `MIRROR`: synchronize with the source, including deletions

***

## All Feeds

### Cloud Storage

<table data-view="cards"><thead><tr><th></th><th></th></tr></thead><tbody><tr><td><img src="https://cdn.brandfetch.io/aws.amazon.com/w/96/h/96" alt=""><br><strong>Amazon S3</strong></td><td>Files from any S3 bucket<br><em>Access Key auth • Automatic sync</em></td></tr><tr><td><img src="https://cdn.brandfetch.io/azure.microsoft.com/w/96/h/96" alt=""><br><strong>Azure Blob Storage</strong></td><td>Files from Azure containers<br><em>Connection String auth • Automatic sync</em></td></tr><tr><td><img src="https://cdn.brandfetch.io/azure.microsoft.com/w/96/h/96" alt=""><br><strong>Azure File Share</strong></td><td>Files from Azure file shares<br><em>Connection String auth • Automatic sync</em></td></tr><tr><td><img src="https://cdn.brandfetch.io/cloud.google.com/w/96/h/96" alt=""><br><strong>Google Cloud Storage</strong></td><td>Files from GCS buckets<br><em>Service Account auth • Automatic sync</em></td></tr></tbody></table>

**Use cases:** Data lakes, backup archives, media libraries, log files

**Example:**

{% tabs %}
{% tab title="TypeScript" %}

```typescript
import { Graphlit } from 'graphlit-client';
import { FeedTypes, FeedServiceTypes } from 'graphlit-client/dist/generated/graphql-types';

const client = new Graphlit();

const feed = await client.createFeed({
  name: "Company Data Lake",
  type: FeedTypes.Site,
  site: {
    type: FeedServiceTypes.S3Blob,
    s3: {
      accessKey: process.env.AWS_ACCESS_KEY,
      secretAccessKey: process.env.AWS_SECRET_KEY,
      bucketName: "company-datalake",
      prefix: "documents/"  // Optional: filter by prefix
    }
  }
});
```

{% endtab %}

{% tab title="Python" %}

```python
import os
from graphlit import Graphlit
from graphlit_api import FeedTypes, FeedServiceTypes

graphlit = Graphlit()

feed = await graphlit.client.create_feed(
    name="Company Data Lake",
    type=FeedTypes.SITE,
    site={
        "type": FeedServiceTypes.S3_BLOB,
        "s3": {
            "accessKey": os.getenv("AWS_ACCESS_KEY"),
            "secretAccessKey": os.getenv("AWS_SECRET_KEY"),
            "bucketName": "company-datalake",
            "prefix": "documents/"  # Optional: filter by prefix
        }
    }
)
```

{% endtab %}
{% endtabs %}

***

### User Storage & Productivity

<table data-view="cards"><thead><tr><th></th><th></th></tr></thead><tbody><tr><td><img src="https://cdn.brandfetch.io/sharepoint.com/w/96/h/96" alt=""><br><strong>Microsoft SharePoint</strong></td><td>Files and pages from SharePoint sites<br><em>OAuth (Microsoft) • Automatic sync</em></td></tr><tr><td><img src="https://cdn.brandfetch.io/onedrive.live.com/w/96/h/96" alt=""><br><strong>Microsoft OneDrive</strong></td><td>Personal and business files<br><em>OAuth (Microsoft) • Automatic sync</em></td></tr><tr><td><img src="https://cdn.brandfetch.io/drive.google.com/w/96/h/96" alt=""><br><strong>Google Drive</strong></td><td>Files, Docs, Sheets, Slides<br><em>OAuth (Google) • Automatic sync</em></td></tr><tr><td><img src="https://cdn.brandfetch.io/dropbox.com/w/96/h/96" alt=""><br><strong>Dropbox</strong></td><td>All file types<br><em>OAuth (Dropbox) • Automatic sync</em></td></tr><tr><td><img src="https://cdn.brandfetch.io/box.com/w/96/h/96" alt=""><br><strong>Box</strong></td><td>Enterprise file storage<br><em>OAuth (Box) • Automatic sync</em></td></tr></tbody></table>

**Use cases:** Company knowledge base, shared documentation, team collaboration, project resources

**Example:**

{% tabs %}
{% tab title="TypeScript" %}

```typescript
import { Graphlit } from 'graphlit-client';
import { FeedTypes, FeedServiceTypes } from 'graphlit-client/dist/generated/graphql-types';

const client = new Graphlit();

const feed = await client.createFeed({
  name: "Engineering Docs",
  type: FeedTypes.Site,
  site: {
    type: FeedServiceTypes.GoogleDrive,
    googleDrive: {
      refreshToken: process.env.GOOGLE_REFRESH_TOKEN,
      clientId: process.env.GOOGLE_CLIENT_ID,
      clientSecret: process.env.GOOGLE_CLIENT_SECRET
      // folderId: "..."  // Optional: sync specific folder only
    }
  }
});
```

{% endtab %}

{% tab title="Python" %}

```python
import os
from graphlit import Graphlit
from graphlit_api import FeedTypes, FeedServiceTypes

graphlit = Graphlit()

feed = await graphlit.client.create_feed(
    name="Engineering Docs",
    type=FeedTypes.SITE,
    site={
        "type": FeedServiceTypes.GOOGLE_DRIVE,
        "googleDrive": {
            "refreshToken": os.getenv("GOOGLE_REFRESH_TOKEN"),
            "clientId": os.getenv("GOOGLE_CLIENT_ID"),
            "clientSecret": os.getenv("GOOGLE_CLIENT_SECRET")
            # "folderId": "..."  # Optional: sync specific folder only
        }
    }
)
```

{% endtab %}
{% endtabs %}

***

### Communication & Messaging

<table data-view="cards"><thead><tr><th></th><th></th></tr></thead><tbody><tr><td><img src="https://cdn.brandfetch.io/slack.com/w/96/h/96" alt=""><br><strong>Slack</strong></td><td>Messages, threads, files from channels<br><em>OAuth (Bot Token) • Automatic sync</em></td></tr><tr><td><img src="https://cdn.brandfetch.io/teams.microsoft.com/w/96/h/96" alt=""><br><strong>Microsoft Teams</strong></td><td>Messages from team channels<br><em>OAuth (Microsoft) • Automatic sync</em></td></tr><tr><td><img src="https://cdn.brandfetch.io/discord.com/w/96/h/96" alt=""><br><strong>Discord</strong></td><td>Messages, threads, files from servers<br><em>OAuth (Bot Token) • Automatic sync</em></td></tr><tr><td><img src="https://cdn.brandfetch.io/x.com/w/96/h/96" alt=""><br><strong>Twitter/X</strong></td><td>Posts, media, conversations<br><em>OAuth (Twitter API) • Automatic sync</em></td></tr></tbody></table>

**Use cases:** Team conversations, decision history, customer discussions, product feedback

**Example:**

{% tabs %}
{% tab title="TypeScript" %}

```typescript
import { Graphlit } from 'graphlit-client';
import { FeedListingTypes, FeedTypes } from 'graphlit-client/dist/generated/graphql-types';

const client = new Graphlit();

const feed = await client.createFeed({
  name: "Engineering Slack",
  type: FeedTypes.Slack,
  slack: {
    channel: "engineering",  // Channel name or ID
    token: process.env.SLACK_BOT_TOKEN,
    type: FeedListingTypes.Past,
    includeAttachments: true
  }
});
```

{% endtab %}

{% tab title="Python" %}

```python
import os
from graphlit import Graphlit
from graphlit_api import FeedListingTypes, FeedTypes

graphlit = Graphlit()

feed = await graphlit.client.create_feed(
    name="Engineering Slack",
    type=FeedTypes.SLACK,
    slack={
        "channel": "engineering",
        "token": os.getenv("SLACK_BOT_TOKEN"),
        "type": FeedListingTypes.PAST,
        "includeAttachments": True
    }
)
```

{% endtab %}
{% endtabs %}

***

### Email

<table data-view="cards"><thead><tr><th></th><th></th></tr></thead><tbody><tr><td><img src="https://cdn.brandfetch.io/gmail.com/w/96/h/96" alt=""><br><strong>Gmail</strong></td><td>Emails, attachments, labels, threads<br><em>OAuth (Google) • Automatic sync</em></td></tr><tr><td><img src="https://cdn.brandfetch.io/outlook.com/w/96/h/96" alt=""><br><strong>Microsoft Outlook</strong></td><td>Emails, attachments, folders<br><em>OAuth (Microsoft) • Automatic sync</em></td></tr></tbody></table>

**Use cases:** Customer communications, sales outreach, support context, contract negotiations

**Example:**

{% tabs %}
{% tab title="TypeScript" %}

```typescript
import { Graphlit } from 'graphlit-client';
import { FeedTypes, FeedServiceTypes } from 'graphlit-client/dist/generated/graphql-types';

const client = new Graphlit();

const feed = await client.createFeed({
  name: "Sales Inbox",
  type: FeedTypes.Email,
  email: {
    type: FeedServiceTypes.GoogleEmail,
    google: {
      refreshToken: process.env.GOOGLE_REFRESH_TOKEN,
      clientId: process.env.GOOGLE_CLIENT_ID,
      clientSecret: process.env.GOOGLE_CLIENT_SECRET,
      query: "from:*@acmecorp.com"
    }
  }
});
```

{% endtab %}

{% tab title="Python" %}

```python
import os
from graphlit import Graphlit
from graphlit_api import FeedTypes, FeedServiceTypes

graphlit = Graphlit()

feed = await graphlit.client.create_feed(
    name="Sales Inbox",
    type=FeedTypes.EMAIL,
    email={
        "type": FeedServiceTypes.GOOGLE_EMAIL,
        "google": {
            "refreshToken": os.getenv("GOOGLE_REFRESH_TOKEN"),
            "clientId": os.getenv("GOOGLE_CLIENT_ID"),
            "clientSecret": os.getenv("GOOGLE_CLIENT_SECRET"),
            "query": "from:*@acmecorp.com"
        }
    }
)
```

{% endtab %}
{% endtabs %}

***

### Issue Tracking & Project Management

<table data-view="cards"><thead><tr><th></th><th></th></tr></thead><tbody><tr><td><img src="https://cdn.brandfetch.io/linear.app/w/96/h/96" alt=""><br><strong>Linear</strong></td><td>Issues, comments, projects, roadmaps<br><em>OAuth (Linear API) • Automatic sync</em></td></tr><tr><td><img src="https://cdn.brandfetch.io/atlassian.com/w/96/h/96" alt=""><br><strong>Jira</strong></td><td>Issues, comments, boards, sprints<br><em>OAuth (Atlassian) • Automatic sync</em></td></tr><tr><td><img src="https://cdn.brandfetch.io/github.com/w/96/h/96" alt=""><br><strong>GitHub Issues</strong></td><td>Repository issues and comments<br><em>OAuth (GitHub) • Automatic sync</em></td></tr><tr><td><img src="https://cdn.brandfetch.io/github.com/w/96/h/96" alt=""><br><strong>GitHub Commits</strong></td><td>Repository commits and code changes<br><em>OAuth (GitHub) • Automatic sync</em></td></tr><tr><td><img src="https://cdn.brandfetch.io/github.com/w/96/h/96" alt=""><br><strong>GitHub Pull Requests</strong></td><td>Pull requests and code reviews<br><em>OAuth (GitHub) • Automatic sync</em></td></tr><tr><td><img src="https://cdn.brandfetch.io/trello.com/w/96/h/96" alt=""><br><strong>Trello</strong></td><td>Cards, boards, checklists<br><em>OAuth (Trello API) • Automatic sync</em></td></tr></tbody></table>

**Use cases:** Product roadmaps, bug tracking, feature requests, sprint planning

**Example:**

{% tabs %}
{% tab title="TypeScript" %}

```typescript
import { Graphlit } from 'graphlit-client';
import { FeedTypes, FeedServiceTypes } from 'graphlit-client/dist/generated/graphql-types';

const client = new Graphlit();

const feed = await client.createFeed({
  name: "Product Backlog",
  type: FeedTypes.Issue,
  issue: {
    type: FeedServiceTypes.Linear,
    linear: {
      apiKey: process.env.LINEAR_API_KEY,
      includeComments: true,
      includeClosed: false
      // teamId: "..."  // Optional: sync specific team only
    }
  }
});
```

{% endtab %}

{% tab title="Python" %}

```python
import os
from graphlit import Graphlit
from graphlit_api import FeedTypes, FeedServiceTypes

graphlit = Graphlit()

feed = await graphlit.client.create_feed(
    name="Product Backlog",
    type=FeedTypes.ISSUE,
    issue={
        "type": FeedServiceTypes.LINEAR,
        "linear": {
            "apiKey": os.getenv("LINEAR_API_KEY"),
            "includeComments": True,
            "includeClosed": False
            # "teamId": "..."  # Optional: sync specific team only
        }
    }
)
```

{% endtab %}
{% endtabs %}

***

### Knowledge Bases & Documentation

| Connector             | Content Types    | Auth Type          | Sync Mode |
| --------------------- | ---------------- | ------------------ | --------- |
| **Notion**            | Pages, Databases | OAuth (Notion API) | Automatic |
| **Intercom Articles** | Articles         | OAuth (Intercom)   | Automatic |
| **Zendesk Articles**  | Articles         | OAuth (Zendesk)    | Automatic |

**Use cases:**

* Internal wikis
* Product documentation
* Help center content
* Company policies

**Example:**

{% tabs %}
{% tab title="TypeScript" %}

```typescript
import { Graphlit } from 'graphlit-client';
import { FeedTypes } from 'graphlit-client/dist/generated/graphql-types';

const client = new Graphlit();

const feed = await client.createFeed({
  name: "Engineering Wiki",
  type: FeedTypes.Notion,
  notion: {
    apiKey: process.env.NOTION_API_KEY,
    includeSubpages: true
    // databaseId: "..."  // Optional: sync specific database only
  }
});
```

{% endtab %}

{% tab title="Python" %}

```python
import os
from graphlit import Graphlit
from graphlit_api import FeedTypes

graphlit = Graphlit()

feed = await graphlit.client.create_feed(
    name="Engineering Wiki",
    type=FeedTypes.NOTION,
    notion={
        "apiKey": os.getenv("NOTION_API_KEY"),
        "includeSubpages": True
        # "databaseId": "..."  # Optional: sync specific database only
    }
)
```

{% endtab %}
{% endtabs %}

***

### Support & Ticketing

| Connector            | Content Types          | Auth Type        | Sync Mode |
| -------------------- | ---------------------- | ---------------- | --------- |
| **Intercom Tickets** | Tickets, Conversations | OAuth (Intercom) | Automatic |
| **Zendesk Tickets**  | Tickets, Conversations | OAuth (Zendesk)  | Automatic |

**Use cases:**

* Customer support history
* Common issues
* Product feedback
* Feature requests

***

### Code Repositories

| Connector  | Content Types      | Auth Type          | Sync Mode |
| ---------- | ------------------ | ------------------ | --------- |
| **GitHub** | Code Files, README | OAuth (GitHub PAT) | Automatic |

**Use cases:**

* Code search
* Documentation in repos
* README indexing
* API references

**Example:**

{% tabs %}
{% tab title="TypeScript" %}

```typescript
import { Graphlit } from 'graphlit-client';
import { FeedTypes, FeedServiceTypes } from 'graphlit-client/dist/generated/graphql-types';

const client = new Graphlit();

const feed = await client.createFeed({
  name: "Codebase",
  type: FeedTypes.Site,
  site: {
    type: FeedServiceTypes.GitHub,
    github: {
      personalAccessToken: process.env.GITHUB_TOKEN,
      repositoryOwner: "acmecorp",
      repositoryName: "backend-api"
    }
  }
});
```

{% endtab %}

{% tab title="Python" %}

```python
import os
from graphlit import Graphlit
from graphlit_api import FeedTypes, FeedServiceTypes

graphlit = Graphlit()

feed = await graphlit.client.create_feed(
    name="Codebase",
    type=FeedTypes.SITE,
    site={
        "type": FeedServiceTypes.GIT_HUB,
        "github": {
            "personalAccessToken": os.getenv("GITHUB_TOKEN"),
            "repositoryOwner": "acmecorp",
            "repositoryName": "backend-api"
        }
    }
)
```

{% endtab %}
{% endtabs %}

***

### Web & Content

| Connector       | Content Types       | Auth Type          | Sync Mode             |
| --------------- | ------------------- | ------------------ | --------------------- |
| **Web Pages**   | Pages, Files        | None               | On-demand / Scheduled |
| **Web Search**  | Search Results      | None               | On-demand             |
| **RSS Feeds**   | Posts, Articles     | None               | Automatic             |
| **Podcast RSS** | Audio, Transcripts  | None               | Automatic             |
| **YouTube**     | Audio (transcribed) | API Key (optional) | On-demand             |
| **Reddit**      | Posts, Comments     | API Key (optional) | Automatic             |

**Use cases:**

* Competitive intelligence
* News monitoring
* Content aggregation
* Market research

**Example:**

{% tabs %}
{% tab title="TypeScript" %}

```typescript
import { Graphlit } from 'graphlit-client';
import { FeedTypes, SearchServiceTypes, TimedPolicyRecurrenceTypes } from 'graphlit-client/dist/generated/graphql-types';

const client = new Graphlit();

// RSS feed
const rssFeed = await client.createFeed({
  name: "Competitor Blog",
  type: FeedTypes.Rss,
  rss: {
    uri: "https://competitor.com/blog/rss"
  }
});

// Web search feed
const searchFeed = await client.createFeed({
  name: "AI News",
  type: FeedTypes.Search,
  search: {
    type: SearchServiceTypes.Tavily,
    text: "artificial intelligence semantic memory",
    readLimit: 10
  },
  schedulePolicy: {
    recurrenceType: TimedPolicyRecurrenceTypes.Repeat,
    repeatInterval: "PT1H"
  }
});
```

{% endtab %}

{% tab title="Python" %}

```python
from graphlit import Graphlit
from graphlit_api import FeedTypes, SearchServiceTypes, TimedPolicyRecurrenceTypes
from datetime import timedelta

graphlit = Graphlit()

# RSS feed
rss_feed = await graphlit.client.create_feed(
    name="Competitor Blog",
    type=FeedTypes.RSS,
    rss={
        "uri": "https://competitor.com/blog/rss"
    }
)

# Web search feed
search_feed = await graphlit.client.create_feed(
    name="AI News",
    type=FeedTypes.SEARCH,
    search={
        "type": SearchServiceTypes.TAVILY,
        "text": "artificial intelligence semantic memory",
        "readLimit": 10
    },
    schedulePolicy={
        "recurrenceType": TimedPolicyRecurrenceTypes.REPEAT,
        "repeatInterval": timedelta(hours=1)
    }
)
```

{% endtab %}
{% endtabs %}

***

### Calendars

| Connector              | Content Types | Auth Type         | Sync Mode |
| ---------------------- | ------------- | ----------------- | --------- |
| **Google Calendar**    | Events        | OAuth (Google)    | Automatic |
| **Microsoft Calendar** | Events        | OAuth (Microsoft) | Automatic |

**Use cases:**

* Meeting recording triggers
* Event-based workflows
* Schedule context
* Attendee tracking

**Example:**

{% tabs %}
{% tab title="TypeScript" %}

```typescript
import { Graphlit } from 'graphlit-client';
import { FeedTypes, FeedServiceTypes } from 'graphlit-client/dist/generated/graphql-types';

const client = new Graphlit();

const feed = await client.createFeed({
  name: "Team Calendar",
  type: FeedTypes.Calendar,
  calendar: {
    type: FeedServiceTypes.GoogleCalendar,
    google: {
      refreshToken: process.env.GOOGLE_REFRESH_TOKEN,
      clientId: process.env.GOOGLE_CLIENT_ID,
      clientSecret: process.env.GOOGLE_CLIENT_SECRET
      // calendarId: "primary"  // Optional: defaults to primary calendar
    }
  }
});
```

{% endtab %}

{% tab title="Python" %}

```python
import os
from graphlit import Graphlit
from graphlit_api import FeedTypes, FeedServiceTypes

graphlit = Graphlit()

feed = await graphlit.client.create_feed(
    name="Team Calendar",
    type=FeedTypes.CALENDAR,
    calendar={
        "type": FeedServiceTypes.GOOGLE_CALENDAR,
        "google": {
            "refreshToken": os.getenv("GOOGLE_REFRESH_TOKEN"),
            "clientId": os.getenv("GOOGLE_CLIENT_ID"),
            "clientSecret": os.getenv("GOOGLE_CLIENT_SECRET")
            # "calendarId": "primary"  # Optional: defaults to primary calendar
        }
    }
)
```

{% endtab %}
{% endtabs %}

***

### Meetings & Call Transcripts

| Connector          | Content Types                  | Auth Type | Sync Mode |
| ------------------ | ------------------------------ | --------- | --------- |
| **Fireflies.ai**   | Meeting transcripts, summaries | API Key   | Automatic |
| **Fathom**         | Meeting transcripts, summaries | API Key   | Automatic |
| **Attio Meetings** | Meeting transcripts            | API Key   | Automatic |

**Use cases:** meeting intelligence, searchable call history, action items, follow-ups

**Example:**

{% tabs %}
{% tab title="TypeScript" %}

```typescript
import { Graphlit } from 'graphlit-client';
import { FeedTypes, FeedServiceTypes } from 'graphlit-client/dist/generated/graphql-types';

const client = new Graphlit();

const feed = await client.createFeed({
  name: 'Fireflies Transcripts',
  type: FeedTypes.Meeting,
  meeting: {
    type: FeedServiceTypes.Fireflies,
    fireflies: {
      apiKey: process.env.FIREFLIES_API_KEY
    }
  }
});
```

{% endtab %}

{% tab title="Python" %}

```python
import os
from graphlit import Graphlit
from graphlit_api import FeedTypes, FeedServiceTypes

graphlit = Graphlit()

feed = await graphlit.client.create_feed(
    name="Fireflies Transcripts",
    type=FeedTypes.MEETING,
    meeting={
        "type": FeedServiceTypes.FIREFLIES,
        "fireflies": {
            "apiKey": os.getenv("FIREFLIES_API_KEY")
        }
    }
)
```

{% endtab %}
{% endtabs %}

***

### CRM & Contacts

| Connector              | Content Types | Auth Type          | Sync Mode |
| ---------------------- | ------------- | ------------------ | --------- |
| **Attio CRM**          | CRM objects   | API Key            | Automatic |
| **Google Contacts**    | Contacts      | OAuth (Google)     | Automatic |
| **Microsoft Contacts** | Contacts      | OAuth (Microsoft)  | Automatic |
| **Salesforce CRM**     | CRM objects   | OAuth (Salesforce) | Automatic |

**Use cases:** account context, contact enrichment, sales/support history, relationship intelligence

***

### Research & Entity Discovery

| Connector                     | Content Types                  | Auth Type | Sync Mode |
| ----------------------------- | ------------------------------ | --------- | --------- |
| **Parallel Research**         | Research reports, source links | API Key   | Automatic |
| **Parallel Entity Discovery** | Entity candidates + sources    | API Key   | Automatic |

**Use cases:** competitive intel, market maps, account research, enrichment pipelines

**Example:**

{% tabs %}
{% tab title="TypeScript" %}

```typescript
import { Graphlit } from 'graphlit-client';
import { FeedTypes, FeedServiceTypes } from 'graphlit-client/dist/generated/graphql-types';

const client = new Graphlit();

const feed = await client.createFeed({
  name: 'Parallel Research',
  type: FeedTypes.Research,
  research: {
    type: FeedServiceTypes.Parallel,
    query: 'Who are the top competitors to Graphlit, and what are their differentiators?'
  }
});
```

{% endtab %}

{% tab title="Python" %}

```python
from graphlit import Graphlit
from graphlit_api import FeedTypes, FeedServiceTypes

graphlit = Graphlit()

feed = await graphlit.client.create_feed(
    name="Parallel Research",
    type=FeedTypes.RESEARCH,
    research={
        "type": FeedServiceTypes.PARALLEL,
        "query": "Who are the top competitors to Graphlit, and what are their differentiators?"
    }
)
```

{% endtab %}
{% endtabs %}

***

***

## Feed Sync Modes

### Real-Time Sync (ARCHIVE)

**Default mode**: Preserve everything, never delete

{% tabs %}
{% tab title="TypeScript" %}

```typescript
import { Graphlit } from 'graphlit-client';
import { FeedTypes, TimedPolicyRecurrenceTypes } from 'graphlit-client/dist/generated/graphql-types';

const client = new Graphlit();

const feed = await client.createFeed({
  name: "Slack Archive",
  type: FeedTypes.Slack,
  slack: {
    // ... slack configuration
  },
  schedulePolicy: {
    recurrenceType: TimedPolicyRecurrenceTypes.Repeat,
    repeatInterval: "PT5M"  // Check every 5 minutes (ISO 8601 duration)
  }
});
```

{% endtab %}

{% tab title="Python" %}

```python
from graphlit import Graphlit
from graphlit_api import FeedTypes, TimedPolicyRecurrenceTypes
from datetime import timedelta

graphlit = Graphlit()

feed = await graphlit.client.create_feed(
    name="Slack Archive",
    type=FeedTypes.SLACK,
    slack={
        # ... slack configuration
    },
    schedulePolicy={
        "recurrenceType": TimedPolicyRecurrenceTypes.REPEAT,
        "repeatInterval": timedelta(minutes=5)
    }
)
```

{% endtab %}
{% endtabs %}

**Behavior:**

* New content added
* Updated content re-indexed
* Deleted content at source → **preserved** in Graphlit
* Use case: Compliance, audit logs, historical research

***

### Mirror Sync (MIRROR)

**Mirror mode**: Keep in sync with source

{% tabs %}
{% tab title="TypeScript" %}

```typescript
import { Graphlit } from 'graphlit-client';
import { FeedTypes, FeedSyncMode } from 'graphlit-client/dist/generated/graphql-types';

const client = new Graphlit();

const feed = await client.createFeed({
  name: "Google Drive Mirror",
  type: FeedTypes.Site,
  site: {
    // ... site configuration
  },
  syncMode: FeedSyncMode.Mirror  // Mirror mode
});
```

{% endtab %}

{% tab title="Python" %}

```python
from graphlit import Graphlit
from graphlit_api import FeedTypes, FeedSyncMode

graphlit = Graphlit()

feed = await graphlit.client.create_feed(
    name="Google Drive Mirror",
    type=FeedTypes.SITE,
    site={
        # ... site configuration
    },
    syncMode=FeedSyncMode.MIRROR
)
```

{% endtab %}
{% endtabs %}

**Behavior:**

* New content added
* Updated content re-indexed
* Deleted content at source → **deleted** in Graphlit
* Use case: Live documentation, current state only

***

## OAuth Setup

### Graphlit Manages OAuth

**You don't need to:**

* ❌ Store refresh tokens securely
* ❌ Handle token expiration
* ❌ Implement refresh logic
* ❌ Manage webhook subscriptions

**Graphlit handles:**

* ✅ Token storage (encrypted)
* ✅ Automatic refresh
* ✅ Webhook management
* ✅ Error recovery

### Setup Process

1. **Get OAuth credentials** from provider (e.g., Google Cloud Console, Microsoft Azure Portal)
2. **Exchange for refresh token** (one-time)
3. **Pass to Graphlit** when creating feed
4. **Done** - Graphlit manages tokens forever

**See**: [OAuth Setup Guide](/mcp-integration/mcp-integration.md#oauth-connectors-via-mcp) for detailed instructions per provider.

***

## Feed Filters

### Filter by Query (Gmail, Slack, etc.)

{% tabs %}
{% tab title="TypeScript" %}

```typescript
import { Graphlit } from 'graphlit-client';
import { FeedTypes, FeedServiceTypes } from 'graphlit-client/dist/generated/graphql-types';

const client = new Graphlit();

const feed = await client.createFeed({
  name: "Customer Emails",
  type: FeedTypes.Email,
  email: {
    type: FeedServiceTypes.GoogleEmail,
    google: {
      query: "from:*@acmecorp.com OR to:*@acmecorp.com"
    }
  }
});
```

{% endtab %}

{% tab title="Python" %}

```python
from graphlit import Graphlit
from graphlit_api import FeedTypes, FeedServiceTypes

graphlit = Graphlit()

feed = await graphlit.client.create_feed(
    name="Customer Emails",
    type=FeedTypes.EMAIL,
    email={
        "type": FeedServiceTypes.GOOGLE_EMAIL,
        "google": {
            "query": "from:*@acmecorp.com OR to:*@acmecorp.com"
        }
    }
)
```

{% endtab %}
{% endtabs %}

### Filter by Folder/Channel

{% tabs %}
{% tab title="TypeScript" %}

```typescript
import { Graphlit } from 'graphlit-client';
import { FeedTypes, FeedServiceTypes } from 'graphlit-client/dist/generated/graphql-types';

const client = new Graphlit();

const feed = await client.createFeed({
  name: "Sales Folder",
  type: FeedTypes.Site,
  site: {
    type: FeedServiceTypes.OneDrive,
    oneDrive: {
      // folderId: "..."  // Optional: sync specific folder only
    }
  }
});
```

{% endtab %}

{% tab title="Python" %}

```python
from graphlit import Graphlit
from graphlit_api import FeedTypes, FeedServiceTypes

graphlit = Graphlit()

feed = await graphlit.client.create_feed(
    name="Sales Folder",
    type=FeedTypes.SITE,
    site={
        "type": FeedServiceTypes.ONE_DRIVE,
        "oneDrive": {
            # "folderId": "..."  # Optional: sync specific folder only
        }
    }
)
```

{% endtab %}
{% endtabs %}

### Filter by Time (Query-Time)

{% tabs %}
{% tab title="TypeScript" %}

```typescript
import { Graphlit } from 'graphlit-client';
import { ContentTypes, SearchTypes } from 'graphlit-client/dist/generated/graphql-types';

const client = new Graphlit();

// Feeds generally don't support "oldest message" cutoffs; instead, ingest and then filter at query-time.
const response = await client.queryContents({
  types: [ContentTypes.Message],
  createdInLast: "PT2160H", // ~90 days
  searchType: SearchTypes.Hybrid,
});
```

{% endtab %}

{% tab title="Python" %}

```python
from graphlit import Graphlit
from graphlit_api.enums import ContentTypes, SearchTypes
from graphlit_api.input_types import ContentFilter

graphlit = Graphlit()

response = await graphlit.client.query_contents(
    filter=ContentFilter(
        types=[ContentTypes.MESSAGE],
        created_in_last="PT2160H",  # ~90 days
        search_type=SearchTypes.HYBRID,
    ),
)
```

{% endtab %}
{% endtabs %}

***

## Common Patterns

### Pattern 1: Multi-Source Customer View

{% tabs %}
{% tab title="TypeScript" %}

```typescript
import { Graphlit } from 'graphlit-client';

const client = new Graphlit();

// Connect all customer touchpoints
const feeds = [];

// Email conversations
feeds.push(await client.createFeed({ /* Gmail config */ }));

// Slack mentions  
feeds.push(await client.createFeed({ /* Slack config */ }));

// Support tickets
feeds.push(await client.createFeed({ /* Zendesk config */ }));

// Meeting notes
feeds.push(await client.createFeed({ /* Google Drive config */ }));

// Now search across all sources
const response = await client.queryContents({
  search: "Acme Corp pricing concerns",
});
// ↑ One query → all customer interactions
```

{% endtab %}

{% tab title="Python" %}

```python
from graphlit import Graphlit

graphlit = Graphlit()

# Connect all customer touchpoints
feeds = []

# Email conversations
feeds.append(await graphlit.client.create_feed(...))  # Gmail

# Slack mentions
feeds.append(await graphlit.client.create_feed(...))  # Slack

# Support tickets
feeds.append(await graphlit.client.create_feed(...))  # Zendesk

# Meeting notes
feeds.append(await graphlit.client.create_feed(...))  # Google Drive

# Now search across all sources
response = await graphlit.client.query_contents(
    filter={
        "search": "Acme Corp pricing concerns"
    }
)
# ↑ One query → all customer interactions
```

{% endtab %}
{% endtabs %}

***

### Pattern 2: Developer Knowledge Base

{% tabs %}
{% tab title="TypeScript" %}

```typescript
import { Graphlit } from 'graphlit-client';

const client = new Graphlit();

// Connect engineering sources
const feeds = [
    // Code
    await client.createFeed({ /* GitHub backend-api */ }),
    await client.createFeed({ /* GitHub frontend-app */ }),
    
    // Discussions
    await client.createFeed({ /* Slack engineering */ }),
    await client.createFeed({ /* Slack architecture */ }),
    
    // Issues
    await client.createFeed({ /* Linear engineering-team */ }),
    
    // Docs
    await client.createFeed({ /* Notion engineering-wiki */ }),
    
    // Meetings
    await client.createFeed({ /* Google Drive meeting-notes */ })
];

// Agent has full engineering context
```

{% endtab %}

{% tab title="Python" %}

```python
from graphlit import Graphlit

graphlit = Graphlit()

# Connect engineering sources
feeds = [
    # Code
    create_github_feed("backend-api"),
    create_github_feed("frontend-app"),
    
    # Discussions
    create_slack_feed("engineering"),
    create_slack_feed("architecture"),
    
    # Issues
    create_linear_feed("engineering-team"),
    
    # Docs
    create_notion_feed("engineering-wiki"),
    
    # Meetings
    create_google_drive_feed("meeting-notes")
]

# Agent has full engineering context
```

{% endtab %}
{% endtabs %}

***

### Pattern 3: Compliance Archive

{% tabs %}
{% tab title="TypeScript" %}

```typescript
import { Graphlit } from 'graphlit-client';
import { FeedSyncMode } from 'graphlit-client/dist/generated/graphql-types';

const client = new Graphlit();

// Archive everything (never delete)
const feeds = [
    await client.createFeed({ syncMode: FeedSyncMode.Archive /* Gmail config */ }),
    await client.createFeed({ syncMode: FeedSyncMode.Archive /* Slack config */ }),
    await client.createFeed({ syncMode: FeedSyncMode.Archive /* Teams config */ })
];

// All communications preserved
// Searchable for compliance
// Audit trail maintained
```

{% endtab %}

{% tab title="Python" %}

```python
from graphlit import Graphlit
from graphlit_api import FeedSyncMode

graphlit = Graphlit()

# Archive everything (never delete)
feeds = [
    await graphlit.client.create_feed(syncMode=FeedSyncMode.ARCHIVE, ...),  # Gmail
    await graphlit.client.create_feed(syncMode=FeedSyncMode.ARCHIVE, ...),  # Slack
    await graphlit.client.create_feed(syncMode=FeedSyncMode.ARCHIVE, ...)   # Teams
]

# All communications preserved
# Searchable for compliance
# Audit trail maintained
```

{% endtab %}
{% endtabs %}

***

## Real-World Example: Zine

[Zine](https://www.zine.ai) uses 20+ Graphlit connectors:

**Connected sources:**

* Slack, Teams, Discord
* Gmail, Outlook
* Google Drive, OneDrive, Dropbox
* Notion, Linear, Jira
* GitHub Issues
* Google Calendar, Microsoft Calendar
* Meeting recordings (auto-attached to calendar events)

**Result:**

* One search across all tools
* AI agents with full company context
* Meeting intelligence
* Customer interaction history
* Developer knowledge base

**All powered by Graphlit connectors.**

***

## Connector Roadmap

**Coming soon** (upon request):

* Confluence
* ServiceNow
* Azure Repos
* Azure Boards

**Want a connector?** [Request it in Discord](https://discord.gg/ygFmfjy3Qx)

***

## Next Steps

* [**MCP Integration**](/mcp-integration/mcp-integration.md) - Use connectors via MCP
* [**Platform Overview**](/getting-started/overview.md) - See how connectors fit into the platform

***

**Connect once. Search forever.**
