> ## Documentation Index
> Fetch the complete documentation index at: https://developers.askparable.com/llms.txt
> Use this file to discover all available pages before exploring further.

# tenantConnectorTaps

> List all ConnectorTap definitions available across this workspace's installed
connector instances. The customer data catalog uses this to enrich tap
contracts with their tap definition (name, description, sync config, etc.).
Returns one ConnectorTap per (connector, tap) pair the workspace has access
to; deduplicated when multiple instances share a connector.



## OpenAPI

````yaml /api-reference/openapi.json get /api/connectors/tenant-connector-taps
openapi: 3.0.3
info:
  title: Parable API
  description: >-
    The REST API for your Parable workspace: manage connectors and taps, explore
    your data catalog, upload artifacts, and administer users and roles.
  version: v1
servers:
  - url: https://api.askparable.com
    description: Production
security: []
paths:
  /api/connectors/tenant-connector-taps:
    get:
      tags:
        - connectors
      summary: tenantConnectorTaps
      description: >-
        List all ConnectorTap definitions available across this workspace's
        installed

        connector instances. The customer data catalog uses this to enrich tap

        contracts with their tap definition (name, description, sync config,
        etc.).

        Returns one ConnectorTap per (connector, tap) pair the workspace has
        access

        to; deduplicated when multiple instances share a connector.
      operationId: ConnectorsTenantConnectorTapsHandler
      parameters:
        - description: >-
            Workspace slug. Overrides subdomain-based workspace resolution when
            provided.
          in: header
          name: X-Tenant
          required: false
          schema:
            example: acme
            type: string
        - description: Optional request correlation ID echoed back in the response.
          in: header
          name: X-Request-ID
          required: false
          schema:
            example: 550e8400-e29b-41d4-a716-446655440000
            format: uuid
            type: string
      responses:
        '200':
          content:
            application/json:
              schema:
                properties:
                  data:
                    items:
                      $ref: '#/components/schemas/ConnectorTap'
                    type: array
                  links:
                    $ref: '#/components/schemas/ResponseLinks'
                  meta:
                    $ref: '#/components/schemas/ResponseMeta'
                required:
                  - data
                  - meta
                type: object
          description: Successful response
        '400':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Bad request
        '500':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Internal server error
      security:
        - bearerAuth: []
components:
  schemas:
    ConnectorTap:
      description: |-
        Definition of a data extraction tap for a connector.
        A tap represents a single endpoint/entity type that can be extracted.
      properties:
        createdAt:
          description: ISO8601 datetime string
          type: string
        createdBy:
          description: UUID v4 string as base62
          type: string
        customFields:
          $ref: '#/components/schemas/TapCustomFieldsConfig'
          description: >-
            Capture config for dynamic/custom fields (PARABLE-734). Null =
            capture off.
        dataKind:
          $ref: '#/components/schemas/TapDataKindEnum'
          description: |-
            Materialization class for this tap's records on the promote path.
            Null = undeclared; the promote path applies documented defaults.
        deletionSemantics:
          $ref: '#/components/schemas/TapDeletionSemanticsEnum'
          description: >-
            How deletions are detectable in this tap's source. Null =
            undeclared.
        description:
          description: Human-readable description of what this tap extracts
          type: string
        enabledByDefault:
          description: Whether this tap is enabled by default for new connections
          type: boolean
        enabledSince:
          description: |-
            Start of the current uninterrupted default-enabled period. Null when
            disabled or when a legacy enabled period predates tracking.
          type: string
        errorBodyRules:
          description: >-
            Rules that reclassify HTTP errors from the response body (retry vs
            skip).
          items:
            $ref: '#/components/schemas/ErrorBodyRule'
          type: array
        extractionHook:
          description: Hook executed after extracting response records
          type: string
        id:
          description: UUID v4 with automatic base62 encoding for client-facing APIs
          type: string
        identityDirectory:
          description: >-
            Marks principal/account-directory taps (e.g. Slack users, Okta
            users).

            Directory taps are unioned into the account set downstream.
          type: boolean
        name:
          description: Unique name for this tap (e.g., 'repos', 'issues', 'users')
          type: string
        objectName:
          description: >-
            API object name for field discovery (e.g., 'User', 'Account' for
            Salesforce SOQL objects)
          type: string
        observability:
          $ref: '#/components/schemas/TapObservabilityConfig'
          description: >-
            Observability-only metadata for pre-Silver evidence. This does not
            mutate

            Bronze I records; it tells ingestion which raw source fields
            represent the

            tap's domain date for OTEL/log evidence.
        parentContextFields:
          description: >-
            Mappings to inject parent record values into tap output records.

            Used on root taps fed by config fan-out when no traversal edge
            supplies

            parent context (e.g. team_id from synthetic parent records).
          items:
            $ref: '#/components/schemas/ParentContextFieldMapping'
          type: array
        perParentAuth:
          $ref: '#/components/schemas/TapPerParentAuth'
          description: >-
            Per-parent authentication for taps that need a different OAuth
            subject

            per parent record (e.g., Google Workspace per-user impersonation).

            When unset the connector's default auth is used.
        qualityConfig:
          $ref: '#/components/schemas/TapQualityConfig'
        rateLimitOverride:
          $ref: '#/components/schemas/ConnectorRateLimits'
          description: Rate limit overrides for this specific tap
        rateLimits:
          $ref: '#/components/schemas/ConnectorRateLimits'
          description: >-
            Per-tap rate limits (e.g. maxConcurrent) merged over connector
            defaults.
        requestHook:
          description: Hook executed before making transport requests
          type: string
        responseExtraction:
          $ref: '#/components/schemas/ResponseExtractionConfig'
          description: How to extract records from API responses
        retentionPolicy:
          $ref: '#/components/schemas/TapRetentionPolicy'
          description: >-
            Source API data retention policy. Null if the source has no
            retention limit.
        schema:
          description: >-
            The schema describing the shape of the data this tap outputs.
            Customers

            render this in the data-catalog UI to enumerate available fields.
          type: object
        skipOnHttpStatus:
          description: >-
            HTTP status codes to skip gracefully during parent-child fan-out
            (e.g., [403, 404])
          items:
            format: double
            type: number
          type: array
        sync:
          $ref: '#/components/schemas/TapSyncConfig'
          description: Sync strategy and incremental parameters
        tombstoneMarkerColumn:
          description: >-
            Root schema field whose truthy value marks an explicit tombstone
            record.

            Required when deletionSemantics is tombstone.
          type: string
        transportOptions:
          description: Prioritized transport options for this tap
          items:
            $ref: '#/components/schemas/TapTransportOption'
          type: array
        updatedAt:
          description: ISO8601 datetime string
          type: string
        updatedBy:
          description: UUID v4 string as base62
          type: string
      required:
        - id
        - createdAt
        - createdBy
        - updatedAt
        - updatedBy
        - name
        - transportOptions
        - responseExtraction
        - sync
        - enabledByDefault
        - schema
        - identityDirectory
      type: object
    ResponseLinks:
      properties:
        first:
          nullable: true
          type: string
        last:
          nullable: true
          type: string
        next:
          nullable: true
          type: string
        prev:
          nullable: true
          type: string
      type: object
    ResponseMeta:
      properties:
        requestId:
          description: Unique identifier for the request
          type: string
        totalCount:
          description: Total count of items for paginated responses
          nullable: true
          type: integer
      required:
        - requestId
      type: object
    Error:
      properties:
        error:
          type: string
      type: object
    TapCustomFieldsConfig:
      description: >-
        Capture config for dynamic/custom fields on the provider-pool promote
        path

        (PARABLE-734). Patterns route keys into `_custom_fields`; remaining

        undeclared keys land in `_raw_unknown_fields` when captureUnknownFields
        is

        true. Prefer patterns over per-workspace field ID allowlists.
      properties:
        captureUnknownFields:
          description: |-
            When true, undeclared keys that do not match known patterns land in
            `_raw_unknown_fields` instead of being dropped.
          type: boolean
        knownCustomFieldKeyPatterns:
          description: >-
            Glob-style patterns (prefix `customfield_*`, suffix `*__c`, or
            exact).
          items:
            type: string
          type: array
      required:
        - captureUnknownFields
      type: object
    TapDataKindEnum:
      description: >-
        Materialization class for a tap's records on the
        ingestion-to-transformation

        promote path. Selects how the transformation layer materializes the
        stream.
      enum:
        - snapshot
        - event
        - changelog
      type: string
    TapDeletionSemanticsEnum:
      description: How deletions in the source are detectable for a tap.
      enum:
        - by_absence
        - tombstone
        - undetectable
      type: string
    ErrorBodyRule:
      description: >-
        Rule for classifying HTTP errors by inspecting the response body.

        When the HTTP status code matches, a JMESPath expression extracts a
        value

        from the body and compares it against retry or skip lists.
      properties:
        jmesPath:
          description: JMESPath expression to extract a value from the response body
          type: string
        retryValues:
          description: Values that indicate the error is transient and should be retried
          items:
            type: string
          type: array
        skipValues:
          description: Values that indicate the error is skippable (treat as empty result)
          items:
            type: string
          type: array
        statusCode:
          description: HTTP status code this rule applies to
          format: double
          type: number
      required:
        - statusCode
        - jmesPath
      type: object
    TapObservabilityConfig:
      description: |-
        Observability-only metadata for a tap. This metadata is used to produce
        pre-Silver evidence and must not mutate Bronze I payloads.
      properties:
        creditingMode:
          $ref: '#/components/schemas/TapDomainDateCreditingModeEnum'
          description: How Bronze I coverage credits calendar days for this tap.
        domainDatePaths:
          description: |-
            Dot-notation paths on the raw source record before envelope fields.
            Multiple paths act as alternates for polymorphic API shapes.
            Required when creditingMode is business_date.
          items:
            type: string
          type: array
      required:
        - creditingMode
      type: object
    ParentContextFieldMapping:
      description: >-
        =============================================================================

        Tap Definition Types

        =============================================================================

        Mapping from a target field name to a source field name in the parent
        record.

        Used to inject parent record values into child records during tap
        execution.
      properties:
        sourceField:
          description: Field name to read from parent record
          type: string
        targetField:
          description: Field name to set in child records
          type: string
      required:
        - targetField
        - sourceField
      type: object
    TapPerParentAuth:
      description: >-
        =============================================================================

        Per-Parent Authentication

        =============================================================================

        Per-parent authentication configuration for taps that iterate per-record

        on a parent tap (e.g., per-user impersonation for Google Workspace
        Gmail/

        Calendar/Meet APIs).

        When set, the runtime mints a separate OAuth token for each parent
        record,

        using the value of `impersonateField` from that record as the subject
        (the

        JWT `sub` claim for service account domain-wide delegation), instead of
        the

        connector's default admin-impersonation token.

        Required for Google APIs that only return data for the authenticated
        user

        (e.g., `/gmail/v1/users/{email}/threads`, Meet conference records).
        Without

        it, calls fall back to admin impersonation and Google rejects per-user
        URLs

        with `403 Delegation denied`.
      properties:
        impersonateField:
          description: >-
            Field name on the parent record whose value is used as the
            impersonation

            subject (e.g., `primaryEmail` for Google Workspace user records).

            Must match a field present on the parent tap's records, including
            any

            values propagated through `parentContextFields`.
          type: string
        method:
          description: |-
            Per-parent authentication strategy. Currently only `service_account`
            (Google Workspace domain-wide delegation) is supported.
          type: string
        quotaUserHeader:
          description: |-
            Optional HTTP header name to set the per-user value on each request
            (e.g., `x-goog-quota-user` so per-user quota is attributed to the
            impersonated user instead of the service account).
          type: string
      required:
        - method
        - impersonateField
      type: object
    TapQualityConfig:
      properties:
        rules:
          items:
            $ref: '#/components/schemas/QualityRuleConfig'
          type: array
        spc:
          $ref: '#/components/schemas/TapSpcConfig'
      required:
        - rules
        - spc
      type: object
    ConnectorRateLimits:
      description: >-
        Connector Rate Limits

        Rate limiting and retry configuration for connectors and individual
        taps.

        Can be set at the connector level (global) and overridden per-tap.

        Rate limit configuration for a connector or tap.
      properties:
        maxConcurrent:
          description: Maximum concurrent requests
          format: double
          type: number
        requestsPerSecond:
          description: Maximum requests per second
          format: double
          type: number
        resetHeader:
          description: >-
            Response header containing the Unix epoch reset time (e.g.
            x-rate-limit-reset for Okta). Used as fallback when Retry-After is
            absent.
          type: string
        retry:
          $ref: '#/components/schemas/RetryConfig'
          description: Retry behavior configuration
      type: object
    ResponseExtractionConfig:
      description: >-
        =============================================================================

        Response Extraction

        =============================================================================

        How to extract records from an API response.
      properties:
        primaryKey:
          description: Primary key field name for deduplication (e.g., 'id')
          type: string
        responseFormat:
          $ref: '#/components/schemas/ResponseFormatEnum'
          description: >-
            Wire format of the response body. Defaults to JSON when null. Set to
            JSONL

            for newline-delimited JSON responses (one record per line, body is
            not a

            single JSON document), e.g. Mixpanel's Raw Event Export API. With
            JSONL,

            set responsePath to '@' so each line becomes a record.
        responsePath:
          description: |-
            JMESPath expression to extract records from response.
            Examples: '@' (response is array), 'data', 'results.items'
          type: string
        responsePathFallback:
          description: >-
            Fallback JMESPath when the primary responsePath returns null.

            Handles polymorphic responses where the array may be at a different
            path

            (e.g., TestrRail suites: 'suites' normally, 'root_array' for
            single-suite projects).
          type: string
        responseValidation:
          $ref: '#/components/schemas/ResponseValidation'
          description: Validation rules for API response success/error handling
        syntheticPrimaryKey:
          $ref: '#/components/schemas/SyntheticPrimaryKeyConfig'
          description: >-
            Synthetic primary key configuration. When present, generates a
            unique ID

            by hashing the specified fields. The primaryKey field becomes the
            output

            field name where the hash is stored (e.g., primaryKey: "id").
      required:
        - primaryKey
      type: object
    TapRetentionPolicy:
      description: >-
        =============================================================================

        Retention Policy

        =============================================================================

        Data retention policy for a tap's source API.

        When set, enables proactive alerting when ingestion gaps risk

        permanent data loss due to source-side retention expiry.
      properties:
        alertThresholdDays:
          description: |-
            Alert when remaining coverage buffer drops below this many days.
            Default: 7 days (alert fires when we are 7 days from losing data).
          format: int64
          type: integer
        retentionDays:
          description: |-
            Maximum number of days the source API retains historical data.
            After this window, data is permanently unrecoverable.
            Example: Google Meet API = 30 days, Zoom Reports = 180 days.
          format: int64
          type: integer
      required:
        - retentionDays
      type: object
    TapSyncConfig:
      description: >-
        =============================================================================

        Sync Configuration

        =============================================================================

        Sync strategy and incremental parameters for a tap.
      properties:
        asyncQuery:
          $ref: '#/components/schemas/AsyncQueryConfig'
          description: >-
            Async query configuration for APIs that use a create-poll-fetch
            pattern

            (e.g., Microsoft Purview audit logs). When present, the ingestion
            engine

            POSTs to create a query job, polls for completion, then fetches
            paginated results.
        cursorField:
          description: |-
            Cursor field for incremental sync watermarks (e.g., 'updated_at').
            Required when mode = INCREMENTAL.
          type: string
        cursorValueFormat:
          $ref: '#/components/schemas/IncrementalTimeFormatEnum'
          description: >-
            Format of raw cursorField values on API records (partial watermark
            only).

            Stored control-plane watermarks remain ISO8601.
        incrementalParams:
          $ref: '#/components/schemas/IncrementalParamsConfig'
          description: Configuration for incremental time-based filtering
        maxLookbackDays:
          description: >-
            Maximum lookback days for the initial sync (no watermark).  When
            set, the

            first-run window is capped to min(defaultLookbackDays,
            maxLookbackDays).

            Use for APIs with data retention limits (e.g., Zoom Report API
            rejects

            queries older than 12 months).
          format: int64
          type: integer
        mode:
          $ref: '#/components/schemas/SyncModeEnum'
          description: 'Sync mode: FULL extracts all records, INCREMENTAL uses watermarks'
        scopes:
          description: >-
            OAuth scopes required for this tap (e.g., Google Workspace
            per-service scopes)
          items:
            type: string
          type: array
      required:
        - mode
      type: object
    TapTransportOption:
      description: >-
        =============================================================================

        Transport Options

        =============================================================================

        A prioritized transport option for executing a tap.

        Taps can define multiple options and the runtime chooses by priority.
      properties:
        apiType:
          $ref: '#/components/schemas/ApiTypeEnum'
          description: API transport type for this option
        errorBodyRules:
          description: >-
            Rules for disambiguating HTTP error responses by inspecting the
            response body.

            Allows overriding the default error classification
            (transient/permanent/skippable)

            based on status code + body content.
          items:
            $ref: '#/components/schemas/ErrorBodyRule'
          type: array
        graphqlConfig:
          $ref: '#/components/schemas/GraphQLEndpointConfig'
          description: GraphQL endpoint configuration (when apiType = GRAPHQL)
        pagination:
          $ref: '#/components/schemas/PaginationConfig'
          description: Pagination configuration for this transport option
        paginationHook:
          description: Optional hook reference for custom pagination behavior
          type: string
        priority:
          description: Execution priority (1 is highest priority)
          format: double
          type: number
        restConfig:
          $ref: '#/components/schemas/RestEndpointConfig'
          description: REST endpoint configuration (when apiType = REST)
        skipOnHttpStatus:
          description: >-
            HTTP status codes to skip gracefully for requests made with this
            transport option

            (e.g., Notion block fan-out returning 400 for unsupported block
            types).

            When unset, tap-level skipOnHttpStatus applies.
          items:
            format: double
            type: number
          type: array
      required:
        - priority
        - apiType
        - pagination
      type: object
    TapDomainDateCreditingModeEnum:
      description: How Bronze I coverage credits calendar days for a connector tap.
      enum:
        - business_date
        - execution_date
        - sync_window
      type: string
    QualityRuleConfig:
      description: Discriminated union of all quality rule variants.
      discriminator:
        mapping:
          dupe_rate:
            $ref: '#/components/schemas/DupeRateRule'
          no_future_timestamp:
            $ref: '#/components/schemas/NoFutureTimestampRule'
          null_rate:
            $ref: '#/components/schemas/NullRateRule'
          referential_integrity:
            $ref: '#/components/schemas/ReferentialIntegrityRule'
          row_count_not_suspicious:
            $ref: '#/components/schemas/RowCountNotSuspiciousRule'
          string_pattern_rate:
            $ref: '#/components/schemas/StringPatternRateRule'
          temporal_order:
            $ref: '#/components/schemas/TemporalOrderRule'
          timeline_gaps:
            $ref: '#/components/schemas/TimelineGapsRule'
          timestamp_coverage:
            $ref: '#/components/schemas/TimestampCoverageRule'
        propertyName: type
      oneOf:
        - $ref: '#/components/schemas/NullRateRule'
        - $ref: '#/components/schemas/DupeRateRule'
        - $ref: '#/components/schemas/TimestampCoverageRule'
        - $ref: '#/components/schemas/TemporalOrderRule'
        - $ref: '#/components/schemas/NoFutureTimestampRule'
        - $ref: '#/components/schemas/TimelineGapsRule'
        - $ref: '#/components/schemas/StringPatternRateRule'
        - $ref: '#/components/schemas/ReferentialIntegrityRule'
        - $ref: '#/components/schemas/RowCountNotSuspiciousRule'
    TapSpcConfig:
      properties:
        minHistoryForViolation:
          description: >-
            Signed 64-bit integer; range bounded by JavaScript's safe-integer
            ceiling.
          format: int64
          type: integer
        trackedSeries:
          items:
            $ref: '#/components/schemas/SpcSeriesKind'
          type: array
        windowSize:
          description: >-
            Signed 64-bit integer; range bounded by JavaScript's safe-integer
            ceiling.
          format: int64
          type: integer
      required:
        - windowSize
        - trackedSeries
        - minHistoryForViolation
      type: object
    RetryConfig:
      description: Retry behavior for rate-limited or failed requests.
      properties:
        backoffMultiplier:
          description: Multiplier for exponential backoff between retries
          format: double
          type: number
        maxRetries:
          description: Maximum number of retries before failing
          format: double
          type: number
        maxRetryTimeSeconds:
          description: Maximum total retry time in seconds before giving up
          format: int64
          type: integer
        respectRetryAfter:
          description: Whether to respect Retry-After headers from the API
          type: boolean
      type: object
    ResponseFormatEnum:
      description: >-
        Wire format of a successful HTTP response body, controlling how the

        ingestion engine turns the body into records before responsePath
        extraction.
      enum:
        - json
        - jsonl
      type: string
    ResponseValidation:
      description: Validation rules for API response handling.
      properties:
        errorField:
          description: Field containing error code/message (e.g., 'error')
          type: string
        okField:
          description: Field indicating success in response body (e.g., 'ok')
          type: string
        skippableErrors:
          description: >-
            Application-level errors to treat as empty results (e.g.,
            'channel_not_found')
          items:
            type: string
          type: array
        transientErrors:
          description: >-
            Application-level errors that are transient and should be retried
            (e.g., 'ratelimited')
          items:
            type: string
          type: array
      required:
        - okField
        - errorField
      type: object
    SyntheticPrimaryKeyConfig:
      description: >-
        =============================================================================

        Synthetic Primary Key Types

        =============================================================================

        Configuration for generating a synthetic primary key by hashing multiple
        fields.

        When present on a tap, the engine concatenates the specified fields
        (JMESPath for

        nested paths such as id.time), hashes them, and injects the result into
        the record.

        Uses outputField when set; otherwise falls back to primaryKey as the
        output field name.
      properties:
        algorithm:
          $ref: '#/components/schemas/SyntheticKeyAlgorithm'
          description: 'Hash algorithm (default: sha1)'
        fields:
          description: Record fields to concatenate for hash input
          items:
            type: string
          type: array
        outputField:
          description: 'Top-level record field for the hash (default: tap primaryKey)'
          type: string
        separator:
          description: 'Separator between field values (default: ''|'')'
          type: string
      required:
        - fields
      type: object
    AsyncQueryConfig:
      description: |-
        Configuration for asynchronous create-poll-fetch query execution.
        Used by APIs that require submitting a query, polling for completion,
        and then fetching results from a separate endpoint.
      properties:
        externalLinksPath:
          description: >-
            JMESPath to an array of presigned result links on a chunk payload

            (Databricks EXTERNAL_LINKS disposition). When set, chunk fetch
            downloads

            result bytes from those URLs instead of reading rows out of the
            chunk

            response. Presigned URLs carry their own credentials, so the
            download is

            issued without the connector's Authorization header.
          type: string
        failureValue:
          description: Status value indicating the query failed (optional)
          type: string
        failureValues:
          description: |-
            Additional terminal failure status values (optional). Merged with
            failureValue when present so vendors with several terminal failure
            states (e.g. Databricks FAILED/CANCELED/CLOSED) do not stall until
            maxPollSeconds.
          items:
            type: string
          type: array
        maxPollSeconds:
          description: 'Maximum seconds to poll before treating as a timeout (default: 3600)'
          format: int64
          type: integer
        pollIntervalSeconds:
          description: 'Seconds between status poll requests (default: 30)'
          format: int64
          type: integer
        queryIdPath:
          description: JMESPath to extract the query ID from the create-query response
          type: string
        recordsEndpoint:
          description: Endpoint template for fetching results (use {queryId} placeholder)
          type: string
        recordsPagination:
          $ref: '#/components/schemas/PaginationConfig'
          description: Pagination config for the results endpoint
        recordsQueryParams:
          description: Query parameters for the results endpoint
          type: object
        recordsResponsePath:
          description: JMESPath to extract records from the results response
          type: string
        statusEndpoint:
          description: Endpoint template for polling status (use {queryId} placeholder)
          type: string
        statusPath:
          description: JMESPath to extract status string from the poll response
          type: string
        successValue:
          description: Status value indicating the query completed successfully
          type: string
      required:
        - queryIdPath
        - statusEndpoint
        - statusPath
        - successValue
        - recordsEndpoint
        - recordsResponsePath
      type: object
    IncrementalTimeFormatEnum:
      description: Format for incremental sync time parameters.
      enum:
        - iso8601
        - iso8601_z
        - iso8601_seconds_z
        - unix
        - unix_millis
        - unix_micros
        - date_slash
        - date
      type: string
    IncrementalParamsConfig:
      description: Configuration for incremental sync time-based filtering.
      properties:
        bodyFilterEndPath:
          description: |-
            Optional second POST-body path for the window end bound (e.g. monday
            activity_logs variables.to alongside variables.from).
          type: string
        bodyFilterFormat:
          $ref: '#/components/schemas/IncrementalTimeFormatEnum'
          description: Format for body filter timestamp value
        bodyFilterPath:
          description: Dot-notation path in POST body for time filter injection
          type: string
        bodyFilterTemplate:
          description: >-
            Template for body filter with {window_start} and {window_end}
            placeholders
          type: string
        defaultLookaheadDays:
          description: >-
            Days to extend the sync window end beyond "now" (UTC) for
            forward-looking

            taps (e.g. calendar APIs). When set and no explicit backfill end is
            supplied,

            window_end becomes now plus min(defaultLookaheadDays,
            maxLookaheadDays) when

            maxLookaheadDays is set, else now plus defaultLookaheadDays. Omitted
            or zero

            preserves the historical end at "now".
          format: int64
          type: integer
        filterType:
          $ref: '#/components/schemas/IncrementalFilterTypeEnum'
          description: Type of incremental filtering to apply
        maxLookaheadDays:
          description: >-
            Upper bound on forward extension when defaultLookaheadDays is set.
            Caps

            first-run and incremental upper bounds the same way maxLookbackDays
            caps

            initial lookback.
          format: int64
          type: integer
        maxWindowDays:
          description: >-
            Maximum number of days per sync window. APIs with date range limits
            (e.g., Microsoft Graph 30 days, Zoom 30 days) are automatically
            split into sub-windows.
          format: int64
          type: integer
        queryParam:
          description: Query parameter for template-based filters (e.g., 'q' for Gmail)
          type: string
        queryTemplate:
          description: Template with {window_start} and {window_end} placeholders
          type: string
        sinceFormat:
          $ref: '#/components/schemas/IncrementalTimeFormatEnum'
          description: Format for the since parameter value
        sinceParam:
          description: Query parameter name for start time filter (e.g., 'since', 'oldest')
          type: string
        untilFormat:
          $ref: '#/components/schemas/IncrementalTimeFormatEnum'
          description: Format for the until parameter value
        untilParam:
          description: Query parameter name for end time filter (e.g., 'until', 'latest')
          type: string
      type: object
    SyncModeEnum:
      description: Sync strategy for a tap.
      enum:
        - full
        - incremental
      type: string
    ApiTypeEnum:
      description: |-
        API transport protocol.
        Determines how requests are constructed and executed.
      enum:
        - rest
        - graphql
        - database
        - file
        - custom
      type: string
    GraphQLEndpointConfig:
      description: |-
        GraphQL API endpoint configuration.
        For connectors that use GraphQL APIs (e.g., Linear).
      properties:
        endpoint:
          description: GraphQL endpoint path
          type: string
        operationName:
          description: GraphQL operation name
          type: string
        query:
          description: GraphQL query or mutation string
          type: string
        variables:
          description: Static variables to include in every request
          type: object
      required:
        - endpoint
        - query
      type: object
    PaginationConfig:
      description: >-
        =============================================================================

        Pagination

        =============================================================================

        Pagination configuration for a tap endpoint.
      properties:
        cursor:
          $ref: '#/components/schemas/CursorPaginationConfig'
          description: Cursor pagination settings (when type = CURSOR)
        offset:
          $ref: '#/components/schemas/OffsetPaginationConfig'
          description: Offset pagination settings (when type = OFFSET)
        pageNumber:
          $ref: '#/components/schemas/PageNumberPaginationConfig'
          description: Page number pagination settings (when type = PAGE_NUMBER)
        sessionPage:
          $ref: '#/components/schemas/SessionPagePaginationConfig'
          description: Session + page pagination settings (when type = SESSION_PAGE)
        type:
          $ref: '#/components/schemas/PaginationTypeEnum'
          description: Pagination strategy type
      required:
        - type
      type: object
    RestEndpointConfig:
      description: >-
        Connector Tap Definition

        A tap represents a single data stream (e.g., repos, issues, users).

        Each tap defines how to extract one entity type from an API.

        Taps are API-type-aware: REST taps use RestEndpointConfig,

        GraphQL taps use GraphQLEndpointConfig.

        =============================================================================

        Endpoint Configurations

        =============================================================================

        REST API endpoint configuration.

        Supports template variables resolved from workspace config or parent tap
        records.

        Examples: '/orgs/{orgId}/repos', '/repos/{full_name}/issues'
      properties:
        batch:
          $ref: '#/components/schemas/RestBatchConfig'
          description: >-
            Optional batch packer config for Google-style multipart/mixed batch
            APIs.

            When set, the runtime packs one sub-request per parent record (built
            from

            this RestEndpointConfig's endpoint/method/headers) into a single

            multipart/mixed POST to `batch.endpoint`. When the tap declares

            `perParentAuth`, each sub-request gets its own `Authorization`
            header so

            it impersonates the parent user (Google domain-wide delegation).
            When

            `perParentAuth` is omitted, the outer POST's auth applies to every

            sub-request -- used for admin-token detail taps such as Drive
            Docs/Sheets.

            When unset, the runtime executes one HTTP request per parent record.
        bodyEncoding:
          $ref: '#/components/schemas/BodyEncodingEnum'
          description: >-
            Serialization for the POST/PUT/PATCH body. Defaults to JSON when
            null. Set

            to FORM (application/x-www-form-urlencoded) for APIs that reject a
            JSON

            body, e.g. Mixpanel's Engage query API.
        endpoint:
          description: |-
            API endpoint path (supports {variable} templates).
            Variables are resolved from parent tap records or workspace config.
          type: string
        headers:
          description: Additional headers to include
          type: object
        method:
          $ref: '#/components/schemas/HttpMethodEnum'
          description: 'HTTP method (default: GET)'
        parentDataFilterBodyInject:
          $ref: '#/components/schemas/ParentDataFilterBodyInject'
          description: >-
            Optional inject of workspace parentDataFilters values into
            requestBody.

            Used by root taps that take an allowlist array (e.g. Purview

            userPrincipalNameFilters) without depending on a parent tap.
        parentDataFilterQueryInject:
          $ref: '#/components/schemas/ParentDataFilterQueryInject'
          description: >-
            Optional inject of workspace parentDataFilters values into a query
            param

            (typically $filter). Used by root taps that take an allowlist in the

            query string without depending on a parent tap.
        pathParamEncodings:
          description: >-
            Optional encoding rules for path template placeholders. Keys are
            placeholder

            names without braces; values select a runtime encoding (e.g.

            zoom_meeting_uuid for Zoom meeting instance UUIDs that contain
            slashes).
          type: object
        queryParams:
          description: Default query parameters to include
          type: object
        requestBody:
          description: Request body template (for POST endpoints, e.g., Notion search)
          type: object
      required:
        - endpoint
        - method
      type: object
    DupeRateRule:
      properties:
        maxRate:
          format: double
          type: number
        type:
          $ref: '#/components/schemas/QualityRuleTypeEnum'
      required:
        - type
        - maxRate
      type: object
    NoFutureTimestampRule:
      properties:
        maxViolations:
          description: >-
            Signed 64-bit integer; range bounded by JavaScript's safe-integer
            ceiling.
          format: int64
          type: integer
        type:
          $ref: '#/components/schemas/QualityRuleTypeEnum'
      required:
        - type
        - maxViolations
      type: object
    NullRateRule:
      properties:
        maxRate:
          format: double
          type: number
        type:
          $ref: '#/components/schemas/QualityRuleTypeEnum'
      required:
        - type
        - maxRate
      type: object
    ReferentialIntegrityRule:
      description: 'Quality rule: foreign key must exist in referenced dataset.'
      properties:
        localColumn:
          type: string
        maxOrphanRate:
          format: double
          type: number
        referencedColumn:
          type: string
        referencedDatasetId:
          type: string
        type:
          $ref: '#/components/schemas/QualityRuleTypeEnum'
      required:
        - type
        - localColumn
        - referencedDatasetId
        - referencedColumn
        - maxOrphanRate
      type: object
    RowCountNotSuspiciousRule:
      properties:
        suspiciousCounts:
          items:
            description: >-
              Signed 64-bit integer; range bounded by JavaScript's safe-integer
              ceiling.
            format: int64
            type: integer
          type: array
        type:
          $ref: '#/components/schemas/QualityRuleTypeEnum'
      required:
        - type
        - suspiciousCounts
      type: object
    StringPatternRateRule:
      properties:
        column:
          type: string
        maxRate:
          format: double
          type: number
        pattern:
          type: string
        type:
          $ref: '#/components/schemas/QualityRuleTypeEnum'
      required:
        - type
        - column
        - pattern
        - maxRate
      type: object
    TemporalOrderRule:
      properties:
        maxViolations:
          description: >-
            Signed 64-bit integer; range bounded by JavaScript's safe-integer
            ceiling.
          format: int64
          type: integer
        type:
          $ref: '#/components/schemas/QualityRuleTypeEnum'
      required:
        - type
        - maxViolations
      type: object
    TimelineGapsRule:
      properties:
        maxGapDays:
          description: Signed integer count of days
          format: int64
          type: integer
        type:
          $ref: '#/components/schemas/QualityRuleTypeEnum'
      required:
        - type
        - maxGapDays
      type: object
    TimestampCoverageRule:
      properties:
        minRate:
          format: double
          type: number
        type:
          $ref: '#/components/schemas/QualityRuleTypeEnum'
      required:
        - type
        - minRate
      type: object
    SpcSeriesKind:
      description: |-
        Tracked SPC series kind. Also used by TapSpcConfig.trackedSeries to
        declare which series the cron should monitor.
      enum:
        - TABLE_ROW_COUNT
        - COLUMN_NULL_PCT
        - COLUMN_VALIDATION_FAILURE_PCT
        - COLUMN_DISTINCT_COUNT
        - COLUMN_AVG
      type: string
    SyntheticKeyAlgorithm:
      description: Hash algorithm for generating synthetic primary keys.
      enum:
        - sha1
        - sha256
      type: string
    IncrementalFilterTypeEnum:
      description: Type of incremental filtering to apply.
      enum:
        - simple
        - query_template
        - body_filter
      type: string
    CursorPaginationConfig:
      description: Configuration for cursor-based pagination.
      properties:
        cursorBodyPath:
          description: >-
            Dot-notation path inside the POST request body where the cursor must
            be

            injected for the next page (e.g., 'cursor', 'variables.after').

            When set, the cursor is written into the body instead of the query
            string.

            Required for APIs that paginate POST endpoints with a body cursor
            (e.g.,

            Gong /v2/calls/extensive).
          type: string
        cursorIsFullUrl:
          description: >-
            When true, the cursor value is an absolute URL (e.g., OData
            @odata.nextLink)
          type: boolean
        cursorParam:
          description: 'Query parameter name for cursor (default: ''cursor'')'
          type: string
        cursorPath:
          description: JMESPath to extract next cursor from response
          type: string
        hasMorePath:
          description: JMESPath to check if more pages exist
          type: string
        nextCursorPath:
          description: JMESPath to extract the next cursor from the nextQuery response.
          type: string
        nextDataPath:
          description: JMESPath to extract records from the nextQuery response.
          type: string
        nextQuery:
          description: >-
            GraphQL query used to fetch subsequent pages when the API requires a

            different query to continue a cursor. Example: monday.com fetches
            the first

            page via boards { items_page }, then continues with
            next_items_page(cursor).
          type: string
      required:
        - cursorPath
      type: object
    OffsetPaginationConfig:
      description: Configuration for offset-based pagination.
      properties:
        defaultLimit:
          description: Default page size
          format: int64
          type: integer
        limitParam:
          description: 'Query parameter name for limit (default: ''limit'')'
          type: string
        maxLimit:
          description: Maximum page size allowed by API
          format: int64
          type: integer
        nextPageLinkPath:
          description: >-
            When set, offset pagination mirrors TestRail-style responses:
            continue only

            while this path is non-null (e.g. `_links.next`), and advance offset
            by

            `defaultLimit` per page instead of the returned record count.
          type: string
        offsetParam:
          description: 'Query parameter name for offset (default: ''offset'')'
          type: string
        totalPath:
          description: JMESPath to extract total count
          type: string
      required:
        - defaultLimit
      type: object
    PageNumberPaginationConfig:
      description: Configuration for page number pagination.
      properties:
        defaultPageSize:
          description: Default page size
          format: int64
          type: integer
        pageParam:
          description: 'Query parameter name for page (default: ''page'')'
          type: string
        pageSizeParam:
          description: 'Query parameter name for page size (default: ''per_page'')'
          type: string
        paramLocation:
          description: Where page/pageSize travel for POST endpoints (body or query).
          type: string
        totalPagesPath:
          description: JMESPath to extract total pages
          type: string
      required:
        - defaultPageSize
      type: object
    SessionPagePaginationConfig:
      description: Configuration for Mixpanel-style session_id + page pagination.
      properties:
        defaultPageSize:
          description: Default page size used to detect the last page
          format: int64
          type: integer
        pageParam:
          description: 'Query/body parameter name for page (default: ''page'')'
          type: string
        pagePath:
          description: JMESPath to extract the current page from the response
          type: string
        sessionIdParam:
          description: 'Query/body parameter name for session id (default: ''session_id'')'
          type: string
        sessionIdPath:
          description: JMESPath to extract session id from the response
          type: string
      required:
        - defaultPageSize
      type: object
    PaginationTypeEnum:
      description: Pagination strategy for API endpoints.
      enum:
        - link_header
        - cursor
        - offset
        - page_number
        - session_page
        - none
      type: string
    RestBatchConfig:
      description: >-
        Batch packer configuration for Google-style multipart/mixed batch
        endpoints

        (e.g., Gmail https://gmail.googleapis.com/batch/gmail/v1, Drive

        https://www.googleapis.com/batch/drive/v3). Used to bundle
        high-cardinality

        detail fetches (one sub-request per parent record) into a single HTTP
        round

        trip. Requires the tap's pagination type to be `none` (one sub-response
        per

        parent). `perParentAuth` is optional: when present each sub-request is

        authed per parent (DWD), when absent the outer POST's auth applies to
        all

        sub-requests.
      properties:
        endpoint:
          description: |-
            Multipart batch endpoint URL. Always invoked with POST and
            `Content-Type: multipart/mixed; boundary=...`.
          type: string
        format:
          description: >-
            Batch wire format. Null or absent = Google-style multipart/mixed
            (default).

            "json" = JSON batch (e.g., Microsoft Graph $batch, OData $batch).
          type: string
        maxSubRequests:
          description: |-
            Maximum sub-requests packed into a single multipart body. Google
            recommends <= 100 sub-requests per batch. Typical value: 50.
          format: double
          type: number
      required:
        - endpoint
        - maxSubRequests
      type: object
    BodyEncodingEnum:
      description: Serialization of a POST/PUT/PATCH request body for a REST endpoint.
      enum:
        - json
        - form
      type: string
    HttpMethodEnum:
      description: HTTP method for API calls.
      enum:
        - GET
        - POST
        - PUT
        - PATCH
        - DELETE
      type: string
    ParentDataFilterBodyInject:
      description: |-
        When set on RestEndpointConfig, the tap (typically a root tap) injects
        ingestionConfig.parentDataFilters[filterKey].values into requestBody at
        bodyPath. No parent-tap fan-out or frontier is required.
      properties:
        bodyPath:
          description: >-
            Top-level requestBody key that receives the values array.

            Example: 'userPrincipalNameFilters' for Microsoft Purview audit
            queries.
          type: string
        field:
          description: >-
            Expected parentDataFilters[filterKey].field. Values are injected
            as-is

            when the field matches; field mismatch or empty values skip the tap

            (fail closed). When the filter key is absent, the body key is
            omitted

            (workspace-wide).
          type: string
        filterKey:
          description: Key under ingestionConfig.parentDataFilters (e.g. 'users').
          type: string
      required:
        - filterKey
        - bodyPath
        - field
      type: object
    ParentDataFilterQueryInject:
      description: >-
        When set on RestEndpointConfig, the tap injects

        ingestionConfig.parentDataFilters[filterKey].values into a query
        parameter.

        Two modes:

        1) OData expression (Microsoft): set clauseTemplate + join/combine
        operators

        to build a $filter string.

        2) Repeated list values (Claude Compliance actor_ids[]): omit
        clauseTemplate;

        values are passed as a list on queryParam (doseq-encoded).
      properties:
        chunkSize:
          description: >-
            Max values per request. Null uses the runtime default (10 for OData

            mode, 50 for repeated-list mode). Both defaults keep the encoded
            query

            string under the common 8KB request-line cap.
          format: double
          type: number
        clauseTemplate:
          description: >-
            Per-value clause with '{value}' placeholder for OData expression
            mode.

            Example: "userPrincipalName eq '{value}'".

            Null selects repeated-list mode (values set as a list on
            queryParam).
          type: string
        combineOperator:
          $ref: '#/components/schemas/ParentDataFilterCombineOperatorEnum'
          description: |-
            How to combine the joined clauses with an existing queryParam value
            (OData mode only). When the query param is absent, only the joined
            clauses are used.
        field:
          description: >-
            Expected parentDataFilters[filterKey].field. Values are injected
            when the

            field matches; field mismatch or empty values skip the tap (fail
            closed).

            When the filter key is absent, no inject runs (workspace-wide).
          type: string
        filterKey:
          description: Key under ingestionConfig.parentDataFilters (e.g. 'users').
          type: string
        joinOperator:
          $ref: '#/components/schemas/ParentDataFilterJoinOperatorEnum'
          description: How to join multiple value clauses (OData mode only).
        normalize:
          $ref: '#/components/schemas/ParentDataFilterNormalizeEnum'
          description: Optional value normalization before render / inject.
        queryParam:
          description: |-
            Query parameter name that receives the filter.
            Examples: '$filter' (OData), 'actor_ids[]' (repeated list).
          type: string
      required:
        - filterKey
        - field
        - queryParam
      type: object
    QualityRuleTypeEnum:
      description: |-
        Discriminator literal for the QualityRuleConfig union variants.
        The wire/storage value is the snake_case form.
      enum:
        - null_rate
        - dupe_rate
        - timestamp_coverage
        - temporal_order
        - no_future_timestamp
        - timeline_gaps
        - string_pattern_rate
        - referential_integrity
        - row_count_not_suspicious
      type: string
    ParentDataFilterCombineOperatorEnum:
      description: |-
        How parentDataFilterQueryInject combines joined clauses with an existing
        query param value (typically a time-window $filter).
      enum:
        - and
        - or
      type: string
    ParentDataFilterJoinOperatorEnum:
      description: How parentDataFilterQueryInject joins multiple per-value clauses.
      enum:
        - or
        - and
      type: string
    ParentDataFilterNormalizeEnum:
      description: |-
        Optional value normalization before parentDataFilterQueryInject renders
        clauseTemplate. Unrecognized values must fail at schema validation time
        (not silently no-op at runtime).
      enum:
        - lowercase
      type: string
  securitySchemes:
    bearerAuth:
      bearerFormat: JWT
      scheme: bearer
      type: http

````