Skip to content

Workspace connections

import { Aside } from ‘@astrojs/starlight/components’;

Workspace connectors are reusable data sources defined once at the workspace level. Artifacts reference them by name — credentials are never copied into published HTML.

PatterncredentialScopeAdmin providesEach member providesExample
Shared team connectorshared (default)Endpoint + one tokenNothingSnowflake service account, team Slack bot
Per-user connectorper_userEndpoint + auth shapeTheir own API tokenGraphQL API scoped to the logged-in user

Use per_user when the upstream API authenticates the person, not the organization. Use shared when one service account covers the whole team.

In the redesigned Home, open the Connectors lens in the left rail to list, create, OAuth-install, and test connectors without leaving the workspace surface.

Actionowner / adminmember
List connectors
Create / delete connectors
OAuth-install platform connectors
Save own credentials (per_user only)
POST /v1/workspaces/{workspaceId}/connections
Authorization: Bearer {token}
Content-Type: application/json
{
"name": "team_mixpanel",
"type": "rest_api",
"credentialScope": "shared",
"config": {
"baseUrl": "https://mixpanel.com/api/2.0",
"apiKeyHeader": "Authorization",
"apiKeyPrefix": "Basic "
},
"credentials": {
"type": "api_key",
"data": { "apiKey": "base64-service-credential" }
}
}

Admin defines the endpoint and auth shape. Do not send credentials.data.

POST /v1/workspaces/{workspaceId}/connections
Authorization: Bearer {token}
Content-Type: application/json
{
"name": "galley_graphql",
"type": "rest_api",
"credentialScope": "per_user",
"authType": "api_key",
"config": {
"baseUrl": "https://api.example.com/graphql",
"apiKeyHeader": "Authorization",
"apiKeyPrefix": "Bearer "
}
}

authType must be one of: api_key, basic_auth, service_account.

PUT /v1/workspaces/{workspaceId}/connections/{connectionId}/my-credentials
Authorization: Bearer {token}
Content-Type: application/json
{
"credentials": {
"type": "api_key",
"data": { "apiKey": "member-personal-token" }
}
}

Check status (no secret values returned):

GET /v1/workspaces/{workspaceId}/connections/{connectionId}/my-credentials
{ "configured": true, "authType": "api_key", "updatedAt": "2026-06-15T12:00:00.000Z" }

Revoke:

DELETE /v1/workspaces/{workspaceId}/connections/{connectionId}/my-credentials

The GET /connections list includes hasMyCredentials: true|false on each per_user connector.

const sdk = await ShareOut.create();
const body = await sdk.connection('galley_graphql').fetch('', {
query: {
endpoint: '',
method: 'POST',
body: {
query: `query Adoption($id: ID!) { company(id: $id) { name } }`,
variables: { id: '743' }
}
},
cache: false
});

The server injects the viewer’s saved token. If no token is saved the request returns 403 CREDENTIALS_REQUIRED.

Browse the always-visible provider catalog in workspace admin. Most providers use bring-your-own credentials — paste your token or service-account key, run Test, then save. Supported platform providers include Google Analytics, Google Ads, Facebook Ads, Shopify, Tienda Nube, Google Sheets, Snowflake, BigQuery, and Slack.

Each catalog entry exposes docsUrl, an exampleSnippet with your connector name, and whether it is testable.

POST /v1/workspaces/{workspaceId}/connections/test
Authorization: Bearer {token}
Content-Type: application/json
{
"provider": "google-analytics",
"config": { "propertyId": "123456789" },
"credentials": { "type": "service_account", "data": { "key": { } } }
}

Returns { "ok": true } or an error with a provider-specific message. Admin+ only.

EndpointPurpose
GET /v1/workspaces/{id}/connections/slack/install?connection={name}Slack install (302).
GET /v1/workspaces/{id}/connections/{connectionId}Admin detail (no secrets).

Platform connectors can use credentialScope: "per_user" for per-member GCP service accounts or OAuth refresh tokens.

Admins can enable AI query per connector so the workspace assistant can run ad-hoc read-only SELECT statements against warehouse connectors:

PATCH /v1/workspaces/{workspaceId}/connections/{connectionId}
Authorization: Bearer {token}
Content-Type: application/json
{ "agent_query_enabled": true }

Off by default. Use read-only credentials. Toggle in the connectors admin UI (AI query: On/Off).

Generic Snowflake and BigQuery workspace connectors (inline credentials, not platform OAuth) execute on the server for:

  • query_snapshot and other scheduled materialize deliveries
  • Connection test (POST /v1/workspaces/{id}/connections/test)

Postgres warehouse connectors still require an external pre-fetch until a Workers engine ships. REST and platform OAuth connectors are unchanged.

MethodEndpointWhoNotes
GET/v1/workspaces/{id}/connectionsMember+List. No secrets.
POST/v1/workspaces/{id}/connectionsAdmin+Create.
GET/v1/workspaces/{id}/connections/{connectionId}Admin+Detail.
DELETE/v1/workspaces/{id}/connections/{connectionId}Admin+Delete; cascades member credentials.
GET/v1/workspaces/{id}/connections/{connectionId}/artifactsMember+Artifacts that queried this connector.
GET/v1/workspaces/{id}/connections/{connectionId}/my-credentialsMember+Per-user status.
PUT/v1/workspaces/{id}/connections/{connectionId}/my-credentialsMember+Save own token.
DELETE/v1/workspaces/{id}/connections/{connectionId}/my-credentialsMember+Remove own token.
POST/v1/workspaces/{id}/connections/testAdmin+Verify pasted credentials without saving.
PATCH/v1/workspaces/{id}/connections/{connectionId}Admin+Toggle agent_query_enabled.
GET/v1/oauth/slack/callbackSlack OAuth callback.
CodeMeaning
403 CREDENTIALS_REQUIREDMember queried a per_user connector before saving my-credentials.
400 NOT_PER_USERmy-credentials called on a shared connector.