Skip to main content
The Provider Directory lists the connectors that Parable can connect to. Each card is one connector: one variant of a product, such as Jira Cloud or Jira Data Center. By Function groups the connectors by their capabilities. By Vendor groups the same connectors by company. A connector can belong to several functions. Choose a function to include its subcategories. The search box, Search Providers, sits above Browse in the panel. On a desktop the panel shows on every Providers page. On a phone it shows on the directory alone, above the list. The search matches connector names, product names, company names, and descriptions. On a Provider’s own page, a search opens the directory with that search, and the box keeps its text. “Jira” finds Jira Cloud and Jira Data Center. “Atlassian” finds every Atlassian connector. Search and the function or company selection apply before pagination. Counts include each matching connector once, even when it belongs to several functions. Changing a filter returns to the first page and keeps the text in the search box. A search that finds nothing shows No Providers match "<query>". With a function or company also selected, it shows No Providers match these filters. The directory hides functions with no visible connectors in the whole branch. Search updates counts without removing populated functions or companies. A selected empty function stays visible so the reader can clear it. By Vendor shows each company with its logo, from the company’s logo. A company without a logo shows its initials. Every company stays listed, and the search changes only its count. The list has sections in this order: Needs Attention, Required, Suggested, Connected, and then all other connectors. The sections use the current Workspace’s connections and priorities. A card shows the connections of its own connector. The product sets the priority of each of its connectors. One connection satisfies the product: once a connector has a connection, the product’s other connectors leave Required and Suggested and show under All providers. The directory has no status filter. An old ?status=requested link opens Requested. A link with any other old ?status= value opens the full catalog. A company’s page, /platform/providers/:vendor, lists the company’s products in the same sections. Its cards keep their description and show the release stage as a badge, except Generally Available and Early Access. It also has no status filter, and no header of its own: the trail names the company with its logo, and the band shows its description. A card shows the connector’s logo and name, and no description. The name and the release stage are the connector’s own. The release stage shows as one word on a band across the card’s top-right corner, while the pointer is on the card or the keyboard focus is on it: Soon for Coming Soon and Invite for Invite Only. On a screen with no hover, such as a phone, the band shows at all times. A screen reader reads the full stage. Generally Available and Early Access show no band. Early Access shows none for now, on purpose. Only the band is hidden: the connector stays in Early Access in the data. A card with a connection shows no release stage. A status line, such as “Last sync failed”, shows under the name. Search still matches the connector’s description. The logo is the connector’s own, else the product’s, else the company’s, else the initials. A connector’s own logo that only repeats its company’s counts as none. A card opens its connector’s page (Provider connections), never the company page. A pull connection whose setup never saved a credential is under Needs Attention. Its card says that setup is not finished and asks for the credentials. On the connector page, the connection’s form shows empty secret fields, because no secret is stored. A connection with stored credentials shows masked secret fields instead, and an empty field keeps the stored value. Request Provider sits below Browse for Parable staff. It follows the Browse list, so it moves up when that list gets shorter. Below it, Requested shows the number of the Workspace’s open requests. It does not show when the Workspace has no open requests, except while its view is open. Select Requested to list the requests and to show their statuses: Pending, Researching, and Research Complete. Search also filters the listed requests and the status counts by name. The Requested count stays the Workspace’s total. For Parable staff, the last page of products ends with a Request Provider tile when there is no search. The tile also takes the place of an empty result, from search or a filter. It does not follow the results of a search that finds products.

Browse Providers

Directory responses distinguish several layers: Leaf groupings expose the Provider Plugin choices that can be configured. A Provider may have more than one grouping when its products or deployment modes require different credentials or endpoints. The product list contains the complete visible catalog. This endpoint is an exception to server pagination: the directory computes function counts and applies search and the function or company filter before paging. Partial catalog pages would produce incorrect counts and omit matching products. Database reads still use bounded pages. The endpoint remains public for catalog discovery before Workspace setup. Currently, tenant headers and subdomains can supply Workspace context without a membership check. That context affects priorities and release access, including signed-out requests. PARABLE-7337 tracks membership enforcement for this route and category connectorIds. A failed release-flag read retains public products and hides invite-only products. productKey references the company’s registered product catalog. Deployment and authentication variants share that identity. Jira Cloud and Data Center, Workday and RaaS, and Slack and events each appear as one product. connectorIds lists its eligible Provider Plugins. Existing unregistered definitions use a company and connector identity until an administrator assigns a product key. Product category membership is the union of its live connector definitions’ versioned memberships. Live definitions include draft variants. Their assignments contribute to an existing registered product, but the directory does not offer draft connectors as connection choices. The product list excludes draft connectors and applies release access before returning products. groupingIds identifies the visible configuration variants for each product. groupingPath identifies its default configuration route. variants lists the same visible variants as groupingIds, in the same order, nested and Invite Access ones included. Each variant has its grouping id, connectorId, name, description, its own logo (null when it has none), releaseStage, groupingPath and the Workspace’s priority for it. A variant’s groupingPath is the slugs of its groupings, from the company’s top grouping down. web-api builds them from the grouping read that builds the products, so the list costs no other read. That read uses the primary database, because each grouping carries the inputs of the Invite Access gate. The Workspace app draws one card for each variant, and the product still decides which variants show, their priority, and the search. Each card names its connector, and a card opens its variant’s page. When variants does not cover a product’s groupingIds, as from a web-api older than the field, the product keeps one card. That card holds the connections of all the product’s variants, and each connection opens on its own variant’s page:
  • One connection opens its row.
  • Several connections, some of which need attention, open the most urgent row.
  • Healthy connections that all sit on one variant open that variant’s page.
  • Otherwise, as with no connection, the card opens the product’s default configuration route.
Read /api/connectors/categories while signed in for the function hierarchy. Each flat category record contains parentId and effective connectorIds for its live descendants. Deprecated parent and children fields remain for existing clients. parent contains shallow metadata and children remains empty. New clients must build the hierarchy from parentId. Regenerate clients to use the new field. IDs use the same release, draft, and internal-product filters as the directory. Directory entries carry effective categoryIds, including ancestors. Clients do not expand membership again. The Workspace app puts a connector’s card in each category whose connectorIds include its Provider Plugin. A Provider Plugin that no category names takes its product’s categoryIds. Missing or deleted parents stop inheritance. Cycle detection prevents repeated traversal. Categories marked isLegacy preserve saved onboarding selections and do not appear in the directory. The approved taxonomy lives in services/pkg/connectordef/functioncategories/catalog.json. Its shape comes from connectors-shared-types. The generated reader validates each load. The migration renderer, development seed, research prompt, and research validator consume this catalog. Migration 20261026153510 installs initial assignments once. The reusable migration renderer updates vocabulary only. Development seeds initialize category memberships only for connectors created in that seed run. They preserve all existing memberships and removals, including an empty selection. Later additions and removals use the connector definition lock and revision history. Admin clients use connectors.addConnectorCategory and connectors.removeConnectorCategory, with admin.connectors.update permission. Repeated additions retain the membership ID. Repeated removals make no change. Category edits invalidate an older promotion preview. Rollback captures the live baseline before restoring recorded memberships and nullable product identity. It preserves current legacy memberships but rejects newly restored categories that are deleted or retired. A rejected rollback changes no definition or history. Before the first deployment, run services/web-db/scripts/preflight/provider_product_identity.sql in a read-only transaction against staging and production web_db. It must return no rows. The query detects a normalized key shared across companies or owned by another company. Resolve collisions through the control plane before deployment. The migration rejects a collision before it writes product identities, but the migration runner records that failed version as dirty. Do not force a dirty version without investigating the failed migration. New full research must return functionCategories with approved slugs. An explicit empty array means the evidence supports no category. Older research that omits the field preserves the connector’s current memberships during promotion. Admin-created connectors and first promotions from older research remain unclassified until an administrator assigns categories. Fresh full research retries missing or unknown categories through the quality-validation loop. A product can belong directly to a parent category. TestRail and Zephyr use Engineering because the approved taxonomy has no test-management leaf. Parent counts include direct members, so child counts need not sum to the parent count. Seed logs name initial connector slugs that are absent from the installed catalog. New onboarding requests offer populated functions at every level. Selecting a parent includes its descendants. Existing requests retain their saved category IDs and legacy memberships. Onboarding choices and delegation links apply release access. Existing connections can still complete saved requests when their products are no longer available as new choices. Email links use Workspace release access without inheriting the sender’s staff-preview permissions. An eligible email item with an incomplete setup path links to the Provider Directory. Invalid or deleted categories cannot enter a new request. A legacy category is accepted only when that Workspace already saved it for the same milestone. Category lookup or resolution failures stop the request before it writes a delegation or sends email. The picker shows saved categories separately from new draft items. Only cards added to the draft enter the new request. Removing a draft card does not remove an earlier delegation. If category metadata cannot load, the directory keeps product search and company browsing available. Function filters use cached metadata when available. Without metadata, function filters are unavailable until retry succeeds. Products do not become Uncategorized because a lookup failed. Authentication and permission errors retain their normal response. The onboarding picker shows an error and disables Retry while its request runs. After a successful catalog read, unknown category or company URL filters return to All and leave the URL. A failed category read preserves the selected category URL for retry. Open Providers from the Workspace sidebar. The sidebar also opens People and Protection. Use the panel under the Providers header to browse available Providers by function or company, and to see requests. In By Function one category is open at each level: opening a category closes its open sibling and everything open inside it. On the directory, choosing a category by its name selects it. The category opens when it has subcategories, and the categories that hold it open. Choose the selected category again to select All functions: that category closes, with everything open inside it. All functions closes every category. The directory with no category keeps the open categories when the reader arrives in another way, such as with the browser’s Back button. On a desktop the panel shows on every Providers page. On a phone a Provider’s own page shows no panel and no search box. There the panel is part of the directory’s page, so it keeps no place across Providers pages: back on the directory, it opens as a reload does. On a connector’s page the panel stays where the reader was when that place holds the connector. It opens the deepest category that the reader had open, or had selected on the directory, that holds the connector directly. Else it takes the deepest of those categories that holds the connector further down, and opens the first path to the connector inside it. The selected category wins a tie. Else it opens the connector’s first function and first category, as a page opened from a link or a reload does. A reader who chose By Vendor last sees By Vendor there, with the connector’s company selected. The category lists only the connector, selected, so the panel does not grow with the catalog. The category’s count still counts every connector in it, and its link opens the directory with all of them. A connector in no category opens Uncategorized the same way. On a company page the panel opens By Vendor with the company selected. There each row is a link. A function or a company opens the directory with that filter and the search box’s text. The function shows there selected and open. All functions opens the directory with every category closed. A connector’s page holds its docs and its connections in two tabs: Learn, and Connect, which becomes Manage once the Workspace has a connection (Provider connections). Open Artifacts from the directory to inspect uploaded data assets.

Inspect existing connections

List the current Workspace’s Provider connections:
Each instance includes its connection state, its grouping and Provider, and its Provider Plugin with the available authentication strategies. Connection lists leave out Provider docs and data streams: no grouping or authentication strategy in an item carries docs, and connector.taps is empty unless the request adds ?includeTaps=true, which returns every data stream with its schema. Read one connection by ID (/api/vendors/tenant-connector-instances/{id}) for its docs and data streams. The same rule applies to the per-Provider, per-grouping, and grouped lists. To check only whether the data of each connection is current, list the connection freshness. It carries no Provider Plugin, grouping, or authentication strategy, so it stays small:
  • Each item has the connection’s id, name, connectorSlug (the {connector} in providers.{connector}.{table}), connectorName, connectionStatus, connectionStatusMessage, lastSyncAt, and lastSyncStatus. A push connection also has lastDataReceivedAt.
  • The status and the last sync are the same as in the full list.
  • A page holds at most limit connections, newest first: 50 by default, 100 at most. It stops before 40,000 characters, but it always holds one connection.
  • Send nextOffset back as offset for the next page. The last page has no nextOffset.
Next, create a Provider connection.