Skip to main content
The Provider Pool contains current data from every Provider connected to a Workspace. Each Provider Plugin contributes one or more queryable tables. You can query those tables with ordinary SQL and join tables from different Providers on the same connection.

Address a Provider table

{connector} is the technical connector slug exposed by the Provider Plugin, such as google, github, or linear. {table} is the projected stream name. Examples include:
  • providers.google.users
  • providers.github.pull_requests
  • providers.linear.issues
References are fully qualified. There is no USE statement or search_path.
A table appears only when its Provider is configured for the Workspace and its stream has registered. It can be present before the first sync produces rows. Use catalog discovery instead of assuming that an example table exists.

Query one Provider

Active Google Workspace directory users:
Open Linear issues, ordered by their latest update:
Open GitHub pull requests in one repository:

Understand projected names

A Provider stream can project one or more tables:
  • Field names are lowercased: primaryEmail becomes primaryemail.
  • Flattened object paths use __: assignee.email becomes assignee__email.
  • Arrays can become child tables named {table}__{path}.
For example, GitHub issue labels can appear at providers.github.issues__labels. The parent ID repeats across child rows, and the child table has its own logical key. Do not use SELECT DISTINCT on the parent ID to remove expected child records. The Provider Plugin owns this projection. See the Provider Plugins primer for how a custom Plugin defines streams, schemas, and projection behavior.

Read row state

Every Provider table carries state columns beside the Provider’s own fields: A table that holds the current state of each record, such as providers.google.users, writes a row only when a load changes it: the load contains the record, the record goes missing for the first time, or it is first marked deleted. A record missing from later loads keeps the dt and _parable_seal_id of the day it went missing. WHERE dt = '<latest day>' therefore returns the rows that changed that day, not the whole table. Read current state from the whole table and filter on the state columns:

Join people by semantic email

Columns marked with the Contact.Email semantic scalar represent compatible email values. They can be joined across Providers and to workspace.users.email.
The same Provider data can join live Workspace membership:
Do not join unrelated Provider-native id columns and expect a person match.

Resolve accounts when emails differ

Directory streams can contribute to the providers.identity schema. It appears after at least one identity directory stream has synced. Associations preserve the Provider-native account ID, its type, the match method, and match confidence. Identity resolution is best-effort; service accounts and shared mailboxes can receive identities too.

Join work, not only people

Use domain keys when they represent the same work item. A Linear issue branch can join a GitHub pull request head branch without using identity data:
See keys and relationships before relying on a logical key, and use Provider quality to inspect the health of Provider tables.