---
title: "Update pipeline"
method: PATCH
path: "/pipelines/{id}"
tags: ["Pipelines"]
---

# Update pipeline

`PATCH /pipelines/{id}`

## Path parameters

- `id` string, required — Unique pipeline identifier (e.g. pipe_abc123).

## Request body

- object
  - `id` string — Optional pipeline identifier. If omitted, the service generates one (e.g. pipe_abc123).
  - `source` SourceConfig
    - `type` 'stripe', required
    - `stripe` SourceStripeConfig, required
      - `api_key` string, required — Stripe API key (sk_test_... or sk_live_...)
      - `account_id` string — Stripe account ID (resolved from API if omitted)
      - `account_created` integer — Stripe account creation timestamp in unix seconds (resolved from API if omitted)
      - `livemode` boolean — Whether this is a live mode sync
      - `api_version` '2026-03-25.dahlia' | '2026-02-25.clover' | '2026-01-28.clover' | '2025-12-15.clover' | '2025-11-17.clover' | '2025-10-29.clover' | '2025-09-30.clover' | '2025-08-27.basil' | '2025-07-30.basil' | '2025-06-30.basil' | '2025-05-28.basil' | '2025-04-30.basil' | '2025-03-31.basil' | '2025-02-24.acacia' | '2025-01-27.acacia' | '2024-12-18.acacia' | '2024-11-20.acacia' | '2024-10-28.acacia' | '2024-09-30.acacia' | '2024-06-20' | '2024-04-10' | '2024-04-03' | '2023-10-16' | '2023-08-16' | '2022-11-15' | '2022-08-01' | '2020-08-27' | '2020-03-02' | '2019-12-03' | '2019-11-05' | '2019-10-17' | '2019-10-08' | '2019-09-09' | '2019-08-14' | '2019-05-16' | '2019-03-14' | '2019-02-19' | '2019-02-11' | '2018-11-08' | '2018-10-31' | '2018-09-24' | '2018-09-06' | '2018-08-23' | '2018-07-27' | '2018-05-21' | '2018-02-28' | '2018-02-06' | '2018-02-05' | '2018-01-23' | '2017-12-14' | '2017-08-15'
      - `base_url` string, uri — Override the Stripe API base URL (e.g. http://localhost:12111 for stripe-mock)
      - `webhook_url` string, uri — URL for managed webhook endpoint registration
      - `webhook_secret` string — Webhook signing secret (whsec_...) for signature verification
      - `websocket` boolean — Enable WebSocket streaming for live events
      - `poll_events` boolean — Enable events API polling for incremental sync after backfill
      - `webhook_port` integer — Port for built-in webhook HTTP listener (e.g. 4242)
      - `revalidate_objects` string[] — Object types to re-fetch from Stripe API on webhook (e.g. ["subscription"])
      - `backfill_limit` integer — Max objects to backfill per stream (useful for testing)
      - `rate_limit` integer — Override max requests per second (default: auto-derived from API key mode — 20 live, 10 test).
  - `destination` union
    - object
      - `type` 'postgres', required
      - `postgres` DestinationPostgresConfig, required
        - `url` string — Postgres connection string
        - `connection_string` string — Deprecated alias for url; prefer url
        - `schema` string — Target schema name (e.g. "stripe")
        - `batch_size` number — Records to buffer before flushing
        - `aws` object — AWS RDS IAM authentication config
          - `host` string, required — Postgres host for RDS IAM auth
          - `port` number — Postgres port for RDS IAM auth
          - `database` string, required — Database name for RDS IAM auth
          - `user` string, required — Database user for RDS IAM auth
          - `region` string, required — AWS region for RDS instance
          - `role_arn` string — IAM role ARN to assume (cross-account)
          - `external_id` string — External ID for STS AssumeRole
        - `ssl_ca_pem` string — PEM-encoded CA certificate for SSL verification (required for verify-ca / verify-full with a private CA)
    - object
      - `type` 'google_sheets', required
      - `google_sheets` DestinationGoogleSheetsConfig, required
        - `client_id` string — Google OAuth2 client ID (env: GOOGLE_CLIENT_ID)
        - `client_secret` string — Google OAuth2 client secret (env: GOOGLE_CLIENT_SECRET)
        - `access_token` string, required — OAuth2 access token
        - `refresh_token` string, required — OAuth2 refresh token
        - `spreadsheet_id` string — Target spreadsheet ID (created if omitted)
        - `spreadsheet_title` string — Title when creating a new spreadsheet
        - `batch_size` number — Rows per Sheets API append call
  - `streams` object[] — Selected streams to sync. All streams synced if omitted.
    - `name` string, required — Stream (table) name to sync.
    - `sync_mode` 'incremental' | 'full_refresh' — How the source reads this stream. Defaults to full_refresh.
    - `backfill_limit` integer — Cap backfill to this many records, then mark the stream complete.
  - `desired_status` 'active' | 'paused' | 'deleted' — Set to "paused" to pause, "active" to resume, "deleted" to tear down.

## Response `200`

Updated pipeline

- Pipeline
  - `id` string, required — Unique pipeline identifier (e.g. pipe_abc123).
  - `source` SourceConfig, required
    - `type` 'stripe', required
    - `stripe` SourceStripeConfig, required
      - `api_key` string, required — Stripe API key (sk_test_... or sk_live_...)
      - `account_id` string — Stripe account ID (resolved from API if omitted)
      - `account_created` integer — Stripe account creation timestamp in unix seconds (resolved from API if omitted)
      - `livemode` boolean — Whether this is a live mode sync
      - `api_version` '2026-03-25.dahlia' | '2026-02-25.clover' | '2026-01-28.clover' | '2025-12-15.clover' | '2025-11-17.clover' | '2025-10-29.clover' | '2025-09-30.clover' | '2025-08-27.basil' | '2025-07-30.basil' | '2025-06-30.basil' | '2025-05-28.basil' | '2025-04-30.basil' | '2025-03-31.basil' | '2025-02-24.acacia' | '2025-01-27.acacia' | '2024-12-18.acacia' | '2024-11-20.acacia' | '2024-10-28.acacia' | '2024-09-30.acacia' | '2024-06-20' | '2024-04-10' | '2024-04-03' | '2023-10-16' | '2023-08-16' | '2022-11-15' | '2022-08-01' | '2020-08-27' | '2020-03-02' | '2019-12-03' | '2019-11-05' | '2019-10-17' | '2019-10-08' | '2019-09-09' | '2019-08-14' | '2019-05-16' | '2019-03-14' | '2019-02-19' | '2019-02-11' | '2018-11-08' | '2018-10-31' | '2018-09-24' | '2018-09-06' | '2018-08-23' | '2018-07-27' | '2018-05-21' | '2018-02-28' | '2018-02-06' | '2018-02-05' | '2018-01-23' | '2017-12-14' | '2017-08-15'
      - `base_url` string, uri — Override the Stripe API base URL (e.g. http://localhost:12111 for stripe-mock)
      - `webhook_url` string, uri — URL for managed webhook endpoint registration
      - `webhook_secret` string — Webhook signing secret (whsec_...) for signature verification
      - `websocket` boolean — Enable WebSocket streaming for live events
      - `poll_events` boolean — Enable events API polling for incremental sync after backfill
      - `webhook_port` integer — Port for built-in webhook HTTP listener (e.g. 4242)
      - `revalidate_objects` string[] — Object types to re-fetch from Stripe API on webhook (e.g. ["subscription"])
      - `backfill_limit` integer — Max objects to backfill per stream (useful for testing)
      - `rate_limit` integer — Override max requests per second (default: auto-derived from API key mode — 20 live, 10 test).
  - `destination` union, required
    - object
      - `type` 'postgres', required
      - `postgres` DestinationPostgresConfig, required
        - `url` string — Postgres connection string
        - `connection_string` string — Deprecated alias for url; prefer url
        - `schema` string — Target schema name (e.g. "stripe")
        - `batch_size` number — Records to buffer before flushing
        - `aws` object — AWS RDS IAM authentication config
          - `host` string, required — Postgres host for RDS IAM auth
          - `port` number — Postgres port for RDS IAM auth
          - `database` string, required — Database name for RDS IAM auth
          - `user` string, required — Database user for RDS IAM auth
          - `region` string, required — AWS region for RDS instance
          - `role_arn` string — IAM role ARN to assume (cross-account)
          - `external_id` string — External ID for STS AssumeRole
        - `ssl_ca_pem` string — PEM-encoded CA certificate for SSL verification (required for verify-ca / verify-full with a private CA)
    - object
      - `type` 'google_sheets', required
      - `google_sheets` DestinationGoogleSheetsConfig, required
        - `client_id` string — Google OAuth2 client ID (env: GOOGLE_CLIENT_ID)
        - `client_secret` string — Google OAuth2 client secret (env: GOOGLE_CLIENT_SECRET)
        - `access_token` string, required — OAuth2 access token
        - `refresh_token` string, required — OAuth2 refresh token
        - `spreadsheet_id` string — Target spreadsheet ID (created if omitted)
        - `spreadsheet_title` string — Title when creating a new spreadsheet
        - `batch_size` number — Rows per Sheets API append call
  - `streams` object[] — Selected streams to sync. All streams synced if omitted.
    - `name` string, required — Stream (table) name to sync.
    - `sync_mode` 'incremental' | 'full_refresh' — How the source reads this stream. Defaults to full_refresh.
    - `backfill_limit` integer — Cap backfill to this many records, then mark the stream complete.
  - `desired_status` 'active' | 'paused' | 'deleted', required — User-controlled lifecycle state. Set via PATCH to pause, resume, or delete.
  - `status` 'setup' | 'backfill' | 'ready' | 'paused' | 'teardown' | 'error', required — Workflow-controlled execution state. Updated by the Temporal workflow.
  - `sync_state` SyncState — Full sync checkpoint with separate sections for source, destination, and sync run. Connectors only see their own section; the engine manages routing.
    - `source` SourceState, required — Source connector state — cursors, backfill progress, events cursors.
      - `streams` object, required — Per-stream checkpoint data, keyed by stream name.
      - `global` object, required — Source-wide state shared across all streams.
    - `destination` object, required — Destination connector state.
    - `sync_run` object, required — Engine-managed run state — run_id, time_ceiling, accumulated progress.
      - `run_id` string — Identifies a finite backfill run. Omit for continuous sync.
      - `time_ceiling` string — Frozen upper bound (ISO 8601). Set on first invocation when run_id is present; reused on continuation.
      - `progress` ProgressPayload, required — Periodic sync progress emitted by the engine as a top-level message. Each emission is a full replacement.
        - `started_at` string, required — When this sync started (ISO 8601); generally equals time_ceiling.
        - `elapsed_ms` integer, required — Wall-clock milliseconds since the sync run started.
        - `global_state_count` integer, required — Total source_state messages observed so far.
        - `connection_status` object — Set when source or destination emits connection_status: failed.
          - `status` 'succeeded' | 'failed', required — Whether the connection check passed.
          - `message` string — Human-readable explanation of the check result.
        - `derived` object, required — Computed aggregates.
          - `status` 'started' | 'succeeded' | 'failed', required — succeeded = all streams completed/skipped; failed = connection_status failed OR any stream errored.
          - `records_per_second` number, required — Overall throughput for the entire run.
          - `states_per_second` number, required — State checkpoints per second.
        - `streams` object, required — Per-stream progress, keyed by stream name.

## Other responses

- `400` — Bad request
- `404` — Not found
- `409` — Invalid status transition

## Changes

- **2026-04-21** `e34afe1c48ab` — 2 warning
  - removed the request property `source/oneOf[subschema #1]/stripe/max_concurrent_streams`
  - removed the optional property `source/oneOf[subschema #1]/stripe/max_concurrent_streams` from the response with the `200` status
- **2026-04-20** `4284e9bc6bb0` — 1 warning, 1 info
  - removed the optional property `sync_state/sync_run/sync_run_id` from the response with the `200` status
  - added the optional property `sync_state/sync_run/run_id` to the response with the `200` status
- **2026-04-20** `a88e89584525` — 2 warning, 1 info
  - removed the optional property `last_progress` from the response with the `200` status
  - removed the optional property `sync_state/sync_run/progress/streams/additionalProperties/time_range` from the response with the `200` status
  - added the optional property `sync_state/sync_run/progress/streams/additionalProperties/total_range` to the response with the `200` status
- **2026-04-20** `678a866828d2` — 1 warning, 2 info
  - removed the optional property `progress` from the response with the `200` status
  - added the optional property `last_progress` to the response with the `200` status
  - added the optional property `sync_state` to the response with the `200` status
- …earlier changes not shown

[Full history](https://skmtc.dev/stripe/apis/stripe-sync-service/changes/pipelines/:id/patch.md)

---

[API](https://skmtc.dev/stripe/apis/stripe-sync-service.md) · [All operations](https://skmtc.dev/stripe/apis/stripe-sync-service/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/stripe/stripe-sync-service/revisions/c669c4f1f613/schema)
