apiVersion: connectors.dex.dev/catalog/v1alpha1
kind: ConnectorCatalog
connectors:
    - company: Airtable
      id: airtable
      name: Airtable
      description: List, read, idempotently upsert, and update typed Airtable records, with base and table pickers.
      version: v0.23.0
      languages:
        go: v0.23.0
        python: v0.1.0
        typescript: v0.1.2
      directory: connectors/airtable
      uiUnits:
        - name: basePicker
          description: Select a base the personal access token can reach, loaded from Airtable's base list; the unit stores the stable base ID, such as app followed by 14 letters and digits, and the base name.
        - name: tablePicker
          description: Select a table loaded from the chosen base's schema; save the base first. The unit stores the stable table ID, such as tbl followed by 14 letters and digits, which keeps working after a rename, and the table name.
      triggers: []
      operations:
        - name: listRecords
          kind: query
          description: List one bounded page of a table's records, filtered by typed field equality and an optional formula, with a field subset, sort, view, and offset cursor.
          languages:
            - go
            - python
            - typescript
        - name: getRecord
          kind: query
          description: Read one record by record ID.
          languages:
            - go
            - python
            - typescript
        - name: upsertRecords
          kind: mutation
          description: Create or update up to 10 records matched by one to three merge fields, such as a case ID, so a repeated write updates the record it created.
          languages:
            - go
            - python
            - typescript
        - name: updateRecords
          kind: mutation
          description: Set the named fields of up to 10 records by record ID, leaving every other field unchanged.
          languages:
            - go
            - python
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/airtable/go/airtablemock
      mocks:
        - operation: listRecords
          name: standardRefundPolicy
          branch: listed
          description: Listing Policy Key refund-standard in the Policies table returns one policy and two further cursor pages.
          default: true
        - operation: listRecords
          name: expiredPolicyOffset
          branch: offsetExpired
          description: Listing Policies with an expired offset cursor requires a fresh scan.
        - operation: listRecords
          name: policyListDenied
          branch: providerRejected
          description: Listing Policies without data.records:read scope is denied.
        - operation: getRecord
          name: approvedDecisionLog
          branch: found
          description: Reading recDecisionLog001 from Decision Log returns the approved case-approved row.
          default: true
        - operation: getRecord
          name: missingDecisionLog
          branch: notFound
          description: Reading recMissingLog001 from Decision Log finds no record.
        - operation: getRecord
          name: decisionReadDenied
          branch: providerRejected
          description: Reading recDecisionLog001 without data.records:read scope is denied.
        - operation: upsertRecords
          name: loggedApprovedRefund
          branch: upserted
          description: Upserting Case ID case-approved in Decision Log creates its approved row linked to recPolicyStandard.
          default: true
        - operation: upsertRecords
          name: decisionUpsertDenied
          branch: providerRejected
          description: Upserting case-approved without data.records:write scope is denied.
        - operation: updateRecords
          name: stampedStandardPolicy
          branch: updated
          description: Updating recPolicyStandard stamps Last Decided Case with case-approved.
          default: true
        - operation: updateRecords
          name: missingPolicyStamp
          branch: notFound
          description: Updating recMissingPolicy1 finds no policy row to stamp.
        - operation: updateRecords
          name: policyStampDenied
          branch: providerRejected
          description: Updating recPolicyStandard without data.records:write scope is denied.
    - company: Algolia
      id: algolia
      name: Algolia
      description: Search an index and replace a record by object ID.
      version: v0.2.0
      languages:
        go: v0.2.0
        python: v0.1.0
        typescript: v0.1.1
      directory: connectors/algolia
      uiUnits: []
      triggers: []
      operations:
        - name: search
          kind: query
          description: Search one Algolia index by query phrase.
          languages:
            - go
            - python
            - typescript
        - name: saveObject
          kind: mutation
          description: Replace one record by stable objectID; Algolia queues indexing asynchronously.
          languages:
            - go
            - python
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/algolia/go/algoliamock
      mocks:
        - operation: search
          name: searchedDefaultIndex
          branch: searched
          description: Meridian catalog search finds one product.
          default: true
        - operation: saveObject
          name: savedDefaultObject
          branch: saved
          description: Meridian notebook record is queued for indexing.
          default: true
    - company: Alpha Vantage
      id: alphavantage
      name: Alpha Vantage
      description: Read a global equity quote and compact daily time series.
      version: v0.2.0
      languages:
        go: v0.2.0
        python: v0.1.0
        typescript: v0.1.1
      directory: connectors/alphavantage
      uiUnits: []
      triggers: []
      operations:
        - name: getGlobalQuote
          kind: query
          description: Read the latest available price and trading day for one stock symbol.
          languages:
            - go
            - python
            - typescript
        - name: getTimeSeriesDaily
          kind: query
          description: Read daily open, high, low, close, and volume values for one stock symbol.
          languages:
            - go
            - python
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/alphavantage/go/alphavantagemock
      mocks:
        - operation: getGlobalQuote
          name: foundDefault
          branch: found
          description: A representative Alpha Vantage result for the example Flow.
          default: true
        - operation: getTimeSeriesDaily
          name: foundDefault
          branch: found
          description: A representative Alpha Vantage result for the example Flow.
          default: true
    - company: Amazon
      id: amazon-s3
      name: Amazon S3
      description: List, inspect, and read bounded text from objects in Amazon S3 or an S3-compatible store such as Cloudflare R2 or MinIO, and store objects with retry-safe overwrite or create-only writes.
      version: v0.23.0
      languages:
        go: v0.23.0
        python: v0.1.0
        typescript: v0.1.1
      directory: connectors/amazon/s3
      uiUnits: []
      triggers: []
      operations:
        - name: listObjects
          kind: query
          description: List one bounded page of a bucket's object keys and common prefixes under an optional prefix and delimiter, in key order, continuing with an opaque continuation token.
          languages:
            - go
            - python
            - typescript
        - name: headObject
          kind: query
          description: Read one object's size, ETag, content type, modification time, version, storage class, and user-defined metadata without reading its content.
          languages:
            - go
            - python
            - typescript
        - name: getObjectText
          kind: query
          description: Read one small text object as bounded UTF-8 text, refusing binary, compressed, and oversized objects without returning their content.
          languages:
            - go
            - python
            - typescript
        - name: putObject
          kind: mutation
          description: Store one object from bounded text or bytes with its content type and user-defined metadata, either replacing any object at the key or, in create-only mode, only when the key is free; a repeated attempt of the same Step converges on the same object.
          languages:
            - go
            - python
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/amazon/s3/go/s3mock
      mocks:
        - operation: listObjects
          name: archivedReports
          branch: found
          description: Listing reports/ in acme-reports returns three ordered pages including ops-weekly.md.
          default: true
        - operation: listObjects
          name: noReports
          branch: notFound
          description: Listing reports/missing/ in acme-reports finds no objects or further pages.
        - operation: listObjects
          name: listDenied
          branch: providerRejected
          description: Listing reports/ without s3:ListBucket permission is denied.
        - operation: headObject
          name: archivedReportMetadata
          branch: found
          description: Reading metadata for reports/ops-weekly.md returns its saved size, ETag, and content type.
          default: true
        - operation: headObject
          name: missingReportMetadata
          branch: notFound
          description: Reading metadata for reports/missing.md finds no object.
        - operation: headObject
          name: metadataDenied
          branch: providerRejected
          description: Reading reports/ops-weekly.md metadata without s3:GetObject permission is denied.
        - operation: getObjectText
          name: archivedReportText
          branch: read
          description: Reading reports/ops-weekly.md returns the generated Ops weekly Markdown report.
          default: true
        - operation: getObjectText
          name: missingReportText
          branch: notFound
          description: Reading reports/missing.md finds no object.
        - operation: getObjectText
          name: binaryReport
          branch: unsupportedContent
          description: Reading reports/diagram.pdf refuses its application/pdf content type.
        - operation: getObjectText
          name: oversizedReport
          branch: tooLarge
          description: Reading reports/archive-large.md refuses an object larger than maxTextBytes.
        - operation: getObjectText
          name: textReadDenied
          branch: providerRejected
          description: Reading reports/ops-weekly.md without s3:GetObject permission is denied.
        - operation: putObject
          name: storedOpsReport
          branch: stored
          description: Storing reports/ops-weekly.md in acme-reports saves the generated Ops weekly report.
          default: true
        - operation: putObject
          name: reportAlreadyExists
          branch: alreadyExists
          description: Creating reports/ops-weekly.md when another report already occupies the key returns that object.
        - operation: putObject
          name: storeDenied
          branch: providerRejected
          description: Storing reports/ops-weekly.md without s3:PutObject permission is denied.
    - company: Amazon
      id: amazon-sqs
      name: Amazon SQS
      description: Consume messages from an Amazon SQS standard or FIFO queue, or an SQS-compatible queue such as ElasticMQ, with long-polling receive, acknowledgement by delete, and visibility changes that release or extend a message.
      version: v0.3.0
      languages:
        go: v0.3.0
        python: v0.1.0
        typescript: v0.1.1
      directory: connectors/amazon/sqs
      uiUnits: []
      triggers: []
      operations:
        - name: receiveMessages
          kind: mutation
          description: Long-poll one queue for up to ten messages with their bodies, receipt handles, receive counts, and message attributes, hiding each received message from other consumers for its visibility timeout.
          languages:
            - go
            - python
            - typescript
        - name: deleteMessage
          kind: mutation
          description: Acknowledge one received message by deleting it from its queue with the receipt handle of its latest delivery, so SQS does not deliver it again; repeating an attempt is safe.
          languages:
            - go
            - python
            - typescript
        - name: changeMessageVisibility
          kind: mutation
          description: Release one received message back to the queue at once with a zero timeout, or hide it for longer while the Flow keeps processing it, by setting its visibility timeout from now.
          languages:
            - go
            - python
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/amazon/sqs/go/sqsmock
      mocks:
        - operation: receiveMessages
          name: paidOrder
          branch: received
          description: A receive from the orders queue returns the paid order 1042 once.
          default: true
        - operation: receiveMessages
          name: noOrder
          branch: empty
          description: A receive from the empty orders queue returns no messages before the wait ends.
        - operation: receiveMessages
          name: receiveDenied
          branch: providerRejected
          description: A receive from a queue without sqs:ReceiveMessage permission is denied.
        - operation: deleteMessage
          name: acknowledgedOrder
          branch: deleted
          description: Deleting receipt-order-1042 acknowledges order-1042 from the orders queue.
          default: true
        - operation: deleteMessage
          name: expiredReceipt
          branch: receiptHandleInvalid
          description: Deleting an expired FIFO receipt handle for order-1042 cannot acknowledge the message.
        - operation: deleteMessage
          name: deleteDenied
          branch: providerRejected
          description: Deleting receipt-order-1042 without sqs:DeleteMessage permission is denied.
        - operation: changeMessageVisibility
          name: releasedOrder
          branch: changed
          description: Setting receipt-order-1042 visibility to zero releases that delivery immediately.
          default: true
        - operation: changeMessageVisibility
          name: expiredVisibilityReceipt
          branch: receiptHandleInvalid
          description: Changing visibility with an expired receipt handle for order-1042 is rejected.
        - operation: changeMessageVisibility
          name: visibilityDenied
          branch: providerRejected
          description: Changing visibility without sqs:ChangeMessageVisibility permission is denied.
    - company: Asana
      id: asana
      name: Asana
      description: List and read Asana tasks by project or section, create tasks and comments without silent duplicates, and complete, assign, reschedule, or move tasks between sections.
      version: v0.23.0
      languages:
        go: v0.23.0
        python: v0.1.1
        typescript: v0.1.1
      directory: connectors/asana
      uiUnits:
        - name: workspacePicker
          description: Choose one Asana workspace or organization the connection's user belongs to; the unit stores the workspace ID and name, for a createTask Step that adds tasks to a workspace without a project, and offers manual entry when the list cannot load.
        - name: projectPicker
          description: Choose a workspace, then one of its unarchived Asana projects and optionally one of that project's sections; the unit stores the workspace, project, and section IDs and names, and offers manual entry of each ID when a list cannot load.
      triggers: []
      operations:
        - name: listTasks
          kind: query
          description: List one bounded page of a project's or a section's tasks, optionally only incomplete tasks or tasks changed since a time, continuing with Asana's offset token.
          languages:
            - go
            - python
            - typescript
        - name: getTask
          kind: query
          description: Read one task by ID with its completion, assignee, dates, project and section memberships, plain-text notes, and custom field values.
          languages:
            - go
            - python
            - typescript
        - name: createTask
          kind: mutation
          description: Create one task in a project, optionally in a section, or in a workspace, with a name, plain-text notes, an assignee, a due date, and text, number, or enum custom field values.
          languages:
            - go
            - python
            - typescript
        - name: updateTask
          kind: mutation
          description: Complete or reopen, assign or unassign, reschedule, or set custom field values on one task, and move it to a section; every change is an absolute value, so a repeated update leaves the same task.
          languages:
            - go
            - python
            - typescript
        - name: addComment
          kind: mutation
          description: Add one plain-text comment, a comment story authored by the connection's user, to a task.
          languages:
            - go
            - python
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/asana/go/asanamock
      mocks:
        - operation: listTasks
          name: listedDefaultAnswer
          branch: listed
          description: A first page for project 1201000000000001 contains an unrelated open maintenance task, leaving REQ-1042 to create.
          default: true
        - operation: listTasks
          name: notFoundFailure
          branch: notFound
          description: A list for unknown project 1201000000000999 finds no visible project.
        - operation: listTasks
          name: providerRejectedFailure
          branch: providerRejected
          description: A list with expired offset expired-offset is rejected by Asana.
        - operation: getTask
          name: foundDefaultAnswer
          branch: found
          description: Task 1204000000000002, created for REQ-1042 in the Facilities project, is read for reconciliation.
          default: true
        - operation: getTask
          name: notFoundFailure
          branch: notFound
          description: Reading task 1204000000000999 finds no visible task.
        - operation: getTask
          name: providerRejectedFailure
          branch: providerRejected
          description: Reading restricted task 1204000000000042 without permission is rejected by Asana.
        - operation: createTask
          name: createdDefaultAnswer
          branch: created
          description: A create in project 1201000000000001 for REQ-1042 returns task 1204000000000002.
          default: true
        - operation: createTask
          name: providerRejectedFailure
          branch: providerRejected
          description: Creating a task with unknown project 1201000000000999 is rejected without a task.
        - operation: updateTask
          name: updatedDefaultAnswer
          branch: updated
          description: Assigning task 1204000000000002 to Ada and moving it to the Approved section returns that task.
          default: true
        - operation: updateTask
          name: notFoundFailure
          branch: notFound
          description: Updating unknown task 1204000000000999 finds no visible task.
        - operation: updateTask
          name: providerRejectedFailure
          branch: providerRejected
          description: Assigning task 1204000000000002 to an unknown user is rejected by Asana.
        - operation: addComment
          name: addedDefaultAnswer
          branch: added
          description: Adding the approval comment to task 1204000000000002 returns its comment story.
          default: true
        - operation: addComment
          name: notFoundFailure
          branch: notFound
          description: Commenting on unknown task 1204000000000999 finds no visible task.
        - operation: addComment
          name: providerRejectedFailure
          branch: providerRejected
          description: Commenting on restricted task 1204000000000042 without permission is rejected by Asana.
    - company: Atlassian
      id: bitbucket
      name: Bitbucket
      description: Read Bitbucket resources through typed Dex Query Steps.
      version: v0.2.0
      languages:
        go: v0.2.0
        python: v0.1.0
        typescript: v0.1.0
      directory: connectors/atlassian/bitbucket
      uiUnits: []
      triggers: []
      operations:
        - name: listRepositories
          kind: query
          description: List repositories owned by a Bitbucket workspace.
          languages:
            - go
            - python
            - typescript
        - name: listPullRequests
          kind: query
          description: List pull requests for a Bitbucket repository.
          languages:
            - go
            - python
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/atlassian/bitbucket/go/bitbucketmock
      mocks:
        - operation: listRepositories
          name: defaultAnswer
          branch: listed
          description: A realistic read-only listRepositories response for a Meridian account.
          default: true
        - operation: listPullRequests
          name: defaultAnswer
          branch: listed
          description: A realistic read-only listPullRequests response for a Meridian account.
          default: true
    - company: Atlassian
      id: confluence
      name: Confluence
      description: Search Confluence Cloud pages with bounded CQL, read a page as Markdown or plain text, publish and update pages without duplicates, and add footer comments.
      version: v0.24.0
      languages:
        go: v0.24.0
        python: v0.1.0
        typescript: v0.1.0
      directory: connectors/atlassian/confluence
      uiUnits:
        - name: sitePicker
          description: Choose the Confluence Cloud site this connection works in from the sites the authorization grants; the unit stores the site's cloudId, and when the host cannot list sites it offers manual entry of the cloudId shown at https://<your-site>.atlassian.net/_edge/tenant_info.
        - name: spacePicker
          description: Choose one Confluence space on the connection's site from the current spaces the account can view; the unit stores the space ID, key, and name, and when the host cannot list spaces it accepts a typed space key.
      triggers: []
      operations:
        - name: searchPages
          kind: query
          description: Search one bounded page of Confluence pages with a typed, connector-escaped CQL filter for space, title, label, and modification time plus an optional bounded CQL clause, continuing with the search cursor.
          languages:
            - go
            - python
            - typescript
        - name: getPage
          kind: query
          description: Read one page by ID with its current version number and its storage or Atlassian Document Format body converted to bounded Markdown or plain text.
          languages:
            - go
            - python
            - typescript
        - name: createPage
          kind: mutation
          description: Publish one page in a space, optionally below a parent page, with a Markdown or plain-text body converted to storage format; Confluence allows one page per title in a space, so a repeated create finds the page instead of adding another.
          languages:
            - go
            - python
            - typescript
        - name: updatePage
          kind: mutation
          description: Replace one page's title and body as the next version, which the caller names; a repeated update finds its own version instead of failing, and a version another editor made is reported as a conflict.
          languages:
            - go
            - python
            - typescript
        - name: addComment
          kind: mutation
          description: Add one footer comment with a Markdown or plain-text body to a page, sending it at most once per Step execution and confirming an unconfirmed attempt by reading the page's comments.
          languages:
            - go
            - python
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/atlassian/confluence/go/confluencemock
      mocks:
        - operation: searchPages
          name: relatedRemoteWorkPolicies
          branch: searched
          description: Searching OPS for Remote work policy returns a related draft and two further cursor pages.
          default: true
        - operation: searchPages
          name: searchDenied
          branch: providerRejected
          description: Searching OPS for Remote work policy when Confluence returns HTTP 403 is forbidden.
        - operation: getPage
          name: publishedRemoteWorkPage
          branch: found
          description: Reading page 600002 returns the published Remote work policy in Markdown at version 1.
          default: true
        - operation: getPage
          name: missingRemoteWorkPage
          branch: notFound
          description: Reading page 699999 finds no visible page.
        - operation: getPage
          name: pageReadDenied
          branch: providerRejected
          description: Reading page 600002 when Confluence returns HTTP 403 is forbidden.
        - operation: createPage
          name: createdRemoteWorkPolicy
          branch: created
          description: Creating Remote work policy in OPS publishes page 600002 at version 1.
          default: true
        - operation: createPage
          name: titleTaken
          branch: titleConflict
          description: Creating Remote work policy when page 600003 already has that title returns its current version.
        - operation: createPage
          name: spaceMissing
          branch: notFound
          description: Creating Remote work policy in an unknown OPS space finds no target space.
        - operation: createPage
          name: createDenied
          branch: providerRejected
          description: Creating Remote work policy without Add page permission in OPS returns HTTP 403.
        - operation: updatePage
          name: updatedRemoteWorkPolicy
          branch: updated
          description: Updating page 600002 to version 2 saves the revised Remote work policy.
          default: true
        - operation: updatePage
          name: competingEdit
          branch: versionConflict
          description: Updating page 600002 to version 2 after another editor saved version 2 finds version 2 current.
        - operation: updatePage
          name: updateMissingPage
          branch: notFound
          description: Updating page 699999 finds no visible page to change.
        - operation: updatePage
          name: updateDenied
          branch: providerRejected
          description: Updating page 600002 without Edit permission in OPS returns HTTP 403.
        - operation: addComment
          name: publicationComment
          branch: added
          description: Adding the Q4 review footer comment to page 600002 creates comment 700001.
          default: true
        - operation: addComment
          name: commentPageMissing
          branch: notFound
          description: Adding a footer comment to page 699999 finds no visible page.
        - operation: addComment
          name: commentDenied
          branch: providerRejected
          description: Adding a footer comment to page 600002 without Add comments permission returns HTTP 403.
    - company: Atlassian
      id: jira
      name: Jira
      description: Search and read Jira Cloud issues with bounded JQL, create issues and comments without silent duplicates, and move issues through their workflow.
      version: v0.24.0
      languages:
        go: v0.24.0
        python: v0.1.0
        typescript: v0.1.0
      directory: connectors/atlassian/jira
      uiUnits:
        - name: sitePicker
          description: Choose the Jira Cloud site this connection works in from the sites the authorization grants; the unit stores the site's cloudId, and when the host cannot list sites it offers manual entry of the cloudId shown at https://<your-site>.atlassian.net/_edge/tenant_info.
        - name: projectPicker
          description: Choose one Jira project on the connection's site; the unit stores the project ID, key, and name, and a Step that creates issues lists only projects the account can create issues in.
      triggers: []
      operations:
        - name: searchIssues
          kind: query
          description: Search one bounded page of issues with a typed, connector-escaped filter or a caller-built bounded JQL query, continuing with the enhanced search nextPageToken.
          languages:
            - go
            - python
            - typescript
        - name: getIssue
          kind: query
          description: Read one issue by key or ID with its standard fields, plain-text description, and any requested additional fields.
          languages:
            - go
            - python
            - typescript
        - name: createIssue
          kind: mutation
          description: Create one issue in a project with a summary, a plain-text description converted to Atlassian Document Format, labels, and an optional assignee. A synchronous single-dispatch fence prevents a lost Step result from resending a possibly accepted issue.
          languages:
            - go
            - python
            - typescript
        - name: transitionIssue
          kind: mutation
          description: Move one issue through its workflow by transition ID, transition name, or destination status, reading the available transitions first and skipping a transition the issue has already made.
          languages:
            - go
            - python
            - typescript
        - name: addComment
          kind: mutation
          description: Add one plain-text comment, converted to Atlassian Document Format, to an issue. A synchronous single-dispatch fence prevents a lost Step result from resending a possibly accepted comment.
          languages:
            - go
            - python
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/atlassian/jira/go/jiramock
      mocks:
        - operation: searchIssues
          name: searchedDefaultAnswer
          branch: searched
          description: Matches a bounded OPS search before the new triage issue is indexed; returns no issues.
          default: true
        - operation: searchIssues
          name: providerRejectedFailure
          branch: providerRejected
          description: Matches an invalid JQL search rejected before any issues are returned.
        - operation: searchIssues
          name: invalidResponseFailure
          branch: invalidResponse
          description: Matches a search whose response cannot be decoded safely.
        - operation: getIssue
          name: foundDefaultAnswer
          branch: found
          description: Matches a read of OPS-4, the triage issue created in this mock world.
          default: true
        - operation: getIssue
          name: notFoundFailure
          branch: notFound
          description: Matches a read of an issue key absent from the connected Jira site.
        - operation: getIssue
          name: providerRejectedFailure
          branch: providerRejected
          description: Matches an issue read whose access token Jira still rejects with 401 after refresh.
        - operation: getIssue
          name: invalidResponseFailure
          branch: invalidResponse
          description: Matches an issue read with an invalid provider response.
        - operation: createIssue
          name: createdDefaultAnswer
          branch: created
          description: Matches creation of the OPS triage task Loading dock light out.
          default: true
        - operation: createIssue
          name: providerRejectedFailure
          branch: providerRejected
          description: Matches creation with an issue type unavailable in OPS.
        - operation: transitionIssue
          name: transitionedDefaultAnswer
          branch: transitioned
          description: Matches moving OPS-4 from To Do to In Progress during triage.
          default: true
        - operation: transitionIssue
          name: notFoundFailure
          branch: notFound
          description: Matches a transition request for an issue absent from Jira.
        - operation: transitionIssue
          name: transitionUnavailableFailure
          branch: transitionUnavailable
          description: Matches a transition request with no route to the requested status.
        - operation: transitionIssue
          name: providerRejectedFailure
          branch: providerRejected
          description: Matches a transition Jira rejects for a required screen field.
        - operation: transitionIssue
          name: invalidResponseFailure
          branch: invalidResponse
          description: Matches a transition read with an invalid provider response.
        - operation: addComment
          name: addedDefaultAnswer
          branch: added
          description: Matches adding the triage comment to OPS-4.
          default: true
        - operation: addComment
          name: notFoundFailure
          branch: notFound
          description: Matches a comment for an issue absent from Jira.
        - operation: addComment
          name: providerRejectedFailure
          branch: providerRejected
          description: Matches a comment rejected because the per-issue comment limit was reached (HTTP 413).
    - company: Atlassian
      id: jira-service-management
      name: Jira Service Management
      description: Raise, read, label, comment on, and move Jira Service Management customer requests as tickets, with public replies and internal notes, SLA cycles, and customers found by email, never sending a request or comment twice.
      version: v0.24.0
      languages:
        go: v0.24.0
        typescript: v0.1.0
      directory: connectors/atlassian/jira-service-management
      uiUnits:
        - name: sitePicker
          description: Choose the Atlassian site with Jira Service Management that this connection works in from the sites the authorization grants; the unit stores the site's cloudId, and when the host cannot list sites it offers manual entry of the cloudId shown at https://<your-site>.atlassian.net/_edge/tenant_info.
        - name: serviceDeskPicker
          description: Choose one service desk on the connection's site from the desks the connected agent can access; the unit stores the service desk ID, the key of the Jira project behind it, which ticket search uses, and the desk's name.
        - name: requestTypePicker
          description: Choose a service desk and then one of its request types, such as Get IT help; the unit stores the service desk ID, the request type ID, and the request type's name, and lists the request types the connected agent can see on that desk.
      triggers: []
      operations:
        - name: findCustomerByEmail
          kind: query
          description: Find the customers of one service desk whose email address equals the given address, for raising a request on a customer's behalf.
          languages:
            - go
            - typescript
        - name: searchTickets
          kind: query
          description: Search one bounded page of a service desk's requests with typed filters that the connector escapes into JQL, continuing with Jira's enhanced search nextPageToken.
          languages:
            - go
            - typescript
        - name: getTicket
          kind: query
          description: Read one customer request with its plain-text description, labels, priority, and status, its first public replies and internal notes, and its SLA cycles.
          languages:
            - go
            - typescript
        - name: createTicket
          kind: mutation
          description: Raise one customer request of a request type, optionally on a customer's behalf. The sync Step retries definite 429 and 503 responses but never repeats a possibly accepted request.
          languages:
            - go
            - typescript
        - name: updateTicket
          kind: mutation
          description: Add or remove labels on one request and set its priority; a repeated attempt finds the change already applied and writes nothing.
          languages:
            - go
            - typescript
        - name: transitionTicket
          kind: mutation
          description: Move one request through its Jira workflow by transition ID, transition name, or destination status, reading the available transitions first and skipping a transition the request has already made.
          languages:
            - go
            - typescript
        - name: addComment
          kind: mutation
          description: Add one public reply, which Jira Service Management shares with the customer, or one internal note that only agents see. The sync Step retries definite 429 and 503 responses but never repeats a possibly accepted comment.
          languages:
            - go
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/atlassian/jira-service-management/go/jiraservicemanagementmock
      mocks:
        - operation: findCustomerByEmail
          name: foundDefaultAnswer
          branch: found
          description: For serviceDeskId 10 and jane@acme.example.com, Jane Doe is an active customer.
          default: true
        - operation: findCustomerByEmail
          name: notFoundFailure
          branch: notFound
          description: For serviceDeskId 10 and nobody@acme.example.com, no customer has that email.
        - operation: findCustomerByEmail
          name: providerRejectedFailure
          branch: providerRejected
          description: For serviceDeskId 10, HTTP 403 denies customer lookup.
        - operation: findCustomerByEmail
          name: invalidResponseFailure
          branch: invalidResponse
          description: For serviceDeskId 10, Jira returned a malformed customer page.
        - operation: searchTickets
          name: searchedDefaultAnswer
          branch: searched
          description: For project ITH and a new Laptop will not boot request, the first page has no exact-summary ticket.
          default: true
        - operation: searchTickets
          name: providerRejectedFailure
          branch: providerRejected
          description: For project ITH, HTTP 403 denies issue search.
        - operation: searchTickets
          name: invalidResponseFailure
          branch: invalidResponse
          description: For project ITH, Jira returned a malformed search page.
        - operation: getTicket
          name: foundDefaultAnswer
          branch: found
          description: For issueIdOrKey ITH-42, the new request has no comments and a first-response SLA.
          default: true
        - operation: getTicket
          name: notFoundFailure
          branch: notFound
          description: For issueIdOrKey ITH-99, no visible request exists.
        - operation: getTicket
          name: providerRejectedFailure
          branch: providerRejected
          description: For issueIdOrKey ITH-42, HTTP 403 denies the SLA read.
        - operation: getTicket
          name: invalidResponseFailure
          branch: invalidResponse
          description: For issueIdOrKey ITH-42, Jira returned a malformed SLA page.
        - operation: createTicket
          name: createdDefaultAnswer
          branch: created
          description: For desk 10, request type 25, and Laptop will not boot, Jira created ITH-42 for Jane.
          default: true
        - operation: createTicket
          name: providerRejectedFailure
          branch: providerRejected
          description: For desk 10 and request type 25, HTTP 400 rejects a missing required field.
        - operation: updateTicket
          name: updatedDefaultAnswer
          branch: updated
          description: For ITH-42 with addLabels hardware and priority High, the request holds both values.
          default: true
        - operation: updateTicket
          name: notFoundFailure
          branch: notFound
          description: For issueIdOrKey ITH-99, no visible issue exists.
        - operation: updateTicket
          name: providerRejectedFailure
          branch: providerRejected
          description: For ITH-42, HTTP 403 denies Edit Issues permission.
        - operation: updateTicket
          name: invalidResponseFailure
          branch: invalidResponse
          description: For ITH-42, Jira returned a malformed read-back issue.
        - operation: transitionTicket
          name: transitionedDefaultAnswer
          branch: transitioned
          description: For ITH-42 moving to In progress, transition 31 reaches that status.
          default: true
        - operation: transitionTicket
          name: notFoundFailure
          branch: notFound
          description: For issueIdOrKey ITH-99, no visible issue exists.
        - operation: transitionTicket
          name: transitionUnavailableFailure
          branch: transitionUnavailable
          description: For ITH-42 moving to Closed, no available transition matches.
        - operation: transitionTicket
          name: providerRejectedFailure
          branch: providerRejected
          description: For ITH-42, HTTP 403 denies the requested transition.
        - operation: transitionTicket
          name: invalidResponseFailure
          branch: invalidResponse
          description: For ITH-42, Jira returned a malformed transition list.
        - operation: addComment
          name: addedDefaultAnswer
          branch: added
          description: For ITH-42 and the internal note Check the warranty first., comment 1001 is private.
          default: true
        - operation: addComment
          name: notFoundFailure
          branch: notFound
          description: For issueIdOrKey ITH-99, no visible request exists for the note.
        - operation: addComment
          name: providerRejectedFailure
          branch: providerRejected
          description: For ITH-42, HTTP 403 denies Add Comments permission.
    - company: Atlassian
      id: trello
      name: Trello
      description: List and read Trello cards on a board or list with open, closed, and due-date filters, create cards and comments without silent duplicates, and move, archive, reopen, reschedule, or relabel cards.
      version: v0.23.0
      languages:
        go: v0.23.0
        python: v0.1.1
        typescript: v0.1.2
      directory: connectors/atlassian/trello
      uiUnits: []
      triggers: []
      operations:
        - name: listCards
          kind: query
          description: List one bounded page of a board's or a list's open, closed, or all cards, newest first, optionally only cards due in a time range or with a given due-complete state, continuing with the oldest card ID on the page.
          languages:
            - go
            - python
            - typescript
        - name: getCard
          kind: query
          description: Read one card by ID with its list, archive state, due and start dates, labels, members, position, and plain-text description.
          languages:
            - go
            - python
            - typescript
        - name: createCard
          kind: mutation
          description: Create one card in a list with a name, a plain-text description, a due date, labels, members, and a position. Sync durability and a checkpoint prevent replay after ambiguous responses; 429 and 503 retry.
          languages:
            - go
            - python
            - typescript
        - name: updateCard
          kind: mutation
          description: Move a card to a list, archive or reopen it, set or clear its due date and due-complete state, and set, add, or remove labels or set members; every change is an absolute value, so a repeated update leaves the same card.
          languages:
            - go
            - python
            - typescript
        - name: addComment
          kind: mutation
          description: Add one plain-text comment, authored by the token's member, to a card. Sync durability and a checkpoint prevent replay after ambiguous responses; 429 and 503 retry.
          languages:
            - go
            - python
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/atlassian/trello/go/trellomock
      mocks:
        - operation: listCards
          name: approvedBoardPages
          branch: listed
          description: Three newest-first pages for the requested approved board, including an archived card.
          default: true
        - operation: listCards
          name: notFoundFailure
          branch: notFound
          description: The board or list does not exist.
        - operation: listCards
          name: providerRejectedFailure
          branch: providerRejected
          description: Trello conclusively rejected the list, such as an invalid key or token, or a board the token's member cannot open.
        - operation: listCards
          name: invalidResponseFailure
          branch: invalidResponse
          description: Trello returned an invalid or oversized card page.
        - operation: getCard
          name: approvedRequestCard
          branch: found
          description: The requested card ID identifies the approved request card on the approved board.
          default: true
        - operation: getCard
          name: notFoundFailure
          branch: notFound
          description: The card does not exist.
        - operation: getCard
          name: providerRejectedFailure
          branch: providerRejected
          description: Trello conclusively rejected the card read, such as an invalid key or token, or a card the token's member cannot open.
        - operation: getCard
          name: invalidResponseFailure
          branch: invalidResponse
          description: Trello returned an invalid or oversized card.
        - operation: createCard
          name: approvedRequestCreated
          branch: created
          description: Creating the approved request in the approved list returns its new card ID.
          default: true
        - operation: createCard
          name: providerRejectedFailure
          branch: providerRejected
          description: Trello conclusively rejected the card, such as an unknown list, label, or member, or missing permission; nothing was created.
        - operation: updateCard
          name: approvedRequestUpdated
          branch: updated
          description: Updating the approved request card returns that card in the approved list.
          default: true
        - operation: updateCard
          name: notFoundFailure
          branch: notFound
          description: The card does not exist.
        - operation: updateCard
          name: providerRejectedFailure
          branch: providerRejected
          description: Trello conclusively rejected a change, such as an unknown list, label, or member, or missing permission.
        - operation: updateCard
          name: invalidResponseFailure
          branch: invalidResponse
          description: Trello returned an invalid or oversized card, or a card that does not show a requested change.
        - operation: addComment
          name: approvalCommentAdded
          branch: added
          description: Adding the approval text to the approved request card returns its comment action ID.
          default: true
        - operation: addComment
          name: notFoundFailure
          branch: notFound
          description: The card does not exist; nothing was added.
        - operation: addComment
          name: providerRejectedFailure
          branch: providerRejected
          description: Trello conclusively rejected the comment, such as missing permission or invalid text; nothing was added.
    - company: BambooHR
      id: bamboohr
      name: BambooHR
      description: Read BambooHR employee records, find an employee by email, poll employee changes, list time off requests, update employee fields, and add employees, keeping BambooHR's own field names and status values.
      version: v0.23.0
      languages:
        go: v0.23.0
        python: v0.1.0
        typescript: v0.1.1
      directory: connectors/bamboohr
      uiUnits: []
      triggers: []
      operations:
        - name: getEmployee
          kind: query
          description: Read one employee by internal ID with an explicit list of up to 400 fields, reporting the requested fields BambooHR omitted because they are unknown or not visible to the connection.
          languages:
            - go
            - python
            - typescript
        - name: findEmployeeByEmail
          kind: query
          description: Find the one employee whose work or home email equals an address, reading at most 100 candidates from BambooHR's List Employees filter.
          languages:
            - go
            - python
            - typescript
        - name: listEmployeeChanges
          kind: query
          description: List employees inserted, updated, or deleted since a cursor, oldest first and at most 1000 per call, with the cursor for the next poll.
          languages:
            - go
            - python
            - typescript
        - name: listTimeOffRequests
          kind: query
          description: List one page of time off requests overlapping a date window, optionally for one employee and BambooHR statuses, at most 200 per page.
          languages:
            - go
            - python
            - typescript
        - name: updateEmployee
          kind: mutation
          description: Set selected fields of one employee that BambooHR stores as plain values; a repeated attempt finds the values applied and writes nothing.
          languages:
            - go
            - python
            - typescript
        - name: addEmployee
          kind: mutation
          description: Add one employee. BambooHR has no idempotency key, so the shared single-dispatch fence requires sync durability to persist heartbeat checkpoints across retries; 429, 503, and proven unsent requests may be retried.
          languages:
            - go
            - python
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/bamboohr/go/bamboohrmock
      mocks:
        - operation: getEmployee
          name: foundDefaultAnswer
          branch: found
          description: Employee 140 is Ava Nguyen; use with employeeId 140 and firstName, lastName, department fields.
          default: true
        - operation: getEmployee
          name: notFoundFailure
          branch: notFound
          description: Employee ID 999 does not exist.
        - operation: getEmployee
          name: providerRejectedFailure
          branch: providerRejected
          description: The API user cannot view this employee (HTTP 403).
        - operation: getEmployee
          name: invalidResponseFailure
          branch: invalidResponse
          description: BambooHR returned a malformed employee record.
        - operation: findEmployeeByEmail
          name: foundDefaultAnswer
          branch: found
          description: Work email ava.nguyen@example.com uniquely matches employee 140, Ava Nguyen.
          default: true
        - operation: findEmployeeByEmail
          name: notFoundFailure
          branch: notFound
          description: No employee visible to the connection has Sam Park's work or home email sam.park@personal.example.com.
        - operation: findEmployeeByEmail
          name: ambiguousFailure
          branch: ambiguous
          description: Work email shared@example.com exactly matches employees 150 and 151, so neither can be chosen.
        - operation: findEmployeeByEmail
          name: providerRejectedFailure
          branch: providerRejected
          description: The API key is invalid (HTTP 401).
        - operation: findEmployeeByEmail
          name: invalidResponseFailure
          branch: invalidResponse
          description: BambooHR returned a malformed employee list.
        - operation: listEmployeeChanges
          name: listedDefaultAnswer
          branch: listed
          description: After the 2026-10-12 cursor, existing employees 140 and 141 changed; pass the next cursor to poll again.
          default: true
        - operation: listEmployeeChanges
          name: providerRejectedFailure
          branch: providerRejected
          description: The API key is invalid (HTTP 401).
        - operation: listEmployeeChanges
          name: invalidResponseFailure
          branch: invalidResponse
          description: BambooHR returned a malformed change list.
        - operation: listTimeOffRequests
          name: listedDefaultAnswer
          branch: listed
          description: For employee 140 with pageSize 1 and no status filter, a request created between page reads shifts 502 onto page 2; deduplicate the repeated request.
          default: true
        - operation: listTimeOffRequests
          name: providerRejectedFailure
          branch: providerRejected
          description: BambooHR rejected an invalid time off filter (HTTP 400).
        - operation: listTimeOffRequests
          name: invalidResponseFailure
          branch: invalidResponse
          description: BambooHR returned a malformed time off page.
        - operation: updateEmployee
          name: updatedDefaultAnswer
          branch: updated
          description: Employee 140 now has department Engineering; use with that employee ID and field update.
          default: true
        - operation: updateEmployee
          name: notFoundFailure
          branch: notFound
          description: Employee ID 999 does not exist.
        - operation: updateEmployee
          name: providerRejectedFailure
          branch: providerRejected
          description: BambooHR rejected a duplicate email (HTTP 409).
        - operation: updateEmployee
          name: invalidResponseFailure
          branch: invalidResponse
          description: BambooHR returned a malformed employee record, so the change may have been applied.
        - operation: addEmployee
          name: createdDefaultAnswer
          branch: created
          description: Creating Sam Park, who is absent from the default employee lookup, returns new employee ID 142.
          default: true
        - operation: addEmployee
          name: providerRejectedFailure
          branch: providerRejected
          description: Adding an employee with ava.nguyen@example.com as work email is rejected as a duplicate (HTTP 409).
    - company: Brevo
      id: brevo
      name: Brevo
      description: Create or update a contact by email and retrieve a contact.
      version: v0.2.0
      languages:
        go: v0.2.0
        python: v0.1.0
        typescript: v0.1.1
      directory: connectors/brevo
      uiUnits: []
      triggers: []
      operations:
        - name: createOrUpdateContact
          kind: mutation
          description: Create a contact by email or set its specified attributes when it already exists.
          languages:
            - go
            - python
            - typescript
        - name: getContact
          kind: query
          description: Get a Brevo contact by email address.
          languages:
            - go
            - python
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/brevo/go/brevomock
      mocks:
        - operation: createOrUpdateContact
          name: savedDefaultContact
          branch: saved
          description: Meridian contact was created.
          default: true
        - operation: getContact
          name: foundDefaultContact
          branch: found
          description: Meridian contact exists.
          default: true
    - company: Calendly
      id: calendly
      name: Calendly
      description: Read Calendly scheduled events and invitees, cancel events, create single-use scheduling links, register webhook subscriptions, and receive signed invitee.created and invitee.canceled webhooks.
      version: v0.24.0
      languages:
        go: v0.24.0
        typescript: v0.1.0
      directory: connectors/calendly
      uiUnits:
        - name: eventTypePicker
          description: Select one of the connected Calendly user's event types, listed live from Calendly, or paste an event type URI; the unit stores the stable event type URI, such as https://api.calendly.com/event_types/AAAAAAAAAAAAAAAA.
      triggers:
        - name: inviteeEventReceived
          description: Receive a signed Calendly invitee.created or invitee.canceled webhook, with the invitee's stable URI as its event ID.
          languages:
            - go
      operations:
        - name: listScheduledEvents
          kind: query
          description: List one page of scheduled events that start inside a required time window, for a user, an organization, or the connected user.
          languages:
            - go
            - typescript
        - name: getScheduledEvent
          kind: query
          description: Read one scheduled event by its Calendly URI.
          languages:
            - go
            - typescript
        - name: listEventInvitees
          kind: query
          description: List one bounded page of a scheduled event's invitees.
          languages:
            - go
            - typescript
        - name: cancelScheduledEvent
          kind: mutation
          description: Cancel one scheduled event; an event that is already canceled also selects canceled, so a repeated call is safe.
          languages:
            - go
            - typescript
        - name: createSchedulingLink
          kind: mutation
          description: Create one single-use scheduling link for an event type. Calendly has no idempotency key or link lookup. A single-dispatch fence requires sync durability so retry attempts see its heartbeat checkpoints; an unconfirmed accepted write selects uncertain.
          languages:
            - go
            - typescript
        - name: createWebhookSubscription
          kind: mutation
          description: Subscribe a callback URL to invitee webhooks. The connector lists the scope's subscriptions first and reuses one with the same URL, so a repeated call creates at most one subscription.
          languages:
            - go
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/calendly/go/calendlymock
      mocks:
        - operation: listScheduledEvents
          name: threeScheduledEventPages
          branch: listed
          description: Three pages in the November window for user USER0001, with EVT00001 repeated across pages.
          default: true
        - operation: listScheduledEvents
          name: providerRejectedFailure
          branch: providerRejected
          description: A 401 means Calendly rejected the access token before listing events.
        - operation: listScheduledEvents
          name: invalidResponseFailure
          branch: invalidResponse
          description: Calendly returned malformed JSON in a successful response.
        - operation: getScheduledEvent
          name: discoveryCall
          branch: found
          description: The requested EVT00001 event is Ada's active November discovery call.
          default: true
        - operation: getScheduledEvent
          name: notFoundFailure
          branch: notFound
          description: The scheduled event does not exist or is not visible to the token.
        - operation: getScheduledEvent
          name: providerRejectedFailure
          branch: providerRejected
          description: A 401 means Calendly rejected the access token before reading the event.
        - operation: getScheduledEvent
          name: invalidResponseFailure
          branch: invalidResponse
          description: Calendly returned malformed JSON in a successful response.
        - operation: listEventInvitees
          name: threeInviteePages
          branch: listed
          description: Three pages of EVT00001 invitees, with Ada repeated across a page boundary.
          default: true
        - operation: listEventInvitees
          name: notFoundFailure
          branch: notFound
          description: The scheduled event does not exist or is not visible to the token.
        - operation: listEventInvitees
          name: providerRejectedFailure
          branch: providerRejected
          description: A 401 means Calendly rejected the access token before listing invitees.
        - operation: listEventInvitees
          name: invalidResponseFailure
          branch: invalidResponse
          description: Calendly returned malformed JSON in a successful response.
        - operation: cancelScheduledEvent
          name: canceledDiscoveryCall
          branch: canceled
          description: Cancel EVT00001 after Ada booked it; this first cancellation succeeds.
          default: true
        - operation: cancelScheduledEvent
          name: notFoundFailure
          branch: notFound
          description: The scheduled event does not exist or is not visible to the token.
        - operation: cancelScheduledEvent
          name: providerRejectedFailure
          branch: providerRejected
          description: Calendly refused cancellation because the event already started.
        - operation: cancelScheduledEvent
          name: invalidResponseFailure
          branch: invalidResponse
          description: Calendly returned malformed JSON in a successful response.
        - operation: createSchedulingLink
          name: singleUseDiscoveryLink
          branch: created
          description: Create a single-use link for event type TYPE0001, the Discovery Call.
          default: true
        - operation: createSchedulingLink
          name: providerRejectedFailure
          branch: providerRejected
          description: A 403 means this token cannot create a link for the selected event type.
        - operation: createWebhookSubscription
          name: activeInviteeWebhook
          branch: subscribed
          description: Subscribe the example callback for user USER0001's invitee events in organization ORG00001.
          default: true
        - operation: createWebhookSubscription
          name: conflictingSubscriptionFailure
          branch: conflictingSubscription
          description: A subscription with this callback URL already exists but is disabled, lacks a requested event, or belongs to another scope or user; delete it in Calendly and run again.
        - operation: createWebhookSubscription
          name: providerRejectedFailure
          branch: providerRejected
          description: A 403 means this token cannot administer the requested webhook scope.
        - operation: createWebhookSubscription
          name: invalidResponseFailure
          branch: invalidResponse
          description: Calendly returned malformed JSON in a successful response.
    - company: ClickUp
      id: clickup
      name: ClickUp
      description: Search a ClickUp Workspace's tasks by List, status, assignee, tag, and update time, read one task with its custom fields, create tasks and comments without silent duplicates, change a task's status, priority, due date, and assignees, add or remove tags, find a member by email, and receive signed task webhooks.
      version: v0.23.0
      languages:
        go: v0.23.0
        typescript: v0.1.2
      directory: connectors/clickup
      uiUnits:
        - name: taskEventPicker
          description: Select the ClickUp task webhook events a taskEvent binding accepts, such as taskCreated or taskStatusUpdated; the unit stores the event names, and selecting none accepts every task event. ClickUp sends only the events its webhook subscribes to.
      triggers:
        - name: taskEvent
          description: Receive one ClickUp task webhook event, verified with its X-Signature, such as a created task or a status change, filtered by event name.
          languages:
            - go
      operations:
        - name: searchTasks
          kind: query
          description: Search one Workspace's tasks by List, Folder, Space, status, assignee, tag, and update time, returning one page of up to 100 tasks and the next page number.
          languages:
            - go
            - typescript
        - name: getTask
          kind: query
          description: Read one task by ID or custom task ID with its status, priority, dates, assignees, tags, List, Markdown description, and custom field values.
          languages:
            - go
            - typescript
        - name: createTask
          kind: mutation
          description: Create one task in a List with a name, Markdown description, status, priority, due time, assignees, tags, parent task, and custom field values. ClickUp has no idempotency key, so the Step runs with sync durability, records a Dex heartbeat checkpoint before sending, and reconciles an unconfirmed attempt by reading the List back instead of resending.
          languages:
            - go
            - typescript
        - name: updateTask
          kind: mutation
          description: Change one task's name, Markdown description, status, priority, or due time, and add or remove assignees; every change is an absolute value or a set membership, so a repeated update leaves the same task.
          languages:
            - go
            - typescript
        - name: updateTaskTags
          kind: mutation
          description: Add tags to and remove tags from one task, then read the task's tags back; adding a present tag or removing an absent one changes nothing, so a repeated update is safe.
          languages:
            - go
            - typescript
        - name: addComment
          kind: mutation
          description: Add one plain-text comment, authored by the token's user, to a task. ClickUp has no idempotency key, so the Step runs with sync durability, records a Dex heartbeat checkpoint before sending, and reconciles an unconfirmed attempt by reading the task's comments back instead of resending.
          languages:
            - go
            - typescript
        - name: findMemberByEmail
          kind: query
          description: Find the member of one Workspace whose email address equals the given address, returning the numeric user ID that task assignees use.
          languages:
            - go
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/clickup/go/clickupmock
      mocks:
        - operation: searchTasks
          name: unrelatedEscalations
          branch: searched
          description: Searching Workspace 9014123456 for escalation List 901410000099 returns three pages of other task IDs.
          default: true
        - operation: searchTasks
          name: unknownWorkspaceSearch
          branch: notFound
          description: A simulated HTTP 404 for Workspace 9999999999 finds no Workspace; ClickUp's live response is unverified.
        - operation: searchTasks
          name: searchDenied
          branch: providerRejected
          description: Searching Workspace 9014123456 without access to its escalation List is denied.
        - operation: getTask
          name: blockedLoginTask
          branch: found
          description: Reading task 86b2x1 returns the blocked SSO login task with its customer tag.
          default: true
        - operation: getTask
          name: missingTask
          branch: notFound
          description: Reading task 86b2missing finds no visible task.
        - operation: getTask
          name: taskReadDenied
          branch: providerRejected
          description: Reading task 86b2x1 without permission to its List is denied.
        - operation: createTask
          name: createdLoginEscalation
          branch: created
          description: Creating the escalation for blocked task 86b2x1 in List 901410000099 creates task 86b2x9.
          default: true
        - operation: createTask
          name: missingEscalationList
          branch: notFound
          description: Creating an escalation in List 999999999999 finds no accessible List.
        - operation: createTask
          name: createDenied
          branch: providerRejected
          description: Creating an escalation in List 901410000099 without task creation permission is denied.
        - operation: updateTask
          name: assignedBlockedTask
          branch: updated
          description: Updating task 86b2x1 assigns Ada Lovelace and sets urgent priority after the escalation.
          default: true
        - operation: updateTask
          name: missingTaskUpdate
          branch: notFound
          description: Updating task 86b2missing finds no visible task.
        - operation: updateTask
          name: taskUpdateDenied
          branch: providerRejected
          description: Updating task 86b2x1 without edit permission is denied.
        - operation: updateTaskTags
          name: taggedBlockedTask
          branch: updated
          description: Adding escalated to task 86b2x1 leaves its customer tag and records the new tag.
          default: true
        - operation: updateTaskTags
          name: missingTaskTags
          branch: notFound
          description: Adding escalated to task 86b2missing finds no visible task.
        - operation: updateTaskTags
          name: tagUpdateDenied
          branch: providerRejected
          description: Adding escalated to task 86b2x1 without edit permission is denied before changes apply.
        - operation: addComment
          name: escalationLinkComment
          branch: added
          description: Commenting on task 86b2x1 links the new escalation task 86b2x9 and creates comment 700001.
          default: true
        - operation: addComment
          name: missingCommentTask
          branch: notFound
          description: Commenting on task 86b2missing finds no visible task.
        - operation: addComment
          name: commentDenied
          branch: providerRejected
          description: Commenting on task 86b2x1 without comment permission is denied.
        - operation: findMemberByEmail
          name: escalationManager
          branch: found
          description: Looking up manager@acme.example.com in Workspace 9014123456 finds Ada Lovelace.
          default: true
        - operation: findMemberByEmail
          name: unknownManager
          branch: notFound
          description: Looking up contractor@vendor.example.com in Workspace 9014123456 finds no member.
        - operation: findMemberByEmail
          name: memberReadDenied
          branch: providerRejected
          description: Looking up manager@acme.example.com when GET /team returns HTTP 403 is denied.
    - company: Close
      id: close
      name: Close
      description: Read Close records with a connection-owned API key.
      version: v0.2.0
      languages:
        go: v0.2.0
        python: v0.1.0
        typescript: v0.1.1
      directory: connectors/close
      uiUnits: []
      triggers: []
      operations:
        - name: listLeads
          kind: query
          description: Read Close data from the documented listLeads endpoint.
          languages:
            - go
            - python
            - typescript
        - name: getLead
          kind: query
          description: Read Close data from the documented getLead endpoint.
          languages:
            - go
            - python
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/close/go/closemock
      mocks:
        - operation: listLeads
          name: defaultAnswer
          branch: listed
          description: One Meridian sample record from the same example world.
          default: true
        - operation: listLeads
          name: invalidKey
          branch: providerRejected
          description: The connection token is invalid.
        - operation: getLead
          name: defaultAnswer
          branch: found
          description: One Meridian sample record from the same example world.
          default: true
        - operation: getLead
          name: invalidKey
          branch: providerRejected
          description: The connection token is invalid.
    - company: Cloudflare
      id: cloudflare
      name: Cloudflare
      description: Use the Cloudflare REST API through typed Dex connector Steps.
      version: v0.2.0
      languages:
        go: v0.2.0
        python: v0.1.0
        typescript: v0.1.1
      directory: connectors/cloudflare
      uiUnits: []
      triggers: []
      operations:
        - name: listZones
          kind: query
          description: List the first page of Cloudflare zones.
          languages:
            - go
            - python
            - typescript
        - name: purgeCacheByURLs
          kind: mutation
          description: Purge specific URLs from a Cloudflare zone; repeating the same purge has the same cache-removal effect.
          languages:
            - go
            - python
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/cloudflare/go/cloudflaremock
      mocks:
        - operation: listZones
          name: listedDefault
          branch: listed
          description: A Meridian example returns a representative ZonesPage.
          default: true
        - operation: purgeCacheByURLs
          name: purgedDefault
          branch: purged
          description: A Meridian example returns a representative CachePurge.
          default: true
    - company: Coda
      id: coda
      name: Coda
      description: Coda REST connector with two bounded operations.
      version: v0.2.0
      languages:
        go: v0.2.0
        python: v0.1.0
        typescript: v0.1.1
      directory: connectors/coda
      uiUnits: []
      triggers: []
      operations:
        - name: listRows
          kind: query
          description: List one page of rows in a Coda table.
          languages:
            - go
            - python
            - typescript
        - name: getRow
          kind: query
          description: Get one row in a Coda table.
          languages:
            - go
            - python
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/coda/go/codamock
      mocks:
        - operation: listRows
          name: defaultListRows
          branch: listed
          description: A representative provider response for the example resource.
          default: true
        - operation: getRow
          name: defaultGetRow
          branch: found
          description: A representative provider response for the example resource.
          default: true
    - company: Cohere
      id: cohere
      name: Cohere
      description: Generate text embeddings and relevance rankings through Cohere v2.
      version: v0.2.0
      languages:
        go: v0.2.0
        python: v0.1.0
        typescript: v0.1.1
      directory: connectors/cohere
      uiUnits: []
      triggers: []
      operations:
        - name: embed
          kind: query
          description: Generate float embeddings for text with Cohere v2.
          languages:
            - go
            - python
            - typescript
        - name: rerank
          kind: query
          description: Rank text documents by relevance to one query through Cohere v2.
          languages:
            - go
            - python
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/cohere/go/coheremock
      mocks:
        - operation: embed
          name: defaultEmbedding
          branch: embedded
          description: One Meridian query returns one three-dimensional float vector.
          default: true
        - operation: embed
          name: invalidKey
          branch: providerRejected
          description: The connection key is invalid.
        - operation: rerank
          name: defaultRanking
          branch: ranked
          description: The release note ranks above an unrelated article.
          default: true
        - operation: rerank
          name: invalidKey
          branch: providerRejected
          description: The connection key is invalid.
    - company: Contentful
      id: contentful
      name: Contentful
      description: Contentful REST connector with two bounded operations.
      version: v0.2.0
      languages:
        go: v0.2.0
        python: v0.1.0
        typescript: v0.1.1
      directory: connectors/contentful
      uiUnits: []
      triggers: []
      operations:
        - name: getEntry
          kind: query
          description: Get one published Contentful entry.
          languages:
            - go
            - python
            - typescript
        - name: listEntries
          kind: query
          description: List one page of published entries in a space and environment.
          languages:
            - go
            - python
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/contentful/go/contentfulmock
      mocks:
        - operation: getEntry
          name: defaultGetEntry
          branch: found
          description: A representative provider response for the example resource.
          default: true
        - operation: listEntries
          name: defaultListEntries
          branch: listed
          description: A representative provider response for the example resource.
          default: true
    - company: Datadog
      id: datadog
      name: Datadog
      description: Use the Datadog REST API through typed Dex connector Steps.
      version: v0.2.0
      languages:
        go: v0.2.0
        python: v0.1.0
        typescript: v0.1.1
      directory: connectors/datadog
      uiUnits: []
      triggers: []
      operations:
        - name: queryMetrics
          kind: query
          description: Query Datadog timeseries points over an explicit Unix-second interval.
          languages:
            - go
            - python
            - typescript
        - name: listMonitors
          kind: query
          description: List one page of Datadog monitors.
          languages:
            - go
            - python
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/datadog/go/datadogmock
      mocks:
        - operation: queryMetrics
          name: queriedDefault
          branch: queried
          description: A Meridian example returns a representative MetricsQuery.
          default: true
        - operation: listMonitors
          name: listedDefault
          branch: listed
          description: A Meridian example returns a representative MonitorsPage.
          default: true
    - company: Discord
      id: discord
      name: Discord
      description: Read Discord channels and bounded pages of channel messages, send nonce-deduplicated bot messages, and add reactions.
      version: v0.3.0
      languages:
        go: v0.3.0
        python: v0.1.0
        typescript: v0.1.0
      directory: connectors/discord
      uiUnits: []
      triggers: []
      operations:
        - name: getChannel
          kind: query
          description: Read one channel the bot can view by channel ID.
          languages:
            - go
            - python
            - typescript
        - name: listChannelMessages
          kind: query
          description: List one bounded page of up to 100 channel messages, newest first, before or after a message ID.
          languages:
            - go
            - python
            - typescript
        - name: createMessage
          kind: mutation
          description: Send one bot text message to a channel, deduplicated by a Discord nonce derived from the idempotency key, with every mention disabled.
          languages:
            - go
            - python
            - typescript
        - name: addReaction
          kind: mutation
          description: Add the bot's reaction with one emoji to a channel message; repeating it leaves one reaction.
          languages:
            - go
            - python
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/discord/go/discordmock
      mocks:
        - operation: getChannel
          name: announcementChannel
          branch: found
          description: Reading channel 100000000000000001 finds the announcements channel.
          default: true
        - operation: getChannel
          name: unknownChannel
          branch: notFound
          description: Reading unknown channel 100000000000000404 receives Discord's Unknown Channel 404.
        - operation: getChannel
          name: inaccessibleChannel
          branch: providerRejected
          description: Reading channel 100000000000000403 without View Channels permission receives HTTP 403.
        - operation: listChannelMessages
          name: announcementReadBack
          branch: listed
          description: Listing channel 100000000000000001 finds the posted announcement behind another user's newer message.
          default: true
        - operation: listChannelMessages
          name: unknownChannel
          branch: notFound
          description: Listing messages in unknown channel 100000000000000404 receives Discord's Unknown Channel 404.
        - operation: listChannelMessages
          name: missingReadPermission
          branch: providerRejected
          description: Listing channel 100000000000000403 without Read Message History receives HTTP 403.
        - operation: createMessage
          name: releaseAnnouncement
          branch: created
          description: Posting Release today @everyone to channel 100000000000000001 creates one mention-safe message.
          default: true
        - operation: createMessage
          name: unknownChannel
          branch: notFound
          description: Posting to unknown channel 100000000000000404 receives Discord's Unknown Channel 404.
        - operation: createMessage
          name: missingSendPermission
          branch: providerRejected
          description: Posting to channel 100000000000000403 without Send Messages receives HTTP 403.
        - operation: addReaction
          name: announcementReaction
          branch: added
          description: "Adding \U0001F4E3 to message 300000000000000001 in channel 100000000000000001 succeeds."
          default: true
        - operation: addReaction
          name: unknownMessage
          branch: notFound
          description: Reacting to unknown message 300000000000000404 receives Discord's Unknown Message 404.
        - operation: addReaction
          name: missingReactionPermission
          branch: providerRejected
          description: Reacting to message 300000000000000403 without Add Reactions receives HTTP 403.
    - company: DocuSign
      id: docusign
      name: DocuSign eSignature
      description: Send DocuSign eSignature envelopes from templates, guarded against duplicates on retry, read envelope and recipient status, void an envelope as compensation, record the signed combined PDF's digest outside Dex payloads, and receive HMAC-verified Connect envelope-completed, envelope-declined, and envelope-voided events.
      version: v0.24.0
      languages:
        go: v0.24.0
        typescript: v0.1.0
      directory: connectors/docusign
      uiUnits: []
      triggers:
        - name: envelopeEventReceived
          description: Receive an HMAC-verified DocuSign Connect envelope-completed, envelope-declined, or envelope-voided event in the JSON SIM format, with the envelope ID and event name as its event ID and the envelope's text custom fields for correlation.
          languages:
            - go
      operations:
        - name: createEnvelopeFromTemplate
          kind: mutation
          description: Create one envelope from a server template, filling its roles in their routing order, and send it or keep it as a draft. DocuSign has no idempotency key, so the call runs with sync durability, tags the envelope with a hidden custom field derived from the Step's idempotency key, and on every later attempt looks for that envelope by the field before sending again; an outcome it cannot confirm selects uncertain.
          languages:
            - go
            - typescript
        - name: getEnvelope
          kind: query
          description: Read one envelope's status, status timestamps, void reason, and text custom fields. DocuSign allows an app one status read per envelope every 15 minutes, so prefer the envelopeEventReceived Trigger and poll only as a fallback.
          languages:
            - go
            - typescript
        - name: listEnvelopeRecipients
          kind: query
          description: List an envelope's recipients in routing order with each one's type, role, status, and sent, delivered, signed, and declined times, and the routing order DocuSign is currently waiting on.
          languages:
            - go
            - typescript
        - name: voidEnvelope
          kind: mutation
          description: Void one sent or delivered envelope with a reason, the compensation for a send that must not complete. An envelope that is already voided also selects voided, so a repeated call is safe; a completed, declined, or draft envelope selects notVoidable with its status.
          languages:
            - go
            - typescript
        - name: downloadCombinedDocument
          kind: query
          description: Stream an envelope's documents as one combined PDF, optionally with the certificate of completion, through a SHA-256 digest and into the application's CombinedDocumentStore when one is configured. The Result holds the byte count, digest, and the store's location, never the PDF bytes.
          languages:
            - go
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/docusign/go/docusignmock
      mocks:
        - operation: createEnvelopeFromTemplate
          name: meridianAgreementSent
          branch: created
          description: Creating template 8c9f5a8b-1111-2222-3333-4f5e6d7c8b9a for Priya sends the Meridian agreement.
          default: true
        - operation: createEnvelopeFromTemplate
          name: unknownTemplate
          branch: providerRejected
          description: Creating from unknown template 8c9f5a8b-1111-2222-3333-4f5e6d7c8b9b receives HTTP 400 TEMPLATE_ID_INVALID.
        - operation: getEnvelope
          name: completedMeridianAgreement
          branch: found
          description: Reading envelope 93be49ab-0000-0000-0000-000000000001 after Priya signs finds it completed.
          default: true
        - operation: getEnvelope
          name: unknownEnvelope
          branch: notFound
          description: Reading envelope 93be49ab-0000-0000-0000-000000000404 receives HTTP 404.
        - operation: getEnvelope
          name: accountAccessDenied
          branch: providerRejected
          description: Reading envelope 93be49ab-0000-0000-0000-000000000403 without account access receives HTTP 403.
        - operation: listEnvelopeRecipients
          name: meridianSigner
          branch: listed
          description: Listing recipients of envelope 93be49ab-0000-0000-0000-000000000001 finds Priya's completed signature.
          default: true
        - operation: listEnvelopeRecipients
          name: unknownEnvelope
          branch: notFound
          description: Listing recipients of envelope 93be49ab-0000-0000-0000-000000000404 receives HTTP 404.
        - operation: listEnvelopeRecipients
          name: accountAccessDenied
          branch: providerRejected
          description: Listing recipients of envelope 93be49ab-0000-0000-0000-000000000403 without account access receives HTTP 403.
        - operation: voidEnvelope
          name: expiredAgreementVoided
          branch: voided
          description: Voiding expired envelope 93be49ab-0000-0000-0000-000000000002 succeeds.
          default: true
        - operation: voidEnvelope
          name: completedAgreementCannotBeVoided
          branch: notVoidable
          description: Voiding completed envelope 93be49ab-0000-0000-0000-000000000001 receives a status refusal and read-back confirms completed.
        - operation: voidEnvelope
          name: unknownEnvelope
          branch: notFound
          description: Voiding envelope 93be49ab-0000-0000-0000-000000000404 receives HTTP 404.
        - operation: voidEnvelope
          name: senderPermissionDenied
          branch: providerRejected
          description: Voiding envelope 93be49ab-0000-0000-0000-000000000403 without sender permission receives HTTP 403.
        - operation: downloadCombinedDocument
          name: signedMeridianPDF
          branch: downloaded
          description: Downloading envelope 93be49ab-0000-0000-0000-000000000001 with its certificate returns the stored signed MSA digest.
          default: true
        - operation: downloadCombinedDocument
          name: unknownEnvelope
          branch: notFound
          description: Downloading envelope 93be49ab-0000-0000-0000-000000000404 receives HTTP 404.
        - operation: downloadCombinedDocument
          name: oversizedPDF
          branch: tooLarge
          description: Downloading envelope 93be49ab-0000-0000-0000-000000000413 exceeds maxDocumentBytes and stores nothing.
        - operation: downloadCombinedDocument
          name: accountAccessDenied
          branch: providerRejected
          description: Downloading envelope 93be49ab-0000-0000-0000-000000000403 without account access receives HTTP 403.
    - company: Doist
      id: todoist
      name: Todoist
      description: List, read, create, update, and delete Todoist tasks through typed Dex Steps.
      version: v0.4.0
      languages:
        go: v0.4.0
        typescript: v0.1.1
      directory: connectors/doist/todoist
      uiUnits: []
      triggers: []
      operations:
        - name: getTask
          kind: query
          description: Read one active, non-completed task by its opaque Todoist task ID.
          languages:
            - go
            - typescript
        - name: updateTaskContent
          kind: mutation
          description: Update only specified content or description fields; omitted fields are unchanged. Empty description clears it. Project moves are not supported.
          languages:
            - go
            - typescript
        - name: listTasks
          kind: query
          description: Read one cursor-paginated page of active tasks, optionally filtered by project.
          languages:
            - go
            - typescript
        - name: createTask
          kind: mutation
          description: Create a task with content and optional description or project; omitted project uses Inbox. Sends a stable X-Request-ID.
          languages:
            - go
            - typescript
        - name: deleteTask
          kind: mutation
          description: Delete a task and its subtasks by immutable task ID. Retried deletion may observe that the task is already absent.
          languages:
            - go
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/doist/todoist/go/todoistmock
      mocks:
        - operation: getTask
          name: createdTask
          branch: found
          description: Reading task created-task just after creation finds its original title and description.
          default: true
        - operation: getTask
          name: deletedTaskMissing
          branch: notFound
          description: Reading task created-task after deletion receives Todoist's HTTP 404.
        - operation: getTask
          name: taskReadDenied
          branch: providerRejected
          description: Reading task denied-task without permission receives Todoist's HTTP 403.
        - operation: updateTaskContent
          name: lifecycleTitleUpdated
          branch: updated
          description: Updating created-task content to Original title - updated keeps its description and project.
          default: true
        - operation: updateTaskContent
          name: taskMissingDuringUpdate
          branch: notFound
          description: Updating task missing-task receives Todoist's HTTP 404 before any change.
        - operation: updateTaskContent
          name: taskUpdateDenied
          branch: providerRejected
          description: Updating task denied-task without permission receives Todoist's HTTP 403.
        - operation: listTasks
          name: inboxTasksAcrossPages
          branch: listed
          description: Listing inbox-project tasks from a blank cursor finds unrelated tasks before created-task on page three.
          default: true
        - operation: listTasks
          name: taskListDenied
          branch: providerRejected
          description: Listing denied-project tasks without permission receives Todoist's HTTP 403.
        - operation: createTask
          name: disposableTaskCreated
          branch: created
          description: Creating Original title with Original description in Inbox returns task created-task.
          default: true
        - operation: createTask
          name: taskCreationDenied
          branch: providerRejected
          description: Creating a task in denied-project without permission receives Todoist's HTTP 403.
        - operation: deleteTask
          name: disposableTaskDeleted
          branch: deleted
          description: Deleting created-task after its update removes the disposable task.
          default: true
        - operation: deleteTask
          name: taskAlreadyAbsent
          branch: alreadyAbsent
          description: Deleting missing-task after an earlier attempt receives Todoist's HTTP 404.
        - operation: deleteTask
          name: taskDeletionDenied
          branch: providerRejected
          description: Deleting denied-task without permission receives Todoist's HTTP 403.
    - company: ElevenLabs
      id: elevenlabs
      name: ElevenLabs
      description: List voices and generate bounded audio through ElevenLabs.
      version: v0.2.0
      languages:
        go: v0.2.0
        typescript: v0.1.0
      directory: connectors/elevenlabs
      uiUnits: []
      triggers: []
      operations:
        - name: listVoices
          kind: query
          description: List available voices and their identifiers for speech generation.
          languages:
            - go
            - typescript
        - name: createSpeech
          kind: query
          description: Generate bounded MP3 speech audio from text with a selected voice.
          languages:
            - go
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/elevenlabs/go/elevenlabsmock
      mocks:
        - operation: listVoices
          name: listedDefault
          branch: listed
          description: A representative ElevenLabs result for the example Flow.
          default: true
        - operation: createSpeech
          name: createdDefault
          branch: created
          description: A representative ElevenLabs result for the example Flow.
          default: true
    - company: Figma
      id: figma
      name: Figma
      description: Read Figma records with a connection-owned API key.
      version: v0.2.0
      languages:
        go: v0.2.0
        typescript: v0.1.1
      directory: connectors/figma
      uiUnits: []
      triggers: []
      operations:
        - name: getFile
          kind: query
          description: Read Figma data from the documented getFile endpoint.
          languages:
            - go
            - typescript
        - name: getFileComments
          kind: query
          description: Read Figma data from the documented getFileComments endpoint.
          languages:
            - go
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/figma/go/figmamock
      mocks:
        - operation: getFile
          name: defaultAnswer
          branch: found
          description: One Meridian sample record from the same example world.
          default: true
        - operation: getFile
          name: invalidKey
          branch: providerRejected
          description: The connection token is invalid.
        - operation: getFileComments
          name: defaultAnswer
          branch: listed
          description: One Meridian sample record from the same example world.
          default: true
        - operation: getFileComments
          name: invalidKey
          branch: providerRejected
          description: The connection token is invalid.
    - company: Freshworks
      id: freshdesk
      name: Freshdesk
      description: Search, read, create, and update Freshdesk tickets and add private notes or public replies, keeping Freshdesk's own integer statuses and priorities.
      version: v0.23.0
      languages:
        go: v0.23.0
        typescript: v0.1.0
      directory: connectors/freshworks/freshdesk
      uiUnits: []
      triggers: []
      operations:
        - name: searchTickets
          kind: query
          description: Filter tickets by Freshdesk status, priority, tag, update date, and requester email with Freshdesk's filter query, returning one page of at most 30 tickets.
          languages:
            - go
            - typescript
        - name: getTicket
          kind: query
          description: Read one ticket by ID with its requester and a bounded list of its first conversations.
          languages:
            - go
            - typescript
        - name: createTicket
          kind: mutation
          description: Create one ticket for a requester email. The Step runs with sync durability; 429, 503, and traced pre-connection failures permit one next-attempt resend, while other dispatched outcomes are never resent.
          languages:
            - go
            - typescript
        - name: updateTicket
          kind: mutation
          description: Set the status, priority, group, or agent of one ticket and add or remove tags; a repeated attempt finds the change already applied and writes nothing.
          languages:
            - go
            - typescript
        - name: addNote
          kind: mutation
          description: Add one private note or one public reply to a ticket. The Step runs with sync durability; 429, 503, and traced pre-connection failures permit one next-attempt resend, while other dispatched outcomes are never resent.
          languages:
            - go
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/freshworks/freshdesk/go/freshdeskmock
      mocks:
        - operation: searchTickets
          name: customerIssuePages
          branch: searched
          description: For requester jane@acme.example.com and tag billing-double-charge, page 1 has no tickets for that requester, page 2 finds ticket 1201, and page 3 has none; other searches need a script.
          default: true
        - operation: searchTickets
          name: searchRejected
          branch: providerRejected
          description: A search for an unknown status is rejected by Freshdesk.
        - operation: searchTickets
          name: invalidSearchPage
          branch: invalidResponse
          description: A search page for the requested filter is malformed.
        - operation: getTicket
          name: customerIssueTicket
          branch: found
          description: Ticket 1201 belongs to jane@acme.example.com and carries billing-double-charge; another ticket ID needs a script.
          default: true
        - operation: getTicket
          name: ticketMissing
          branch: notFound
          description: The requested ticket ID is not visible to the agent.
        - operation: getTicket
          name: ticketReadRejected
          branch: providerRejected
          description: The agent cannot read the requested ticket.
        - operation: getTicket
          name: invalidTicketRead
          branch: invalidResponse
          description: The requested ticket has a malformed conversation page.
        - operation: createTicket
          name: createdCustomerIssue
          branch: created
          description: For a new issue from jane@acme.example.com tagged billing-double-charge, Freshdesk creates ticket 1202; other inputs need a script.
          default: true
        - operation: createTicket
          name: ticketCreateRejected
          branch: providerRejected
          description: A new ticket naming a group the agent cannot use is rejected.
        - operation: updateTicket
          name: reprioritizedCustomerIssue
          branch: updated
          description: For ticket 1201, set status Open, priority High, and tag dex-repeat-contact; another ticket or change needs a script.
          default: true
        - operation: updateTicket
          name: updateTicketMissing
          branch: notFound
          description: The ticket ID to update no longer exists.
        - operation: updateTicket
          name: updateRejected
          branch: providerRejected
          description: The ticket is marked spam and cannot be updated.
        - operation: updateTicket
          name: invalidUpdatedTicket
          branch: invalidResponse
          description: The update succeeded but its ticket answer is malformed.
        - operation: addNote
          name: customerIssuePrivateNote
          branch: added
          description: For ticket 1201, add the private triage note for jane@acme.example.com's billing issue; another ticket or body needs a script.
          default: true
        - operation: addNote
          name: noteTicketMissing
          branch: notFound
          description: The ticket ID for the note no longer exists.
        - operation: addNote
          name: noteRejected
          branch: providerRejected
          description: The agent cannot add a note to this ticket.
    - company: Front
      id: front
      name: Front
      description: Search, read, reply to, comment on, and update Front conversations and find contacts by email, keeping Front's own conversation statuses, ticket status IDs, and tag and teammate IDs.
      version: v0.23.0
      languages:
        go: v0.23.0
        typescript: v0.1.0
      directory: connectors/front
      uiUnits:
        - name: inboxPicker
          description: Select one Front inbox, listed live from GET https://api2.frontapp.com/inboxes with the connection's API token, or enter its ID; the unit stores the stable inbox ID, such as inb_41w25, never the inbox name.
        - name: teammatePicker
          description: Select one Front teammate, listed live from GET https://api2.frontapp.com/teammates with the connection's API token, or enter the teammate ID; the unit stores the stable teammate ID, such as tea_2thf, never the email address.
        - name: tagPicker
          description: Select one Front tag, listed live from GET https://api2.frontapp.com/tags with the connection's API token, or enter the tag ID; the unit stores the stable tag ID, such as tag_13o8r1, because Front adds, removes, and searches tags by ID, never by name.
      triggers: []
      operations:
        - name: searchConversations
          kind: query
          description: Search conversations by text, inbox, tag, Front status filters, recipient email, assignee, and recent activity, returning one bounded page newest activity first and a page token for the next.
          languages:
            - go
            - typescript
        - name: getConversation
          kind: query
          description: Read one conversation by ID with a bounded list of its newest messages and newest internal comments.
          languages:
            - go
            - typescript
        - name: replyToConversation
          kind: mutation
          description: Send one reply that Front delivers to the conversation's recipients, or add one internal comment that only teammates see. Front has no idempotency key or client-supplied lookup value, so the shared single-dispatch fence needs sync durability for visible heartbeat checkpoints across attempts.
          languages:
            - go
            - typescript
        - name: updateConversation
          kind: mutation
          description: Set the Front status or ticket status, assignee, and tags of one conversation, then read it back; a repeated attempt finds the values already applied and writes nothing.
          languages:
            - go
            - typescript
        - name: findContactByEmail
          kind: query
          description: Find the Front contact whose email handle equals one address; Front keeps each handle on at most one contact.
          languages:
            - go
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/front/go/frontmock
      mocks:
        - operation: searchConversations
          name: matchingConversations
          branch: searched
          description: The first search page for jane@acme.example.com contains cnv_100 and cnv_200 in the same inbox.
          default: true
        - operation: searchConversations
          name: invalidToken
          branch: providerRejected
          description: The API token is invalid for a conversation search (HTTP 401).
        - operation: searchConversations
          name: oversizedPage
          branch: invalidResponse
          description: The matching conversation page exceeds maxResponseBytes.
        - operation: getConversation
          name: triageConversation
          branch: found
          description: cnv_100 contains Jane's newest inbound message and no earlier triage comment.
          default: true
        - operation: getConversation
          name: mergedConversation
          branch: merged
          description: cnv_100 was merged into cnv_200 (HTTP 301).
        - operation: getConversation
          name: missingConversation
          branch: notFound
          description: cnv_100 does not exist or is hidden from the token (HTTP 404).
        - operation: getConversation
          name: deniedConversationRead
          branch: providerRejected
          description: The token cannot read cnv_100's messages (HTTP 403).
        - operation: getConversation
          name: oversizedConversation
          branch: invalidResponse
          description: cnv_100's message page exceeds maxResponseBytes.
        - operation: replyToConversation
          name: triageComment
          branch: replied
          description: The internal triage comment on cnv_100 was created as com_100.
          default: true
        - operation: replyToConversation
          name: missingConversation
          branch: notFound
          description: cnv_100 does not exist, so Front created no comment (HTTP 404).
        - operation: replyToConversation
          name: deniedCommentWrite
          branch: providerRejected
          description: The token lacks comments:write for cnv_100 (HTTP 403).
        - operation: updateConversation
          name: routedConversation
          branch: updated
          description: cnv_100 is assigned to tea_leela and tagged tag_triaged after routing.
          default: true
        - operation: updateConversation
          name: missingConversation
          branch: notFound
          description: cnv_100 no longer exists when routing starts (HTTP 404).
        - operation: updateConversation
          name: invalidTag
          branch: providerRejected
          description: Front rejected tag_missing in a routing update (HTTP 400).
        - operation: updateConversation
          name: oversizedReadBack
          branch: invalidResponse
          description: The read-back of cnv_100 exceeds maxResponseBytes after routing.
        - operation: findContactByEmail
          name: requesterContact
          branch: found
          description: jane@acme.example.com belongs to crd_100, the requester on cnv_100.
          default: true
        - operation: findContactByEmail
          name: missingContact
          branch: notFound
          description: No contact owns the jane@acme.example.com email handle (HTTP 404).
        - operation: findContactByEmail
          name: deniedContactRead
          branch: providerRejected
          description: The token lacks contacts:read (HTTP 403).
        - operation: findContactByEmail
          name: oversizedContact
          branch: invalidResponse
          description: The jane@acme.example.com contact exceeds maxResponseBytes.
    - company: GitHub
      id: github
      name: GitHub
      description: Read an authenticated GitHub profile, verified primary email, bounded public repositories, releases, and repository changes.
      version: v0.24.0
      languages:
        go: v0.24.0
        typescript: v0.1.0
      directory: connectors/github
      uiUnits: []
      triggers: []
      operations:
        - name: getAuthenticatedProfile
          kind: query
          description: Read the authenticated account and its primary verified email.
          languages:
            - go
            - typescript
        - name: listPublicRepositories
          kind: query
          description: List a bounded, recent-first set of public repositories owned by one login.
          languages:
            - go
            - typescript
        - name: listMergedPullRequests
          kind: query
          description: List one bounded page of pull requests merged into a public repository within a time window.
          languages:
            - go
            - typescript
        - name: listPullRequestFiles
          kind: query
          description: List one bounded page of files changed by a public repository pull request.
          languages:
            - go
            - typescript
        - name: listReleases
          kind: query
          description: List one bounded page of repository releases with publication dates, notes, draft and prerelease flags, and a next-page cursor. GitHub does not support a publication-date filter; callers filter PublishedAt and follow pagination without assuming publication order.
          languages:
            - go
            - typescript
        - name: listCommits
          kind: query
          description: List one bounded page of public repository commits within a time window.
          languages:
            - go
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/github/go/githubmock
      mocks:
        - operation: getAuthenticatedProfile
          name: octocatProfile
          branch: profileLoaded
          description: The authenticated account with a primary verified email and every optional profile field.
          default: true
        - operation: getAuthenticatedProfile
          name: rateLimited
          description: GitHub's secondary rate limit throttles the read once.
        - operation: getAuthenticatedProfile
          name: verifiedEmailRequiredFailure
          branch: verifiedEmailRequired
          description: A primary verified email was not available.
        - operation: getAuthenticatedProfile
          name: insufficientScopeFailure
          branch: insufficientScope
          description: The OAuth grant does not match the required scopes.
        - operation: getAuthenticatedProfile
          name: authorizationRevokedFailure
          branch: authorizationRevoked
          description: The OAuth grant is invalid or revoked.
        - operation: getAuthenticatedProfile
          name: notFoundFailure
          branch: notFound
          description: The authenticated account was not found.
        - operation: getAuthenticatedProfile
          name: providerRejectedFailure
          branch: providerRejected
          description: GitHub conclusively rejected the profile query.
        - operation: getAuthenticatedProfile
          name: invalidResponseFailure
          branch: invalidResponse
          description: GitHub returned an invalid or oversized profile response.
        - operation: getAuthenticatedProfile
          name: defectFailure
          branch: defect
          description: Local input, connection configuration, or connector definition is invalid.
        - operation: listPublicRepositories
          name: mixedRepositories
          branch: repositoriesLoaded
          description: A truncated recent-first set with a fork, an archived repository, and a disabled one that applications usually filter out.
          default: true
        - operation: listPublicRepositories
          name: noRepositories
          branch: repositoriesLoaded
          description: The login owns no public repositories.
        - operation: listPublicRepositories
          name: rateLimited
          description: GitHub's secondary rate limit throttles the listing once.
        - operation: listPublicRepositories
          name: insufficientScopeFailure
          branch: insufficientScope
          description: The OAuth grant does not match the required scopes.
        - operation: listPublicRepositories
          name: authorizationRevokedFailure
          branch: authorizationRevoked
          description: The OAuth grant is invalid or revoked.
        - operation: listPublicRepositories
          name: notFoundFailure
          branch: notFound
          description: The requested GitHub account was not found.
        - operation: listPublicRepositories
          name: providerRejectedFailure
          branch: providerRejected
          description: GitHub conclusively rejected the repository query.
        - operation: listPublicRepositories
          name: invalidResponseFailure
          branch: invalidResponse
          description: GitHub returned an invalid or oversized repository response.
        - operation: listPublicRepositories
          name: defectFailure
          branch: defect
          description: Local input, connection configuration, or connector definition is invalid.
        - operation: listMergedPullRequests
          name: threeUnorderedPages
          branch: listed
          description: Three pages in GitHub search order, not merge order, with a pull request repeated across a page boundary and merges exactly at both window edges.
          default: true
        - operation: listMergedPullRequests
          name: noMerges
          branch: listed
          description: No pull request merged in the window.
        - operation: listMergedPullRequests
          name: incompleteSearch
          branch: listed
          description: GitHub search timed out and returned a partial page.
        - operation: listMergedPullRequests
          name: rateLimited
          description: GitHub's search rate limit throttles the listing and asks for a wait.
        - operation: listMergedPullRequests
          name: insufficientScopeFailure
          branch: insufficientScope
          description: The OAuth grant does not match the required scopes.
        - operation: listMergedPullRequests
          name: authorizationRevokedFailure
          branch: authorizationRevoked
          description: The OAuth grant is invalid or revoked.
        - operation: listMergedPullRequests
          name: notFoundFailure
          branch: notFound
          description: The requested GitHub resource was not found.
        - operation: listMergedPullRequests
          name: providerRejectedFailure
          branch: providerRejected
          description: GitHub conclusively rejected the search, including a repository it cannot search.
        - operation: listMergedPullRequests
          name: invalidResponseFailure
          branch: invalidResponse
          description: GitHub returned an invalid or oversized search response.
        - operation: listMergedPullRequests
          name: defectFailure
          branch: defect
          description: Local input, connection configuration, or connector definition is invalid.
        - operation: listPullRequestFiles
          name: threePagesOfChanges
          branch: listed
          description: Three pages of added, modified, renamed, and removed files, with a truncated patch and a binary file without a patch.
          default: true
        - operation: listPullRequestFiles
          name: rateLimited
          description: GitHub's rate limit throttles the listing once.
        - operation: listPullRequestFiles
          name: insufficientScopeFailure
          branch: insufficientScope
          description: The OAuth grant does not match the required scopes.
        - operation: listPullRequestFiles
          name: authorizationRevokedFailure
          branch: authorizationRevoked
          description: The OAuth grant is invalid or revoked.
        - operation: listPullRequestFiles
          name: notFoundFailure
          branch: notFound
          description: The repository or pull request was not found.
        - operation: listPullRequestFiles
          name: providerRejectedFailure
          branch: providerRejected
          description: GitHub conclusively rejected the changed-file query.
        - operation: listPullRequestFiles
          name: invalidResponseFailure
          branch: invalidResponse
          description: GitHub returned an invalid or oversized changed-file response.
        - operation: listPullRequestFiles
          name: defectFailure
          branch: defect
          description: Local input, connection configuration, or connector definition is invalid.
        - operation: listReleases
          name: threeUnorderedPages
          branch: listed
          description: Three pages in GitHub order, not publication order, with a draft, a prerelease, a release repeated across a page boundary, and one published outside a typical window.
          default: true
        - operation: listReleases
          name: noReleases
          branch: listed
          description: The repository has no releases.
        - operation: listReleases
          name: rateLimited
          description: GitHub's rate limit throttles the listing once.
        - operation: listReleases
          name: insufficientScopeFailure
          branch: insufficientScope
          description: The OAuth grant does not match the required scopes.
        - operation: listReleases
          name: authorizationRevokedFailure
          branch: authorizationRevoked
          description: The OAuth grant is invalid or revoked.
        - operation: listReleases
          name: notFoundFailure
          branch: notFound
          description: The repository was not found or is inaccessible.
        - operation: listReleases
          name: providerRejectedFailure
          branch: providerRejected
          description: GitHub conclusively rejected the releases query.
        - operation: listReleases
          name: invalidResponseFailure
          branch: invalidResponse
          description: GitHub returned an invalid or oversized releases response.
        - operation: listReleases
          name: defectFailure
          branch: defect
          description: Local input, connection configuration, or connector definition is invalid.
        - operation: listCommits
          name: threePagesNewestFirst
          branch: listed
          description: Three pages newest first, with a commit repeated across a page boundary as new commits shift pages, a truncated message, and a commit without a GitHub author.
          default: true
        - operation: listCommits
          name: emptyRepository
          branch: listed
          description: The repository has no commits in the window.
        - operation: listCommits
          name: rateLimited
          description: GitHub's rate limit throttles the listing once.
        - operation: listCommits
          name: insufficientScopeFailure
          branch: insufficientScope
          description: The OAuth grant does not match the required scopes.
        - operation: listCommits
          name: authorizationRevokedFailure
          branch: authorizationRevoked
          description: The OAuth grant is invalid or revoked.
        - operation: listCommits
          name: notFoundFailure
          branch: notFound
          description: The repository or starting ref was not found.
        - operation: listCommits
          name: providerRejectedFailure
          branch: providerRejected
          description: GitHub conclusively rejected the commit query.
        - operation: listCommits
          name: invalidResponseFailure
          branch: invalidResponse
          description: GitHub returned an invalid or oversized commit response.
        - operation: listCommits
          name: defectFailure
          branch: defect
          description: Local input, connection configuration, or connector definition is invalid.
    - company: GitLab
      id: gitlab
      name: GitLab
      description: Use the GitLab REST API through typed Dex connector Steps.
      version: v0.2.0
      languages:
        go: v0.2.0
        typescript: v0.1.0
      directory: connectors/gitlab
      uiUnits: []
      triggers: []
      operations:
        - name: getProject
          kind: query
          description: Read one GitLab project by numeric ID or namespace path.
          languages:
            - go
            - typescript
        - name: listIssues
          kind: query
          description: List the first page of issues for a GitLab project.
          languages:
            - go
            - typescript
        - name: updateIssueLabels
          kind: mutation
          description: Replace one GitLab issue's complete label set; repeating the request is safe.
          languages:
            - go
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/gitlab/go/gitlabmock
      mocks:
        - operation: getProject
          name: foundDefault
          branch: found
          description: A Meridian example returns a representative Project.
          default: true
        - operation: listIssues
          name: listedDefault
          branch: listed
          description: A Meridian example returns a representative IssuesPage.
          default: true
        - operation: updateIssueLabels
          name: updatedDefault
          branch: updated
          description: A Meridian example returns a representative Issue.
          default: true
    - company: Google
      id: google-calendar
      name: Google Calendar
      description: List and read events in a bounded window, create and update events idempotently, and query free/busy intervals in Google Calendar.
      version: v0.24.0
      languages:
        go: v0.24.0
        typescript: v0.1.0
      directory: connectors/google/calendar
      uiUnits:
        - name: calendarPicker
          description: Select a calendar from the authorized account's Google Calendar list; the unit stores the provider calendar ID and display name, and an operation that writes events lists only calendars the account can edit.
      triggers: []
      operations:
        - name: listEvents
          kind: query
          description: List one page of events on one calendar that overlap a bounded time window, with recurring events expanded and ordered by start.
          languages:
            - go
            - typescript
        - name: getEvent
          kind: query
          description: Read one event by calendar and event ID.
          languages:
            - go
            - typescript
        - name: createEvent
          kind: mutation
          description: Create one timed or all-day event under a stable client-supplied event ID, so a retried Step returns the existing event instead of a duplicate.
          languages:
            - go
            - typescript
        - name: updateEvent
          kind: mutation
          description: Patch the summary, description, start and end, or attendees of one existing event, guarded by its ETag.
          languages:
            - go
            - typescript
        - name: queryFreeBusy
          kind: query
          description: Return the busy intervals of one or more calendars in a bounded time window.
          languages:
            - go
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/google/calendar/go/calendarmock
      mocks:
        - operation: listEvents
          name: meetingWindow
          branch: listed
          description: Three start-ordered pages for the 2026-02-20 14:00-15:00 America/Los_Angeles window, with a repeated transparent event and the meeting hold meetinghold0001.
          default: true
        - operation: listEvents
          name: busyMeetingWindow
          branch: listed
          description: A new opaque event overlaps the hold and repeats across the boundary between two pages.
        - operation: listEvents
          name: calendarNotFound
          branch: notFound
          description: The calendar is absent or not visible to this connection.
        - operation: listEvents
          name: listRejected
          branch: providerRejected
          description: Google rejects an event listing for this calendar.
        - operation: getEvent
          name: meetingHold
          branch: found
          description: The uninvited hold of the 2026-02-20 14:00-15:00 America/Los_Angeles meeting is available for read-back; a Flow that verifies another time needs a script.
          default: true
        - operation: getEvent
          name: eventNotFound
          branch: notFound
          description: The requested event is absent or not visible.
        - operation: getEvent
          name: readRejected
          branch: providerRejected
          description: Google rejects the event read.
        - operation: createEvent
          name: holdCreated
          branch: created
          description: Google creates the uninvited hold of the 2026-02-20 14:00-15:00 America/Los_Angeles meeting under a stable event ID; another meeting needs a script.
          default: true
        - operation: createEvent
          name: eventIDConflict
          branch: conflict
          description: A deleted or inaccessible event already owns the stable event ID.
        - operation: createEvent
          name: createRejected
          branch: providerRejected
          description: Google rejects an event creation on a read-only calendar.
        - operation: updateEvent
          name: attendeesInvited
          branch: updated
          description: The confirmed 2026-02-20 14:00-15:00 America/Los_Angeles meeting now includes priya@meridian.example.com and alice@example.com; other guests need a script.
          default: true
        - operation: updateEvent
          name: updateEventNotFound
          branch: notFound
          description: The event was removed before the guest update.
        - operation: updateEvent
          name: updateRejected
          branch: providerRejected
          description: Google rejects the guest update on a read-only calendar.
        - operation: queryFreeBusy
          name: calendarFree
          branch: queried
          description: The primary calendar has no busy time in the 2026-02-20 14:00-15:00 America/Los_Angeles meeting window.
          default: true
        - operation: queryFreeBusy
          name: availabilityIncomplete
          branch: incomplete
          description: Google cannot report availability for one requested calendar.
        - operation: queryFreeBusy
          name: freeBusyRejected
          branch: providerRejected
          description: Google rejects the free/busy query.
    - company: Google
      id: google-docs
      name: Google Docs
      description: Read Google Docs as bounded Markdown or plain text with their revision, create documents in a Drive folder with duplicate-aware recovery, and replace or append text only at the revision a Flow read.
      version: v0.24.0
      languages:
        go: v0.24.0
        typescript: v0.1.0
      directory: connectors/google/docs
      uiUnits:
        - name: documentPicker
          description: Select a Google Doc listed from the authorized account, most recently modified first, or paste a document ID or its docs.google.com/document link; the unit stores the provider document ID plus the title of a listed document, and blank leaves the operation without a document.
        - name: folderPicker
          description: Select a folder listed from the authorized Google Drive account, or paste a folder ID or its drive.google.com/drive/folders link; the unit stores the provider folder ID plus the display name of a listed folder, and blank leaves the operation without a folder.
      triggers: []
      operations:
        - name: getDocumentText
          kind: query
          description: Read the first tab of one document, without pending suggestions, as bounded Markdown or plain text with its title and revision ID.
          languages:
            - go
            - typescript
        - name: createDocument
          kind: mutation
          description: Create one Google Doc from a title and optional plain-text or Markdown text in an optional Drive folder. Google offers no idempotency key, so the single-dispatch fence requires sync durability to persist its heartbeat across attempts; a private Drive app property supports read-back before any permitted resend.
          languages:
            - go
            - typescript
        - name: replaceDocumentText
          kind: mutation
          description: Replace the whole body text or named text placeholders in the first tab of one document in one batch that Google applies only at the required revision, so a repeated dispatch cannot apply it twice.
          languages:
            - go
            - typescript
        - name: appendText
          kind: mutation
          description: Append plain-text paragraphs to the end of the first tab's body of one document in one batch that Google applies only at the required revision, so a repeated dispatch cannot append twice.
          languages:
            - go
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/google/docs/go/docsmock
      mocks:
        - operation: getDocumentText
          name: policyTemplate
          branch: read
          description: The input names the policy template; the answer contains placeholders for the publication Flow.
          default: true
        - operation: getDocumentText
          name: notFoundFailure
          branch: notFound
          description: The document does not exist or the connection cannot see it.
        - operation: getDocumentText
          name: tooLargeFailure
          branch: tooLarge
          description: The requested document exceeds the configured text or response size limit.
        - operation: getDocumentText
          name: providerRejectedFailure
          branch: providerRejected
          description: The connection lacks permission to read the requested document.
        - operation: getDocumentText
          name: invalidResponseFailure
          branch: invalidResponse
          description: Google returned an invalid document response.
        - operation: createDocument
          name: createdPolicyDraft
          branch: created
          description: The input creates a policy draft in the configured folder from the template text.
          default: true
        - operation: createDocument
          name: providerRejectedFailure
          branch: providerRejected
          description: The input names a missing parent folder and Google creates no document.
        - operation: createDocument
          name: invalidResponseFailure
          branch: invalidResponse
          description: The duplicate lookup returns malformed JSON before a create is sent.
        - operation: replaceDocumentText
          name: filledPolicyDraft
          branch: replaced
          description: The input replaces the policy draft placeholders at rev-draft-1 and yields a new revision.
          default: true
        - operation: replaceDocumentText
          name: placeholderNotFoundFailure
          branch: placeholderNotFound
          description: A requested placeholder does not occur in the body at the required revision; nothing was written.
        - operation: replaceDocumentText
          name: revisionChangedFailure
          branch: revisionChanged
          description: The document changed after the required revision and does not hold the requested text; nothing was written.
        - operation: replaceDocumentText
          name: notFoundFailure
          branch: notFound
          description: The document does not exist or the connection cannot see it.
        - operation: replaceDocumentText
          name: providerRejectedFailure
          branch: providerRejected
          description: The connection lacks edit access to the requested document.
        - operation: replaceDocumentText
          name: invalidResponseFailure
          branch: invalidResponse
          description: Google returned a malformed document response.
        - operation: appendText
          name: stampedPolicyDraft
          branch: appended
          description: The input appends the publication stamp to policyDraft1 at rev-draft-2.
          default: true
        - operation: appendText
          name: revisionChangedFailure
          branch: revisionChanged
          description: The document changed after the required revision and does not end with the requested text; nothing was written.
        - operation: appendText
          name: notFoundFailure
          branch: notFound
          description: The document does not exist or the connection cannot see it.
        - operation: appendText
          name: providerRejectedFailure
          branch: providerRejected
          description: The connection lacks edit access to the requested document.
        - operation: appendText
          name: invalidResponseFailure
          branch: invalidResponse
          description: Google returned a malformed document response.
    - company: Google
      id: google-drive
      name: Google Drive
      description: Find Google Drive files by name, read metadata and bounded text, and upload files without creating duplicates on retry.
      version: v0.24.0
      languages:
        go: v0.24.0
        typescript: v0.1.0
      directory: connectors/google/drive
      uiUnits:
        - name: folderPicker
          description: Select a folder listed from the authorized Google Drive account, or paste a folder ID or its drive.google.com/drive/folders link; the unit stores the provider folder ID plus the display name of a listed folder, and blank leaves the operation without a folder.
      triggers: []
      operations:
        - name: searchFiles
          kind: query
          description: Find non-trashed files by exact or prefix name, MIME type, and parent folder, newest first, one bounded page at a time.
          languages:
            - go
            - typescript
        - name: getFile
          kind: query
          description: Read the full metadata of one file by its Drive file ID.
          languages:
            - go
            - typescript
        - name: readFileText
          kind: query
          description: Read bounded UTF-8 text by exporting a Google Doc, Sheet, or Slides file or downloading a small text file.
          languages:
            - go
            - typescript
        - name: uploadFile
          kind: mutation
          description: Create one file from text or bytes in an optional parent folder. Sync durability makes the single-dispatch heartbeat fence visible to retries, while the app property supports read-back of ambiguous uploads.
          languages:
            - go
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/google/drive/go/drivemock
      mocks:
        - operation: searchFiles
          name: foundDefaultAnswer
          branch: found
          description: A broad search returns three unordered pages with a duplicate and an archived file; exact-name tests script their own answer.
          default: true
        - operation: searchFiles
          name: notFoundFailure
          branch: notFound
          description: No file matched and Google Drive reported no further pages.
        - operation: searchFiles
          name: providerRejectedFailure
          branch: providerRejected
          description: An expired page token makes Google reject the search with a non-retryable 400.
        - operation: searchFiles
          name: invalidResponseFailure
          branch: invalidResponse
          description: Google returned malformed search metadata that the connector cannot decode.
        - operation: getFile
          name: foundDefaultAnswer
          branch: found
          description: Reading copied_policy returns the text copy created by the upload default; other IDs need a scripted answer.
          default: true
        - operation: getFile
          name: notFoundFailure
          branch: notFound
          description: The file does not exist or the connection cannot see it.
        - operation: getFile
          name: providerRejectedFailure
          branch: providerRejected
          description: Google rejected the metadata read with a non-retryable 400.
        - operation: getFile
          name: invalidResponseFailure
          branch: invalidResponse
          description: Google returned malformed file metadata that the connector cannot decode.
        - operation: readFileText
          name: readDefaultAnswer
          branch: read
          description: Reading file_policy returns the policy text as UTF-8 plain text for the example copy.
          default: true
        - operation: readFileText
          name: notFoundFailure
          branch: notFound
          description: The file does not exist or the connection cannot see it.
        - operation: readFileText
          name: unsupportedContentFailure
          branch: unsupportedContent
          description: The file is binary, a folder or shortcut, a Google Workspace type without a text export, or not valid UTF-8 text.
        - operation: readFileText
          name: tooLargeFailure
          branch: tooLarge
          description: The file text exceeds the configured limit or Google's export limit.
        - operation: readFileText
          name: providerRejectedFailure
          branch: providerRejected
          description: Google rejected the content download with a non-retryable 400.
        - operation: readFileText
          name: invalidResponseFailure
          branch: invalidResponse
          description: Google returned malformed metadata that the connector cannot decode.
        - operation: uploadFile
          name: uploadedDefaultAnswer
          branch: uploaded
          description: Uploading the example policy copy creates a text file in fld_finance; other inputs should script their own answer.
          default: true
        - operation: uploadFile
          name: providerRejectedFailure
          branch: providerRejected
          description: A missing parent folder makes Google reject the upload with a 404.
        - operation: uploadFile
          name: invalidResponseFailure
          branch: invalidResponse
          description: Google returned malformed duplicate-lookup metadata before any upload was sent.
    - company: Google
      id: google-forms
      name: Google Forms
      description: Read a Google Form's questions and its responses, listed one bounded page at a time after a submission time or read one by ID.
      version: v0.24.0
      languages:
        go: v0.24.0
        typescript: v0.1.0
      directory: connectors/google/forms
      uiUnits:
        - name: formPicker
          description: Select a form listed from the authorized account's Google Drive, most recently changed first, or paste a form ID or its docs.google.com/forms/d/FORM_ID/edit link; the unit stores the form ID plus the title of a listed form, and blank leaves the Step without a form.
      triggers: []
      operations:
        - name: getForm
          kind: query
          description: Read one form's items in form order, with each question's ID, title, type, and choices.
          languages:
            - go
            - typescript
        - name: listResponses
          kind: query
          description: List one bounded page, 1 to 1000, of a form's responses, optionally only those submitted after a time, continued with Google's page token.
          languages:
            - go
            - typescript
        - name: getResponse
          kind: query
          description: Read one form response by its response ID, with every answer keyed by question ID.
          languages:
            - go
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/google/forms/go/formsmock
      mocks:
        - operation: getForm
          name: vendorIntakeForm
          branch: found
          description: Reading form 1FAIpQLintake finds the Vendor intake questions and their IDs.
          default: true
        - operation: getForm
          name: unknownForm
          branch: notFound
          description: Reading form 1FAIpQLmissing receives Google's HTTP 404.
        - operation: getForm
          name: formAccessDenied
          branch: providerRejected
          description: Reading form 1FAIpQLdenied without Forms permission receives Google's HTTP 403.
        - operation: listResponses
          name: vendorIntakeResponses
          branch: listed
          description: Listing form 1FAIpQLintake from a blank page token finds unordered submissions across three pages, including a duplicate.
          default: true
        - operation: listResponses
          name: unknownForm
          branch: notFound
          description: Listing responses of form 1FAIpQLmissing receives Google's HTTP 404.
        - operation: listResponses
          name: responseListDenied
          branch: providerRejected
          description: Listing responses of form 1FAIpQLdenied without responses permission receives Google's HTTP 403.
        - operation: getResponse
          name: acmeSubmission
          branch: found
          description: Reading response r_acme in form 1FAIpQLintake finds Acme's company and regions answers.
          default: true
        - operation: getResponse
          name: unknownResponse
          branch: notFound
          description: Reading response r_missing in form 1FAIpQLintake receives Google's HTTP 404.
        - operation: getResponse
          name: responseReadDenied
          branch: providerRejected
          description: Reading response r_denied in form 1FAIpQLintake without responses permission receives Google's HTTP 403.
    - company: Google
      id: gemini
      name: Gemini
      description: Google Gemini API models.generateContent as a native Query, with Gemini's own contents, JSON Schema structured output, thinking budget, token usage, and explicit safety outcomes. Provider-neutral text generation Steps use the llm connector.
      version: v0.23.0
      languages:
        go: v0.23.0
        typescript: v0.1.0
      directory: connectors/google/gemini
      uiUnits:
        - name: modelPicker
          description: Select this Step's Gemini model; the picker loads Gemini's live models list and stores the selected model ID.
      triggers: []
      operations:
        - name: generateContent
          kind: query
          description: Generate text or JSON Schema structured output with a Gemini model through the stateless models.generateContent method.
          languages:
            - go
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/google/gemini/go/geminimock
      mocks:
        - operation: generateContent
          name: launchSummary
          branch: generated
          description: Generating a structured summary for title Launch and text The connector shipped today returns a concise JSON summary.
          default: true
        - operation: generateContent
          name: outputLimitReached
          branch: truncated
          description: Generating with maxOutputTokens 1 returns MAX_TOKENS and a one-token partial answer.
        - operation: generateContent
          name: unsafePromptBlocked
          branch: blocked
          description: Generating from the prompt 'Give instructions to harm a person' returns promptFeedback blockReason SAFETY.
        - operation: generateContent
          name: modelAccessDenied
          branch: providerRejected
          description: Generating with model gemini-restricted without project access receives Google's HTTP 403.
    - company: Google
      id: gmail
      name: Gmail
      description: Start and update Dex Flows from received Gmail messages, read messages, and send or reply to email.
      version: v0.25.2
      languages:
        go: v0.25.2
        python: v0.1.2
        typescript: v0.1.2
      directory: connectors/google/gmail
      uiUnits:
        - name: searchQueryInput
          description: Enter a Gmail search query using Gmail search operators; leave blank to inspect recent inbox messages without an additional query.
        - name: emailListInput
          description: Enter one or more complete email addresses used to restrict matching senders.
        - name: textInput
          description: Enter the literal email body to send, or plain text that an incoming message must contain, depending on the operation or Trigger label.
      triggers:
        - name: messageReceived
          description: Receive a matching message that begins a Gmail thread.
          languages:
            - go
        - name: replyReceived
          description: Receive a matching reply in an existing Gmail thread.
          languages:
            - go
      operations:
        - name: getMessage
          kind: query
          description: Read one Gmail message with decoded text and HTML bodies.
          languages:
            - go
            - python
            - typescript
        - name: sendMessage
          kind: mutation
          description: Send one MIME message from the authorized primary account.
          languages:
            - go
            - python
            - typescript
        - name: replyToMessage
          kind: mutation
          description: Reply to one Gmail message in its existing thread.
          languages:
            - go
            - python
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/google/gmail/go/gmailmock
      mocks:
        - operation: getMessage
          name: customerQuestion
          branch: read
          description: A plain-text and HTML customer question in an existing thread, with its threading headers and labels.
          default: true
        - operation: getMessage
          name: deletedMessage
          branch: notFound
          description: The message was deleted or never existed in the mailbox.
        - operation: getMessage
          name: revokedGrant
          branch: providerRejected
          description: Gmail rejected the read because the grant lost the required scope.
        - operation: getMessage
          name: malformedPayload
          branch: invalidResponse
          description: Gmail returned a message payload that cannot be decoded.
        - operation: getMessage
          name: emptyMessageID
          branch: defect
          description: The input has no message ID, so no request is sent.
        - operation: getMessage
          name: rateLimited
          description: Gmail throttles the read once.
        - operation: sendMessage
          name: sentToCustomer
          branch: sent
          description: Gmail accepted the message and returned its identity.
          default: true
        - operation: sendMessage
          name: invalidRecipient
          branch: providerRejected
          description: Gmail rejected the message because a recipient address is invalid.
        - operation: sendMessage
          name: connectionLost
          description: The connection closed after dispatch and Sent Mail found nothing; retry the lookup without another send.
        - operation: sendMessage
          name: noRecipients
          branch: defect
          description: The message has no recipient, so no request is sent.
        - operation: sendMessage
          name: unavailable
          description: Gmail is briefly unavailable before the message is sent.
        - operation: replyToMessage
          name: repliedInThread
          branch: sent
          description: Gmail accepted the reply in the source message's thread.
          default: true
        - operation: replyToMessage
          name: sourceMissing
          branch: providerRejected
          description: Gmail rejected the reply because the source message no longer exists.
        - operation: replyToMessage
          name: malformedSource
          branch: invalidResponse
          description: Gmail returned a source message that cannot be decoded, so no reply is sent.
        - operation: replyToMessage
          name: connectionLost
          description: The connection closed after dispatch and Sent Mail found nothing; retry the lookup without another reply.
        - operation: replyToMessage
          name: emptyBody
          branch: defect
          description: The reply has no body, so no request is sent.
    - company: Google
      id: google-sheets
      name: Google Sheets
      description: Read ranges, find stable keyed rows, and idempotently upsert rows in Google Sheets.
      version: v0.25.0
      languages:
        go: v0.25.0
        typescript: v0.1.0
      directory: connectors/google/spreadsheet
      uiUnits:
        - name: spreadsheetPicker
          description: Select a spreadsheet returned by the authorized Google Drive account; the unit stores its provider spreadsheet ID and display name automatically.
        - name: sheetTabPicker
          description: Select a tab loaded from the chosen spreadsheet; choose the spreadsheet first so the unit can list its current tab titles.
        - name: textInput
          description: Enter the exact A1 range, lookup key, or cell value requested by the operation label; spreadsheet and tab IDs are selected by their dedicated units.
      triggers: []
      operations:
        - name: getValues
          kind: query
          description: Read one bounded A1 range.
          languages:
            - go
            - typescript
        - name: findRow
          kind: query
          description: Find exactly one row by a named key column and value.
          languages:
            - go
            - typescript
        - name: upsertRow
          kind: mutation
          description: Query by a stable key and replace or append one row; synchronous durability persists the append dispatch fence before Google receives a non-repeatable write.
          languages:
            - go
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/google/spreadsheet/go/spreadsheetmock
      mocks:
        - operation: getValues
          name: contactsRange
          branch: read
          description: A contact range with its header and two rows.
          default: true
        - operation: getValues
          name: rangeNotFound
          branch: notFound
          description: The spreadsheet or range does not exist.
        - operation: getValues
          name: readRejected
          branch: providerRejected
          description: Google rejects a range read because the account lacks access.
        - operation: findRow
          name: contactFound
          branch: found
          description: One contact row matches the requested email key.
          default: true
        - operation: findRow
          name: contactNotFound
          branch: notFound
          description: No contact row has the requested email key, and the answer carries no failure.
        - operation: findRow
          name: duplicateContacts
          branch: conflict
          description: Two rows have the same contact email key.
        - operation: findRow
          name: findRejected
          branch: providerRejected
          description: Google rejects the row lookup because the account lacks access.
        - operation: upsertRow
          name: contactUpserted
          branch: upserted
          description: The contact already on row 2 of the Contacts tab is updated in place.
          default: true
        - operation: upsertRow
          name: duplicateKey
          branch: conflict
          description: Existing duplicate email keys prevent a safe upsert.
        - operation: upsertRow
          name: writeRejected
          branch: providerRejected
          description: Google rejects the contact upsert because the account lacks edit access.
    - company: Google
      id: google-workspace-admin
      name: Google Workspace Admin
      description: Read and list Google Workspace user accounts, create, suspend, and restore them, and add or remove group members through the Admin SDK Directory API, converging instead of duplicating when a Step repeats.
      version: v0.24.0
      languages:
        go: v0.24.0
        typescript: v0.1.0
      directory: connectors/google/workspace-admin
      uiUnits: []
      triggers: []
      operations:
        - name: getUser
          kind: query
          description: Read one user account by primary email address, alias, or unique user ID.
          languages:
            - go
            - typescript
        - name: listUsers
          kind: query
          description: List one bounded page of accounts in the administrator's customer account or one domain, optionally filtered with Google's user search syntax.
          languages:
            - go
            - typescript
        - name: createUser
          kind: mutation
          description: Create one account with a generated password nobody receives, tagged with a stable key, so a repeated Step returns the account it created instead of a duplicate.
          languages:
            - go
            - typescript
        - name: suspendUser
          kind: mutation
          description: Suspend one account so it cannot sign in, keeping its data; suspending a suspended account changes nothing.
          languages:
            - go
            - typescript
        - name: unsuspendUser
          kind: mutation
          description: Restore sign-in for one suspended account; restoring an active account changes nothing.
          languages:
            - go
            - typescript
        - name: addUserToGroup
          kind: mutation
          description: Add one account to a group with a role; an existing membership is read back and returned instead of failing.
          languages:
            - go
            - typescript
        - name: removeUserFromGroup
          kind: mutation
          description: Remove one account's direct membership from a group; a membership that is already gone is reported as removed.
          languages:
            - go
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/google/workspace-admin/go/workspaceadminmock
      mocks:
        - operation: getUser
          name: adaAccount
          branch: found
          description: The read of user ID 1001 returns Ada in the Engineering organizational unit.
          default: true
        - operation: getUser
          name: notFoundFailure
          branch: notFound
          description: The user ID 1001 names an account that does not exist.
        - operation: getUser
          name: providerRejectedFailure
          branch: providerRejected
          description: Google denies the user ID 1001 because the administrator lacks the required privilege.
        - operation: listUsers
          name: engineeringUsers
          branch: listed
          description: The Engineering user listing returns three unordered pages with Ada repeated across a boundary.
          default: true
        - operation: listUsers
          name: providerRejectedFailure
          branch: providerRejected
          description: Google denies the Engineering user listing because the administrator lacks the required privilege.
        - operation: createUser
          name: adaCreated
          branch: created
          description: Creating ada@example.com in /Engineering returns account ID 1001.
          default: true
        - operation: createUser
          name: alreadyExistsFailure
          branch: alreadyExists
          description: The creation of ada@example.com conflicts with an existing group, so no account is returned.
        - operation: createUser
          name: providerRejectedFailure
          branch: providerRejected
          description: Google denies the creation of ada@example.com because the administrator lacks the required privilege.
        - operation: suspendUser
          name: adaSuspended
          branch: suspended
          description: Suspending user ID 1001 returns Ada with sign-in disabled.
          default: true
        - operation: suspendUser
          name: notFoundFailure
          branch: notFound
          description: The suspension of user ID 1001 names an account that does not exist.
        - operation: suspendUser
          name: providerRejectedFailure
          branch: providerRejected
          description: Google denies the suspension of user ID 1001 because the administrator lacks the required privilege.
        - operation: unsuspendUser
          name: adaUnsuspended
          branch: unsuspended
          description: Unsuspending user ID 1001 returns Ada with sign-in restored.
          default: true
        - operation: unsuspendUser
          name: notFoundFailure
          branch: notFound
          description: The restoration of user ID 1001 names an account that does not exist.
        - operation: unsuspendUser
          name: providerRejectedFailure
          branch: providerRejected
          description: Google denies the restoration of user ID 1001 because the administrator lacks the required privilege.
        - operation: addUserToGroup
          name: adaJoinedEngineering
          branch: added
          description: Adding ada@example.com to engineering@example.com returns direct MEMBER status.
          default: true
        - operation: addUserToGroup
          name: notFoundFailure
          branch: notFound
          description: The addition of ada@example.com to engineering@example.com names a user or group that does not exist.
        - operation: addUserToGroup
          name: providerRejectedFailure
          branch: providerRejected
          description: Google denies the addition of ada@example.com to engineering@example.com because the administrator lacks the required privilege.
        - operation: removeUserFromGroup
          name: adaLeftEngineering
          branch: removed
          description: Removing user ID 1001 from engineering@example.com reports the membership removed.
          default: true
        - operation: removeUserFromGroup
          name: notFoundFailure
          branch: notFound
          description: The removal of user ID 1001 from engineering@example.com names a group that does not exist.
        - operation: removeUserFromGroup
          name: providerRejectedFailure
          branch: providerRejected
          description: Google denies the removal of user ID 1001 from engineering@example.com because the administrator lacks the required privilege.
    - company: Google
      id: google-youtube
      name: YouTube
      description: Search YouTube videos, read videos, channels, and playlist pages, and add a video to a playlist once through the YouTube Data API v3.
      version: v0.3.0
      languages:
        go: v0.3.0
        typescript: v0.1.0
      directory: connectors/google/youtube
      uiUnits: []
      triggers: []
      operations:
        - name: searchVideos
          kind: query
          description: Search one page of up to 50 public videos by keywords, optionally within one channel, in relevance, date, view count, rating, or title order; each call costs 100 quota units.
          languages:
            - go
            - typescript
        - name: getVideo
          kind: query
          description: Read one video's details, duration, statistics, and privacy status by video ID.
          languages:
            - go
            - typescript
        - name: getChannel
          kind: query
          description: Read one channel by channel ID, by @handle, or as the authorized account's own channel, including its uploads playlist ID.
          languages:
            - go
            - typescript
        - name: listPlaylistItems
          kind: query
          description: List one page of up to 50 playlist items, such as a channel's uploads, optionally only the items of one video.
          languages:
            - go
            - typescript
        - name: addPlaylistItem
          kind: mutation
          description: Add a video to a playlist the authorized account owns unless the playlist already holds it, so a repeated Step never adds a second copy.
          languages:
            - go
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/google/youtube/go/youtubemock
      mocks:
        - operation: searchVideos
          name: matchingCompilerVideo
          branch: searched
          description: The search for compiler on channel UC1234567890123456789012 returns three pages with video AbCdEfGhI12 repeated across a boundary.
          default: true
        - operation: searchVideos
          name: quotaExhaustedFailure
          branch: quotaExhausted
          description: The search for compiler on channel UC1234567890123456789012 exhausts the project daily YouTube quota.
        - operation: searchVideos
          name: providerRejectedFailure
          branch: providerRejected
          description: YouTube denies the search for compiler on channel UC1234567890123456789012 because the grant lacks the required scope.
        - operation: getVideo
          name: compilerVideo
          branch: found
          description: The requested video AbCdEfGhI12 is a public Compiler Lab walkthrough.
          default: true
        - operation: getVideo
          name: notFoundFailure
          branch: notFound
          description: The read of another video ID ZxYwVuTsR90 names a resource the account cannot see.
        - operation: getVideo
          name: quotaExhaustedFailure
          branch: quotaExhausted
          description: The read of video AbCdEfGhI12 exhausts the project daily YouTube quota.
        - operation: getVideo
          name: providerRejectedFailure
          branch: providerRejected
          description: YouTube denies the read of video AbCdEfGhI12 because the grant lacks the required scope.
        - operation: getChannel
          name: compilerChannel
          branch: found
          description: The requested @CompilerLab handle resolves to channel UC1234567890123456789012.
          default: true
        - operation: getChannel
          name: notFoundFailure
          branch: notFound
          description: The lookup of another channel handle @MissingLab names a resource the account cannot see.
        - operation: getChannel
          name: quotaExhaustedFailure
          branch: quotaExhausted
          description: The lookup of @CompilerLab exhausts the project daily YouTube quota.
        - operation: getChannel
          name: providerRejectedFailure
          branch: providerRejected
          description: YouTube denies the lookup of @CompilerLab because the grant lacks the required scope.
        - operation: listPlaylistItems
          name: curatedVideo
          branch: listed
          description: The playlist PLcurated123 listing returns item PLITEM001 on its first two pages and an empty third page.
          default: true
        - operation: listPlaylistItems
          name: notFoundFailure
          branch: notFound
          description: The listing of another playlist ID PLmissing456 names a resource the account cannot see.
        - operation: listPlaylistItems
          name: quotaExhaustedFailure
          branch: quotaExhausted
          description: The listing of playlist PLcurated123 filtered to AbCdEfGhI12 exhausts the project daily YouTube quota.
        - operation: listPlaylistItems
          name: providerRejectedFailure
          branch: providerRejected
          description: YouTube denies the listing of playlist PLcurated123 filtered to AbCdEfGhI12 because the grant lacks the required scope.
        - operation: addPlaylistItem
          name: compilerVideoAdded
          branch: added
          description: Adding video AbCdEfGhI12 to playlist PLcurated123 creates item PLITEM001.
          default: true
        - operation: addPlaylistItem
          name: notFoundFailure
          branch: notFound
          description: The addition of another video ID ZxYwVuTsR90 to playlist PLcurated123 names a resource the account cannot see.
        - operation: addPlaylistItem
          name: quotaExhaustedFailure
          branch: quotaExhausted
          description: The addition of AbCdEfGhI12 to playlist PLcurated123 exhausts the project daily YouTube quota.
        - operation: addPlaylistItem
          name: providerRejectedFailure
          branch: providerRejected
          description: YouTube denies the addition of AbCdEfGhI12 to playlist PLcurated123 because the grant lacks the required scope.
    - company: Gorgias
      id: gorgias
      name: Gorgias
      description: Search, read, create, and update Gorgias tickets, find customers by email, and add internal notes or public email replies, keeping Gorgias's own open and closed statuses and priorities; a retried create or message first looks for the earlier write by its external ID.
      version: v0.23.0
      languages:
        go: v0.23.0
        typescript: v0.1.1
      directory: connectors/gorgias
      uiUnits: []
      triggers: []
      operations:
        - name: searchTickets
          kind: query
          description: List one page of tickets, most recently updated first, for a customer email or ID and an optional Gorgias view, keeping only the requested statuses, priorities, tags, and update time, with a cursor for the next page.
          languages:
            - go
            - typescript
        - name: getTicket
          kind: query
          description: Read one ticket by ID with its customer and a bounded list of its latest messages, internal notes included.
          languages:
            - go
            - typescript
        - name: findCustomerByEmail
          kind: query
          description: Find the Gorgias customer whose primary email address is the given address.
          languages:
            - go
            - typescript
        - name: createTicket
          kind: mutation
          description: Create one ticket with the customer's first message. Gorgias has no idempotency key, so the Step runs with sync durability, records a Dex checkpoint before sending, and finds an unconfirmed ticket by the external ID it wrote instead of sending again. A Worker lost before Dex stores the checkpoint can still send twice when the first ticket is not yet visible.
          languages:
            - go
            - typescript
        - name: updateTicket
          kind: mutation
          description: Set the status, priority, assigned user, or assigned team of one ticket and add or remove tags; a repeated attempt finds the change already applied and writes nothing.
          languages:
            - go
            - typescript
        - name: addNote
          kind: mutation
          description: Add one internal note or one public email reply to a ticket. Gorgias has no idempotency key, so the Step runs with sync durability, records a Dex checkpoint before sending, and finds an unconfirmed message by the external ID it wrote instead of sending again. A Worker lost before Dex stores the checkpoint can still send twice when the first message is not yet visible.
          languages:
            - go
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/gorgias/go/gorgiasmock
      mocks:
        - operation: searchTickets
          name: openBillingTicket
          branch: searched
          description: Searching customer 501 for open billing-double-charge tickets returns three pages with ticket 7001 repeated across a boundary.
          default: true
        - operation: searchTickets
          name: providerRejectedFailure
          branch: providerRejected
          description: Gorgias denies the search of customer 501 tickets because the helpdesk credential lacks access.
        - operation: getTicket
          name: billingTicketDetails
          branch: found
          description: Reading ticket 7001 returns Ada and the open billing-double-charge ticket.
          default: true
        - operation: getTicket
          name: notFoundFailure
          branch: notFound
          description: The read of ticket 7001 names a ticket that is missing or inaccessible.
        - operation: getTicket
          name: providerRejectedFailure
          branch: providerRejected
          description: Gorgias denies the read of ticket 7001 because the helpdesk credential lacks access.
        - operation: findCustomerByEmail
          name: adaCustomer
          branch: found
          description: Looking up ada@example.com returns customer 501.
          default: true
        - operation: findCustomerByEmail
          name: customerAbsent
          branch: notFound
          description: Looking up nobody@example.com returns no matching customer.
        - operation: findCustomerByEmail
          name: providerRejectedFailure
          branch: providerRejected
          description: Gorgias denies the lookup of ada@example.com because the helpdesk credential lacks access.
        - operation: createTicket
          name: refundTicketCreated
          branch: created
          description: Creating the Refund question for nobody@example.com returns ticket 7002.
          default: true
        - operation: createTicket
          name: providerRejectedFailure
          branch: providerRejected
          description: Gorgias denies the creation of the Refund question ticket because the helpdesk credential lacks access.
        - operation: updateTicket
          name: billingTicketPrioritized
          branch: updated
          description: Updating ticket 7001 to high priority and adding dex-repeat-contact returns the changed ticket.
          default: true
        - operation: updateTicket
          name: notFoundFailure
          branch: notFound
          description: The update of ticket 7001 names a ticket that is missing or inaccessible.
        - operation: updateTicket
          name: providerRejectedFailure
          branch: providerRejected
          description: Gorgias denies the update of ticket 7001 because the helpdesk credential lacks access.
        - operation: addNote
          name: billingTriageNote
          branch: added
          description: Adding an internal triage note to ticket 7001 returns message 9001.
          default: true
        - operation: addNote
          name: notFoundFailure
          branch: notFound
          description: The note on ticket 7001 names a ticket that is missing or inaccessible.
        - operation: addNote
          name: providerRejectedFailure
          branch: providerRejected
          description: Gorgias denies the note on ticket 7001 because the helpdesk credential lacks access.
    - company: Hacker News
      id: hacker-news-daily
      name: Hacker News Daily
      description: Read public Hacker News feeds, stories, and discussions for a daily developer digest with direct source links.
      version: v0.23.0
      languages:
        go: v0.23.0
        typescript: v0.1.0
      directory: connectors/hackernews
      uiUnits: []
      triggers: []
      operations:
        - name: listStoryIDs
          kind: query
          description: Read a bounded snapshot of the top, best, new, Ask HN, or Show HN feed in provider order.
          languages:
            - go
            - typescript
        - name: getItem
          kind: query
          description: Read one public story or comment, its child IDs, and its direct Hacker News link.
          languages:
            - go
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/hackernews/go/hackernewsmock
      mocks:
        - operation: listStoryIDs
          name: developerFeed
          branch: listed
          description: The top feed requested with a limit of at least one contains the compiler story 42001.
          default: true
        - operation: listStoryIDs
          name: feedRejected
          branch: providerRejected
          description: Hacker News rejects the requested feed snapshot.
        - operation: getItem
          name: compilerStory
          branch: found
          description: Item 42001 is a public compiler release story with a source and discussion link.
          default: true
        - operation: getItem
          name: itemMissing
          branch: notFound
          description: The requested item ID identifies a deleted or dead story.
        - operation: getItem
          name: itemRejected
          branch: providerRejected
          description: Hacker News rejects the requested item read.
    - company: Harvest
      id: harvest
      name: Harvest
      description: Read Harvest records with a connection-owned API key.
      version: v0.2.0
      languages:
        go: v0.2.0
        typescript: v0.1.0
      directory: connectors/harvest
      uiUnits: []
      triggers: []
      operations:
        - name: listProjects
          kind: query
          description: Read Harvest data from the documented listProjects endpoint.
          languages:
            - go
            - typescript
        - name: listTimeEntries
          kind: query
          description: Read Harvest data from the documented listTimeEntries endpoint.
          languages:
            - go
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/harvest/go/harvestmock
      mocks:
        - operation: listProjects
          name: defaultAnswer
          branch: listed
          description: One Meridian sample record from the same example world.
          default: true
        - operation: listProjects
          name: invalidKey
          branch: providerRejected
          description: The connection token is invalid.
        - operation: listTimeEntries
          name: defaultAnswer
          branch: listed
          description: One Meridian sample record from the same example world.
          default: true
        - operation: listTimeEntries
          name: invalidKey
          branch: providerRejected
          description: The connection token is invalid.
    - company: Help Scout
      id: helpscout
      name: Help Scout
      description: Search, read, reply to, and update Help Scout Inbox conversations, find customers by email, and receive signed conversation webhooks, keeping Help Scout's own active, pending, closed, and spam statuses.
      version: v0.24.0
      languages:
        go: v0.24.0
        typescript: v0.1.0
      directory: connectors/helpscout
      uiUnits:
        - name: mailboxPicker
          description: Select one Help Scout inbox, listed live from GET https://api.helpscout.net/v2/mailboxes with the access token the application stored, or enter its numeric ID; the unit stores the stable inbox ID, such as 12345.
      triggers:
        - name: conversationEvent
          description: Receive a signed Help Scout conversation webhook, such as convo.created or convo.customer.reply.created, filtered by event and inbox.
          languages:
            - go
      operations:
        - name: searchConversations
          kind: query
          description: List one page of up to 25 conversations filtered by inbox, Help Scout status, tag, customer email, and modification time, with the next page number.
          languages:
            - go
            - typescript
        - name: getConversation
          kind: query
          description: Read one conversation by ID with a bounded list of its newest threads.
          languages:
            - go
            - typescript
        - name: replyToConversation
          kind: mutation
          description: Add one customer reply, which Help Scout emails, or one internal note to a conversation. Help Scout has no idempotency key; the single-dispatch fence requires sync durability so retry attempts can read its heartbeat checkpoint before deciding whether to send.
          languages:
            - go
            - typescript
        - name: updateConversation
          kind: mutation
          description: Set the Help Scout status or assignee of one conversation and add or remove tags; a repeated attempt finds the values already applied and writes nothing.
          languages:
            - go
            - typescript
        - name: findCustomerByEmail
          kind: query
          description: Find the Help Scout customer profiles whose email matches one address, returning every match so the Flow decides between duplicates.
          languages:
            - go
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/helpscout/go/helpscoutmock
      mocks:
        - operation: searchConversations
          name: searchedDefaultAnswer
          branch: searched
          description: Matches the support inbox's active conversations for jane@acme.example.com; page one includes conversation 501 and repeat contact 502.
          default: true
        - operation: searchConversations
          name: providerRejectedFailure
          branch: providerRejected
          description: Matches a search with a provider-rejected filter (HTTP 400).
        - operation: searchConversations
          name: invalidResponseFailure
          branch: invalidResponse
          description: Matches a search whose successful page is malformed.
        - operation: getConversation
          name: foundDefaultAnswer
          branch: found
          description: Matches conversation 501 in inbox 123, with Jane as primary customer and a recent customer message.
          default: true
        - operation: getConversation
          name: mergedFailure
          branch: merged
          description: Matches conversation 501 after Help Scout merged it into conversation 777.
        - operation: getConversation
          name: notFoundFailure
          branch: notFound
          description: Matches an unknown conversation ID (HTTP 404).
        - operation: getConversation
          name: providerRejectedFailure
          branch: providerRejected
          description: Matches a token that cannot read conversation 501 (HTTP 403).
        - operation: getConversation
          name: invalidResponseFailure
          branch: invalidResponse
          description: Matches a malformed successful conversation response.
        - operation: replyToConversation
          name: repliedDefaultAnswer
          branch: replied
          description: Matches an internal triage note on conversation 501, created as thread 567.
          default: true
        - operation: replyToConversation
          name: notFoundFailure
          branch: notFound
          description: Matches a note sent to an unknown conversation (HTTP 404).
        - operation: replyToConversation
          name: providerRejectedFailure
          branch: providerRejected
          description: Matches a locked conversation with too many threads (HTTP 412).
        - operation: updateConversation
          name: updatedDefaultAnswer
          branch: updated
          description: Matches tagging conversation 501 after triage and identifying repeat contact 502.
          default: true
        - operation: updateConversation
          name: notFoundFailure
          branch: notFound
          description: Matches an update to an unknown conversation (HTTP 404).
        - operation: updateConversation
          name: providerRejectedFailure
          branch: providerRejected
          description: Matches a locked conversation that refuses an update (HTTP 412).
        - operation: updateConversation
          name: invalidResponseFailure
          branch: invalidResponse
          description: Matches an oversized read-back after a status update.
        - operation: findCustomerByEmail
          name: foundDefaultAnswer
          branch: found
          description: Matches jane@acme.example.com to customer profile 238604.
          default: true
        - operation: findCustomerByEmail
          name: notFoundFailure
          branch: notFound
          description: Matches an email address with no customer profile.
        - operation: findCustomerByEmail
          name: providerRejectedFailure
          branch: providerRejected
          description: Matches a token forbidden from customer lookup (HTTP 403).
        - operation: findCustomerByEmail
          name: invalidResponseFailure
          branch: invalidResponse
          description: Matches an oversized customer lookup page.
    - company: Hiver
      id: hiver
      name: Hiver
      description: List Hiver shared inboxes and their conversations, read one conversation, set its status, assignee, and tags, add internal notes, and create shared reply drafts, keeping Hiver's own open, pending, and closed statuses.
      version: v0.23.0
      languages:
        go: v0.23.0
        typescript: v0.1.0
      directory: connectors/hiver
      uiUnits: []
      triggers: []
      operations:
        - name: listInboxes
          kind: query
          description: List one page of the account's Hiver shared inboxes with their IDs, names, and email addresses, and the token of the next page.
          languages:
            - go
            - typescript
        - name: listConversations
          kind: query
          description: List one page of up to 100 conversations of one shared inbox with their Hiver status, assignee, and tag IDs, and the token of the next page.
          languages:
            - go
            - typescript
        - name: getConversation
          kind: query
          description: Read one conversation of a shared inbox by Hiver conversation ID or Gmail thread ID, with its status, assignee, tag IDs, and message IDs.
          languages:
            - go
            - typescript
        - name: updateConversation
          kind: mutation
          description: Set the Hiver status or assignee of one conversation and apply or remove tags by name, then read the conversation back; a repeated attempt sends the same absolute change again.
          languages:
            - go
            - typescript
        - name: addNote
          kind: mutation
          description: Add one internal note, visible only to Hiver users, to a conversation. The shared single-dispatch fence requires sync durability so retry attempts can read its heartbeat checkpoint. Hiver documents no idempotency key or note read-back, so ambiguous sends remain uncertain.
          languages:
            - go
            - typescript
        - name: createSharedDraft
          kind: mutation
          description: Create one shared reply draft for a Hiver user to review and send. The shared single-dispatch fence requires sync durability so retry attempts can read its heartbeat checkpoint. Hiver documents no idempotency key or draft read-back, so ambiguous sends remain uncertain.
          languages:
            - go
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/hiver/go/hivermock
      mocks:
        - operation: listInboxes
          name: listedDefaultAnswer
          branch: listed
          description: For an empty pageToken or the following inbox token, returns three pages with support@acme.example.com on the last page.
          default: true
        - operation: listInboxes
          name: providerRejectedFailure
          branch: providerRejected
          description: For an invalid API key, Hiver returns HTTP 401 before listing inboxes.
        - operation: listInboxes
          name: invalidResponseFailure
          branch: invalidResponse
          description: For an empty pageToken, Hiver returned malformed inbox JSON.
        - operation: listConversations
          name: listedDefaultAnswer
          branch: listed
          description: For inboxId 105902 and successive pageToken values, returns two filtered pages before one open unassigned conversation.
          default: true
        - operation: listConversations
          name: notFoundFailure
          branch: notFound
          description: The shared inbox does not exist or is not visible to the API key.
        - operation: listConversations
          name: providerRejectedFailure
          branch: providerRejected
          description: For an invalid API key, Hiver returns HTTP 401 before listing conversations.
        - operation: listConversations
          name: invalidResponseFailure
          branch: invalidResponse
          description: For inboxId 105902, Hiver returned malformed conversation-page JSON.
        - operation: getConversation
          name: foundDefaultAnswer
          branch: found
          description: For inboxId 105902 and conversationId 573741352, returns the still-open unassigned conversation and one source message.
          default: true
        - operation: getConversation
          name: notFoundFailure
          branch: notFound
          description: The conversation or shared inbox does not exist or is not visible to the API key.
        - operation: getConversation
          name: providerRejectedFailure
          branch: providerRejected
          description: For an invalid API key, Hiver returns HTTP 401 before reading the conversation.
        - operation: getConversation
          name: invalidResponseFailure
          branch: invalidResponse
          description: For conversationId 573741352, Hiver returned malformed conversation JSON.
        - operation: updateConversation
          name: updatedDefaultAnswer
          branch: updated
          description: For the claim of conversation 573741352 by phoebe@acme.example.com with Claimed, returns the assigned tagged conversation.
          default: true
        - operation: updateConversation
          name: notFoundFailure
          branch: notFound
          description: The conversation or shared inbox does not exist or is not visible to the API key.
        - operation: updateConversation
          name: providerRejectedFailure
          branch: providerRejected
          description: For an assigneeEmail absent from inbox users, the connector rejects the change before PATCH.
        - operation: updateConversation
          name: invalidResponseFailure
          branch: invalidResponse
          description: For conversationId 573741352, Hiver returned malformed conversation JSON during read-back after accepting the change.
        - operation: addNote
          name: addedDefaultAnswer
          branch: added
          description: For a note on conversation 573741352, returns the internal note created by the claiming agent.
          default: true
        - operation: addNote
          name: notFoundFailure
          branch: notFound
          description: The conversation or shared inbox does not exist or is not visible to the API key; nothing was added.
        - operation: addNote
          name: providerRejectedFailure
          branch: providerRejected
          description: For invalid note content, Hiver returns HTTP 400 without adding a note.
        - operation: createSharedDraft
          name: createdDefaultAnswer
          branch: created
          description: For the reply to message 834466048 in inbox 105902, returns a reviewable shared draft.
          default: true
        - operation: createSharedDraft
          name: notFoundFailure
          branch: notFound
          description: The message or shared inbox does not exist or is not visible to the API key; no draft was created.
        - operation: createSharedDraft
          name: providerRejectedFailure
          branch: providerRejected
          description: For a draft body Hiver rejects, HTTP 400 leaves no shared draft.
    - company: HubSpot
      id: hubspot
      name: HubSpot
      description: Search, read, upsert, and update HubSpot CRM contacts, companies, and deals.
      version: v0.24.0
      languages:
        go: v0.24.0
        typescript: v0.1.0
      directory: connectors/hubspot
      uiUnits:
        - name: objectTypePicker
          description: Select the HubSpot CRM object type, contacts, companies, or deals, that the operation reads or writes; the unit stores the object type name.
        - name: ownerPicker
          description: Select one active HubSpot owner loaded from the connected account; the unit stores the owner's numeric ID for the hubspot_owner_id property.
        - name: dealStagePicker
          description: Select one deal pipeline and one of its stages loaded from the connected account; the unit stores the stable pipeline ID and stage ID.
      triggers: []
      operations:
        - name: searchObjects
          kind: query
          description: Search one bounded page of HubSpot contacts, companies, or deals with typed property filters, one sort, and an after cursor.
          languages:
            - go
            - typescript
        - name: getObject
          kind: query
          description: Read one HubSpot contact, company, or deal by record ID with the requested properties.
          languages:
            - go
            - typescript
        - name: upsertObject
          kind: mutation
          description: Create or update one HubSpot contact, company, or deal identified by a unique property, such as email for contacts.
          languages:
            - go
            - typescript
        - name: updateObject
          kind: mutation
          description: Update properties of one HubSpot contact, company, or deal by record ID.
          languages:
            - go
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/hubspot/go/hubspotmock
      mocks:
        - operation: searchObjects
          name: recentOpenDeals
          branch: searched
          description: Three sorted pages with a repeated newest deal and an older open deal.
          default: true
        - operation: searchObjects
          name: searchRejected
          branch: providerRejected
          description: HubSpot rejects an unavailable CRM property filter.
        - operation: getObject
          name: qualifiedDeal
          branch: found
          description: The selected deal read back at stage qualifiedtobuy; an application configured with another stage fails on it and needs a scripted answer.
          default: true
        - operation: getObject
          name: objectMissing
          branch: notFound
          description: The requested CRM record was deleted or is unavailable.
        - operation: getObject
          name: objectReadRejected
          branch: providerRejected
          description: HubSpot denies access to the requested record.
        - operation: upsertObject
          name: upsertedLead
          branch: upserted
          description: The lead contact was updated under its unique email.
          default: true
        - operation: upsertObject
          name: upsertConflict
          branch: conflict
          description: Another contact already owns a conflicting unique email.
        - operation: upsertObject
          name: upsertRejected
          branch: providerRejected
          description: HubSpot rejects an invalid contact property.
        - operation: updateObject
          name: advancedDeal
          branch: updated
          description: The selected deal now at stage qualifiedtobuy; script another stage when the application configures one.
          default: true
        - operation: updateObject
          name: dealMissing
          branch: notFound
          description: The selected deal was removed before its stage update.
        - operation: updateObject
          name: dealConflict
          branch: conflict
          description: The requested stage conflicts with the deal's state.
        - operation: updateObject
          name: updateRejected
          branch: providerRejected
          description: HubSpot rejects an invalid deal stage.
    - company: Intercom
      id: intercom
      name: Intercom
      description: Search, read, answer, close, reopen, and snooze Intercom conversations, find contacts by email, and receive signed conversation webhooks, with Intercom's own open, closed, and snoozed states.
      version: v0.23.0
      languages:
        go: v0.23.0
        typescript: v0.1.1
      directory: connectors/intercom
      uiUnits:
        - name: adminPicker
          description: Select the Intercom teammate (admin) that replies to, closes, reopens, or snoozes conversations; the unit lists the workspace's admins from Intercom and stores the chosen admin's numeric ID.
        - name: conversationTopicPicker
          description: Select the Intercom conversation webhook topics a conversationEvent binding accepts, such as conversation.user.created; the unit stores the topic names, and selecting none accepts every supported conversation topic.
      triggers:
        - name: conversationEvent
          description: Receive one Intercom conversation webhook notification, verified with its X-Hub-Signature, such as a new inbound conversation or a customer reply, filtered by topic.
          languages:
            - go
      operations:
        - name: searchConversations
          kind: query
          description: Search conversations by state, contact email, contact ID, tag, and update time, returning one bounded page and a cursor for the next.
          languages:
            - go
            - typescript
        - name: getConversation
          kind: query
          description: Read one conversation by ID with its first message and a bounded list of its latest parts as plain text.
          languages:
            - go
            - typescript
        - name: replyToConversation
          kind: mutation
          description: Add one admin reply or internal note to a conversation. Intercom has no idempotency key, so the Step runs with sync durability, sends the reply at most once per Step execution, and reconciles an unconfirmed attempt by reading the conversation back.
          languages:
            - go
            - typescript
        - name: updateConversationState
          kind: mutation
          description: Close, reopen, or snooze one conversation as an admin. Every attempt reads the conversation first and writes only when its state differs, so a repeated Step is safe.
          languages:
            - go
            - typescript
        - name: findContactByEmail
          kind: query
          description: Find the users and leads whose email equals one address, returning a bounded list; Intercom can hold several contacts with one email.
          languages:
            - go
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/intercom/go/intercommock
      mocks:
        - operation: searchConversations
          name: adaOpenConversations
          branch: searched
          description: Searching contact-1 for open or snoozed conversations returns three pages with earlier 2001 repeated across a boundary.
          default: true
        - operation: searchConversations
          name: providerRejectedFailure
          branch: providerRejected
          description: Intercom denies the search of contact-1 conversations because the token lacks the required permission.
        - operation: getConversation
          name: adaInboundConversation
          branch: found
          description: Reading inbound conversation 2002 returns Ada as its unanswered author.
          default: true
        - operation: getConversation
          name: notFoundFailure
          branch: notFound
          description: The read of conversation 2002 names a missing conversation.
        - operation: getConversation
          name: providerRejectedFailure
          branch: providerRejected
          description: Intercom denies the read of conversation 2002 because the token lacks the required permission.
        - operation: replyToConversation
          name: duplicateAnswered
          branch: replied
          description: Replying to duplicate conversation 2002 as admin 77 adds part 3001.
          default: true
        - operation: replyToConversation
          name: notFoundFailure
          branch: notFound
          description: The reply to conversation 2002 names a missing conversation.
        - operation: replyToConversation
          name: providerRejectedFailure
          branch: providerRejected
          description: Intercom denies the reply to conversation 2002 because the token lacks the required permission.
        - operation: updateConversationState
          name: duplicateClosed
          branch: updated
          description: Closing duplicate conversation 2002 as admin 77 returns its closed state.
          default: true
        - operation: updateConversationState
          name: notFoundFailure
          branch: notFound
          description: The close of conversation 2002 names a missing conversation.
        - operation: updateConversationState
          name: providerRejectedFailure
          branch: providerRejected
          description: Intercom denies the close of conversation 2002 because the token lacks the required permission.
        - operation: findContactByEmail
          name: adaContact
          branch: found
          description: Looking up ada@example.com returns user contact-1.
          default: true
        - operation: findContactByEmail
          name: notFoundFailure
          branch: notFound
          description: Looking up nobody@example.com returns no indexed contact.
        - operation: findContactByEmail
          name: providerRejectedFailure
          branch: providerRejected
          description: Intercom denies the lookup of ada@example.com because the token lacks the required permission.
    - company: Intuit
      id: mailchimp
      name: Mailchimp
      description: Read, upsert, tag, and list Mailchimp audience contacts without resubscribing anyone who unsubscribed, and send an existing campaign at most once after reading its status.
      version: v0.23.0
      languages:
        go: v0.23.0
        typescript: v0.1.0
      directory: connectors/intuit/mailchimp
      uiUnits: []
      triggers: []
      operations:
        - name: getMember
          kind: query
          description: Read one audience contact by email address, addressed by the MD5 hash of the lowercased address, with its status, merge fields, and up to 50 tags.
          languages:
            - go
            - typescript
        - name: listMembers
          kind: query
          description: List one bounded page of an audience's contacts, oldest change first, optionally only one status or contacts changed or opted in since a time, continuing at the returned offset.
          languages:
            - go
            - typescript
        - name: upsertMember
          kind: mutation
          description: Add a contact or update an existing one with PUT, which Mailchimp keys by the contact's address, so a repeated attempt writes the same values. statusIfNew applies only to a new contact; changing an existing contact to subscribed or pending requires isResubscribeAllowed.
          languages:
            - go
            - typescript
        - name: updateMemberTags
          kind: mutation
          description: Add and remove tags on one audience contact by declaring each tag active or inactive, so a repeated attempt leaves the same tags.
          languages:
            - go
            - typescript
        - name: sendCampaign
          kind: mutation
          description: Send one existing draft campaign now. The connector reads the campaign first and sends only a draft; a send is irreversible and Mailchimp has no idempotency key, so the Step runs with sync durability and sends at most once per Step execution.
          languages:
            - go
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/intuit/mailchimp/go/mailchimpmock
      mocks:
        - operation: getMember
          name: subscribedBen
          branch: found
          description: The audience 57afe96172 member ben@example.com is subscribed and tagged for the spring launch.
          default: true
        - operation: getMember
          name: memberMissing
          branch: notFound
          description: A getMember request for absent@example.com in audience 57afe96172 finds no contact.
        - operation: getMember
          name: memberReadForbidden
          branch: providerRejected
          description: A getMember request for ben@example.com with an API key lacking audience access is rejected.
        - operation: listMembers
          name: subscribedAudience
          branch: listed
          description: A listMembers request with pageSize 1 for subscribed contacts in audience 57afe96172 returns three one-contact pages, oldest first.
          default: true
        - operation: listMembers
          name: audienceMissing
          branch: notFound
          description: A listMembers request for deleted audience 0000000000 finds no audience.
        - operation: listMembers
          name: memberListKeyRevoked
          branch: providerRejected
          description: A listMembers request for audience 57afe96172 with a revoked API key is rejected.
        - operation: upsertMember
          name: upsertedBen
          branch: upserted
          description: An upsertMember request for ben@example.com in audience 57afe96172 keeps the subscribed contact.
          default: true
        - operation: upsertMember
          name: permanentlyDeletedAddress
          branch: providerRejected
          description: An upsertMember request for deleted@example.com is rejected because the address was permanently deleted.
        - operation: updateMemberTags
          name: taggedBen
          branch: updated
          description: An updateMemberTags request adding spring-launch to ben@example.com in audience 57afe96172 succeeds.
          default: true
        - operation: updateMemberTags
          name: taggingMissingMember
          branch: notFound
          description: An updateMemberTags request for absent@example.com in audience 57afe96172 finds no contact.
        - operation: updateMemberTags
          name: taggingForbidden
          branch: providerRejected
          description: An updateMemberTags request for ben@example.com with an API key of a Viewer-role user is rejected.
        - operation: sendCampaign
          name: sentSpringCampaign
          branch: sent
          description: A sendCampaign request for draft 42694e9e57 targeting audience 57afe96172 is accepted once.
          default: true
        - operation: sendCampaign
          name: springCampaignAlreadySent
          branch: alreadySent
          description: A sendCampaign request for 42694e9e57 after its first accepted send finds it already sending.
        - operation: sendCampaign
          name: scheduledCampaignNotSendable
          branch: notSendable
          description: A sendCampaign request for scheduled campaign 42694e9e57 cannot send it as a draft.
        - operation: sendCampaign
          name: campaignMissing
          branch: notFound
          description: A sendCampaign request for absent campaign 0000000000 finds no campaign.
        - operation: sendCampaign
          name: campaignChecklistRejected
          branch: providerRejected
          description: A sendCampaign request for draft 42694e9e57 with a failed send checklist is rejected.
    - company: Intuit
      id: quickbooks
      name: QuickBooks Online
      description: Find or create QuickBooks Online customers, raise invoices with exact decimal amounts, list and read them page by page, email them, and record payments against them, with every write sent under a QuickBooks requestid derived from the Step.
      version: v0.24.0
      languages:
        go: v0.24.0
        typescript: v0.1.0
      directory: connectors/intuit/quickbooks
      uiUnits: []
      triggers: []
      operations:
        - name: findCustomer
          kind: query
          description: Resolve one customer by exact primary email address or exact display name with a QuickBooks query, distinguishing one match, none, and several.
          languages:
            - go
            - typescript
        - name: createCustomer
          kind: mutation
          description: Create one customer with a unique display name, email address, names, company, phone, and currency; every attempt of the Step sends the same QuickBooks requestid to request replay of an earlier result.
          languages:
            - go
            - typescript
        - name: createInvoice
          kind: mutation
          description: Create one invoice for a customer with exact decimal item lines, dates, an optional document number, and a billing email; every attempt sends the same QuickBooks requestid to request replay of an earlier result.
          languages:
            - go
            - typescript
        - name: getInvoice
          kind: query
          description: Read one invoice by Id with its lines, exact decimal total and balance, email status, and linked payments.
          languages:
            - go
            - typescript
        - name: listInvoices
          kind: query
          description: List one bounded page of invoices, at most 100, filtered by customer, document number, open balance, invoice date, and last update, in a stable order with the next start position.
          languages:
            - go
            - typescript
        - name: sendInvoice
          kind: mutation
          description: Email one invoice to its billing address or a given address; every attempt sends the same QuickBooks requestid, though replay support on /send is unverified.
          languages:
            - go
            - typescript
        - name: recordPayment
          kind: mutation
          description: Record one received payment of an exact decimal amount and apply it to an invoice; every attempt sends the same QuickBooks requestid to request replay of an earlier result.
          languages:
            - go
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/intuit/quickbooks/go/quickbooksmock
      mocks:
        - operation: findCustomer
          name: existingCityAgency
          branch: found
          description: An email lookup for accounts@cityagency.example.com finds the active City Agency customer.
          default: true
        - operation: findCustomer
          name: notFoundFailure
          branch: notFound
          description: An email lookup for newbuyer@example.com finds no active customer.
        - operation: findCustomer
          name: sharedEmail
          branch: ambiguous
          description: An email lookup for shared@example.com returns two active customers for application selection.
        - operation: findCustomer
          name: providerRejectedFailure
          branch: providerRejected
          description: Looking up accounts@cityagency.example.com with a revoked connection is rejected.
        - operation: findCustomer
          name: invalidResponseFailure
          branch: invalidResponse
          description: Looking up accounts@cityagency.example.com receives an unusable customer list.
        - operation: createCustomer
          name: newBuyerCustomer
          branch: created
          description: Creating New Buyer for newbuyer@example.com returns customer 59.
          default: true
        - operation: createCustomer
          name: nameConflictFailure
          branch: nameConflict
          description: Creating a customer named Existing Vendor conflicts with an existing name-list entry.
        - operation: createCustomer
          name: providerRejectedFailure
          branch: providerRejected
          description: Creating City Agency with a revoked connection is rejected before creation.
        - operation: createInvoice
          name: newBuyerOrderInvoice
          branch: created
          description: Creating order ORDER-2048 for customer 59 returns invoice 131 for 75.00.
          default: true
        - operation: createInvoice
          name: providerRejectedFailure
          branch: providerRejected
          description: Creating ORDER-9999 with an unknown item ID returns Object Not Found (Fault 610) before creation.
        - operation: getInvoice
          name: paidCityAgencyInvoice
          branch: found
          description: Reading invoice 130 after payment and delivery returns a zero balance and EmailSent.
          default: true
        - operation: getInvoice
          name: notFoundFailure
          branch: notFound
          description: Reading deleted invoice ID 999 finds no invoice.
        - operation: getInvoice
          name: providerRejectedFailure
          branch: providerRejected
          description: Reading invoice ID 130 with a revoked connection is rejected.
        - operation: getInvoice
          name: invalidResponseFailure
          branch: invalidResponse
          description: Reading invoice ID 130 receives an unusable invoice body.
        - operation: listInvoices
          name: cityAgencyOpenInvoice
          branch: listed
          description: Listing customer 58 and document ORDER-1042 finds its unpaid invoice on the first page.
          default: true
        - operation: listInvoices
          name: providerRejectedFailure
          branch: providerRejected
          description: Listing customer 58's invoices with a revoked connection is rejected.
        - operation: listInvoices
          name: invalidResponseFailure
          branch: invalidResponse
          description: Listing customer 58's invoices receives an unusable page.
        - operation: sendInvoice
          name: cityAgencyInvoiceDelivery
          branch: sent
          description: Sending invoice 130 to accounts@cityagency.example.com returns EmailSent.
          default: true
        - operation: sendInvoice
          name: providerRejectedFailure
          branch: providerRejected
          description: Sending invoice 132, which has no billing address, without sendTo is rejected before delivery.
        - operation: recordPayment
          name: cityAgencyOrderPayment
          branch: recorded
          description: Recording 112.40 for customer 58 applies payment 186 fully to invoice 130.
          default: true
        - operation: recordPayment
          name: providerRejectedFailure
          branch: providerRejected
          description: Recording 112.40 against another customer's invoice is rejected before payment.
    - company: Klaviyo
      id: klaviyo
      name: Klaviyo
      description: Retrieve profiles and create deduplicated profile events.
      version: v0.2.0
      languages:
        go: v0.2.0
        typescript: v0.1.0
      directory: connectors/klaviyo
      uiUnits: []
      triggers: []
      operations:
        - name: getProfile
          kind: query
          description: Get one profile by Klaviyo ID.
          languages:
            - go
            - typescript
        - name: createEvent
          kind: mutation
          description: Submit a profile event with a unique_id derived from Dex's stable call identity.
          languages:
            - go
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/klaviyo/go/klaviyomock
      mocks:
        - operation: getProfile
          name: foundDefaultProfile
          branch: found
          description: Meridian member profile exists.
          default: true
        - operation: createEvent
          name: acceptedDefaultEvent
          branch: accepted
          description: Meridian member's signup event was accepted.
          default: true
    - company: Linear
      id: linear
      name: Linear
      description: Search and read Linear issues, create issues and comments under client-supplied IDs that every repeated attempt reuses and reads back, move issues through their team's workflow states, assign and label them, find users by email, and receive signed Issue webhooks.
      version: v0.24.0
      languages:
        go: v0.24.0
        typescript: v0.1.0
      directory: connectors/linear
      uiUnits:
        - name: teamPicker
          description: Choose one Linear team the connection can see, listed live from Linear for an OAuth connection; the unit stores the team's UUID, key, and name. A personal API key cannot list teams through Dex Web, so the unit then offers manual entry of the team UUID, which Linear shows under Settings > Teams > the team > Copy team ID.
      triggers:
        - name: issueEventReceived
          description: Receive a signed Linear Issue webhook for a created, updated, or removed issue, verified with its Linear-Signature and fresh webhookTimestamp; the event ID is the action, the issue UUID, and the issue's updatedAt.
          languages:
            - go
      operations:
        - name: searchIssues
          kind: query
          description: List one bounded page of issue summaries that match a typed filter, such as a team, workflow state types, an assignee email, labels, a title, or changes after a time, continuing with Linear's pagination cursor.
          languages:
            - go
            - typescript
        - name: getIssue
          kind: query
          description: Read one issue by UUID or identifier, such as ENG-123, with its description, workflow state, team, assignee, labels, project, cycle, and timestamps.
          languages:
            - go
            - typescript
        - name: createIssue
          kind: mutation
          description: Create one issue in a team with a title, Markdown description, workflow state, assignee, labels, priority, and due date; every attempt of the Step sends the same client-supplied issue UUID, so a repeated dispatch finds the first issue instead of creating another.
          languages:
            - go
            - typescript
        - name: updateIssue
          kind: mutation
          description: Move one issue to a workflow state, assign or unassign it, add or remove labels, and set its priority, due date, or title with absolute values, so a repeated update leaves the issue unchanged.
          languages:
            - go
            - typescript
        - name: addComment
          kind: mutation
          description: Add one Markdown comment to an issue; every attempt of the Step sends the same client-supplied comment UUID, so a repeated dispatch finds the first comment instead of posting another.
          languages:
            - go
            - typescript
        - name: findUserByEmail
          kind: query
          description: Find the workspace user with an email address, compared without case, to resolve an assignee.
          languages:
            - go
            - typescript
        - name: listWorkflowStates
          kind: query
          description: List a team's workflow states, Linear's issue statuses, with their names and types such as backlog, unstarted, started, completed, and canceled, so a Flow can choose the state to move an issue to.
          languages:
            - go
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/linear/go/linearmock
      mocks:
        - operation: searchIssues
          name: engineeringIssues
          branch: searched
          description: A searchIssues request filtered to Engineering and including archived issues before ENG-210 is created returns three newest-first pages with a repeated issue.
          default: true
        - operation: searchIssues
          name: noOpenFireDrillIssue
          branch: searched
          description: A searchIssues request for the exact February fire drill title in Engineering finds no open issue before creation.
        - operation: searchIssues
          name: invalidIssueCursor
          branch: providerRejected
          description: A searchIssues request with an expired Linear cursor is rejected.
        - operation: getIssue
          name: movedFireDrillIssue
          branch: found
          description: A getIssue request for UUID 44444444-4444-4444-8444-444444444444 reads the February fire drill after it moved to In Progress.
          default: true
        - operation: getIssue
          name: issueMissing
          branch: notFound
          description: A getIssue request for deleted identifier ENG-999 finds no issue.
        - operation: getIssue
          name: issueNotVisible
          branch: notFound
          description: A getIssue request for ENG-210 from a member without Engineering access finds no visible issue.
        - operation: getIssue
          name: issueReadKeyRevoked
          branch: providerRejected
          description: A getIssue request for ENG-210 with a revoked personal API key is rejected with HTTP 401.
        - operation: createIssue
          name: createdFireDrillIssue
          branch: created
          description: A createIssue request for the February fire drill in Engineering creates assigned issue ENG-210.
          default: true
        - operation: createIssue
          name: unknownTeamRejectsCreate
          branch: providerRejected
          description: A createIssue request for the February fire drill in team 00000000-0000-4000-8000-000000000000 is rejected after read-back finds no issue.
        - operation: updateIssue
          name: movedFireDrillToProgress
          branch: updated
          description: An updateIssue request moving ENG-210 to In Progress and assigning Alice returns the changed issue.
          default: true
        - operation: updateIssue
          name: updateMissingIssue
          branch: notFound
          description: An updateIssue request for deleted ENG-999 finds no issue to change.
        - operation: updateIssue
          name: stateFromAnotherTeam
          branch: providerRejected
          description: An updateIssue request moving ENG-210 to another team's workflow state is rejected.
        - operation: addComment
          name: commentedFireDrill
          branch: added
          description: An addComment request for ENG-210 with the facilities note creates one comment on the issue.
          default: true
        - operation: addComment
          name: commentIssueMissing
          branch: notFound
          description: An addComment request for deleted ENG-999 finds no issue to comment on.
        - operation: addComment
          name: commentForbidden
          branch: providerRejected
          description: An addComment request for ENG-210 from a member without comment permission is forbidden.
        - operation: findUserByEmail
          name: aliceAssignee
          branch: found
          description: A findUserByEmail request for Alice@Example.com resolves active Engineering member Alice Nguyen.
          default: true
        - operation: findUserByEmail
          name: assigneeMissing
          branch: notFound
          description: A findUserByEmail request for contractor@vendor.example.com finds no active workspace member.
        - operation: findUserByEmail
          name: assigneeLookupForbidden
          branch: providerRejected
          description: A findUserByEmail request for Alice@Example.com with a scope-limited OAuth grant is forbidden.
        - operation: listWorkflowStates
          name: engineeringStates
          branch: listed
          description: A listWorkflowStates request for Engineering returns its Backlog, Todo, In Progress, and Done states.
          default: true
        - operation: listWorkflowStates
          name: teamMissing
          branch: notFound
          description: A listWorkflowStates request for deleted team 00000000-0000-4000-8000-000000000000 finds no team.
        - operation: listWorkflowStates
          name: teamStatesNotVisible
          branch: notFound
          description: A listWorkflowStates request for Engineering without team access finds no visible team.
        - operation: listWorkflowStates
          name: teamStatesKeyRevoked
          branch: providerRejected
          description: A listWorkflowStates request for Engineering with a revoked personal API key is rejected with HTTP 401.
    - company: LinkedIn
      id: linkedin
      name: LinkedIn
      description: Read the authenticated member's OpenID Connect UserInfo profile and verified email.
      version: v0.24.0
      languages:
        go: v0.24.0
        typescript: v0.1.0
      directory: connectors/linkedin
      uiUnits: []
      triggers: []
      operations:
        - name: getAuthenticatedProfile
          kind: query
          description: Read bounded signup identity claims from LinkedIn OpenID Connect UserInfo.
          languages:
            - go
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/linkedin/go/linkedinmock
      mocks:
        - operation: getAuthenticatedProfile
          name: verifiedSignupProfile
          branch: profileLoaded
          description: An empty profile request for the authorized Ada Lovelace member returns her verified signup identity.
          default: true
        - operation: getAuthenticatedProfile
          name: memberWithoutVerifiedEmail
          branch: verifiedEmailRequired
          description: An empty profile request for a member whose UserInfo email is unverified requires a verified email.
        - operation: getAuthenticatedProfile
          name: grantWithoutEmailScope
          branch: verifiedEmailRequired
          description: An empty profile request using a grant without the email scope returns no verified email.
        - operation: getAuthenticatedProfile
          name: forbiddenUserInfoRequest
          branch: insufficientScope
          description: An empty profile request answered with HTTP 403 by LinkedIn UserInfo is forbidden.
        - operation: getAuthenticatedProfile
          name: revokedMemberGrant
          branch: authorizationRevoked
          description: An empty profile request using a revoked grant requires reauthorization.
        - operation: getAuthenticatedProfile
          name: missingMember
          branch: notFound
          description: An empty profile request for a removed member returns no UserInfo profile.
        - operation: getAuthenticatedProfile
          name: rejectedUserInfoRequest
          branch: providerRejected
          description: An empty profile request answered with HTTP 400 by LinkedIn UserInfo is rejected.
    - company: Mailgun
      id: mailgun
      name: Mailgun
      description: Read Mailgun domain events and account domains.
      version: v0.2.0
      languages:
        go: v0.2.0
        typescript: v0.1.0
      directory: connectors/mailgun
      uiUnits: []
      triggers: []
      operations:
        - name: getEvents
          kind: query
          description: Read a bounded page of delivery events for one sending domain.
          languages:
            - go
            - typescript
        - name: listDomains
          kind: query
          description: List sending domains and the account's reported domain count.
          languages:
            - go
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/mailgun/go/mailgunmock
      mocks:
        - operation: getEvents
          name: listedDefault
          branch: listed
          description: A representative Mailgun result for the example Flow.
          default: true
        - operation: listDomains
          name: listedDefault
          branch: listed
          description: A representative Mailgun result for the example Flow.
          default: true
    - company: Microsoft
      id: microsoft-entra-id
      name: Microsoft Entra ID
      description: Read and list Microsoft Entra ID user accounts, create, disable, and enable them, revoke their sign-in sessions, and add or remove group members through Microsoft Graph, converging instead of duplicating when a Step repeats.
      version: v0.24.0
      languages:
        go: v0.24.0
        typescript: v0.1.0
      directory: connectors/microsoft/entra-id
      uiUnits: []
      triggers: []
      operations:
        - name: getUser
          kind: query
          description: Read one user account by object ID or user principal name.
          languages:
            - go
            - typescript
        - name: listUsers
          kind: query
          description: List one bounded page of accounts in the tenant, optionally filtered with an OData filter or a search expression.
          languages:
            - go
            - typescript
        - name: createUser
          kind: mutation
          description: Create one enabled account with a generated password nobody receives that must be changed at the next sign-in, tagged with a stable key, so a repeated Step returns the account it created instead of a duplicate.
          languages:
            - go
            - typescript
        - name: disableUser
          kind: mutation
          description: Block sign-in for one account by setting accountEnabled to false, keeping its data; disabling a disabled account changes nothing.
          languages:
            - go
            - typescript
        - name: enableUser
          kind: mutation
          description: Restore sign-in for one account by setting accountEnabled to true; enabling an enabled account changes nothing.
          languages:
            - go
            - typescript
        - name: revokeSignInSessions
          kind: mutation
          description: Invalidate every refresh token and browser session cookie issued to one account so it must sign in again everywhere; repeating it only moves the cutoff time forward.
          languages:
            - go
            - typescript
        - name: addUserToGroup
          kind: mutation
          description: Add one account as a direct member of a security or Microsoft 365 group; an existing membership is confirmed and reported instead of failing.
          languages:
            - go
            - typescript
        - name: removeUserFromGroup
          kind: mutation
          description: Remove one account's direct membership from a group; a membership that is already gone is reported as removed.
          languages:
            - go
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/microsoft/entra-id/go/entraidmock
      mocks:
        - operation: getUser
          name: adaAccount
          branch: found
          description: A getUser request for ada.lovelace@contoso.com finds Ada's enabled account before offboarding.
          default: true
        - operation: getUser
          name: accountMissing
          branch: notFound
          description: A getUser request for absent@contoso.com finds no account.
        - operation: getUser
          name: accountReadForbidden
          branch: providerRejected
          description: A getUser request for ada.lovelace@contoso.com without User.Read.All is forbidden.
        - operation: listUsers
          name: tenantAccounts
          branch: listed
          description: A listUsers request with no filter pages through the Contoso tenant, including Ada, a duplicate, and a disabled user.
          default: true
        - operation: listUsers
          name: unsupportedAccountFilter
          branch: providerRejected
          description: A listUsers request with an unsupported OData filter is rejected by Graph.
        - operation: createUser
          name: createdAda
          branch: created
          description: A createUser request for ada.lovelace@contoso.com with the onboarding details creates her enabled account.
          default: true
        - operation: createUser
          name: accountNameTaken
          branch: alreadyExists
          description: A createUser request for taken@contoso.com conflicts with another account's principal name.
        - operation: createUser
          name: unverifiedDomain
          branch: providerRejected
          description: A createUser request for ada@unverified.example is rejected because the tenant has not verified that domain.
        - operation: disableUser
          name: disabledAda
          branch: disabled
          description: A disableUser request for object ID 11111111-2222-4333-8444-555555555555 blocks Ada's sign-in.
          default: true
        - operation: disableUser
          name: disableMissingAccount
          branch: notFound
          description: A disableUser request for deleted object 99999999-9999-4999-8999-999999999999 finds no account.
        - operation: disableUser
          name: disableForbidden
          branch: providerRejected
          description: A disableUser request for Ada's account without account management permission is forbidden.
        - operation: enableUser
          name: enabledAda
          branch: enabled
          description: An enableUser request for ada.lovelace@contoso.com restores Ada's sign-in after offboarding.
          default: true
        - operation: enableUser
          name: enableMissingAccount
          branch: notFound
          description: An enableUser request for deleted@contoso.com finds no account.
        - operation: enableUser
          name: enableForbidden
          branch: providerRejected
          description: An enableUser request for Ada's account without account management permission is forbidden.
        - operation: revokeSignInSessions
          name: adaSessionsRevoked
          branch: revoked
          description: A revokeSignInSessions request for object ID 11111111-2222-4333-8444-555555555555 revokes Ada's sessions.
          default: true
        - operation: revokeSignInSessions
          name: revokeMissingAccount
          branch: notFound
          description: A revokeSignInSessions request for deleted object 99999999-9999-4999-8999-999999999999 finds no account.
        - operation: revokeSignInSessions
          name: revokeForbidden
          branch: providerRejected
          description: A revokeSignInSessions request for Ada without User.RevokeSessions.All is forbidden.
        - operation: addUserToGroup
          name: adaAddedToTeam
          branch: added
          description: An addUserToGroup request for Ada's object ID and team group aaaaaaaa-bbbb-4ccc-8ddd-eeeeeeeeeeee adds her direct membership.
          default: true
        - operation: addUserToGroup
          name: addToMissingGroup
          branch: notFound
          description: An addUserToGroup request for deleted group bbbbbbbb-cccc-4ddd-8eee-ffffffffffff finds no group.
        - operation: addUserToGroup
          name: dynamicGroupRejectsAdd
          branch: providerRejected
          description: An addUserToGroup request for a dynamic group is rejected because direct membership cannot be edited.
        - operation: removeUserFromGroup
          name: adaRemovedFromTeam
          branch: removed
          description: A removeUserFromGroup request for Ada's object ID and team group aaaaaaaa-bbbb-4ccc-8ddd-eeeeeeeeeeee removes her direct membership.
          default: true
        - operation: removeUserFromGroup
          name: removeFromMissingGroup
          branch: notFound
          description: A removeUserFromGroup request for deleted group bbbbbbbb-cccc-4ddd-8eee-ffffffffffff finds no group.
        - operation: removeUserFromGroup
          name: dynamicGroupRejectsRemoval
          branch: providerRejected
          description: A removeUserFromGroup request for a dynamic group is rejected because direct membership cannot be edited.
    - company: Microsoft
      id: microsoft-excel
      name: Microsoft Excel
      description: Read Excel tables as rows keyed by column name, read and write bounded ranges, and append table rows without duplicates in workbooks stored in OneDrive for work or school and SharePoint, through Microsoft Graph.
      version: v0.24.0
      languages:
        go: v0.24.0
        typescript: v0.1.0
      directory: connectors/microsoft/excel
      uiUnits:
        - name: workbookPicker
          description: Select an .xlsx workbook found by searching the signed-in person's OneDrive and the files shared with them, or paste a OneDrive or SharePoint sharing link to the workbook; the unit stores the workbook's drive ID, its drive item ID, and its file name.
        - name: worksheetPicker
          description: Select a worksheet listed from the chosen workbook, or type a worksheet name; choose the workbook first. The unit stores the worksheet's stable ID when it is picked from the list, which keeps working after a rename, or the typed name, plus the display name.
        - name: tablePicker
          description: Select an Excel table listed from the chosen workbook, or type a table name; choose the workbook first. The unit stores the table's stable ID when it is picked from the list, which keeps working after a rename, or the typed name, plus the display name.
      triggers: []
      operations:
        - name: getTableRows
          kind: query
          description: Read every data row of one Excel table, without its header and total rows, as rows keyed by the table's column names, with the column names in table order.
          languages:
            - go
            - typescript
        - name: getValues
          kind: query
          description: Read one bounded A1 range of one worksheet, such as A1:C10, as raw cell values and their displayed text.
          languages:
            - go
            - typescript
        - name: updateValues
          kind: mutation
          description: Write literal values to one bounded A1 range of one worksheet whose size matches the values exactly. Text is stored as text, never as a formula or a parsed number or date, and the values are absolute, so a repeated dispatch writes the same values again and leaves the same range.
          languages:
            - go
            - typescript
        - name: appendTableRows
          kind: mutation
          description: Append rows to the end of one Excel table in one request, skipping every row whose key column value the table already holds. Microsoft Graph offers no idempotency key, so the Step runs with sync durability, records a Dex heartbeat checkpoint before it sends the append, and sends it at most once per Step execution.
          languages:
            - go
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/microsoft/excel/go/excelmock
      mocks:
        - operation: getTableRows
          name: approvalPolicyRows
          branch: read
          description: A getTableRows request for the ApprovalPolicy table in the policy workbook returns travel and hardware approval limits.
          default: true
        - operation: getTableRows
          name: policyTableMissing
          branch: notFound
          description: A getTableRows request for a deleted ApprovalPolicy table finds no table.
        - operation: getTableRows
          name: policyTableTooLarge
          branch: tooLarge
          description: A getTableRows request for an ApprovalPolicy table above the configured cell limit is refused.
        - operation: getTableRows
          name: policyReadForbidden
          branch: providerRejected
          description: A getTableRows request for the policy workbook without Files.Read permission is rejected.
        - operation: getValues
          name: approvedSummary
          branch: read
          description: A getValues request for Summary!A2:E2 after approving REQ-1001 reads the displayed decision row.
          default: true
        - operation: getValues
          name: summaryWorksheetMissing
          branch: notFound
          description: A getValues request for Summary!A2:E2 after the worksheet was deleted finds no worksheet.
        - operation: getValues
          name: summaryResponseTooLarge
          branch: tooLarge
          description: A getValues request for Summary!A2:E2 with a response above the configured byte limit is refused.
        - operation: getValues
          name: summaryReadForbidden
          branch: providerRejected
          description: A getValues request for Summary!A2:E2 without Files.Read permission is rejected.
        - operation: updateValues
          name: approvedSummaryWritten
          branch: updated
          description: An updateValues request writing the REQ-1001 approval to Summary!A2:E2 succeeds.
          default: true
        - operation: updateValues
          name: summaryWriteMissing
          branch: notFound
          description: An updateValues request for Summary!A2:E2 after the worksheet was deleted finds no worksheet.
        - operation: updateValues
          name: summaryProtected
          branch: providerRejected
          description: An updateValues request writing Summary!A2:E2 on a protected worksheet is forbidden.
        - operation: appendTableRows
          name: approvedDecisionLogged
          branch: appended
          description: An appendTableRows request keyed by REQ-1001 adds its approved row to the Decisions table.
          default: true
        - operation: appendTableRows
          name: decisionTableMissing
          branch: notFound
          description: An appendTableRows request for a deleted Decisions table finds no table and writes nothing.
        - operation: appendTableRows
          name: decisionColumnsMismatch
          branch: columnsMismatch
          description: An appendTableRows request with RequestId as key fails when Decisions lacks that column.
        - operation: appendTableRows
          name: decisionAppendForbidden
          branch: providerRejected
          description: An appendTableRows request for Decisions on a protected worksheet is forbidden before writing.
    - company: Microsoft
      id: microsoft-onedrive
      name: Microsoft OneDrive and SharePoint
      description: Find, read, and write files in OneDrive and SharePoint document libraries through Microsoft Graph, with uploads and folders that stay single under retries.
      version: v0.24.0
      languages:
        go: v0.24.0
        typescript: v0.1.0
      directory: connectors/microsoft/onedrive
      uiUnits:
        - name: sitePicker
          description: Search the SharePoint sites the authorized user can reach by keyword, or paste a site ID of the form hostname,site-collection-GUID,web-GUID; the unit stores the Graph site ID and display name so a drivePicker in the same Step can list that site's document libraries, and blank means the user's own OneDrive.
        - name: drivePicker
          description: Select the signed-in user's OneDrive or one document library of the site chosen by a sitePicker in the same Step, or paste a drive ID such as b!Abc123; the unit stores the Graph drive ID and display name, and blank means the signed-in user's OneDrive (app-only connections need a drive ID).
        - name: folderPicker
          description: Browse the folders of the drive chosen by a drivePicker in the same Step, opening subfolders one level at a time, or paste a folder item ID; the unit stores the Graph item ID and display name of the folder, and blank means the drive's root folder.
      triggers: []
      operations:
        - name: searchFiles
          kind: query
          description: Find files and folders by exact or partial name in one folder or across one drive, one bounded page at a time.
          languages:
            - go
            - typescript
        - name: getFile
          kind: query
          description: Read the metadata of one file or folder by its drive item ID.
          languages:
            - go
            - typescript
        - name: readFileText
          kind: query
          description: Download one small text file as bounded UTF-8 text without exposing its pre-authenticated download URL.
          languages:
            - go
            - typescript
        - name: uploadFile
          kind: mutation
          description: Write one file from text or bytes by parent folder and name with an explicit fail or replace conflict behavior, converging on one file when a Step is dispatched twice.
          languages:
            - go
            - typescript
        - name: createFolder
          kind: mutation
          description: Ensure one folder with a name exists in a parent folder, returning the folder an earlier attempt or another writer already created.
          languages:
            - go
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/microsoft/onedrive/go/onedrivemock
      mocks:
        - operation: searchFiles
          name: foundDefaultAnswer
          branch: found
          description: Exact search for Ops Policy.txt in source-folder finds one matching file.
          default: true
        - operation: searchFiles
          name: missingName
          branch: notFound
          description: Searching for Missing Policy.txt returns no matching item.
        - operation: searchFiles
          name: restrictedFolder
          branch: providerRejected
          description: Searching source-folder without read permission is rejected.
        - operation: getFile
          name: foundDefaultAnswer
          branch: found
          description: Reading copy-file-1 in b!financeLibrary-2 returns the copied text file metadata.
          default: true
        - operation: getFile
          name: missingItem
          branch: notFound
          description: Reading missing-file-1 returns not found.
        - operation: getFile
          name: deniedRead
          branch: providerRejected
          description: Reading copy-file-1 metadata without Graph permission is rejected.
        - operation: readFileText
          name: readDefaultAnswer
          branch: read
          description: Reading source-file-1 returns the UTF-8 Ops Policy.txt content.
          default: true
        - operation: readFileText
          name: missingItem
          branch: notFound
          description: Reading missing-file-1 returns not found.
        - operation: readFileText
          name: folderContent
          branch: unsupportedContent
          description: Reading source-folder as UTF-8 text is unsupported.
        - operation: readFileText
          name: oversizedText
          branch: tooLarge
          description: Reading source-file-large over the configured text limit is rejected.
        - operation: readFileText
          name: deniedDownload
          branch: providerRejected
          description: Reading source-file-1 metadata when Graph returns 403 is rejected.
        - operation: uploadFile
          name: uploadedDefaultAnswer
          branch: uploaded
          description: Uploading Ops Policy (copy).txt into copy-folder-1 creates copy-file-1.
          default: true
        - operation: uploadFile
          name: differentFile
          branch: alreadyExists
          description: Uploading Ops Policy (copy).txt with fail behavior over existing-copy returns a conflict.
        - operation: uploadFile
          name: quotaExhausted
          branch: providerRejected
          description: Uploading Ops Policy (copy).txt into copy-folder-1 when the drive quota is exhausted is rejected.
        - operation: createFolder
          name: createdDefaultAnswer
          branch: created
          description: Ensuring Dex copies in destination-folder returns copy-folder-1.
          default: true
        - operation: createFolder
          name: fileAtFolderName
          branch: nameConflict
          description: Creating Dex copies in destination-folder where existing-file has that name returns a conflict.
        - operation: createFolder
          name: readOnlyParent
          branch: providerRejected
          description: Creating Dex copies in read-only destination-folder is rejected.
    - company: Microsoft
      id: outlook-calendar
      name: Microsoft Outlook Calendar
      description: List and read Outlook calendar events in a bounded window, create and update events idempotently, and query free/busy schedules through Microsoft Graph, with delegated Microsoft OAuth or an app-only connection to one mailbox.
      version: v0.24.0
      languages:
        go: v0.24.0
        typescript: v0.1.0
      directory: connectors/microsoft/outlook-calendar
      uiUnits:
        - name: calendarPicker
          description: Select a calendar of the connection's mailbox, listed from Microsoft Graph's read-only calendars list; the unit stores the stable calendar ID and display name, and an operation that writes events lists only calendars the connection can edit. Blank uses the mailbox's default calendar.
      triggers: []
      operations:
        - name: listEvents
          kind: query
          description: List one page of a calendar view, the events and expanded recurring occurrences that overlap a bounded window, with every time returned at an explicit offset.
          languages:
            - go
            - typescript
        - name: getEvent
          kind: query
          description: Read one event by its Graph event ID.
          languages:
            - go
            - typescript
        - name: createEvent
          kind: mutation
          description: Create one timed or all-day event under the Step's idempotency key, sent as Graph's transactionId and stamped as an extended property for retry lookup.
          languages:
            - go
            - typescript
        - name: updateEvent
          kind: mutation
          description: Patch the subject, body, location, start and end, or attendees of one existing event after reading it, skipping a change it already holds and sending If-Match with its ETag.
          languages:
            - go
            - typescript
        - name: queryFreeBusy
          kind: query
          description: Return the free/busy schedule items and availability view of 1 to 20 users, groups, or rooms in a bounded window through Microsoft Graph getSchedule.
          languages:
            - go
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/microsoft/outlook-calendar/go/outlookcalendarmock
      mocks:
        - operation: listEvents
          name: listedDefaultAnswer
          branch: listed
          description: Listing team-calendar returns the held Meridian kickoff and a free briefing.
          default: true
        - operation: listEvents
          name: missingCalendar
          branch: notFound
          description: Listing a missing calendar returns not found.
        - operation: listEvents
          name: deniedCalendar
          branch: providerRejected
          description: Listing a calendar without permission is rejected.
        - operation: getEvent
          name: foundDefaultAnswer
          branch: found
          description: Reading hold-1 returns the Meridian kickoff hold without a calendar ID.
          default: true
        - operation: getEvent
          name: missingEvent
          branch: notFound
          description: Reading a missing event ID returns not found.
        - operation: getEvent
          name: deniedEvent
          branch: providerRejected
          description: Reading an event without permission is rejected.
        - operation: createEvent
          name: createdDefaultAnswer
          branch: created
          description: Creating the Meridian kickoff hold in team-calendar returns hold-1.
          default: true
        - operation: createEvent
          name: deniedCreate
          branch: providerRejected
          description: Creating an event in a read-only calendar is rejected.
        - operation: updateEvent
          name: updatedDefaultAnswer
          branch: updated
          description: Updating hold-1 with Priya and Alice returns the invited Meridian kickoff.
          default: true
        - operation: updateEvent
          name: missingEvent
          branch: notFound
          description: Updating a missing event ID returns not found.
        - operation: updateEvent
          name: deniedUpdate
          branch: providerRejected
          description: Updating an event without write permission is rejected.
        - operation: queryFreeBusy
          name: queriedDefaultAnswer
          branch: queried
          description: Querying Priya and Alice for the Meridian kickoff hour reports both free.
          default: true
        - operation: queryFreeBusy
          name: unknownSchedule
          branch: incomplete
          description: Querying only alice@example.com when Graph cannot read her schedule returns unknown availability.
        - operation: queryFreeBusy
          name: deniedSchedule
          branch: providerRejected
          description: Querying schedules without permission is rejected.
    - company: Microsoft
      id: outlook-mail
      name: Microsoft Outlook Mail
      description: Search, read, flag, categorize, and move messages in a Microsoft 365 (Exchange Online) mailbox through Microsoft Graph, and send new messages or threaded replies through drafts marked with the Step's idempotency key, so a retried Step never sends twice.
      version: v0.24.0
      languages:
        go: v0.24.0
        typescript: v0.1.0
      directory: connectors/microsoft/outlook-mail
      uiUnits:
        - name: mailFolderPicker
          description: Select one mail folder of the connection's mailbox, listed live from Microsoft Graph's mailFolders and childFolders with the connection's access token, or enter a folder ID; the unit stores the stable folder ID and its display name.
      triggers: []
      operations:
        - name: searchMessages
          kind: query
          description: List one bounded page of message summaries in one mail folder, newest first, filtered by exact sender address, subject text, received time range, and unread state, with an opaque cursor for the next page.
          languages:
            - go
            - typescript
        - name: getMessage
          kind: query
          description: Read one message by ID without marking it read, returning its header fields, a bounded plain-text body that Microsoft Graph converts from HTML when needed, and attachment names and sizes without their content.
          languages:
            - go
            - typescript
        - name: sendMessage
          kind: mutation
          description: Send one plain-text message by creating a draft marked with the Step's idempotency key and sending that draft. Graph has no idempotency key, so the Step runs with sync durability, finds its own draft again on every retry, sends it at most once, and confirms a lost answer from the Sent Items copy.
          languages:
            - go
            - typescript
        - name: replyToMessage
          kind: mutation
          description: Reply to one message, or reply to all, by creating Outlook's threaded reply draft, which quotes the original, marking it with the Step's idempotency key, and sending it at most once per Step execution like sendMessage.
          languages:
            - go
            - typescript
        - name: moveMessage
          kind: mutation
          description: Move one message to another mail folder by folder ID or well-known name. Message IDs are immutable, so a repeated attempt that finds the message already in the folder reports it moved without moving it again.
          languages:
            - go
            - typescript
        - name: setMessageFlags
          kind: mutation
          description: Set one message's read state, follow-up flag, and categories to absolute values; it reads them first and writes only the differences, so a repeated attempt changes nothing twice.
          languages:
            - go
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/microsoft/outlook-mail/go/outlookmailmock
      mocks:
        - operation: searchMessages
          name: customerInbox
          branch: searched
          description: Three newest-first Inbox pages for a search from jane@acme.example.com in folder inbox, with a lookalike sender and a repeated customer message; another sender or folder needs a script.
          default: true
        - operation: searchMessages
          name: searchRejected
          branch: providerRejected
          description: The mailbox search is not authorized.
        - operation: getMessage
          name: customerMessage
          branch: found
          description: The customer's refund request with a receipt attachment.
          default: true
        - operation: getMessage
          name: messageMissing
          branch: notFound
          description: The customer message was deleted before it was read.
        - operation: getMessage
          name: messageReadRejected
          branch: providerRejected
          description: The mailbox does not permit this read.
        - operation: sendMessage
          name: newMessageSent
          branch: sent
          description: A new message to jane@acme.example.com with subject 'Your refund for order 88213', accepted for sending; other recipients or subjects need a script.
          default: true
        - operation: sendMessage
          name: sendRejected
          branch: providerRejected
          description: Microsoft Graph rejects an invalid recipient.
        - operation: replyToMessage
          name: customerReplySent
          branch: sent
          description: A threaded reply to message AAMkAGI2MDEyMzQ1AAABC002 from jane@acme.example.com, accepted for sending; a reply to another message needs a script.
          default: true
        - operation: replyToMessage
          name: originalMessageMissing
          branch: notFound
          description: The original customer message was deleted before drafting the reply.
        - operation: replyToMessage
          name: replyRejected
          branch: providerRejected
          description: Microsoft Graph rejects an unusable reply recipient.
        - operation: moveMessage
          name: customerMessageArchived
          branch: moved
          description: The answered customer message now belongs to Archive.
          default: true
        - operation: moveMessage
          name: moveMessageMissing
          branch: notFound
          description: The answered message was removed before archiving.
        - operation: moveMessage
          name: moveRejected
          branch: providerRejected
          description: Microsoft Graph denies moving into the destination folder.
        - operation: setMessageFlags
          name: customerMessageRead
          branch: updated
          description: The answered customer message is marked read.
          default: true
        - operation: setMessageFlags
          name: flaggedMessageMissing
          branch: notFound
          description: The message was removed before its flags changed.
        - operation: setMessageFlags
          name: flagsRejected
          branch: providerRejected
          description: Microsoft Graph denies a read-state update.
    - company: Microsoft
      id: microsoft-sql-server
      name: Microsoft SQL Server
      description: Run one parameterized read query, or one transactional write statement, against Microsoft SQL Server, Azure SQL Database, or Azure SQL Managed Instance.
      version: v0.23.0
      languages:
        go: v0.23.0
        typescript: v0.1.0
      directory: connectors/microsoft/sql-server
      uiUnits: []
      triggers: []
      operations:
        - name: query
          kind: query
          description: Run one parameterized SELECT in a transaction that is always rolled back and return its bounded rows.
          languages:
            - go
            - typescript
        - name: execute
          kind: mutation
          description: Run one parameterized INSERT, UPDATE, DELETE, or MERGE in its own transaction and return its rows affected and any bounded OUTPUT rows.
          languages:
            - go
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/microsoft/sql-server/go/sqlservermock
      mocks:
        - operation: query
          name: completedDefaultAnswer
          branch: completed
          description: Querying refund_ledger for order 88213 returns its recorded refund.
          default: true
        - operation: query
          name: rowLimit
          branch: truncated
          description: Querying refund_ledger for order 88213 with maxRows 1 below the result size returns a truncated row set.
        - operation: query
          name: missingTable
          branch: providerRejected
          description: Querying a missing refund_ledger table is rejected.
        - operation: execute
          name: completedDefaultAnswer
          branch: completed
          description: Inserting refund order 88213 writes one refund and returns its OUTPUT row.
          default: true
        - operation: execute
          name: raceLost
          branch: completed
          description: Inserting refund order 88213 after another Flow won the race returns no OUTPUT row.
        - operation: execute
          name: rowLimit
          branch: limitExceeded
          description: Updating more rows than maxRowsAffected rolls back the statement.
        - operation: execute
          name: duplicateKey
          branch: providerRejected
          description: Inserting a duplicate unique key is rejected before commit.
    - company: Microsoft
      id: microsoft-teams
      name: Microsoft Teams
      description: Post Microsoft Teams channel messages, thread replies, and chat messages as the signed-in user, each at most once per Step execution, and read a channel message's replies so a Flow can wait for a person's answer.
      version: v0.24.0
      languages:
        go: v0.24.0
        typescript: v0.1.0
      directory: connectors/microsoft/teams
      uiUnits:
        - name: teamPicker
          description: Select one team the connected account is a direct member of, loaded from Microsoft Teams; the unit stores the team's stable ID, a GUID such as fbe2bf47-16c8-47cf-b4a5-4b9b187c508b, and its name. Teams that host a shared channel the account joined without joining the team are not listed.
        - name: channelPicker
          description: Select one channel of the chosen team, loaded from Microsoft Teams; choose the team first. The list holds standard channels and the private or shared channels the account belongs to, and the unit stores the stable channel ID, such as 19:4a95f7d8db4c4e7fae857bcebe0623e6@thread.tacv2, and its name.
        - name: chatPicker
          description: Select one one-on-one, group, or meeting chat the connected account belongs to, loaded from Microsoft Teams and labeled by its topic or members; the unit stores the stable chat ID, such as 19:meeting_MjdhNjM4YzUtYzExZi00@thread.v2, and the label.
      triggers: []
      operations:
        - name: listThreadReplies
          kind: query
          description: Read one bounded page of the replies to a channel message, with each reply's sender, time, and text converted from HTML, continuing with the returned cursor. Needs ChannelMessage.Read.All, which requires administrator consent.
          languages:
            - go
            - typescript
        - name: postChannelMessage
          kind: mutation
          description: Post one top-level message, with an optional subject, to a channel as the signed-in user. Graph has no idempotency key, so a sync single-dispatch fence checkpoints the send across retries; an unconfirmed send is read back without another post.
          languages:
            - go
            - typescript
        - name: postThreadReply
          kind: mutation
          description: Reply once to an existing channel message's thread as the signed-in user. Graph has no idempotency key, so a sync single-dispatch fence checkpoints the send across retries; an unconfirmed reply is read back without another post.
          languages:
            - go
            - typescript
        - name: postChatMessage
          kind: mutation
          description: Send one message to an existing one-on-one, group, or meeting chat as the signed-in user. A sync single-dispatch fence prevents a duplicate across retries; the connection cannot read chat messages, so an unconfirmed send selects uncertain.
          languages:
            - go
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/microsoft/teams/go/teamsmock
      mocks:
        - operation: listThreadReplies
          name: incidentAcknowledgement
          branch: read
          description: The incident bot's status reply and Ada's acknowledgement in root message 1616990032035; other threads need a script.
          default: true
        - operation: listThreadReplies
          name: missingThread
          branch: notFound
          description: A root message ID absent from the selected channel.
        - operation: listThreadReplies
          name: readDenied
          branch: providerRejected
          description: The connected account lacks channel-message read permission.
        - operation: listThreadReplies
          name: invalidPage
          branch: invalidResponse
          description: Graph returns an unusable reply page for the selected thread.
        - operation: postChannelMessage
          name: incidentPosted
          branch: sent
          description: The signed-in incident account posts INC-1042 in the selected incident channel; other incidents need a script.
          default: true
        - operation: postChannelMessage
          name: channelPostDenied
          branch: providerRejected
          description: The signed-in account cannot post to the selected incident channel.
        - operation: postThreadReply
          name: incidentStatusReply
          branch: sent
          description: The incident account replies with status to root message 1616990032035; other roots need a script.
          default: true
        - operation: postThreadReply
          name: replyDenied
          branch: providerRejected
          description: The incident account cannot reply to root message 1616990032035.
        - operation: postChatMessage
          name: incidentEscalation
          branch: sent
          description: The incident account escalates INC-1042 to the on-call meeting chat; another chat needs a script.
          default: true
        - operation: postChatMessage
          name: chatPostDenied
          branch: providerRejected
          description: The incident account left the selected on-call chat.
    - company: Mixpanel
      id: mixpanel
      name: Mixpanel
      description: Import a deduplicated event and export a bounded day of raw events.
      version: v0.2.0
      languages:
        go: v0.2.0
        typescript: v0.1.0
      directory: connectors/mixpanel
      uiUnits: []
      triggers: []
      operations:
        - name: trackEvent
          kind: mutation
          description: Import one event with stable time, distinct_id, and a derived $insert_id.
          languages:
            - go
            - typescript
        - name: exportEvents
          kind: query
          description: Export a bounded date range of raw events without arbitrary properties.
          languages:
            - go
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/mixpanel/go/mixpanelmock
      mocks:
        - operation: trackEvent
          name: importedDefaultEvent
          branch: imported
          description: Meridian signup event was accepted.
          default: true
        - operation: exportEvents
          name: exportedDefaultEvents
          branch: exported
          description: Meridian signup event appears in raw export.
          default: true
    - company: monday
      id: monday
      name: monday.com
      description: List a monday.com board's items with a typed column filter, read one item, create items and set typed column values under monday.com idempotency keys, and add updates to items.
      version: v0.24.0
      languages:
        go: v0.24.0
        typescript: v0.1.0
      directory: connectors/monday
      uiUnits: []
      triggers: []
      operations:
        - name: listItems
          kind: query
          description: List one bounded page of a board's active items that match a typed column-value filter, continuing with monday.com's items_page cursor.
          languages:
            - go
            - typescript
        - name: getItem
          kind: query
          description: Read one item by ID with its group, timestamps, and the text and JSON value of every requested column.
          languages:
            - go
            - typescript
        - name: createItem
          kind: mutation
          description: Create one item on a board with typed column values. A stable Idempotency-Key and sync dispatch checkpoint fence retries; an unconfirmed sent request fails closed.
          languages:
            - go
            - typescript
        - name: updateItemColumnValues
          kind: mutation
          description: Set typed absolute values on columns of one item, so a repeated or duplicated update leaves the item unchanged; every attempt also sends the Step's Idempotency-Key.
          languages:
            - go
            - typescript
        - name: addUpdate
          kind: mutation
          description: Add one plain-text item update. A stable Idempotency-Key and sync dispatch checkpoint fence retries; an unconfirmed sent request fails closed.
          languages:
            - go
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/monday/go/mondaymock
      mocks:
        - operation: listItems
          name: completedWorkRequestPages
          branch: listed
          description: Three pages for board 1234567890 and the exact-name work request; only completed items match, with a duplicate across pages.
          default: true
        - operation: listItems
          name: notFoundFailure
          branch: notFound
          description: The board does not exist or the connection cannot see it.
        - operation: listItems
          name: providerRejectedFailure
          branch: providerRejected
          description: The requested list filter names a missing board column.
        - operation: listItems
          name: invalidResponseFailure
          branch: invalidResponse
          description: monday.com returned a malformed page of items.
        - operation: getItem
          name: createdWorkItem
          branch: found
          description: Item 5550004 created for the February work request on board 1234567890.
          default: true
        - operation: getItem
          name: notFoundFailure
          branch: notFound
          description: The item does not exist, the connection cannot see it, or it is archived or deleted and inactive items were not requested.
        - operation: getItem
          name: providerRejectedFailure
          branch: providerRejected
          description: The connection lacks permission to read this item.
        - operation: getItem
          name: invalidResponseFailure
          branch: invalidResponse
          description: monday.com returned a malformed item.
        - operation: createItem
          name: februaryWorkItem
          branch: created
          description: Create the February work request on board 1234567890 in group february as item 5550004.
          default: true
        - operation: createItem
          name: notFoundFailure
          branch: notFound
          description: The board or group does not exist or the connection cannot see it; nothing was created.
        - operation: createItem
          name: providerRejectedFailure
          branch: providerRejected
          description: The requested status label does not exist and label creation is disabled.
        - operation: updateItemColumnValues
          name: scheduledWorkItem
          branch: updated
          description: Set status and due date on item 5550004 of board 1234567890.
          default: true
        - operation: updateItemColumnValues
          name: notFoundFailure
          branch: notFound
          description: The board or item does not exist or the connection cannot see it; nothing was changed.
        - operation: updateItemColumnValues
          name: providerRejectedFailure
          branch: providerRejected
          description: The requested status label does not exist and label creation is disabled.
        - operation: updateItemColumnValues
          name: invalidResponseFailure
          branch: invalidResponse
          description: monday.com returned a malformed item, so the values may have been set; repeating the Step is safe.
        - operation: addUpdate
          name: workRequestUpdate
          branch: added
          description: Add update 3300001 to the created February work item 5550004.
          default: true
        - operation: addUpdate
          name: notFoundFailure
          branch: notFound
          description: The item does not exist or the connection cannot see it; nothing was added.
        - operation: addUpdate
          name: providerRejectedFailure
          branch: providerRejected
          description: The connection lacks permission to add an update to this item.
    - company: MySQL
      id: mysql
      name: MySQL
      description: Run one parameterized read-only query, or one transactional write statement, against a MySQL or MariaDB database.
      version: v0.23.0
      languages:
        go: v0.23.0
        typescript: v0.1.0
      directory: connectors/mysql
      uiUnits: []
      triggers: []
      operations:
        - name: query
          kind: query
          description: Run one parameterized read statement in a read-only transaction and return its bounded rows.
          languages:
            - go
            - typescript
        - name: execute
          kind: mutation
          description: Run one parameterized write statement in its own transaction and return its rows affected, last insert ID, and any bounded MariaDB RETURNING rows.
          languages:
            - go
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/mysql/go/mysqlmock
      mocks:
        - operation: query
          name: completedDefaultAnswer
          branch: completed
          description: Querying refund_ledger for order 88213 returns its recorded refund.
          default: true
        - operation: query
          name: rowLimit
          branch: truncated
          description: Querying refund_ledger for order 88213 with maxRows 1 below the result size returns a truncated row set.
        - operation: query
          name: missingTable
          branch: providerRejected
          description: Querying a missing refund_ledger table is rejected.
        - operation: execute
          name: completedDefaultAnswer
          branch: completed
          description: Inserting refund order 88213 after another Flow won the race changes no rows.
          default: true
        - operation: execute
          name: rowLimit
          branch: limitExceeded
          description: Updating more rows than maxRowsAffected rolls back the statement.
        - operation: execute
          name: duplicateKey
          branch: providerRejected
          description: Inserting a duplicate unique key is rejected before commit.
    - company: Netlify
      id: netlify
      name: Netlify
      description: Use the Netlify REST API through typed Dex connector Steps.
      version: v0.2.0
      languages:
        go: v0.2.0
        typescript: v0.1.0
      directory: connectors/netlify
      uiUnits: []
      triggers: []
      operations:
        - name: listSites
          kind: query
          description: List sites visible to the Netlify token.
          languages:
            - go
            - typescript
        - name: listDeploys
          kind: query
          description: List deploys for one Netlify site.
          languages:
            - go
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/netlify/go/netlifymock
      mocks:
        - operation: listSites
          name: listedDefault
          branch: listed
          description: A Meridian example returns a representative SitesPage.
          default: true
        - operation: listDeploys
          name: listedDefault
          branch: listed
          description: A Meridian example returns a representative DeploysPage.
          default: true
    - company: NewsAPI
      id: newsapi
      name: NewsAPI
      description: Search recent news articles from the publishers NewsAPI indexes by keyword, title or body fields, sources, domains, language, and publication window.
      version: v0.23.1
      languages:
        go: v0.23.1
        python: v0.1.0
        typescript: v0.1.1
      directory: connectors/newsapi
      uiUnits: []
      triggers: []
      operations:
        - name: searchArticles
          kind: query
          description: Search one page of articles through NewsAPI's everything endpoint by keyword, title or body fields, sources, domains, language, and publication window, newest or most relevant first.
          languages:
            - go
            - python
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/newsapi/go/newsapimock
      mocks:
        - operation: searchArticles
          name: searchedDefaultAnswer
          branch: searched
          description: Searching title matches for Meridian returns two recent articles on page one.
          default: true
        - operation: searchArticles
          name: invalidKey
          branch: providerRejected
          description: Searching with an invalid NewsAPI key is rejected.
    - company: Notion
      id: notion
      name: Notion
      description: Search Notion pages and data sources by title, query database rows with typed filters, read a page's properties and plain-text content, and create or update database rows without silent duplicates.
      version: v0.24.0
      languages:
        go: v0.24.0
        typescript: v0.1.0
      directory: connectors/notion
      uiUnits: []
      triggers: []
      operations:
        - name: search
          kind: query
          description: Search one bounded page of the pages and data sources shared with the connection by title, continuing with Notion's cursor.
          languages:
            - go
            - typescript
        - name: queryDatabase
          kind: query
          description: Query one bounded page of a database's rows through its data source with a typed filter and sorts, continuing with Notion's cursor.
          languages:
            - go
            - typescript
        - name: getPage
          kind: query
          description: Read one page's properties and a bounded plain-text rendering of its top-level blocks.
          languages:
            - go
            - typescript
        - name: createPage
          kind: mutation
          description: Create one database row with typed property values and optional plain-text body paragraphs. Sync durability persists the single-dispatch fence before sending so retries cannot duplicate an unconfirmed page.
          languages:
            - go
            - typescript
        - name: updatePageProperties
          kind: mutation
          description: Set typed property values on one page with absolute values, so a repeated or duplicated update leaves the page unchanged.
          languages:
            - go
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/notion/go/notionmock
      mocks:
        - operation: search
          name: submissionsSearch
          branch: searched
          description: 'Three search pages that fit database title Form submissions: decoys and a trashed match on page 1, the data source on page 2, and the same data source again on page 3. Script other titles.'
          default: true
        - operation: search
          name: noSharedTitle
          branch: noMatch
          description: No shared data source title contains the search text.
        - operation: search
          name: searchRejected
          branch: providerRejected
          description: Notion conclusively rejects an inaccessible search.
        - operation: queryDatabase
          name: existingSubmission
          branch: queried
          description: 'Three pages that fit submission ID sub-new-1: a trashed and an archived row on page 1, the saved row on page 2, and the same row again on page 3. Script other submission IDs.'
          default: true
        - operation: queryDatabase
          name: dataSourceMissing
          branch: notFound
          description: The data source is missing or not shared.
        - operation: queryDatabase
          name: queryRejected
          branch: providerRejected
          description: The requested property filter is not accepted.
        - operation: getPage
          name: submittedPage
          branch: found
          description: The saved submission row with properties and plain-text body.
          default: true
        - operation: getPage
          name: pageMissing
          branch: notFound
          description: The row was deleted or access was removed.
        - operation: getPage
          name: pageReadRejected
          branch: providerRejected
          description: Notion denies this page read.
        - operation: createPage
          name: createdSubmission
          branch: created
          description: A newly created submission row.
          default: true
        - operation: createPage
          name: createSourceMissing
          branch: notFound
          description: The destination data source is unavailable.
        - operation: createPage
          name: createRejected
          branch: providerRejected
          description: Notion rejects a row with an invalid property.
        - operation: updatePageProperties
          name: updatedSubmission
          branch: updated
          description: An existing submission row after absolute property replacement.
          default: true
        - operation: updatePageProperties
          name: updatePageMissing
          branch: notFound
          description: The submission row no longer exists.
        - operation: updatePageProperties
          name: updateRejected
          branch: providerRejected
          description: Notion rejects an invalid property update.
    - company: OpenAI
      id: openai
      name: OpenAI
      description: 'OpenAI Responses API stored responses: create a model response with JSON Schema structured output, streamed text and progress, token usage, and explicit uncertainty, and retrieve it by ID for recovery. Text generation Steps use the llm connector.'
      version: v0.23.0
      languages:
        go: v0.23.0
        typescript: v0.1.0
      directory: connectors/openai
      uiUnits:
        - name: modelPicker
          description: Select this Step's OpenAI model; the picker loads OpenAI's live api.openai.com model list and stores the selected model ID.
      triggers: []
      operations:
        - name: createResponse
          kind: mutation
          description: Create an ordinary or structured model response.
          languages:
            - go
            - typescript
        - name: retrieveResponse
          kind: query
          description: Retrieve a response by provider response ID.
          languages:
            - go
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/openai/go/openaimock
      mocks:
        - operation: createResponse
          name: storedSummary
          branch: completed
          description: A stored response summarizes the submitted text and reports token usage.
          default: true
        - operation: createResponse
          name: incompleteSummary
          branch: failed
          description: The stored response ended incomplete with partial text.
        - operation: createResponse
          name: createRejected
          branch: providerRejected
          description: OpenAI rejects the response request because the project lacks model access.
        - operation: retrieveResponse
          name: storedResponse
          branch: found
          description: The stored completed summary is available by response ID.
          default: true
        - operation: retrieveResponse
          name: responseNotFound
          branch: notFound
          description: No stored response has the requested ID.
        - operation: retrieveResponse
          name: retrieveRejected
          branch: providerRejected
          description: OpenAI rejects the stored response lookup.
    - company: OpenWeatherMap
      id: openweathermap
      name: OpenWeatherMap
      description: Read current weather and a five-day forecast by coordinates.
      version: v0.2.0
      languages:
        go: v0.2.0
        typescript: v0.1.0
      directory: connectors/openweathermap
      uiUnits: []
      triggers: []
      operations:
        - name: getCurrentWeather
          kind: query
          description: Read current temperature and weather conditions at geographic coordinates.
          languages:
            - go
            - typescript
        - name: getForecast
          kind: query
          description: Read forecast temperatures at three-hour intervals for geographic coordinates.
          languages:
            - go
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/openweathermap/go/openweathermapmock
      mocks:
        - operation: getCurrentWeather
          name: foundDefault
          branch: found
          description: A representative OpenWeatherMap result for the example Flow.
          default: true
        - operation: getForecast
          name: foundDefault
          branch: found
          description: A representative OpenWeatherMap result for the example Flow.
          default: true
    - company: PagerDuty
      id: pagerduty
      name: PagerDuty
      description: Read and act through the PagerDuty public API.
      version: v0.2.0
      languages:
        go: v0.2.0
        python: v0.2.0
        typescript: v0.1.0
      directory: connectors/pagerduty
      uiUnits: []
      triggers: []
      operations:
        - name: listIncidents
          kind: query
          description: ListIncidents through the PagerDuty public JSON API.
          languages:
            - go
            - python
            - typescript
        - name: getIncident
          kind: query
          description: GetIncident through the PagerDuty public JSON API.
          languages:
            - go
            - python
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/pagerduty/go/pagerdutymock
      mocks:
        - operation: listIncidents
          name: listIncidentsDefault
          branch: listed
          description: A representative PagerDuty response.
          default: true
        - operation: getIncident
          name: getIncidentDefault
          branch: found
          description: A representative PagerDuty response.
          default: true
    - company: PayPal
      id: paypal
      name: PayPal
      description: Read PayPal resources through typed Dex Query Steps.
      version: v0.2.0
      languages:
        go: v0.2.0
        typescript: v0.1.0
      directory: connectors/paypal
      uiUnits: []
      triggers: []
      operations:
        - name: getOrder
          kind: query
          description: Read one PayPal checkout order.
          languages:
            - go
            - typescript
        - name: listTransactions
          kind: query
          description: List one page of PayPal transactions in a date range.
          languages:
            - go
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/paypal/go/paypalmock
      mocks:
        - operation: getOrder
          name: defaultAnswer
          branch: found
          description: A realistic read-only getOrder response for a Meridian account.
          default: true
        - operation: listTransactions
          name: defaultAnswer
          branch: listed
          description: A realistic read-only listTransactions response for a Meridian account.
          default: true
    - company: Pinecone
      id: pinecone
      name: Pinecone
      description: Pinecone REST connector with two bounded operations.
      version: v0.2.0
      languages:
        go: v0.2.0
        typescript: v0.1.0
      directory: connectors/pinecone
      uiUnits: []
      triggers: []
      operations:
        - name: upsertVectors
          kind: mutation
          description: Upsert vector IDs by absolute replacement in one namespace.
          languages:
            - go
            - typescript
        - name: queryVectors
          kind: query
          description: Find nearest vectors in one namespace.
          languages:
            - go
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/pinecone/go/pineconemock
      mocks:
        - operation: upsertVectors
          name: defaultUpsertVectors
          branch: upserted
          description: A representative provider response for the example resource.
          default: true
        - operation: queryVectors
          name: defaultQueryVectors
          branch: queried
          description: A representative provider response for the example resource.
          default: true
    - company: Pipedrive
      id: pipedrive
      name: Pipedrive
      description: Search, list, read, create, upsert, and update Pipedrive persons, organizations, and deals, with persons upserted by email and deal stages and owners passed through as Pipedrive IDs.
      version: v0.24.0
      languages:
        go: v0.24.0
        typescript: v0.1.0
      directory: connectors/pipedrive
      uiUnits:
        - name: ownerPicker
          description: Select one active Pipedrive user, loaded from Company settings > Manage users of a Personal API token connection, as the owner the operation sets; the unit stores the user's numeric ID for owner_id, offers a numeric ID field when the list cannot load, and blank sets no owner.
        - name: dealStagePicker
          description: Select one deal pipeline and one of its stages, loaded from the Pipeline view of a Personal API token connection; the unit stores the numeric pipeline ID and stage ID for pipeline_id and stage_id, and offers numeric ID fields when the lists cannot load.
        - name: customFieldPicker
          description: Select persons, organizations, or deals and one of that object's custom fields, loaded from Company settings > Data fields of a Personal API token connection; the unit stores the object type and the field's 40-character key, offers a key field when the list cannot load, and blank writes no custom field.
      triggers: []
      operations:
        - name: searchObjects
          kind: query
          description: Search one bounded page of Pipedrive persons, organizations, or deals by a term in chosen fields, optionally as an exact match, returning partial records with IDs and a next cursor.
          languages:
            - go
            - typescript
        - name: getObject
          kind: query
          description: Read one Pipedrive person, organization, or deal by ID with every standard and custom field.
          languages:
            - go
            - typescript
        - name: listObjects
          kind: query
          description: List one bounded page of Pipedrive persons, organizations, or deals changed since a time or filtered by owner, person, organization, pipeline, stage, or deal status, with a next cursor.
          languages:
            - go
            - typescript
        - name: upsertObject
          kind: mutation
          description: Create or update one Pipedrive person identified by email, or one organization identified by name. Pipedrive has no idempotency key, so sync durability lets the shared single-dispatch fence persist a claim before a create; a later attempt searches the identity again and updates the record it finds or reports uncertain, and a missing or stale claim fails closed while identity read-back checks for a previously created record.
          languages:
            - go
            - typescript
        - name: createObject
          kind: mutation
          description: Create one Pipedrive person, organization, or deal. Pipedrive has no idempotency key, so sync durability persists the shared single-dispatch fence claim across retries; a later attempt may resend after a definite refusal or proven unsent request, read back a known ID, or report uncertain.
          languages:
            - go
            - typescript
        - name: updateObject
          kind: mutation
          description: Set named standard or custom fields on one Pipedrive person, organization, or deal by ID, such as a deal's stage or owner; a repeated update writes the same values again.
          languages:
            - go
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/pipedrive/go/pipedrivemock
      mocks:
        - operation: searchObjects
          name: searchedDefaultAnswer
          branch: searched
          description: A deals search beginning without a cursor returns deal 301, then 302 and a duplicate 301 across three pages.
          default: true
        - operation: searchObjects
          name: providerRejectedFailure
          branch: providerRejected
          description: A read without permission receives HTTP 403.
        - operation: searchObjects
          name: invalidResponseFailure
          branch: invalidResponse
          description: A successful read returns malformed JSON for the requested record or page.
        - operation: getObject
          name: foundDefaultAnswer
          branch: found
          description: Reading deal 301 returns the Acme renewal record.
          default: true
        - operation: getObject
          name: notFoundFailure
          branch: notFound
          description: Reading an unknown record ID receives HTTP 404.
        - operation: getObject
          name: providerRejectedFailure
          branch: providerRejected
          description: A read without permission receives HTTP 403.
        - operation: getObject
          name: invalidResponseFailure
          branch: invalidResponse
          description: A successful read returns malformed JSON for the requested record or page.
        - operation: listObjects
          name: listedDefaultAnswer
          branch: listed
          description: A deals list beginning without a cursor returns deal 301, then 302 and a duplicate 301 across three pages.
          default: true
        - operation: listObjects
          name: providerRejectedFailure
          branch: providerRejected
          description: A read without permission receives HTTP 403.
        - operation: listObjects
          name: invalidResponseFailure
          branch: invalidResponse
          description: A successful read returns malformed JSON for the requested record or page.
        - operation: upsertObject
          name: upsertedDefaultAnswer
          branch: upserted
          description: Upserting person jane@acme.example.com returns the existing person 101.
          default: true
        - operation: upsertObject
          name: multipleMatchesFailure
          branch: multipleMatches
          description: A person email search finds two exact matches and no write is sent.
        - operation: upsertObject
          name: providerRejectedFailure
          branch: providerRejected
          description: A write with an invalid field value receives HTTP 400.
        - operation: upsertObject
          name: invalidResponseFailure
          branch: invalidResponse
          description: A successful identity search returns malformed JSON.
        - operation: createObject
          name: createdDefaultAnswer
          branch: created
          description: Creating the Acme renewal deal returns deal 301 linked to person 101 and organization 201.
          default: true
        - operation: createObject
          name: providerRejectedFailure
          branch: providerRejected
          description: A write with an invalid field value receives HTTP 400.
        - operation: updateObject
          name: updatedDefaultAnswer
          branch: updated
          description: Updating deal 301 to stage 3 returns that same Acme renewal deal.
          default: true
        - operation: updateObject
          name: notFoundFailure
          branch: notFound
          description: Updating an unknown record ID receives HTTP 404.
        - operation: updateObject
          name: providerRejectedFailure
          branch: providerRejected
          description: A write with an invalid field value receives HTTP 400.
        - operation: updateObject
          name: invalidResponseFailure
          branch: invalidResponse
          description: A successful update returns malformed JSON.
    - company: PostgreSQL
      id: postgresql
      name: PostgreSQL
      description: Run one parameterized read-only query, or one transactional write statement, against a PostgreSQL database.
      version: v0.23.0
      languages:
        go: v0.23.0
        typescript: v0.1.0
      directory: connectors/postgresql
      uiUnits: []
      triggers: []
      operations:
        - name: query
          kind: query
          description: Run one parameterized statement in a read-only transaction and return its bounded rows.
          languages:
            - go
            - typescript
        - name: execute
          kind: mutation
          description: Run one parameterized write statement in its own transaction and return its rows affected and bounded RETURNING rows.
          languages:
            - go
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/postgresql/go/postgresqlmock
      mocks:
        - operation: query
          name: noRecordedRefund
          branch: completed
          description: The order-88213 refund lookup finds no ledger row, allowing the example to insert it.
          default: true
        - operation: query
          name: truncatedLookup
          branch: truncated
          description: The six-column refund lookup exceeds maxRows and returns only the first row.
        - operation: query
          name: missingLedgerTable
          branch: providerRejected
          description: A refund lookup against a missing refund_ledger table receives SQLSTATE 42P01.
        - operation: execute
          name: recordedRefund
          branch: completed
          description: The idempotent INSERT for order-88213 commits one $250.00 refund with ticket SUP-88213.
          default: true
        - operation: execute
          name: affectedRowLimit
          branch: limitExceeded
          description: An UPDATE affecting two rows with maxRowsAffected 1 rolls back.
        - operation: execute
          name: duplicateOrder
          branch: providerRejected
          description: An INSERT for an already refunded order receives SQLSTATE 23505 before commit.
    - company: Postmark
      id: postmark
      name: Postmark
      description: Read and act through the Postmark public API.
      version: v0.2.0
      languages:
        go: v0.2.0
        python: v0.2.0
        typescript: v0.1.0
      directory: connectors/postmark
      uiUnits: []
      triggers: []
      operations:
        - name: listOutboundMessages
          kind: query
          description: ListOutboundMessages through the Postmark public JSON API.
          languages:
            - go
            - python
            - typescript
        - name: getMessageDetails
          kind: query
          description: GetMessageDetails through the Postmark public JSON API.
          languages:
            - go
            - python
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/postmark/go/postmarkmock
      mocks:
        - operation: listOutboundMessages
          name: listOutboundMessagesDefault
          branch: listed
          description: A representative Postmark response.
          default: true
        - operation: getMessageDetails
          name: getMessageDetailsDefault
          branch: found
          description: A representative Postmark response.
          default: true
    - company: Re:amaze
      id: reamaze
      name: Re:amaze
      description: Search, read, create, and update Re:amaze conversations, add public replies or internal notes, and find contacts by email, keeping Re:amaze's own integer statuses.
      version: v0.23.0
      languages:
        go: v0.23.0
        typescript: v0.1.0
      directory: connectors/reamaze
      uiUnits: []
      triggers: []
      operations:
        - name: searchConversations
          kind: query
          description: List one page of up to 30 conversations of the brand, filtered by Re:amaze view, requester email, tags, channel, and latest customer message time, with the next page number.
          languages:
            - go
            - typescript
        - name: getConversation
          kind: query
          description: Read one conversation by its slug with its first message and a bounded list of its newest messages and internal notes.
          languages:
            - go
            - typescript
        - name: createConversation
          kind: mutation
          description: Create one conversation on behalf of a customer in one channel. Re:amaze has no idempotency key, so the Step runs with sync durability, resends only after a confirmed 429, 503, or provably unsent request, and reconciles an unconfirmed attempt by finding the conversation whose data attribute holds the Step's key. A shared single-dispatch fence requires sync durability so retry attempts see its heartbeat checkpoint and do not resend a possibly accepted write.
          languages:
            - go
            - typescript
        - name: updateConversation
          kind: mutation
          description: Set the Re:amaze status or assignee of one conversation and add or remove tags; a repeated attempt finds the values already applied and writes nothing.
          languages:
            - go
            - typescript
        - name: replyToConversation
          kind: mutation
          description: Add one public reply, which Re:amaze sends to the customer, or one internal note to a conversation. The message carries an origin_id derived from the Step, the Step runs with sync durability, and an unconfirmed attempt is reconciled by finding that origin_id instead of sending again. A shared single-dispatch fence requires sync durability so retry attempts see its heartbeat checkpoint and do not resend a possibly accepted write.
          languages:
            - go
            - typescript
        - name: findContactByEmail
          kind: query
          description: Find the Re:amaze contacts whose email equals one address, from the first page of Re:amaze's name-or-email contact search; contacts belong to the account, not one brand.
          languages:
            - go
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/reamaze/go/reamazemock
      mocks:
        - operation: searchConversations
          name: searchedDefaultAnswer
          branch: searched
          description: A search for requesterEmail jane@acme.example.com and tag billing-double-charge spans three pages; resolved, wrong-tag, and wrong-requester conversations are decoys.
          default: true
        - operation: searchConversations
          name: providerRejectedFailure
          branch: providerRejected
          description: For requesterEmail jane@acme.example.com, a revoked API token returns HTTP 401.
        - operation: searchConversations
          name: invalidResponseFailure
          branch: invalidResponse
          description: For requesterEmail jane@acme.example.com, Re:amaze returns a malformed conversation page.
        - operation: getConversation
          name: foundDefaultAnswer
          branch: found
          description: Reading the billing conversation returns Jane’s opening message.
          default: true
        - operation: getConversation
          name: notFoundFailure
          branch: notFound
          description: For conversationId missing-conversation, Re:amaze returns HTTP 404.
        - operation: getConversation
          name: providerRejectedFailure
          branch: providerRejected
          description: For conversationId double-charge, a revoked API token returns HTTP 401.
        - operation: getConversation
          name: invalidResponseFailure
          branch: invalidResponse
          description: For conversationId double-charge, Re:amaze returns a malformed conversation object.
        - operation: createConversation
          name: createdDefaultAnswer
          branch: created
          description: Creating Jane’s billing issue returns the new support conversation.
          default: true
        - operation: createConversation
          name: providerRejectedFailure
          branch: providerRejected
          description: For channel retired-channel, Re:amaze rejects the create with HTTP 422.
        - operation: updateConversation
          name: updatedDefaultAnswer
          branch: updated
          description: Setting the billing conversation status and tags returns that conversation.
          default: true
        - operation: updateConversation
          name: notFoundFailure
          branch: notFound
          description: For conversationId missing-conversation, Re:amaze returns HTTP 404.
        - operation: updateConversation
          name: providerRejectedFailure
          branch: providerRejected
          description: Re:amaze rejects an unknown assignee with HTTP 422.
        - operation: updateConversation
          name: invalidResponseFailure
          branch: invalidResponse
          description: For conversationId double-charge, Re:amaze returns a malformed updated conversation.
        - operation: replyToConversation
          name: repliedDefaultAnswer
          branch: replied
          description: Adding an internal triage note returns the note in Jane’s billing conversation.
          default: true
        - operation: replyToConversation
          name: notFoundFailure
          branch: notFound
          description: For conversationId missing-conversation, Re:amaze returns HTTP 404 and adds no message.
        - operation: replyToConversation
          name: providerRejectedFailure
          branch: providerRejected
          description: For conversationId double-charge and text Note., a revoked API token returns HTTP 401.
        - operation: findContactByEmail
          name: foundDefaultAnswer
          branch: found
          description: Finding Jane’s email returns her account contact.
          default: true
        - operation: findContactByEmail
          name: notFoundNoMatch
          branch: notFound
          description: For email missing@acme.example.com, no exact contact matches on the first search page.
        - operation: findContactByEmail
          name: providerRejectedFailure
          branch: providerRejected
          description: For email jane@acme.example.com, a revoked API token returns HTTP 401.
        - operation: findContactByEmail
          name: invalidResponseFailure
          branch: invalidResponse
          description: For email jane@acme.example.com, Re:amaze returns a malformed contact search page.
    - company: Resend
      id: resend
      name: Resend
      description: Read and act through the Resend public API.
      version: v0.2.0
      languages:
        go: v0.2.0
        python: v0.1.0
        typescript: v0.1.0
      directory: connectors/resend
      uiUnits: []
      triggers: []
      operations:
        - name: sendEmail
          kind: mutation
          description: SendEmail through the Resend public JSON API.
          languages:
            - go
            - python
            - typescript
        - name: getEmail
          kind: query
          description: GetEmail through the Resend public JSON API.
          languages:
            - go
            - python
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/resend/go/resendmock
      mocks:
        - operation: sendEmail
          name: sendEmailDefault
          branch: sent
          description: A representative Resend response.
          default: true
        - operation: getEmail
          name: getEmailDefault
          branch: found
          description: A representative Resend response.
          default: true
    - company: Salesforce
      id: salesforce
      name: Salesforce
      description: Query Salesforce CRM records with typed SOQL bind values, read one record, create or update a record by external ID without duplicates on retry, and update a record by ID.
      version: v0.24.0
      languages:
        go: v0.24.0
        typescript: v0.1.0
      directory: connectors/salesforce
      uiUnits:
        - name: sObjectPicker
          description: Choose a standard Salesforce CRM object from the list, or enter the API name of a custom object such as Invoice__c from Setup > Object Manager > the object > API Name; the unit stores the object API name, and blank leaves the object to the Flow.
        - name: fieldNameInput
          description: Enter the API name of one field, such as Email or ERP_Id__c, from Setup > Object Manager > the object > Fields & Relationships > Field Name column; the unit validates and stores the API name, and blank leaves the field to the Flow.
      triggers: []
      operations:
        - name: queryRecords
          kind: query
          description: Run one SOQL statement whose values are typed, escaped bind values, returning one bounded page of records and the nextRecordsUrl cursor for the next page.
          languages:
            - go
            - typescript
        - name: getRecord
          kind: query
          description: Read the chosen fields of one record by sObject type and record ID.
          languages:
            - go
            - typescript
        - name: upsertRecordByExternalId
          kind: mutation
          description: Create or update one record keyed by an External ID field value, so a retried Step updates the record an earlier attempt created instead of creating a duplicate.
          languages:
            - go
            - typescript
        - name: updateRecord
          kind: mutation
          description: Update the named fields of one record by sObject type and record ID, leaving every other field unchanged.
          languages:
            - go
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/salesforce/go/salesforcemock
      mocks:
        - operation: queryRecords
          name: allContactsByCreatedDate
          branch: found
          description: A Contact query without LIMIT ordered by CreatedDate returns 401 contacts in 200, 200, and 1-record pages at the default batch size.
          default: true
        - operation: queryRecords
          name: noContactMatches
          branch: notFound
          description: A Contact query for an unknown email returns no records and no next cursor.
        - operation: queryRecords
          name: malformedSOQL
          branch: queryRejected
          description: A SOQL query with an unknown field receives INVALID_FIELD.
        - operation: queryRecords
          name: apiDisabled
          branch: providerRejected
          description: A query from a user whose org disables API access receives API_DISABLED_FOR_ORG.
        - operation: getRecord
          name: linkedPriyaContact
          branch: found
          description: Reading Contact 003RM000001AbcdYAC after linking returns ERP-88213 and title CTO.
          default: true
        - operation: getRecord
          name: missingContact
          branch: notFound
          description: Reading a deleted Contact ID receives HTTP 404.
        - operation: getRecord
          name: unreadableField
          branch: providerRejected
          description: Reading a Contact with field Bogus__c receives INVALID_FIELD.
        - operation: upsertRecordByExternalId
          name: linkedPriyaUpsert
          branch: upserted
          description: Upserting ERP-88213 updates the already-linked Contact 003RM000001AbcdYAC.
          default: true
        - operation: upsertRecordByExternalId
          name: duplicateExternalID
          branch: multipleMatches
          description: Upserting ERP-DUP shared by two Contacts receives HTTP 300 and changes neither.
        - operation: upsertRecordByExternalId
          name: missingRequiredField
          branch: recordRejected
          description: Creating a Contact without LastName receives REQUIRED_FIELD_MISSING.
        - operation: upsertRecordByExternalId
          name: createAccessDenied
          branch: providerRejected
          description: Upserting a Contact without create permission receives INSUFFICIENT_ACCESS.
        - operation: updateRecord
          name: linkedPriyaUpdate
          branch: updated
          description: Updating Contact 003RM000001AbcdYAC links ERP-88213 and sets title CTO.
          default: true
        - operation: updateRecord
          name: missingContact
          branch: notFound
          description: Updating a deleted Contact ID receives HTTP 404.
        - operation: updateRecord
          name: invalidTitle
          branch: recordRejected
          description: Updating Title with a value rejected by a validation rule selects recordRejected.
        - operation: updateRecord
          name: editAccessDenied
          branch: providerRejected
          description: Updating Contact without edit permission receives INSUFFICIENT_ACCESS.
    - company: SendGrid
      id: sendgrid
      name: SendGrid
      description: Read SendGrid global statistics and transactional templates.
      version: v0.2.0
      languages:
        go: v0.2.0
        typescript: v0.1.0
      directory: connectors/sendgrid
      uiUnits: []
      triggers: []
      operations:
        - name: getStats
          kind: query
          description: Read daily email request and delivery counts across the account.
          languages:
            - go
            - typescript
        - name: listTemplates
          kind: query
          description: List a bounded page of dynamic or legacy transactional email templates.
          languages:
            - go
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/sendgrid/go/sendgridmock
      mocks:
        - operation: getStats
          name: foundDefault
          branch: found
          description: A representative SendGrid result for the example Flow.
          default: true
        - operation: listTemplates
          name: listedDefault
          branch: listed
          description: A representative SendGrid result for the example Flow.
          default: true
    - company: Sentry
      id: sentry
      name: Sentry
      description: Read and act through the Sentry public API.
      version: v0.2.0
      languages:
        go: v0.2.0
        typescript: v0.1.0
      directory: connectors/sentry
      uiUnits: []
      triggers: []
      operations:
        - name: listIssues
          kind: query
          description: ListIssues through the Sentry public JSON API.
          languages:
            - go
            - typescript
        - name: getIssue
          kind: query
          description: GetIssue through the Sentry public JSON API.
          languages:
            - go
            - typescript
        - name: updateIssueStatus
          kind: mutation
          description: UpdateIssueStatus through the Sentry public JSON API.
          languages:
            - go
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/sentry/go/sentrymock
      mocks:
        - operation: listIssues
          name: listIssuesDefault
          branch: listed
          description: A representative Sentry response.
          default: true
        - operation: getIssue
          name: getIssueDefault
          branch: found
          description: A representative Sentry response.
          default: true
        - operation: updateIssueStatus
          name: updateIssueStatusDefault
          branch: updated
          description: A representative Sentry response.
          default: true
    - company: Shopify
      id: shopify
      name: Shopify
      description: Read Shopify resources through typed Dex Query Steps.
      version: v0.2.0
      languages:
        go: v0.2.0
        typescript: v0.1.0
      directory: connectors/shopify
      uiUnits: []
      triggers: []
      operations:
        - name: getOrder
          kind: query
          description: Read one Shopify order.
          languages:
            - go
            - typescript
        - name: listOrders
          kind: query
          description: List one page of Shopify orders across all order statuses, subject to Shopify's order history access.
          languages:
            - go
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/shopify/go/shopifymock
      mocks:
        - operation: getOrder
          name: defaultAnswer
          branch: found
          description: A realistic read-only getOrder response for a Meridian account.
          default: true
        - operation: listOrders
          name: defaultAnswer
          branch: listed
          description: A realistic read-only listOrders response for a Meridian account.
          default: true
    - company: Slack
      id: slack
      name: Slack
      description: Start and update Dex Flows from Slack threads and exchange thread messages.
      version: v1.3.0
      languages:
        go: v1.3.0
        typescript: v0.1.0
      directory: connectors/slack
      uiUnits:
        - name: channelPicker
          description: Select one joined public or private channel loaded from the authorized workspace; the unit stores the stable Slack channel ID automatically.
        - name: memberPicker
          description: Select one or more active workspace members loaded from Slack; the unit stores stable Slack member IDs automatically.
        - name: textInput
          description: Enter the literal message to post, or plain text an incoming Slack message must contain, depending on the operation or Trigger label.
      triggers:
        - name: channelThreadCreated
          description: Receive a matching top-level channel message.
          languages:
            - go
        - name: threadReplyCreated
          description: Receive a matching thread reply.
          languages:
            - go
      operations:
        - name: listThreadMessages
          kind: query
          description: Read one bounded page of messages from a channel thread.
          languages:
            - go
            - typescript
        - name: getThreadReply
          kind: query
          description: Read one reply from a channel thread by timestamp.
          languages:
            - go
            - typescript
        - name: postChannelMessage
          kind: mutation
          description: Post one top-level message to a Slack channel. Synchronous durability preserves the shared single-dispatch fence after retry or Worker loss.
          languages:
            - go
            - typescript
        - name: postThreadReply
          kind: mutation
          description: Post one reply to an existing Slack channel thread. Synchronous durability preserves the shared single-dispatch fence after retry or Worker loss.
          languages:
            - go
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/slack/go/slackmock
      mocks:
        - operation: listThreadMessages
          name: approvalThread
          branch: read
          description: Three pages of a channel thread with a repeated reply across page boundaries.
          default: true
        - operation: listThreadMessages
          name: readRejected
          branch: providerRejected
          description: Slack rejects the thread read because the app is not in the private channel.
        - operation: listThreadMessages
          name: malformedThread
          branch: invalidResponse
          description: Slack returns an invalid thread response.
        - operation: listThreadMessages
          name: missingThreadTimestamp
          branch: defect
          description: The thread timestamp is missing, so no request is sent.
        - operation: getThreadReply
          name: approvalReply
          branch: found
          description: A human approval reply in an existing channel thread.
          default: true
        - operation: getThreadReply
          name: replyMissing
          branch: notFound
          description: The requested reply was deleted or never existed.
        - operation: getThreadReply
          name: replyRejected
          branch: providerRejected
          description: Slack rejects the reply read because the app lacks channel access.
        - operation: getThreadReply
          name: malformedReply
          branch: invalidResponse
          description: Slack returns an invalid reply response.
        - operation: getThreadReply
          name: missingReplyTimestamp
          branch: defect
          description: The reply timestamp is missing, so no request is sent.
        - operation: postChannelMessage
          name: messageSent
          branch: sent
          description: Slack accepts a new top-level channel message.
          default: true
        - operation: postChannelMessage
          name: channelRejected
          branch: providerRejected
          description: Slack rejects the post because the bot cannot write to the channel.
        - operation: postChannelMessage
          name: postOutcomeUnknown
          branch: uncertain
          description: The connection closes after dispatch, so Slack acceptance cannot be confirmed.
        - operation: postChannelMessage
          name: missingMessageText
          branch: defect
          description: The message text is empty, so no request is sent.
        - operation: postThreadReply
          name: replySent
          branch: sent
          description: Slack accepts a reply in the existing channel thread.
          default: true
        - operation: postThreadReply
          name: threadRejected
          branch: providerRejected
          description: Slack rejects the reply because the thread is unavailable.
        - operation: postThreadReply
          name: replyOutcomeUnknown
          branch: uncertain
          description: The connection closes after dispatch, so Slack acceptance cannot be confirmed.
        - operation: postThreadReply
          name: missingReplyText
          branch: defect
          description: The reply text is empty, so no request is sent.
    - company: Smartsheet
      id: smartsheet
      name: Smartsheet
      description: Read Smartsheet records with a connection-owned API key.
      version: v0.2.0
      languages:
        go: v0.2.0
        typescript: v0.1.0
      directory: connectors/smartsheet
      uiUnits: []
      triggers: []
      operations:
        - name: listSheets
          kind: query
          description: Read Smartsheet data from the documented listSheets endpoint.
          languages:
            - go
            - typescript
        - name: getSheet
          kind: query
          description: Read Smartsheet data from the documented getSheet endpoint.
          languages:
            - go
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/smartsheet/go/smartsheetmock
      mocks:
        - operation: listSheets
          name: defaultAnswer
          branch: listed
          description: One Meridian sample record from the same example world.
          default: true
        - operation: listSheets
          name: invalidKey
          branch: providerRejected
          description: The connection token is invalid.
        - operation: getSheet
          name: defaultAnswer
          branch: found
          description: One Meridian sample record from the same example world.
          default: true
        - operation: getSheet
          name: invalidKey
          branch: providerRejected
          description: The connection token is invalid.
    - company: Snowflake
      id: snowflake
      name: Snowflake
      description: Submit one parameterized SQL statement to a Snowflake warehouse through the SQL API, read its status and result partitions, and cancel it.
      version: v0.23.0
      languages:
        go: v0.23.0
        typescript: v0.1.0
      directory: connectors/snowflake
      uiUnits: []
      triggers: []
      operations:
        - name: submitStatement
          kind: mutation
          description: Submit one parameterized SQL statement for asynchronous execution and return its statement handle without waiting for it to finish.
          languages:
            - go
            - typescript
        - name: getStatementResult
          kind: query
          description: Read a submitted statement's status and, once it finished, its column metadata and the bounded rows of one result partition.
          languages:
            - go
            - typescript
        - name: cancelStatement
          kind: mutation
          description: Ask Snowflake to cancel a submitted statement that is still queued or running.
          languages:
            - go
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/snowflake/go/snowflakemock
      mocks:
        - operation: submitStatement
          name: acceptedAccountUsageQuery
          branch: submitted
          description: The account-usage SELECT for acct_003 since 2026-01-01 is accepted and assigned one handle.
          default: true
        - operation: submitStatement
          name: invalidSQL
          branch: providerRejected
          description: A SELECT with an unknown column receives a Snowflake SQL compilation error.
        - operation: getStatementResult
          name: completedAccountUsageQuery
          branch: completed
          description: Reading partition zero of the acct_003 usage query returns one aggregate row.
          default: true
        - operation: getStatementResult
          name: queryStillRunning
          branch: running
          description: A status read of the submitted account-usage query receives HTTP 202 while it runs.
        - operation: getStatementResult
          name: oversizedPartition
          branch: truncated
          description: A result partition exceeding maxRows returns only its first row.
        - operation: getStatementResult
          name: failedStatement
          branch: providerRejected
          description: Reading a statement that failed with SQLSTATE 22018 selects providerRejected.
        - operation: cancelStatement
          name: canceledAccountUsageQuery
          branch: canceled
          description: Canceling the still-running acct_003 usage query accepts its statement handle.
          default: true
        - operation: cancelStatement
          name: unknownStatementHandle
          branch: providerRejected
          description: Canceling an unknown UUID-shaped statement handle receives Snowflake code 000709.
    - company: Spotify
      id: spotify
      name: Spotify
      description: List bounded pages of tracks from playlists owned by or shared with the authenticated Spotify user.
      version: v0.24.0
      languages:
        go: v0.24.0
        typescript: v0.1.0
      directory: connectors/spotify
      uiUnits: []
      triggers: []
      operations:
        - name: listPlaylistTracks
          kind: query
          description: List one bounded page of tracks from a playlist owned by or shared with the authenticated Spotify user.
          languages:
            - go
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/spotify/go/spotifymock
      mocks:
        - operation: listPlaylistTracks
          name: oneAvailableTrack
          branch: listed
          description: Playlist 3cEYpjA9oz9GiPac4AsH4n has five items across three offset pages; each page includes one available track and the first two skip an unavailable item.
          default: true
        - operation: listPlaylistTracks
          name: revokedGrant
          branch: authorizationRevoked
          description: A playlist read with a revoked OAuth grant receives HTTP 401.
        - operation: listPlaylistTracks
          name: inaccessiblePlaylist
          branch: accessDenied
          description: A request for a private playlist unavailable to this user receives HTTP 403.
        - operation: listPlaylistTracks
          name: missingPlaylist
          branch: notFound
          description: A request for a deleted playlist receives HTTP 404.
        - operation: listPlaylistTracks
          name: invalidPlaylistRequest
          branch: providerRejected
          description: A playlist query with market ZZ, valid in local two-letter syntax but rejected by Spotify with HTTP 400, selects providerRejected.
    - company: Square
      id: square
      name: Square
      description: Read Square resources through typed Dex Query Steps.
      version: v0.2.0
      languages:
        go: v0.2.0
        typescript: v0.1.0
      directory: connectors/square
      uiUnits: []
      triggers: []
      operations:
        - name: listPayments
          kind: query
          description: List one page of Square payments.
          languages:
            - go
            - typescript
        - name: getPayment
          kind: query
          description: Read one Square payment.
          languages:
            - go
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/square/go/squaremock
      mocks:
        - operation: listPayments
          name: defaultAnswer
          branch: listed
          description: A realistic read-only listPayments response for a Meridian account.
          default: true
        - operation: getPayment
          name: defaultAnswer
          branch: found
          description: A realistic read-only getPayment response for a Meridian account.
          default: true
    - company: Stripe
      id: stripe
      name: Stripe
      description: Create and reconcile hosted card or ACH Checkout Sessions, read PaymentIntents, refund payments, and receive signed Checkout Session events.
      version: v0.25.1
      languages:
        go: v0.25.1
        python: v0.1.0
        typescript: v0.1.1
      directory: connectors/stripe
      uiUnits: []
      triggers:
        - name: checkoutSessionUpdated
          description: Receive a verified Checkout Session completion, delayed-payment, or expiration event.
          languages:
            - go
      operations:
        - name: createCardCheckoutSession
          kind: mutation
          description: Create one Stripe-hosted Checkout Session for a card payment; keep any overridden retry window at most 23 hours, below the 24 hours that Stripe keeps idempotency keys.
          languages:
            - go
            - python
            - typescript
        - name: createACHCheckoutSession
          kind: mutation
          description: Create one Stripe-hosted Checkout Session for a US bank account payment; keep any overridden retry window at most 23 hours, below the 24 hours that Stripe keeps idempotency keys.
          languages:
            - go
            - python
            - typescript
        - name: getCheckoutSession
          kind: query
          description: Retrieve one Checkout Session by Stripe ID.
          languages:
            - go
            - python
            - typescript
        - name: getPaymentIntent
          kind: query
          description: Retrieve one PaymentIntent with its refunded amount and customer email.
          languages:
            - go
            - python
            - typescript
        - name: createRefund
          kind: mutation
          description: Refund part or all of one PaymentIntent in minor currency units; keep any overridden retry window at most 23 hours, below the 24 hours that Stripe keeps idempotency keys.
          languages:
            - go
            - python
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/stripe/go/stripemock
      mocks:
        - operation: createCardCheckoutSession
          name: createdCardSession
          branch: created
          description: Stripe created an open hosted card Checkout Session.
          default: true
        - operation: createCardCheckoutSession
          name: invalidCardRequest
          branch: providerRejected
          description: Stripe rejected the card Checkout Session parameters.
        - operation: createCardCheckoutSession
          name: unconfirmedCardSession
          branch: uncertain
          description: Stripe cached a 500 for the card request and the created Session cannot be confirmed.
        - operation: createCardCheckoutSession
          name: malformedCardSession
          branch: invalidResponse
          description: Stripe returned a body that is not a Checkout Session.
        - operation: createCardCheckoutSession
          name: invalidCardCurrency
          branch: defect
          description: The currency is not a lowercase three-letter code.
        - operation: createACHCheckoutSession
          name: createdSession
          branch: created
          description: Stripe created an open hosted Checkout Session.
          default: true
        - operation: createACHCheckoutSession
          name: invalidRequest
          branch: providerRejected
          description: Stripe rejected the Checkout Session parameters.
        - operation: createACHCheckoutSession
          name: unconfirmedSession
          branch: uncertain
          description: Stripe cached a 500 for the bank payment request and the created Session cannot be confirmed.
        - operation: createACHCheckoutSession
          name: malformedSession
          branch: invalidResponse
          description: Stripe returned a body that is not a Checkout Session.
        - operation: createACHCheckoutSession
          name: invalidCurrency
          branch: defect
          description: The currency is not a lowercase three-letter code.
        - operation: getCheckoutSession
          name: paidSession
          branch: found
          description: A completed Checkout Session whose payment is paid.
          default: true
        - operation: getCheckoutSession
          name: missingSession
          branch: notFound
          description: Stripe reports no such Checkout Session.
        - operation: getCheckoutSession
          name: unauthorizedKey
          branch: providerRejected
          description: Stripe rejected the API key.
        - operation: getCheckoutSession
          name: malformedSession
          branch: invalidResponse
          description: Stripe returned a body that is not a Checkout Session.
        - operation: getCheckoutSession
          name: invalidSessionID
          branch: defect
          description: The Checkout Session ID is empty or not a cs_ identifier.
        - operation: getPaymentIntent
          name: partiallyRefundedPayment
          branch: found
          description: A succeeded PaymentIntent with part of its amount already refunded.
          default: true
        - operation: getPaymentIntent
          name: missingPaymentIntent
          branch: notFound
          description: Stripe reports no such PaymentIntent.
        - operation: getPaymentIntent
          name: unauthorizedKey
          branch: providerRejected
          description: Stripe rejected the API key.
        - operation: getPaymentIntent
          name: malformedPaymentIntent
          branch: invalidResponse
          description: Stripe returned a body that is not a PaymentIntent.
        - operation: getPaymentIntent
          name: invalidPaymentIntentID
          branch: defect
          description: The PaymentIntent ID is empty or not a pi_ identifier.
        - operation: createRefund
          name: succeededRefund
          branch: refunded
          description: Stripe created a refund that has already succeeded.
          default: true
        - operation: createRefund
          name: alreadyRefunded
          branch: providerRejected
          description: Stripe rejected the refund because the charge is already fully refunded.
        - operation: createRefund
          name: unconfirmedRefund
          branch: uncertain
          description: Stripe cached a 500 and bounded refund read-back found no matching call ID.
        - operation: createRefund
          name: malformedRefund
          branch: invalidResponse
          description: Stripe returned a body that is not a refund.
        - operation: createRefund
          name: invalidAmount
          branch: defect
          description: The refund amount is not positive.
    - company: Supabase
      id: supabase
      name: Supabase
      description: Supabase REST connector with two bounded operations.
      version: v0.2.0
      languages:
        go: v0.2.0
        typescript: v0.1.0
      directory: connectors/supabase
      uiUnits: []
      triggers: []
      operations:
        - name: selectRows
          kind: query
          description: Select a bounded page of table rows through PostgREST.
          languages:
            - go
            - typescript
        - name: upsertRows
          kind: mutation
          description: Upsert rows with a declared unique conflict key and merge duplicates.
          languages:
            - go
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/supabase/go/supabasemock
      mocks:
        - operation: selectRows
          name: defaultSelectRows
          branch: selected
          description: A representative provider response for the example resource.
          default: true
        - operation: upsertRows
          name: defaultUpsertRows
          branch: upserted
          description: A representative provider response for the example resource.
          default: true
    - company: Super Durable
      id: email
      name: Email (IMAP and SMTP)
      description: Search, read, flag, and move messages in any IMAP mailbox and send new messages or threaded replies over SMTP, for mail providers other than Gmail and Microsoft 365.
      version: v0.23.0
      languages:
        go: v0.23.0
        typescript: v0.1.0
      directory: connectors/superdurable/email
      uiUnits: []
      triggers: []
      operations:
        - name: searchMessages
          kind: query
          description: Search one mailbox with IMAP SEARCH by sender, recipient, subject, date, and unseen state, returning a bounded newest-first list of message summaries with UIDs and Message-IDs.
          languages:
            - go
            - typescript
        - name: getMessage
          kind: query
          description: Read one message by mailbox, UIDVALIDITY, and UID without marking it seen, returning its headers, a bounded plain-text body, and attachment names and sizes without their content.
          languages:
            - go
            - typescript
        - name: sendMessage
          kind: mutation
          description: Send one plain-text message over SMTP with a Message-ID derived from the Step's idempotency key. SMTP has no idempotency, so the Step runs with sync durability and submits at most once per Step execution.
          languages:
            - go
            - typescript
        - name: replyToMessage
          kind: mutation
          description: Reply to one IMAP message over SMTP with In-Reply-To, References, and a Re subject so mail clients thread it, submitting at most once per Step execution like sendMessage.
          languages:
            - go
            - typescript
        - name: moveMessage
          kind: mutation
          description: Move one message to another mailbox with IMAP MOVE; a repeated attempt that finds the message already moved reports it moved instead of failing.
          languages:
            - go
            - typescript
        - name: setFlags
          kind: mutation
          description: Set or clear the seen, flagged, and answered flags of one message to absolute values, so a repeated attempt changes nothing twice.
          languages:
            - go
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/superdurable/email/go/emailmock
      mocks:
        - operation: searchMessages
          name: customerInboxPages
          branch: searched
          description: Searching INBOX for jane@acme.example.com yields three newest-first pages with a lookalike sender before Jane's refund request.
          default: true
        - operation: searchMessages
          name: rejectedIMAPLogin
          branch: providerRejected
          description: Searching INBOX with a wrong app password receives an IMAP authentication rejection.
        - operation: getMessage
          name: customerRefundRequest
          branch: found
          description: Reading INBOX UID 100 returns Jane's refund request and plain-text body without marking it seen.
          default: true
        - operation: getMessage
          name: missingUID
          branch: notFound
          description: Reading an INBOX UID removed by another mail client selects notFound.
        - operation: getMessage
          name: rejectedReadLogin
          branch: providerRejected
          description: Reading INBOX UID 100 with a wrong app password receives an IMAP login rejection.
        - operation: sendMessage
          name: newCustomerMessage
          branch: sent
          description: A new message to jane@acme.example.com about order 88213 is accepted by SMTP.
          default: true
        - operation: sendMessage
          name: recipientRejected
          branch: providerRejected
          description: SMTP refuses a new message to a blocked recipient before accepting the message.
        - operation: replyToMessage
          name: threadedRefundReply
          branch: sent
          description: Replying to INBOX UID 100 sends one threaded refund answer to Jane.
          default: true
        - operation: replyToMessage
          name: missingSourceMessage
          branch: notFound
          description: Replying to a source UID deleted from INBOX selects notFound before SMTP.
        - operation: replyToMessage
          name: rejectedReplyRecipient
          branch: providerRejected
          description: SMTP refuses the reply to a blocked address before accepting it.
        - operation: replyToMessage
          name: missingReplyAddress
          branch: invalidResponse
          description: Replying to a source message with no usable From or Reply-To address sends nothing.
        - operation: moveMessage
          name: archivedCustomerRequest
          branch: moved
          description: Moving answered INBOX UID 100 to Archive returns its destination UID.
          default: true
        - operation: moveMessage
          name: missingSourceAndArchive
          branch: notFound
          description: Moving a missing INBOX UID with no matching Message-ID in Archive selects notFound.
        - operation: moveMessage
          name: archiveUnavailable
          branch: providerRejected
          description: Moving INBOX UID 100 to a nonexistent Archive mailbox receives IMAP NO [TRYCREATE].
        - operation: setFlags
          name: markedCustomerRequest
          branch: updated
          description: Setting INBOX UID 100 seen and answered returns those absolute flags.
          default: true
        - operation: setFlags
          name: missingFlagTarget
          branch: notFound
          description: Setting flags on an INBOX UID deleted by another mail client selects notFound.
        - operation: setFlags
          name: readOnlyMailbox
          branch: providerRejected
          description: Setting flags in a read-only INBOX is refused by IMAP.
    - company: Super Durable
      id: llm
      name: LLM
      description: 'The text generation connector for applications: one generateText Step runs a model of the provider that the connection names, including an OpenAI-compatible custom endpoint, with that provider''s API key and its own model IDs.'
      version: v0.25.0
      languages:
        go: v0.25.0
        typescript: v0.1.0
      directory: connectors/superdurable/llm
      uiUnits:
        - name: modelPicker
          description: Choose a model ID from the live model list of the connection's provider and region, or type one the provider serves. On a Step, blank keeps the connection's model; on the connection, blank uses the provider's default model.
      triggers: []
      operations:
        - name: generateText
          kind: query
          description: Generate text or JSON Schema structured output with a model of the connection's provider through that provider's stateless text generation API.
          languages:
            - go
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/superdurable/llm/go/llmmock
      mocks:
        - operation: generateText
          name: shortSummary
          branch: generated
          description: The model finished normally with a short answer and its token usage.
          default: true
        - operation: generateText
          name: structuredAnswer
          branch: generated
          description: JSON text for the example schema with a string status and numeric confidence; script a fitting answer for other schemas.
        - operation: generateText
          name: outputTokenLimit
          branch: truncated
          description: The model stopped at the output token limit after partial text.
        - operation: generateText
          name: contentPolicy
          branch: blocked
          description: The provider stopped the response for a content policy and returned no text.
        - operation: generateText
          name: invalidKey
          branch: providerRejected
          description: The provider rejected the connection's API key.
        - operation: generateText
          name: quotaExhausted
          branch: providerRejected
          description: The account has no credit or quota left, which waiting does not restore.
        - operation: generateText
          name: schemaMismatch
          branch: invalidResponse
          description: The structured output does not match the request's schema.
        - operation: generateText
          name: unsupportedField
          branch: defect
          description: The request sets a field the model does not accept, so no provider request is sent.
        - operation: generateText
          name: rateLimited
          description: The provider throttles the request once and asks for a short wait.
    - company: Super Durable
      id: oauth2-http
      name: OAuth 2.0 HTTP
      description: 'Call any HTTP API that an OAuth 2.0 authorization server protects, such as a Keycloak realm or an internal service: the connection names the server''s endpoints and scopes, the host authorizes it with PKCE, and the connector refreshes the access token before it expires.'
      version: v0.2.0
      languages:
        go: v0.2.0
        typescript: v0.1.0
      directory: connectors/superdurable/oauth2-http
      uiUnits: []
      triggers: []
      operations:
        - name: sendRequest
          kind: mutation
          description: Send one HTTP request to the connection's API with the OAuth access token as a Bearer credential, and return the status code and body. Refreshes the token first when it is about to expire and once more after a 401. GET, HEAD, and OPTIONS are retried on a transient failure; any other method whose request may have reached the API selects uncertain instead of repeating it.
          languages:
            - go
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/superdurable/oauth2-http/go/oauth2httpmock
      mocks:
        - operation: sendRequest
          name: userProfile
          branch: completed
          description: The API answered 200 with a small JSON document.
          default: true
        - operation: sendRequest
          name: notFound
          branch: rejected
          description: The API answered 404 for the requested path.
        - operation: sendRequest
          name: authorizationExpired
          branch: rejected
          description: The server refused to renew the authorization, so no request was sent.
        - operation: sendRequest
          name: connectionLost
          branch: uncertain
          description: The connection closed after a POST was sent, so the API may have processed it.
        - operation: sendRequest
          name: invalidPath
          branch: defect
          description: The request path is not an absolute path, so no request is sent.
        - operation: sendRequest
          name: throttled
          description: The API throttles the request once before processing it.
    - company: Super Durable
      id: webhook
      name: Webhook
      description: Receive verified webhook requests from any sender, such as a form service, and start or resume Flows with a stable event ID. Send signed Standard Webhooks events to a configured HTTPS receiver.
      version: v0.24.0
      languages:
        go: v0.24.0
        typescript: v0.1.0
      directory: connectors/superdurable/webhook
      uiUnits: []
      triggers:
        - name: requestReceived
          description: Receive one verified JSON or form-encoded webhook request, such as a form submission, with a stable event ID.
          languages:
            - go
      operations:
        - name: sendEvent
          kind: mutation
          description: 'POST one JSON event to the connection''s HTTPS delivery URL, signed with the Standard Webhooks scheme. Delivery is at least once: after a 408, 409, 425, 429, or 5xx answer, a timeout, or a lost response the same webhook-id is sent again with a fresh timestamp and signature, so the receiver must deduplicate by webhook-id and answer 2xx for an id it already applied.'
          languages:
            - go
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/superdurable/webhook/go/webhookmock
      mocks:
        - operation: sendEvent
          name: submissionDelivered
          branch: delivered
          description: The receiver accepts the form.submitted event for submission evt_mock_1 with HTTP 202.
          default: true
        - operation: sendEvent
          name: submissionRejected
          branch: rejected
          description: The receiver refuses the form.submitted event for submission evt_rejected_1 with HTTP 422.
    - company: TMDB
      id: tmdb
      name: TMDB
      description: Read and act through the TMDB public API.
      version: v0.2.0
      languages:
        go: v0.2.0
        python: v0.2.0
        typescript: v0.1.0
      directory: connectors/tmdb
      uiUnits: []
      triggers: []
      operations:
        - name: searchMovies
          kind: query
          description: SearchMovies through the TMDB public JSON API.
          languages:
            - go
            - python
            - typescript
        - name: getMovie
          kind: query
          description: GetMovie through the TMDB public JSON API.
          languages:
            - go
            - python
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/tmdb/go/tmdbmock
      mocks:
        - operation: searchMovies
          name: searchMoviesDefault
          branch: searched
          description: A representative TMDB response.
          default: true
        - operation: getMovie
          name: getMovieDefault
          branch: found
          description: A representative TMDB response.
          default: true
    - company: Twilio
      id: twilio-messaging
      name: Twilio Messaging
      description: Send SMS, MMS, and WhatsApp messages through Twilio Programmable Messaging and read their delivery status.
      version: v0.23.0
      languages:
        go: v0.23.0
        typescript: v0.1.0
      directory: connectors/twilio/messaging
      uiUnits: []
      triggers: []
      operations:
        - name: sendMessage
          kind: mutation
          description: Send one SMS, MMS, or WhatsApp message from a Twilio number or Messaging Service to one recipient; synchronous durability makes the single-dispatch checkpoint visible to retries because Twilio provides no message idempotency key.
          languages:
            - go
            - typescript
        - name: getMessage
          kind: query
          description: Read one message by SID, including its delivery status and Twilio error code.
          languages:
            - go
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/twilio/messaging/go/messagingmock
      mocks:
        - operation: sendMessage
          name: queuedText
          branch: accepted
          description: A send to +14155550123 is queued from +14155550100 with a synthetic account ID; script another recipient or sender.
          default: true
        - operation: sendMessage
          name: trialRecipientRejected
          branch: providerRejected
          description: A trial account send to an unverified recipient is rejected before message creation.
        - operation: getMessage
          name: deliveredText
          branch: found
          description: The queued SMfedcba9876543210fedcba9876543210 message to +14155550123 was delivered under a synthetic account ID; script another SID.
          default: true
        - operation: getMessage
          name: messageMissing
          branch: notFound
          description: The requested message SID does not exist in this account.
        - operation: getMessage
          name: messageReadRejected
          branch: providerRejected
          description: Twilio returns 403 because this account credential lacks permission to read the requested message.
        - operation: getMessage
          name: invalidMessageResponse
          branch: invalidResponse
          description: Twilio returned a malformed response for the requested message SID.
    - company: Typeform
      id: typeform
      name: Typeform
      description: Receive signed Typeform form_response webhooks as typed, field-keyed answers, list and read forms, list responses, and create or update a form's webhook.
      version: v0.23.0
      languages:
        go: v0.23.0
        typescript: v0.1.0
      directory: connectors/typeform
      uiUnits:
        - name: formPicker
          description: Select one of the connected account's Typeform forms, listed live from Typeform, or paste a form ID; the unit stores the form ID, such as u6nXL7 from the form link https://form.typeform.com/to/u6nXL7.
      triggers:
        - name: responseSubmitted
          description: Receive a signed Typeform form_response webhook for one submitted response, with its answers keyed by field ref and its hidden fields; the event ID is the form ID and response token.
          languages:
            - go
      operations:
        - name: listForms
          kind: query
          description: List one page, 1 to 200 forms, of the account's forms, optionally filtered by a search string or workspace.
          languages:
            - go
            - typescript
        - name: getForm
          kind: query
          description: Read one form's fields, with each field's ref, type, title, and choices, and its hidden field names.
          languages:
            - go
            - typescript
        - name: listResponses
          kind: query
          description: List one bounded page, 1 to 1000, of a form's completed responses, newest first, filtered by since and until and paged with the before or after response token.
          languages:
            - go
            - typescript
        - name: upsertWebhook
          kind: mutation
          description: Create or replace a form's webhook with the given tag, URL, and enabled state, signed with the connection's webhook_secret. The PUT is idempotent by tag, so a repeated call leaves one webhook.
          languages:
            - go
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/typeform/go/typeformmock
      mocks:
        - operation: listForms
          name: signupForms
          branch: listed
          description: Listing all forms returns form f_signup_1 for customer signup.
          default: true
        - operation: listForms
          name: formsReadDenied
          branch: providerRejected
          description: Listing forms without forms:read returns HTTP 403.
        - operation: getForm
          name: signupForm
          branch: found
          description: Reading form f_signup_1 returns its name and email questions.
          default: true
        - operation: getForm
          name: formMissing
          branch: notFound
          description: Reading nonexistent form f_missing_1 returns HTTP 404.
        - operation: getForm
          name: formReadDenied
          branch: providerRejected
          description: Reading form f_signup_1 without forms:read returns HTTP 403.
        - operation: listResponses
          name: signupResponses
          branch: listed
          description: Listing responses for form f_signup_1 returns Ada's signup.
          default: true
        - operation: listResponses
          name: responsesFormMissing
          branch: notFound
          description: Listing responses for nonexistent form f_missing_1 returns HTTP 404.
        - operation: listResponses
          name: responsesReadDenied
          branch: providerRejected
          description: Listing responses without responses:read returns HTTP 403.
        - operation: upsertWebhook
          name: signupWebhook
          branch: upserted
          description: Upserting the dex-response-recorder webhook for form f_signup_1 stores the HTTPS callback.
          default: true
        - operation: upsertWebhook
          name: webhookFormMissing
          branch: notFound
          description: Upserting a webhook for nonexistent form f_missing_1 returns HTTP 404.
        - operation: upsertWebhook
          name: webhookWriteDenied
          branch: providerRejected
          description: Upserting the webhook without webhooks:write returns HTTP 403.
    - company: Unsplash
      id: unsplash
      name: Unsplash
      description: Search public photos and retrieve one photo through Unsplash.
      version: v0.2.0
      languages:
        go: v0.2.0
        typescript: v0.1.0
      directory: connectors/unsplash
      uiUnits: []
      triggers: []
      operations:
        - name: searchPhotos
          kind: query
          description: Search one page of public photos.
          languages:
            - go
            - typescript
        - name: getPhoto
          kind: query
          description: Retrieve one public photo by ID.
          languages:
            - go
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/unsplash/go/unsplashmock
      mocks:
        - operation: searchPhotos
          name: searchedDefaultPhotos
          branch: searched
          description: One office photo in the search results.
          default: true
        - operation: getPhoto
          name: foundDefaultPhoto
          branch: found
          description: The same office photo is available by ID.
          default: true
    - company: Vercel
      id: vercel
      name: Vercel
      description: Use the Vercel REST API through typed Dex connector Steps.
      version: v0.2.0
      languages:
        go: v0.2.0
        typescript: v0.1.0
      directory: connectors/vercel
      uiUnits: []
      triggers: []
      operations:
        - name: listDeployments
          kind: query
          description: List deployments visible to a personal account or team.
          languages:
            - go
            - typescript
        - name: getDeployment
          kind: query
          description: Read a deployment by Vercel deployment ID or hostname.
          languages:
            - go
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/vercel/go/vercelmock
      mocks:
        - operation: listDeployments
          name: listedDefault
          branch: listed
          description: A Meridian example returns a representative DeploymentsPage.
          default: true
        - operation: getDeployment
          name: foundDefault
          branch: found
          description: A Meridian example returns a representative Deployment.
          default: true
    - company: Webflow
      id: webflow
      name: Webflow
      description: Webflow REST connector with two bounded operations.
      version: v0.2.0
      languages:
        go: v0.2.0
        typescript: v0.1.0
      directory: connectors/webflow
      uiUnits: []
      triggers: []
      operations:
        - name: listCollectionItems
          kind: query
          description: List a page of staged CMS collection items.
          languages:
            - go
            - typescript
        - name: getCollectionItem
          kind: query
          description: Get one staged CMS collection item.
          languages:
            - go
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/webflow/go/webflowmock
      mocks:
        - operation: listCollectionItems
          name: defaultListCollectionItems
          branch: listed
          description: A representative provider response for the example resource.
          default: true
        - operation: getCollectionItem
          name: defaultGetCollectionItem
          branch: found
          description: A representative provider response for the example resource.
          default: true
    - company: WooCommerce
      id: woocommerce
      name: WooCommerce
      description: Read WooCommerce resources through typed Dex Query Steps.
      version: v0.2.0
      languages:
        go: v0.2.0
        typescript: v0.1.0
      directory: connectors/woocommerce
      uiUnits: []
      triggers: []
      operations:
        - name: listOrders
          kind: query
          description: List one page of WooCommerce orders.
          languages:
            - go
            - typescript
        - name: getOrder
          kind: query
          description: Read one WooCommerce order.
          languages:
            - go
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/woocommerce/go/woocommercemock
      mocks:
        - operation: listOrders
          name: defaultAnswer
          branch: listed
          description: A realistic read-only listOrders response for a Meridian account.
          default: true
        - operation: getOrder
          name: defaultAnswer
          branch: found
          description: A realistic read-only getOrder response for a Meridian account.
          default: true
    - company: Xero
      id: xero
      name: Xero
      description: Find Xero contacts by email, list and read invoices, raise invoices with exact decimal amounts in any enabled currency, and record payments against them, with every write sent under a Xero Idempotency-Key derived from the Step.
      version: v0.24.0
      languages:
        go: v0.24.0
        typescript: v0.1.0
      directory: connectors/xero
      uiUnits: []
      triggers: []
      operations:
        - name: listContacts
          kind: query
          description: List one bounded page of contacts, at most 100, filtered by a case-insensitive search term, contact IDs, and modification time, with Xero's page count.
          languages:
            - go
            - typescript
        - name: findContactByEmail
          kind: query
          description: Resolve one contact by its exact email address with Xero's optimised EmailAddress filter, distinguishing one match, none, and several.
          languages:
            - go
            - typescript
        - name: getInvoice
          kind: query
          description: Read one sales invoice or bill by InvoiceID or invoice number, with its line items, exact decimal totals, amounts due and paid, and applied payments.
          languages:
            - go
            - typescript
        - name: listInvoices
          kind: query
          description: List one bounded page of invoices, at most 100 with line items, filtered by Xero status, contact, type, exact reference, and If-Modified-Since time, with Xero's page count.
          languages:
            - go
            - typescript
        - name: createInvoice
          kind: mutation
          description: Create one sales invoice or bill for a contact with exact decimal line amounts, a currency, a reference, and an optional invoice number; every attempt of the Step sends the same Xero Idempotency-Key, so a repeated dispatch returns the first invoice instead of creating another.
          languages:
            - go
            - typescript
        - name: recordPayment
          kind: mutation
          description: Record one payment of an exact decimal amount against an approved invoice from a bank or payment-enabled account; every attempt of the Step sends the same Xero Idempotency-Key, so a repeated dispatch returns the first payment instead of paying twice.
          languages:
            - go
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/xero/go/xeromock
      mocks:
        - operation: listContacts
          name: cityAgencyContacts
          branch: listed
          description: Listing active contacts finds City Agency and its billing email.
          default: true
        - operation: listContacts
          name: accessDenied
          branch: providerRejected
          description: listContacts with a token missing its Xero scope returns HTTP 403.
        - operation: listContacts
          name: dailyLimit
          branch: dailyLimitReached
          description: listContacts after the organisation exhausts its daily API quota returns HTTP 429.
        - operation: findContactByEmail
          name: cityAgencyContact
          branch: found
          description: Finding accounts@cityagency.example.com resolves the one active City Agency contact.
          default: true
        - operation: findContactByEmail
          name: emailNotFound
          branch: notFound
          description: Finding nobody@cityagency.example.com returns no active contact.
        - operation: findContactByEmail
          name: emailAmbiguous
          branch: ambiguous
          description: Finding shared@cityagency.example.com returns two active contacts.
        - operation: findContactByEmail
          name: accessDenied
          branch: providerRejected
          description: findContactByEmail with a token missing its Xero scope returns HTTP 403.
        - operation: findContactByEmail
          name: dailyLimit
          branch: dailyLimitReached
          description: findContactByEmail after the organisation exhausts its daily API quota returns HTTP 429.
        - operation: getInvoice
          name: paidOrderInvoice
          branch: found
          description: Reading invoice INV-1042 after payment returns the paid ORDER-1042 invoice.
          default: true
        - operation: getInvoice
          name: invoiceNotFound
          branch: notFound
          description: Reading nonexistent invoice INV-MISSING returns HTTP 404.
        - operation: getInvoice
          name: accessDenied
          branch: providerRejected
          description: getInvoice with a token missing its Xero scope returns HTTP 403.
        - operation: getInvoice
          name: dailyLimit
          branch: dailyLimitReached
          description: getInvoice after the organisation exhausts its daily API quota returns HTTP 429.
        - operation: listInvoices
          name: paidOrderInvoices
          branch: listed
          description: Listing invoices finds the paid ORDER-1042 invoice.
          default: true
        - operation: listInvoices
          name: orderWithoutInvoice
          branch: listed
          description: Listing invoices for ORDER-1042 before creation finds no invoice.
        - operation: listInvoices
          name: accessDenied
          branch: providerRejected
          description: listInvoices with a token missing its Xero scope returns HTTP 403.
        - operation: listInvoices
          name: dailyLimit
          branch: dailyLimitReached
          description: listInvoices after the organisation exhausts its daily API quota returns HTTP 429.
        - operation: createInvoice
          name: approvedOrderInvoice
          branch: created
          description: Creating the authorised invoice for ORDER-1042 records one USD invoice for City Agency.
          default: true
        - operation: createInvoice
          name: accessDenied
          branch: providerRejected
          description: createInvoice with a token missing its Xero scope returns HTTP 403.
        - operation: createInvoice
          name: dailyLimit
          branch: dailyLimitReached
          description: createInvoice after the organisation exhausts its daily API quota returns HTTP 429.
        - operation: recordPayment
          name: orderPayment
          branch: recorded
          description: Recording the 49.95 USD payment for INV-1042 leaves that invoice paid.
          default: true
        - operation: recordPayment
          name: accessDenied
          branch: providerRejected
          description: recordPayment with a token missing its Xero scope returns HTTP 403.
        - operation: recordPayment
          name: dailyLimit
          branch: dailyLimitReached
          description: recordPayment after the organisation exhausts its daily API quota returns HTTP 429.
    - company: Zendesk
      id: zendesk-support
      name: Zendesk Support
      description: Search, read, create, and update Zendesk Support tickets, with duplicate-safe ticket creation and follow-up comments.
      version: v0.23.0
      languages:
        go: v0.23.0
        typescript: v0.1.0
      directory: connectors/zendesk/support
      uiUnits: []
      triggers: []
      operations:
        - name: searchTickets
          kind: query
          description: Search tickets by status, requester email, tag, update time, and keywords, returning one bounded page and a cursor for the next.
          languages:
            - go
            - typescript
        - name: getTicket
          kind: query
          description: Read one ticket by ID with its requester and a bounded list of its latest comments.
          languages:
            - go
            - typescript
        - name: createTicket
          kind: mutation
          description: Create one ticket with its first comment under a Zendesk Idempotency-Key derived from the Step, so a retried or re-dispatched Step returns the same ticket.
          languages:
            - go
            - typescript
        - name: updateTicket
          kind: mutation
          description: Change the status, priority, assignee, group, or tags of one ticket and optionally add one public reply or internal note, applied at most once per Step.
          languages:
            - go
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/zendesk/support/go/supportmock
      mocks:
        - operation: searchTickets
          name: customerIssueTickets
          branch: searched
          description: Searching Jane's billing-double-charge tickets returns two unsolved matches and a newer solved one, ordered by creation.
          default: true
        - operation: searchTickets
          name: accessDenied
          branch: providerRejected
          description: searchTickets without agent permission returns HTTP 403.
        - operation: getTicket
          name: customerIssueTicket
          branch: found
          description: Reading ticket 35436 returns Jane's pending double-charge issue and latest comment.
          default: true
        - operation: getTicket
          name: missingTicket
          branch: notFound
          description: Reading nonexistent ticket 99999 returns HTTP 404.
        - operation: getTicket
          name: accessDenied
          branch: providerRejected
          description: getTicket without agent permission returns HTTP 403.
        - operation: createTicket
          name: openedCustomerIssue
          branch: created
          description: Opening Jane's double-charge issue after no match creates ticket 35437.
          default: true
        - operation: createTicket
          name: accessDenied
          branch: providerRejected
          description: createTicket without agent permission returns HTTP 403.
        - operation: updateTicket
          name: followedUpCustomerIssue
          branch: updated
          description: Updating ticket 35436 adds Jane's internal follow-up and repeat-contact tag.
          default: true
        - operation: updateTicket
          name: missingTicket
          branch: notFound
          description: Updating nonexistent ticket 99999 returns HTTP 404.
        - operation: updateTicket
          name: ticketChanged
          branch: conflict
          description: Updating ticket 35436 with an older expectedUpdatedAt finds a newer ticket revision.
        - operation: updateTicket
          name: accessDenied
          branch: providerRejected
          description: updateTicket without agent permission returns HTTP 403.
    - company: Zoho
      id: zoho-crm
      name: Zoho CRM
      description: Find, read, upsert, and update Zoho CRM records such as contacts, accounts, and deals in the connection's Zoho data center, list records changed since a watermark, and read a module's fields and picklist values, keeping Zoho CRM's own field names and stages.
      version: v0.24.0
      languages:
        go: v0.24.0
        typescript: v0.1.0
      directory: connectors/zoho/crm
      uiUnits: []
      triggers: []
      operations:
        - name: findRecords
          kind: query
          description: Find up to 200 records of one module whose fields match every condition, such as a contact by email or an account by name, through a COQL query with typed, escaped values; results are immediate, with no search-index delay, and an offset cursor reads the next page.
          languages:
            - go
            - typescript
        - name: getRecord
          kind: query
          description: Read one record of a module by record ID, with every field or the chosen fields, including lookups such as a contact's account and a deal's owner.
          languages:
            - go
            - typescript
        - name: listModifiedRecords
          kind: query
          description: List up to 200 records of one module modified at or after a time, oldest change first, and return a watermark cursor that reads the next page now or the next changes in a later poll.
          languages:
            - go
            - typescript
        - name: upsertRecord
          kind: mutation
          description: Create one record, or update the record whose duplicate-check field, such as a contact's Email or a unique external ID field, already holds the value, so a retried Step updates the record an earlier attempt created instead of creating a duplicate.
          languages:
            - go
            - typescript
        - name: updateRecord
          kind: mutation
          description: Set the named fields of one record by record ID, such as a deal's Stage or Owner, leaving every other field unchanged; repeating the update sets the same values again.
          languages:
            - go
            - typescript
        - name: listModuleFields
          kind: query
          description: List the fields of one module with their API names, data types, unique and custom flags, lookup modules, and picklist values, such as the stages a deal's Stage accepts.
          languages:
            - go
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/zoho/crm/go/crmmock
      mocks:
        - operation: findRecords
          name: acmeAccount
          branch: found
          description: Finding Accounts with Account_Name Acme Corp returns its existing account.
          default: true
        - operation: findRecords
          name: openDeal
          branch: found
          description: Finding Deals for contact 4150868000000376011 returns its newest open renewal deal.
        - operation: findRecords
          name: noMatchingRecords
          branch: notFound
          description: Finding Accounts with Account_Name Missing Corp returns no records.
        - operation: findRecords
          name: accessDenied
          branch: providerRejected
          description: findRecords with a token missing the module scope returns HTTP 403.
        - operation: getRecord
          name: advancedDeal
          branch: found
          description: Reading deal 4150868000000376022 after its update returns Negotiation/Review and owner 4150868000000376001.
          default: true
        - operation: getRecord
          name: recordMissing
          branch: notFound
          description: Reading missing Deal 4150868000000999999 returns HTTP 204.
        - operation: getRecord
          name: accessDenied
          branch: providerRejected
          description: getRecord with a token missing the module scope returns HTTP 403.
        - operation: listModifiedRecords
          name: changedDeals
          branch: listed
          description: Listing Deals changed since 2026-10-25 returns the updated renewal deal.
          default: true
        - operation: listModifiedRecords
          name: accessDenied
          branch: providerRejected
          description: listModifiedRecords with a token missing the module scope returns HTTP 403.
        - operation: upsertRecord
          name: acmeContact
          branch: upserted
          description: Upserting Contacts by Email ada@acme.example.com creates Ada under Acme Corp.
          default: true
        - operation: upsertRecord
          name: accountUpserted
          branch: upserted
          description: Upserting Accounts by Account_Name Acme Corp finds the existing account.
        - operation: upsertRecord
          name: duplicateUniqueField
          branch: conflict
          description: Upserting a contact with an Email already held by another record returns DUPLICATE_DATA.
        - operation: upsertRecord
          name: invalidContactFields
          branch: recordRejected
          description: Upserting a contact without its mandatory Last_Name returns MANDATORY_NOT_FOUND.
        - operation: upsertRecord
          name: accessDenied
          branch: providerRejected
          description: upsertRecord with a token missing the module scope returns HTTP 403.
        - operation: updateRecord
          name: advancedRenewalDeal
          branch: updated
          description: Updating deal 4150868000000376022 sets its stage to Negotiation/Review.
          default: true
        - operation: updateRecord
          name: missingRecord
          branch: notFound
          description: Updating missing Deal 4150868000000999999 returns INVALID_DATA for its ID.
        - operation: updateRecord
          name: duplicateField
          branch: conflict
          description: Updating a deal with a unique value held by another record returns DUPLICATE_DATA.
        - operation: updateRecord
          name: invalidFields
          branch: recordRejected
          description: Updating a deal to a blocked stage returns INVALID_DATA.
        - operation: updateRecord
          name: accessDenied
          branch: providerRejected
          description: updateRecord with a token missing the module scope returns HTTP 403.
        - operation: listModuleFields
          name: dealFields
          branch: listed
          description: Listing Deals fields returns Stage with Negotiation/Review enabled.
          default: true
        - operation: listModuleFields
          name: accessDenied
          branch: providerRejected
          description: listModuleFields with a token missing the module scope returns HTTP 403.
    - company: Zoho
      id: zoho-desk
      name: Zoho Desk
      description: Search, read, create, and update Zoho Desk tickets and add public or private comments in the connection's Zoho data center, keeping Zoho Desk's own status and priority names.
      version: v0.24.1
      languages:
        go: v0.24.1
        typescript: v0.1.0
      directory: connectors/zoho/desk
      uiUnits:
        - name: organizationPicker
          description: Choose the Zoho Desk organization this connection works in from the organizations of the authorized user, listed in the connection's own data center only; the unit stores the organization's numeric orgId. Pick the organization chosen on the Zoho consent screen, and when the list cannot load, enter the orgId shown in Zoho Desk under Setup > Developer Space > API.
      triggers: []
      operations:
        - name: searchTickets
          kind: query
          description: Search one page of Zoho Desk tickets by status, status type, priority, contact email, department, and modified time, with from and limit paging of at most 100 tickets.
          languages:
            - go
            - typescript
        - name: getTicket
          kind: query
          description: Read one ticket by ID with its contact and bounded lists of its newest threads and newest comments.
          languages:
            - go
            - typescript
        - name: createTicket
          kind: mutation
          description: Create one ticket in a department for a contact. Zoho Desk has no idempotency key, so the Step runs with sync durability and sends the request at most once per Step execution.
          languages:
            - go
            - typescript
        - name: updateTicket
          kind: mutation
          description: Set the status, priority, assignee, or department of one ticket; a repeated attempt finds the change already applied and writes nothing.
          languages:
            - go
            - typescript
        - name: addComment
          kind: mutation
          description: Add one public or private plain-text comment to a ticket. Zoho Desk has no idempotency key, so the Step runs with sync durability and sends the request at most once per Step execution.
          languages:
            - go
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/zoho/desk/go/deskmock
      mocks:
        - operation: searchTickets
          name: noExistingTicket
          branch: searched
          description: Three pages of broader Zoho results, searched with Open and On Hold status types and a 25-ticket limit, contain no ticket for jane@example.test in department 1892000000006907.
          default: true
        - operation: searchTickets
          name: searchScopeRejected
          branch: providerRejected
          description: The search has a missing Desk.tickets.READ scope and Zoho Desk returns HTTP 403.
        - operation: searchTickets
          name: invalidSearchPage
          branch: invalidResponse
          description: The search response has no usable ticket page.
        - operation: getTicket
          name: openedTicketDetails
          branch: found
          description: Ticket 1892000000099001 is read before a follow-up, after its private comment and a move to On Hold with Low priority.
          default: true
        - operation: getTicket
          name: ticketNotFound
          branch: notFound
          description: The requested ticket ID does not exist and Zoho Desk returns HTTP 404.
        - operation: getTicket
          name: ticketReadScopeRejected
          branch: providerRejected
          description: The ticket read has a missing Desk.tickets.READ scope and Zoho Desk returns HTTP 403.
        - operation: getTicket
          name: invalidTicketDetails
          branch: invalidResponse
          description: The returned ticket has malformed required fields.
        - operation: createTicket
          name: createdBillingTicket
          branch: created
          description: The new jane@example.test billing issue in department 1892000000006907 creates ticket 1892000000099001.
          default: true
        - operation: createTicket
          name: invalidDepartment
          branch: providerRejected
          description: The supplied department ID is unknown and Zoho Desk returns HTTP 422 without creating a ticket.
        - operation: updateTicket
          name: reprioritizedBillingTicket
          branch: updated
          description: Ticket 1892000000099001 is reopened and reprioritized from On Hold and Low to Open and High.
          default: true
        - operation: updateTicket
          name: ticketNotFound
          branch: notFound
          description: The requested update ticket ID does not exist and Zoho Desk returns HTTP 404.
        - operation: updateTicket
          name: invalidStatus
          branch: providerRejected
          description: The requested status is unknown and Zoho Desk returns HTTP 422 without applying it.
        - operation: updateTicket
          name: invalidUpdatedTicket
          branch: invalidResponse
          description: Zoho Desk accepted the update but returned an invalid ticket body.
        - operation: addComment
          name: privateTriageComment
          branch: added
          description: 'Ticket 1892000000099001 receives the private comment "Dex triage: opened with priority High; the contact had no open or on-hold ticket in this department."'
          default: true
        - operation: addComment
          name: ticketNotFound
          branch: notFound
          description: The target ticket ID does not exist and Zoho Desk returns HTTP 404 without adding a comment.
        - operation: addComment
          name: invalidComment
          branch: providerRejected
          description: Zoho Desk rejects the comment content with HTTP 422 and adds nothing.
    - company: Zoom
      id: zoom
      name: Zoom
      description: List, read, schedule, and reschedule the authorized user's Zoom meetings, and list who joined a past meeting.
      version: v0.24.0
      languages:
        go: v0.24.0
        typescript: v0.1.0
      directory: connectors/zoom
      uiUnits: []
      triggers: []
      operations:
        - name: listMeetings
          kind: query
          description: List one page of the authorized user's scheduled, upcoming, live, or previous meetings, at most 300 per page.
          languages:
            - go
            - typescript
        - name: getMeeting
          kind: query
          description: Read one meeting by its numeric meeting ID, including its start instant, time zone, join URL, and settings.
          languages:
            - go
            - typescript
        - name: createMeeting
          kind: mutation
          description: Schedule one meeting for the authorized user at an explicit start instant and IANA time zone; a synchronous dispatch fence makes the pre-send checkpoint visible across attempts and prevents a second send after an unknown outcome.
          languages:
            - go
            - typescript
        - name: updateMeeting
          kind: mutation
          description: Patch the topic, agenda, start instant and time zone, duration, or settings of one meeting; the patch sets absolute values, so repeating it is safe.
          languages:
            - go
            - typescript
        - name: listPastMeetingParticipants
          kind: query
          description: List one page of the people who joined the latest ended instance of a meeting, at most 300 per page.
          languages:
            - go
            - typescript
      mockPackage: github.com/superdurable/dex-connectors-library/connectors/zoom/go/zoommock
      mocks:
        - operation: listMeetings
          name: listedDefaultAnswer
          branch: listed
          description: Matches upcoming meeting pages for the authorized host, including the consultation created below.
          default: true
        - operation: listMeetings
          name: providerRejectedFailure
          branch: providerRejected
          description: Matches a listing that Zoom denies with HTTP 403.
        - operation: listMeetings
          name: dailyLimitFailure
          branch: providerRejected
          description: Matches a listing rejected by Zoom's documented daily-limit 429 message.
        - operation: listMeetings
          name: invalidResponseFailure
          branch: invalidResponse
          description: Matches a listing whose Zoom response is structurally unusable.
        - operation: getMeeting
          name: foundDefaultAnswer
          branch: found
          description: Matches a read of meeting 92674392836, the consultation created below.
          default: true
        - operation: getMeeting
          name: notFoundFailure
          branch: notFound
          description: Matches a read with an unknown or deleted meeting ID.
        - operation: getMeeting
          name: providerRejectedFailure
          branch: providerRejected
          description: Matches a meeting read that Zoom denies with HTTP 403.
        - operation: getMeeting
          name: dailyLimitFailure
          branch: providerRejected
          description: Matches a meeting read rejected by Zoom's documented daily-limit 429 message.
        - operation: getMeeting
          name: invalidResponseFailure
          branch: invalidResponse
          description: Matches a meeting read whose response is structurally unusable.
        - operation: createMeeting
          name: createdDefaultAnswer
          branch: created
          description: Matches a scheduled Consultation at 2036-02-24T17:00:00Z for the authorized host.
          default: true
        - operation: createMeeting
          name: providerRejectedFailure
          branch: providerRejected
          description: Matches a create when the authorized user cannot host meetings.
        - operation: createMeeting
          name: dailyLimitFailure
          branch: providerRejected
          description: Matches a create rejected by Zoom's documented daily-limit 429 message; nothing was created.
        - operation: updateMeeting
          name: updatedDefaultAnswer
          branch: updated
          description: Matches an absolute-value update to meeting 92674392836.
          default: true
        - operation: updateMeeting
          name: notFoundFailure
          branch: notFound
          description: Matches an update to an unknown or deleted meeting ID.
        - operation: updateMeeting
          name: providerRejectedFailure
          branch: providerRejected
          description: Matches an update whose field value Zoom rejects with HTTP 400.
        - operation: updateMeeting
          name: dailyLimitFailure
          branch: providerRejected
          description: Matches an update rejected by Zoom's documented daily-limit 429 message.
        - operation: listPastMeetingParticipants
          name: listedDefaultAnswer
          branch: listed
          description: Matches participant pages for meeting 92674392836 after its consultation ends.
          default: true
        - operation: listPastMeetingParticipants
          name: notFoundFailure
          branch: notFound
          description: Matches participant listing before the meeting has an ended instance.
        - operation: listPastMeetingParticipants
          name: providerRejectedFailure
          branch: providerRejected
          description: Matches a participant listing that Zoom denies with HTTP 403.
        - operation: listPastMeetingParticipants
          name: dailyLimitFailure
          branch: providerRejected
          description: Matches a participant listing rejected by Zoom's documented daily-limit 429 message.
        - operation: listPastMeetingParticipants
          name: invalidResponseFailure
          branch: invalidResponse
          description: Matches a participant listing whose response is structurally unusable.
