diff --git a/apps/docs/connectors/google-drive-selected-files.mdx b/apps/docs/connectors/google-drive-selected-files.mdx new file mode 100644 index 00000000..5d3942d5 --- /dev/null +++ b/apps/docs/connectors/google-drive-selected-files.mdx @@ -0,0 +1,218 @@ +--- +title: "Google Drive — Selected files" +description: "Sync only specific Google Drive files—pick in the Console or build your own picker; the API stores choices via configure" +sidebarTitle: "Google Drive (selected)" +icon: "google-drive" +--- + +**Selected files** mode limits indexing to files you explicitly choose. Google’s consent screen uses a narrower scope (built around `drive.file` plus email) instead of full-account Drive read access. Only those files are read during sync. + +Compared to **full drive** (default on this connector), selected mode does **not** use the same account-wide Drive change notifications. Treat each import as a snapshot of the file at sync time—use **Sync** in the [Console](https://console.supermemory.ai) or call the import API when you want the latest version from Drive. + +## Supermemory Console + +1. Open [Console](https://console.supermemory.ai) → **Connectors** → **Google Drive** → **Connect**. +2. Under **Sync mode**, choose **Selected files** (not **Full drive**). +3. Click **Authorize** and complete Google sign-in. The consent text reflects limited access, not “see all your Drive.” +4. After OAuth, the **file picker** opens. Select Google Docs, Sheets, Slides, and/or PDFs, then confirm. +5. To change the list later, use **Select files** (or equivalent) on the connection row. +6. To pull edits from Drive after the first import, click **Sync** on that connection. + + +Import is **one-time per sync run** for the files you selected: run **Sync** again when you need updated content from Drive. + + +## Choosing files: Console vs your product + +There is **no supermemory API** that opens a file-picker or returns chosen files for you. Picking which Drive files to sync is either: + +1. **In the [Supermemory Console](https://console.supermemory.ai)** — after OAuth, users use the built-in Google Drive picker (recommended if your customers connect from Console). +2. **In your own app** — you must **build the UX yourself** (typically [Google Picker](https://developers.google.com/drive/picker/guides/overview) in the browser, or another flow that yields each file’s Drive `id` and `mimeType`). Your backend then calls **`POST /v3/connections/{connectionId}/configure`** with that list. + +The API only **stores** the list (`configure`) and **reads** it back (`GET …/resources` / `GET …/connections/{id}`). It does not replace a picker for third-party end users. + +## API reference (create, configure, import) + +Use these calls when you automate OAuth, sync, or verification. **`configure` still requires file ids you obtained from the Console or from your own picker integration** — not from a “pick files” API on supermemory. + +### 1. Create the connection + +`POST /v3/connections/google-drive` with `metadata.syncMode` set to `"selected"`. Save `id` from the response and send the user to `authLink`. + + + +```bash cURL +curl -X POST "https://api.supermemory.ai/v3/connections/google-drive" \ + -H "Authorization: Bearer $SUPERMEMORY_API_KEY" \ + -H "Content-Type: application/json" \ + -d '{ + "redirectUrl": "https://yourapp.com/connectors/callback", + "documentLimit": 5000, + "metadata": { "syncMode": "selected" } + }' +``` + +```typescript Typescript +const { id, authLink } = await client.connections.create("google-drive", { + redirectUrl: "https://yourapp.com/connectors/callback", + documentLimit: 5000, + metadata: { syncMode: "selected" }, +}); +// Save `id` as connectionId; redirect the user to authLink +window.location.href = authLink; +``` + + + +Example create response (fields you need): + +```json +{ + "id": "conn_abc123", + "authLink": "https://accounts.google.com/o/oauth2/v2/auth?...", + "expiresIn": "1 hour", + "redirectsTo": "https://yourapp.com/connectors/callback" +} +``` + +### 2. Finish OAuth in the browser + +After Google redirects back to your app, the connection is stored. **No full-drive sync runs yet** until you call **configure** with at least one file — and you only get those files from the **Console picker** or **your own** Google Picker / Drive integration (see [Choosing files](#choosing-files-console-vs-your-product) above). + +### 3. (Optional) `GET` resources + +Returns **files already saved** on the connection (`resources`, `total_count`). Useful for displaying the current list or debugging. It does **not** perform picking; for a custom app, you still build the picker and then `configure`. + + + +```bash cURL +curl "https://api.supermemory.ai/v3/connections/$CONNECTION_ID/resources" \ + -H "Authorization: Bearer $SUPERMEMORY_API_KEY" +``` + +```typescript Typescript +const res = await fetch( + `https://api.supermemory.ai/v3/connections/${connectionId}/resources`, + { headers: { Authorization: `Bearer ${process.env.SUPERMEMORY_API_KEY}` } }, +); +const data = await res.json(); +// data.resources, data.total_count — already configured files (may be empty) +``` + + + +### 4. Save files with `configure` + +Send the Drive file `id`, `mimeType`, and display `name` (or `title`) per file. Omit `url` unless you already have it; the API can derive it from `id` + `mimeType`. + + + +```bash cURL +curl -X POST "https://api.supermemory.ai/v3/connections/$CONNECTION_ID/configure" \ + -H "Authorization: Bearer $SUPERMEMORY_API_KEY" \ + -H "Content-Type: application/json" \ + -d '{ + "resources": [ + { + "id": "YOUR_DRIVE_FILE_ID", + "name": "Strategy doc", + "mimeType": "application/vnd.google-apps.document" + } + ] + }' +``` + +```typescript Typescript +await fetch( + `https://api.supermemory.ai/v3/connections/${connectionId}/configure`, + { + method: "POST", + headers: { + Authorization: `Bearer ${process.env.SUPERMEMORY_API_KEY}`, + "Content-Type": "application/json", + }, + body: JSON.stringify({ + resources: [ + { + id: "YOUR_DRIVE_FILE_ID", + name: "Strategy doc", + mimeType: "application/vnd.google-apps.document", + }, + ], + }), + }, +); +``` + + + +### 5. Run import + +Starts processing for Drive connections (optionally narrow by `containerTags` in the body). + + + +```bash cURL +curl -X POST "https://api.supermemory.ai/v3/connections/google-drive/import" \ + -H "Authorization: Bearer $SUPERMEMORY_API_KEY" \ + -H "Content-Type: application/json" \ + -d '{}' +``` + +```typescript Typescript +await client.connections.import("google-drive"); +``` + + + +### 6. Confirm with `GET` connection + +Use the same `connectionId` as above. Check `metadata.syncMode` and `metadata.selectedFiles`. + + + +```bash cURL +curl "https://api.supermemory.ai/v3/connections/$CONNECTION_ID" \ + -H "Authorization: Bearer $SUPERMEMORY_API_KEY" +``` + +```typescript Typescript +const res = await fetch( + `https://api.supermemory.ai/v3/connections/${connectionId}`, + { headers: { Authorization: `Bearer ${process.env.SUPERMEMORY_API_KEY}` } }, +); +const connection = await res.json(); +// connection.metadata.syncMode === "selected" +// connection.metadata.selectedFiles — array of configured files +``` + + + +Example (trimmed) `GET` response: + +```json +{ + "id": "conn_abc123", + "email": "you@example.com", + "createdAt": "2025-01-15T10:30:00.000Z", + "expiresAt": "2025-01-15T11:30:00.000Z", + "documentLimit": 5000, + "metadata": { + "syncMode": "selected", + "selectedFiles": [ + { + "id": "YOUR_DRIVE_FILE_ID", + "title": "Strategy doc", + "mimeType": "application/vnd.google-apps.document", + "url": "https://docs.googleapis.com/v1/documents/YOUR_DRIVE_FILE_ID" + } + ] + } +} +``` + +## Supported types + +Typical picks include Google Docs, Sheets, Slides, and PDFs (`application/pdf`). Other Drive file types may work depending on export and extraction support. + +See also the main [Google Drive connector](/connectors/google-drive) page for OAuth app settings, limits, and connection management. diff --git a/apps/docs/connectors/google-drive.mdx b/apps/docs/connectors/google-drive.mdx index 94bc7809..03265371 100644 --- a/apps/docs/connectors/google-drive.mdx +++ b/apps/docs/connectors/google-drive.mdx @@ -6,6 +6,10 @@ icon: "google-drive" Connect Google Drive to sync documents into your Supermemory knowledge base with OAuth authentication and custom app support. + +If you prefer **not** to grant full Drive access, use **Selected files** sync mode: Google only sees the files you pick, and you refresh content with **Sync** when you need updates. File picking is done in the **Console** or in **your own app** (e.g. Google Picker)—not via a supermemory “pick files” API. Details: [Google Drive — Selected files](/connectors/google-drive-selected-files). + + ## Quick Setup ### 1. Create Google Drive Connection diff --git a/apps/docs/docs.json b/apps/docs/docs.json index 8a32c873..130d1da4 100644 --- a/apps/docs/docs.json +++ b/apps/docs/docs.json @@ -109,6 +109,7 @@ "pages": [ "connectors/notion", "connectors/google-drive", + "connectors/google-drive-selected-files", "connectors/gmail", "connectors/onedrive", "connectors/s3", diff --git a/apps/docs/memory-api/connectors/creating-connection.mdx b/apps/docs/memory-api/connectors/creating-connection.mdx index debabe7b..2a4dd708 100644 --- a/apps/docs/memory-api/connectors/creating-connection.mdx +++ b/apps/docs/memory-api/connectors/creating-connection.mdx @@ -71,6 +71,7 @@ curl --request POST \ - `metadata`: Optional. Any metadata you want to associate with the connection. - This metadata is added to every document synced from this connection. - For `web-crawler`, must include `startUrl` in metadata: `{"startUrl": "https://example.com"}` + - For `google-drive`, optional `metadata.syncMode: "selected"`. Choosing which files to sync is not done through a picker API—use the **Console** or implement **your own** Google Picker (then `configure`). See [Google Drive — Selected files](/connectors/google-drive-selected-files). - `documentLimit`: Optional. Caps how many provider items are fetched **per sync run** (allowed range **1–10,000** when set). Exact behavior is provider-specific. - **Notion:** Pages come from the Notion Search API, **newest edited first**; once the limit is reached, remaining shareable pages are skipped until a later sync or a higher limit. See [Notion connector — Document limit](/connectors/notion#document-limit). - Default when omitted depends on how the connection is created (often **10,000** for hosted flows).