{
  "schema": "aaes/capability-pack/1",
  "provider": "fivetran",
  "version": "1.0.0",
  "description": "Read Fivetran destinations, connector types, and connections; update connection settings, start syncs or historical re-syncs, and delete connections. Updates can resume scheduled data movement or carry source credentials.",
  "notes": "The endpoint host 'fivetran-api.invalid' is a reserved non-production placeholder (an RFC 2606 reserved TLD): substitute Fivetran's real API host api.fivetran.com before enabling, in every endpoint, in the resource locator and in every egress allowlist entry — the allowlist matches exactly, so all three must be substituted together, and substitution is a required deployment step. The placeholder stands in for a single global API host that serves every Fivetran account (there is no per-tenant hostname); the account scoping comes from the API key, not the host.\n\nCONNECTION_ID in the paths is a placeholder the deployment binds to a concrete connection before enabling.\n\nNaming and versioning: Fivetran renamed 'connectors' to 'connections' in the current REST API; this pack registers the current /v1/connections/... paths (the legacy /v1/connectors/... aliases still serve the same operations but are not registered). The current API negotiates version 2 through the Accept header (application/json;version=2); the documented examples set it, and how the HTTP connector pins that header is a deployment binding decision — the registration records the endpoint, and a response rendered under a different negotiated version is a compatibility review, not a different capability.\n\nApproval classification: sync and re-sync are registered with the deploy action at the minimum R3 tier rather than as ordinary executions — a sync moves customer data from source systems into the destination, and a historical re-sync re-reads the source and rewrites destination tables, so both are data-movement operations whose scope of impact is the connected systems; deploy is one of the designated actions requiring human approval.\n\nDocumented exclusions — this pack does not register: connection creation (POST /v1/connections), because its config/auth payload embeds the source system's credentials and writing third-party secrets through a governed capability needs its own credential-handling review; Retrieve Connection Details (GET /v1/connections/{connectionId}), because the fetched connection-details page's response EXAMPLE echoes a credential-valued config field (api_key) — the example does not prove live responses return unmasked secrets, but the response must be treated as credential-bearing until proven otherwise, and a read that may return live secrets is excluded until the deployment demonstrates log and trace hygiene for response bodies (the collection read is registered instead); Move a Connection (POST /v1/connections/{connectionId}/move), whose BACKFILL and CONTINUE_WITH_DATA behaviors copy or rewrite data between destinations — transfer-class semantics requiring a separate review; the connection schema configuration endpoints (including PATCH schema/table/column config and drop-columns, which deletes columns from the destination); Run Connection Setup Tests; and the rest of the account-administration surface — users, teams, roles, system keys, certificates, external secrets managers, hybrid deployment agents, private links and webhooks (destination WRITES stay excluded; destination listing is registered above) — none of which the integration this pack models requires.",
  "credential": {
    "secret_ref_id": "secret-ref-fivetran-api-key",
    "custody": "customer_vault",
    "inject": "header",
    "inject_name": "Authorization",
    "note": "A Fivetran API key-secret pair, held in the client's own secret manager. The stored material must be the complete Authorization header value: the scheme 'Basic', one separating space, then the base64 of 'api_key:api_secret' — 'Basic <base64(api_key:api_secret)>'.\n\nToken issuance is external and manual: a key is generated in the Fivetran dashboard (username > API Key), and Fivetran shows the secret only once at generation; the deployment stores the encoded header value under this reference and the executor injects it verbatim — the injector performs no key lifecycle itself.\n\nA scoped API key is tied to the Fivetran user who generated it and inherits that user's RBAC permissions, tracking any later permission changes: generate the key from a dedicated least-privilege service user whose role covers only the groups and operations this pack registers (Fivetran also documents organization-managed System keys and, in private preview, service-account keys — either is preferable to a personal user's key where the plan supports it).\n\nExpiry and revocation: the pair does not expire on its own; regenerating the API secret instantly invalidates the old key-secret pair, and deleting the owning user deletes and revokes the key — because every request is authenticated against the key, revocation takes effect on the next call and there is no already-issued token that outlives it. An invalid pair fails closed with a 401.\n\nExecutor hygiene: the value must live only in executor memory for the lifetime of a call, must never be written to logs, traces or diagnostics, and must not appear in crash dumps; a deployment that cannot meet that bar must not enable the pack."
  },
  "capabilities": [
    {
      "capability_id": "fivetran.destinations.read",
      "version": "1.0.0",
      "kind": "tool",
      "risk_tier": "R0",
      "owner": "REPLACE-WITH-ACCOUNTABLE-HUMAN",
      "data_class": "internal",
      "egress_allowlist": [
        "fivetran-api.invalid"
      ],
      "endpoint": "https://fivetran-api.invalid/v1/destinations",
      "method": "GET",
      "connector": "http",
      "custody": "customer_vault",
      "secret_ref_id": "secret-ref-fivetran-api-key",
      "inject": "header",
      "inject_name": "Authorization",
      "actions": [
        "read"
      ],
      "resource_id": "fivetran-account",
      "description": "List the account's destinations; this pack registers the collection read only — single-destination reads are not registered. Destination records reveal where the organization lands its replicated data (service, region, group ids), which is internal infrastructure information.\n\nThe host is a reserved placeholder: substitute api.fivetran.com before enabling.",
      "requires_review": true
    },
    {
      "capability_id": "fivetran.metadata.connectors.read",
      "version": "1.0.0",
      "kind": "tool",
      "risk_tier": "R0",
      "owner": "REPLACE-WITH-ACCOUNTABLE-HUMAN",
      "data_class": "internal",
      "egress_allowlist": [
        "fivetran-api.invalid"
      ],
      "endpoint": "https://fivetran-api.invalid/v1/metadata/connector-types",
      "method": "GET",
      "connector": "http",
      "custody": "customer_vault",
      "secret_ref_id": "secret-ref-fivetran-api-key",
      "inject": "header",
      "inject_name": "Authorization",
      "actions": [
        "read"
      ],
      "resource_id": "fivetran-account",
      "description": "List the available connector types and their internal service identifiers and configuration schemas — vendor catalog information used to build connection requests, classified as internal data because the response drives downstream provisioning decisions. The registered path is the current '/v1/metadata/connector-types' shown on the fetched metadata-connectors reference page (the legacy '/v1/metadata/connectors' path was sunset in 2022).\n\nThe host is a reserved placeholder: substitute api.fivetran.com before enabling.",
      "requires_review": true
    },
    {
      "capability_id": "fivetran.connections.read",
      "version": "1.0.0",
      "kind": "tool",
      "risk_tier": "R0",
      "owner": "REPLACE-WITH-ACCOUNTABLE-HUMAN",
      "data_class": "internal",
      "egress_allowlist": [
        "fivetran-api.invalid"
      ],
      "endpoint": "https://fivetran-api.invalid/v1/connections",
      "method": "GET",
      "connector": "http",
      "custody": "customer_vault",
      "secret_ref_id": "secret-ref-fivetran-api-key",
      "inject": "header",
      "inject_name": "Authorization",
      "actions": [
        "read"
      ],
      "resource_id": "fivetran-account",
      "description": "List the account's connections (List All Connections); this pack registers the collection read only — Retrieve Connection Details (GET /v1/connections/{connectionId}) is deliberately not registered because the fetched connection-details page's response example echoes a credential-valued config field — the example does not prove live responses return unmasked secrets, but the detail response must be treated as credential-bearing until proven otherwise, and a read that may return live secrets needs a response-handling review this pack has not done.\n\nConnection records reveal which systems replicate into which destination, their schedules and their sync state — internal pipeline information.\n\nThe host is a reserved placeholder: substitute api.fivetran.com before enabling.",
      "requires_review": true
    },
    {
      "capability_id": "fivetran.connection.update",
      "version": "1.0.0",
      "kind": "tool",
      "risk_tier": "R3",
      "owner": "REPLACE-WITH-ACCOUNTABLE-HUMAN",
      "data_class": "internal",
      "egress_allowlist": [
        "fivetran-api.invalid"
      ],
      "endpoint": "https://fivetran-api.invalid/v1/connections/CONNECTION_ID",
      "method": "PATCH",
      "connector": "http",
      "custody": "customer_vault",
      "secret_ref_id": "secret-ref-fivetran-api-key",
      "inject": "header",
      "inject_name": "Authorization",
      "actions": [
        "update",
        "deploy"
      ],
      "resource_id": "fivetran-account",
      "description": "Update one connection's mutable fields — pausing and resuming (paused), the scheduling method (schedule_type auto or manual; setting manual makes every subsequent sync occur only through an explicit trigger call), the sync frequency and the networking settings. Resuming a paused connection or setting schedule_type to auto re-enables provider-side execution: Fivetran's scheduler then moves customer data on its own without traversing fivetran.connection.sync.trigger, so the update carries the deploy-class effect and the capability declares update and deploy at the minimum R3 tier.\n\nThis registration does not restrict which fields the request body may carry: the body can also carry config values, which for many services are source credentials, so a request body can itself contain live secrets and must be handled like one. A reviewer who intends pause-only must impose that in policy, because intended limits need a separate enforceable control. CONNECTION_ID is a placeholder the deployment binds before enabling.",
      "requires_review": true
    },
    {
      "capability_id": "fivetran.connection.sync.trigger",
      "version": "1.0.0",
      "kind": "tool",
      "risk_tier": "R3",
      "owner": "REPLACE-WITH-ACCOUNTABLE-HUMAN",
      "data_class": "internal",
      "egress_allowlist": [
        "fivetran-api.invalid"
      ],
      "endpoint": "https://fivetran-api.invalid/v1/connections/CONNECTION_ID/sync",
      "method": "POST",
      "connector": "http",
      "custody": "customer_vault",
      "secret_ref_id": "secret-ref-fivetran-api-key",
      "inject": "header",
      "inject_name": "Authorization",
      "actions": [
        "deploy",
        "delete"
      ],
      "resource_id": "fivetran-account",
      "description": "Trigger a data sync for one connection without waiting for its schedule. Registered with the deploy action at the minimum R3 tier rather than as an ordinary execution: the sync moves customer data from the source system into the destination, overwriting destination state, and that data movement is not reversed by a later call. Deploy is one of the designated actions requiring human approval.\n\nOn supported AAES-mediated execution paths, irreversible actions require approval by an authorized person; this does not prevent calls through bypass or observation-only paths.\n\nRequest body: the documented body is {\"force\": true|false}; the fetched sync-connection page confirms force=true 'will stop the sync and re-run it' — terminating an in-flight sync is a terminate-class, irreversible interruption (the interrupted sync's partial work is not rolled back), so the delete verb is declared alongside deploy; an empty body syncs only if the connection is idle. The registration does not restrict the body, so the interrupt-in-flight behavior is in scope. CONNECTION_ID is a placeholder the deployment binds before enabling.",
      "requires_review": true
    },
    {
      "capability_id": "fivetran.connection.resync",
      "version": "1.0.0",
      "kind": "tool",
      "risk_tier": "R3",
      "owner": "REPLACE-WITH-ACCOUNTABLE-HUMAN",
      "data_class": "internal",
      "egress_allowlist": [
        "fivetran-api.invalid"
      ],
      "endpoint": "https://fivetran-api.invalid/v1/connections/CONNECTION_ID/resync",
      "method": "POST",
      "connector": "http",
      "custody": "customer_vault",
      "secret_ref_id": "secret-ref-fivetran-api-key",
      "inject": "header",
      "inject_name": "Authorization",
      "actions": [
        "deploy"
      ],
      "resource_id": "fivetran-account",
      "description": "Trigger a full historical re-sync of a connection. Registered with the deploy action at the minimum R3 tier: a re-sync re-reads the source from the beginning and rewrites the destination tables — heavier than a sync on both the source system (full re-extract) and the destination (rewritten tables), and it is not reversed by a later call. Deploy is one of the designated actions requiring human approval.\n\nRequest body: the documented body is an optional scope object mapping schema names to non-empty arrays of table names; omitting it re-syncs every schema and table of the connection, which is the default a caller gets with an empty body. The API declines with 409 while another sync is in progress and re-syncs a paused connection when it is re-enabled — documented timing behaviors, not restrictions this pack imposes. CONNECTION_ID is a placeholder the deployment binds before enabling.",
      "requires_review": true
    },
    {
      "capability_id": "fivetran.connection.delete",
      "version": "1.0.0",
      "kind": "tool",
      "risk_tier": "R3",
      "owner": "REPLACE-WITH-ACCOUNTABLE-HUMAN",
      "data_class": "internal",
      "egress_allowlist": [
        "fivetran-api.invalid"
      ],
      "endpoint": "https://fivetran-api.invalid/v1/connections/CONNECTION_ID",
      "method": "DELETE",
      "connector": "http",
      "custody": "customer_vault",
      "secret_ref_id": "secret-ref-fivetran-api-key",
      "inject": "header",
      "inject_name": "Authorization",
      "actions": [
        "delete"
      ],
      "resource_id": "fivetran-account",
      "description": "Delete a connection from the Fivetran account. The pipeline definition — source configuration, sync cursor, schedule — is removed; recreating the connection later starts as a new pipeline (a new initial sync), not an undo of this call, and any downstream models or dashboards fed by the connection stop updating. Registered as delete at the minimum R3 tier; delete is one of the designated actions requiring human approval. CONNECTION_ID is a placeholder the deployment binds before enabling.",
      "requires_review": true
    }
  ],
  "resources": [
    {
      "resource_id": "fivetran-account",
      "kind": "api",
      "locator": "https://fivetran-api.invalid/v1",
      "data_class": "internal",
      "owner": "REPLACE-WITH-ACCOUNTABLE-HUMAN"
    }
  ],
  "review": {
    "state": "library",
    "date": "2026-09-22",
    "sources": [
      "https://fivetran.com/docs/rest-api/getting-started (retrieved 2026-09-21)",
      "https://fivetran.com/docs/developer-resources/rest-api/api-reference/connections (retrieved 2026-09-21)",
      "https://fivetran.com/docs/developer-resources/rest-api/api-reference/connections/sync-connection (retrieved 2026-09-21)",
      "https://fivetran.com/docs/rest-api/api-reference/connections/resync-connection (retrieved 2026-09-21)",
      "https://fivetran.com/docs/developer-resources/rest-api/api-reference/connections/delete-connection (retrieved 2026-09-21)",
      "https://fivetran.com/docs/rest-api/api-reference/destinations (retrieved 2026-09-21)",
      "https://fivetran.com/docs/rest-api/api-reference/connector-metadata/metadata-connectors (retrieved 2026-09-21)",
      "https://fivetran.com/docs/rest-api/api-reference/connections/connection-details (retrieved 2026-09-21)",
      "https://fivetran.com/docs/rest-api/api-reference/connections/list-connections (retrieved 2026-09-21)",
      "https://fivetran.com/docs/rest-api/api-reference/connections/modify-connection (retrieved 2026-09-21)"
    ],
    "reviewer_id": "aaes-eng"
  }
}
