--- title: "Connector troubleshooting" sidebarTitle: "Troubleshooting" description: "Diagnose and resolve common issues with Google Drive, Gmail, Notion, and OneDrive connectors" icon: "/icons/hugeicons/wrench-01.svg" --- Quick guide to resolve common connector issues with authentication, syncing, and permissions. ## Quick health check Check if your connectors are working properly: ```typescript TypeScript const { connectors } = await supermemory.connectors.list("user-123") connectors.forEach(connector => { console.log(`${connector.provider}: ${connector.account} - last sync ${connector.latestRun?.system.status ?? "never"}`) }) // Inspect a failing connector's recent runs and the items that failed const failing = connectors.filter(connector => connector.latestRun?.system.status === "failed") for (const connector of failing) { const detail = await supermemory.connectors.get("user-123", connector.id, { include: "syncs", }) console.log(`⚠️ ${connector.provider}: ${detail.latestRun?.error}`) console.log(detail.syncs) } // Check for stuck documents in the namespace const { documents } = await supermemory.list("user-123", "documents") const stuck = documents.filter(doc => doc.system.status === "failed") if (stuck.length > 0) { console.log(`⚠️ ${stuck.length} documents failed to process`) } ``` ```python Python connectors = client.connectors.list("user-123").connectors for connector in connectors: status = connector.latest_run.system.status if connector.latest_run else "never" print(f"{connector.provider}: {connector.account} - last sync {status}") # Inspect a failing connector's recent runs and the items that failed failing = [c for c in connectors if c.latest_run and c.latest_run.system.status == "failed"] for connector in failing: detail = client.connectors.get("user-123", connector.id, include=["syncs"]) print(f"⚠️ {connector.provider}: {detail.latest_run.error}") print(detail.syncs) # Check for stuck documents in the namespace documents = client.list("user-123", "documents").documents stuck = [doc for doc in documents if doc.system.status == "failed"] if stuck: print(f"⚠️ {len(stuck)} documents failed to process") ``` ```bash cURL # List connectors in the namespace curl "https://api.supermemory.ai/ns/user-123/connectors" \ -H "Authorization: Bearer $SUPERMEMORY_API_KEY" # Read one connector with its recent sync runs curl "https://api.supermemory.ai/ns/user-123/connectors/PTzGiUYei7pgzg5buzZHgA?include=syncs" \ -H "Authorization: Bearer $SUPERMEMORY_API_KEY" # Check document status in the namespace curl -X POST "https://api.supermemory.ai/ns/user-123/list/documents" \ -H "Authorization: Bearer $SUPERMEMORY_API_KEY" \ -H "Content-Type: application/json" \ -d '{"filter": {"field": "source", "operator": "eq", "value": "notion"}}' ``` There is no per-connector document list in v5. `supermemory.list(namespace, "documents")` returns every document in the namespace; read each document's `system.status`. ## Common issues ### Connector Missing From List **Problem:** `connectors.create` returned an `id`, but `connectors.list` and `connectors.get` do not show it **Solution:** A pending OAuth connector is not visible in list or get until the user finishes authorization. Send the user to `authorization.url` before `authorization.expiresAt`. If the link expired, create the connector again. ### OAuth callback fails **Problem:** "Invalid redirect URI" error after user grants permissions **Solution:** Ensure your redirect URL matches EXACTLY what's configured in your OAuth app: ```typescript // correct - exact match with OAuth app settings const connector = await supermemory.connectors.create("user-123", { provider: "notion", redirectUrl: "https://yourapp.com/auth/notion/callback" }) // Wrong - URL doesn't match // redirectUrl: "https://yourapp.com/callback" ``` **Prevention:** - Use HTTPS for production URLs - Copy the exact URL from your OAuth app settings - Test the flow in development first ### Documents not syncing **Problem:** Documents stuck in "queued" or "extracting" status for over 30 minutes **Solution:** Trigger a manual sync: ```typescript // Force a sync for the connector await supermemory.connectors.sync("user-123", "PTzGiUYei7pgzg5buzZHgA") // 409 means a sync is already running; wait for latestRun.system.status to change ``` If documents consistently fail: - Read `latestRun.error` and `include: "syncs"` for the failed items - Check if files are over 50MB (may timeout) - Verify you have permission to access the documents - Ensure the document type is supported ### Permission denied errors **Problem:** Some documents show "permission denied" or aren't syncing **Solution:** Re-authenticate with proper permissions: ```typescript // Delete and recreate the connector await supermemory.connectors.delete("user-123", "PTzGiUYei7pgzg5buzZHgA", { deleteDocuments: false, }) const next = await supermemory.connectors.create("user-123", { provider: "google-drive", redirectUrl: "https://yourapp.com/callback" }) // User must re-authenticate if (next.authorization) window.location.href = next.authorization.url ``` ### Sync takes too long **Problem:** Hundreds of documents taking hours to sync **Solution:** Set reasonable document limits: ```typescript const connector = await supermemory.connectors.create("user-123", { provider: "onedrive", redirectUrl: "https://yourapp.com/callback" documentLimit: 500, // Start with fewer documents }) // Raise it later without reconnecting await supermemory.connectors.update("user-123", connector.id, { documentLimit: 2000, }) ``` ## Provider-specific issues ### Google Drive **Shared Drive Issues** Shared drives require special permissions. Make sure: - User has access to the shared drive - OAuth app has drive.readonly scope - User is a member of the shared drive **Picker Not Completed** With the default scoped sync, syncs may skip the connector until the user finishes the file picker. Read the connector with `include: "picker"` and send the user to `picker.url`. ### Notion **Database Not Syncing** Notion databases need explicit permission. If databases aren't syncing: 1. Go to Notion workspace settings 2. Find your integration under "Connections" 3. Click on the integration 4. Select specific pages/databases to share 5. Re-sync after granting access **Workspace Access** For full workspace access, a workspace admin must: 1. Approve the integration 2. Grant access to all pages 3. Enable "Read content" permission ### OneDrive **Business vs Personal Accounts** Business accounts may have additional restrictions: - Admin consent might be required - Some SharePoint sites may be restricted - Compliance policies may block certain files ### Gmail **Real-time Sync Not Working** If emails aren't syncing in real-time but scheduled/manual sync works: 1. Real-time sync uses Google Cloud Pub/Sub webhooks 2. Watch subscriptions expire after 7 days (supermemory auto-renews) 3. Only INBOX label triggers real-time updates 4. Trigger a manual sync to verify the connector is healthy: ```typescript await supermemory.connectors.sync("user-123", "PTzGiUYei7pgzg5buzZHgA") ``` **Missing Refresh Token** If Gmail stops syncing after initial setup: 1. The user may have revoked app access in Google Account settings 2. Delete and recreate the connector 3. Ensure user completes full OAuth consent flow ```typescript // Re-authenticate to get fresh tokens await supermemory.connectors.delete("user-123", "PTzGiUYei7pgzg5buzZHgA", { deleteDocuments: false, }) const next = await supermemory.connectors.create("user-123", { provider: "gmail", redirectUrl: "https://yourapp.com/callback" }) ``` **Scale Plan Required Error** Gmail connector requires Scale Plan or Enterprise Plan. If you see access errors: - Verify your organization has the required plan - Contact support to upgrade your plan ## Best practices 1. **Set reasonable document limits** - Start with 500-1000 documents 2. **Use one namespace per user or tenant** - Makes debugging easier 3. **Monitor `latestRun`** - Check weekly for failed syncs 4. **Handle rate limits gracefully** - Implement exponential backoff 5. **Test OAuth in development** - Ensure redirect URLs work before production