---
title: 'Managing Connector Selection'
sidebarTitle: 'Managing Resources'
description: 'Choose what a connector syncs with the hosted picker or a direct selection update'
icon: 'folder-sync'
---
**Selectable connectors:** GitHub (repositories), Gmail (labels) and Google Drive (files and folders) let you choose what to sync. Other connectors sync everything and return `selection: null`.
Some connectors let you select which resources to sync. v5 exposes this through two calls on the connector itself: read it with `include: "picker"` to get a hosted picker URL, or send the ids directly with `connectors.update`.
## Open the Hosted Picker
`GET /ns/{namespace}/connectors/{id}?include=picker`
Returns a one-time picker URL. Send the user there; Supermemory lists their resources, saves the selection and starts a sync. Pass `returnUrl` to choose where the picker sends the user when they finish.
```typescript Typescript
import { Supermemory } from "supermemory"
const supermemory = new Supermemory({ apiKey: process.env.SUPERMEMORY_API_KEY })
const connector = await supermemory.connectors.get("user-123", connectorId, {
include: "picker",
returnUrl: "https://yourapp.com/settings/integrations"
})
console.log("Picker URL:", connector.picker?.url)
console.log("Expires at:", connector.picker?.expiresAt)
console.log("Selectable:", connector.capabilities.selectable)
```
```python Python
from supermemory import Supermemory
import os
client = Supermemory(api_key=os.environ.get("SUPERMEMORY_API_KEY"))
connector = client.connectors.get(
"user-123",
connector_id,
include=["picker"],
return_url="https://yourapp.com/settings/integrations",
)
print(f"Picker URL: {connector.picker.url if connector.picker else None}")
print(f"Expires at: {connector.picker.expires_at if connector.picker else None}")
print(f"Selectable: {connector.capabilities.selectable}")
```
```bash cURL
curl "https://api.supermemory.ai/ns/user-123/connectors/{connectorId}?include=picker&returnUrl=https%3A%2F%2Fyourapp.com%2Fsettings%2Fintegrations" \
-H "Authorization: Bearer $SUPERMEMORY_API_KEY"
```
### Query parameters
- `include`: `picker` for the hosted picker URL, `syncs` for recent sync runs, or `syncs,picker` for both
- `returnUrl`: Optional. Where the hosted picker sends the user when they finish
### Response
```json
{
"id": "PTzGiUYei7pgzg5buzZHgA",
"provider": "github",
"namespace": "user-123",
"capabilities": { "selectable": true, "webhooks": true },
"selection": {
"repos": [
{ "id": "123456789", "name": "your-org/documentation" }
]
},
"picker": {
"url": "https://...",
"expiresAt": "2024-01-15T11:30:00.000Z"
}
}
```
The picker link works once, in any browser. `picker` is `null` for connectors that sync everything.
## Set the Selection Directly
`PATCH /ns/{namespace}/connectors/{id}`
Send the ids to sync, grouped by kind. The new selection replaces the current one and starts a sync. Webhooks are registered for the selected resources.
```typescript Typescript
import { Supermemory } from "supermemory"
const supermemory = new Supermemory({ apiKey: process.env.SUPERMEMORY_API_KEY })
const connector = await supermemory.connectors.update("user-123", connectorId, {
selection: {
repos: ["123456789", "987654321"],
},
})
console.log("Selection:", connector.selection)
console.log("Last sync:", connector.latestRun?.system.status)
```
```python Python
from supermemory import Supermemory
import os
client = Supermemory(api_key=os.environ.get("SUPERMEMORY_API_KEY"))
connector = client.connectors.update(
"user-123",
connector_id,
selection={"repos": ["123456789", "987654321"]},
)
print(f"Selection: {connector.selection}")
print(f"Last sync: {connector.latest_run.system.status}")
```
```bash cURL
curl -X PATCH "https://api.supermemory.ai/ns/user-123/connectors/{connectorId}" \
-H "Authorization: Bearer $SUPERMEMORY_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"selection": {
"repos": ["123456789", "987654321"]
}
}'
```
### Request body
```json
{
"selection": {
"repos": ["123456789"]
}
}
```
The selection key depends on the provider:
- GitHub: `repos` (repository ids)
- Gmail: `labels` (label ids, for example `INBOX`)
- Google Drive: `files` and `folders` (Drive ids)
You can send `documentLimit` in the same body. Each call must include `selection`, `documentLimit`, or both.
### Response
The updated connector object, including the saved `selection` as `{ id, name }` pairs.
```json
{
"id": "PTzGiUYei7pgzg5buzZHgA",
"provider": "github",
"selection": {
"repos": [
{ "id": "123456789", "name": "your-org/documentation" },
{ "id": "987654321", "name": "your-org/api-docs" }
]
},
"latestRun": { "errorCode": null, "error": null, "system": { "status": "running", "startedAt": "...", "completedAt": null } }
}
```
### Error Responses
- `400`: Connector does not support selection
- `401`: Unauthorized
- `404`: Connector not found
**Automatic Sync:** After a selection is saved, a sync starts for the connector. You don't need to call `connectors.sync` afterwards.
## Example: GitHub repository selection
Here's a complete example for GitHub:
```typescript Typescript
// 1. Create the connector
const created = await supermemory.connectors.create("user-123", {
provider: "github",
redirectUrl: "https://yourapp.com/callback"
})
// 2. Send the user to GitHub; the connector becomes visible once they authorize
if (created.authorization) window.location.href = created.authorization.url
// 3. After the callback, open the hosted picker so the user chooses repositories
const connector = await supermemory.connectors.get("user-123", created.id, {
include: "picker",
returnUrl: "https://yourapp.com/settings/integrations"
})
if (connector.picker) window.location.href = connector.picker.url
// 4. Or, if you already know the repository ids, set them directly
await supermemory.connectors.update("user-123", created.id, {
selection: { repos: selectedRepositoryIds },
})
```
```python Python
# 1. Create the connector
created = client.connectors.create(
"user-123",
request={
"provider": "github",
"redirectUrl": "https://yourapp.com/callback",
},
)
# 2. Send the user to GitHub; the connector becomes visible once they authorize
print(f"Redirect to: {created.authorization.url}")
# 3. After the callback, open the hosted picker so the user chooses repositories
connector = client.connectors.get(
"user-123",
created.id,
include=["picker"],
return_url="https://yourapp.com/settings/integrations",
)
if connector.picker:
print(f"Redirect to: {connector.picker.url}")
# 4. Or, if you already know the repository ids, set them directly
client.connectors.update(
"user-123",
created.id,
selection={"repos": selected_repository_ids},
)
```
```bash cURL
# 1. Create the connector
curl -X POST "https://api.supermemory.ai/ns/user-123/connectors" \
-H "Authorization: Bearer $SUPERMEMORY_API_KEY" \
-H "Content-Type: application/json" \
-d '{"provider": "github", "redirectUrl": "https://yourapp.com/callback"}'
# 2. ... (user authorizes at authorization.url) ...
# 3. Get a one-time hosted picker URL
curl "https://api.supermemory.ai/ns/user-123/connectors/{connectorId}?include=picker" \
-H "Authorization: Bearer $SUPERMEMORY_API_KEY"
# 4. Or set the repositories directly
curl -X PATCH "https://api.supermemory.ai/ns/user-123/connectors/{connectorId}" \
-H "Authorization: Bearer $SUPERMEMORY_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"selection": {
"repos": ["123456789"]
}
}'
```