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


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.graphlit.dev/platform/feeds.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
