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

# List flows

> Retrieve a paginated list of your automation flows, including each flow's trigger and steps.
Use `GET /v1/flows/{id}` for a flow's full configuration — entry frequency,
flow filters, exit criteria, and the node branch graph.

Configuration only — no performance, and no membership. Flow results and
the live enrollment count both come from `/v1/reports/flows`, which lists
every flow, so pair the two rather than expecting stats here.

**Required scope:** `flows_read`




## OpenAPI

````yaml openapi/privy-api.yaml GET /flows
openapi: 3.1.0
info:
  title: Privy API
  version: '1.0'
  description: >
    The Privy API lets you programmatically manage your contact list and read
    what you have set up in Privy.

    Create, update, unsubscribe, and remove contacts; report orders;

    and read your campaigns, flows, segments, orders, store products, coupon
    pools,

    performance reports, and account setup.
servers:
  - url: https://api.privy.com/v1
    description: Production
security:
  - bearerAuth: []
tags:
  - name: Account
    description: Retrieve information about the authenticated Privy account.
  - name: Contacts
    description: Manage your contact list.
  - name: Imports
    description: >-
      Read your contact import history — CSV uploads, connected-provider syncs,
      and SMS consent imports.
  - name: Campaigns
    description: >-
      Read your message campaigns — email and SMS newsletters, plus the messages
      your flows send.
  - name: Displays
    description: >-
      Read your on-site displays (popups, flyouts, banners, embedded forms,
      landing pages).
  - name: Coupons
    description: Read your coupon pools, their code inventory, and individual codes.
  - name: Reports
    description: >-
      Read performance reporting — signups, views, conversion rates, and
      attributed revenue — for your business, displays, and flows.
  - name: Flows
    description: Read your automation flows and their configuration.
  - name: Segments
    description: Read your customer segments and their membership.
  - name: Orders
    description: Report orders placed in your store and read your order history.
  - name: Products
    description: Read the product catalog and collections of your connected store.
  - name: Events
    description: Ingest custom events to trigger Flows and other automations.
paths:
  /flows:
    get:
      tags:
        - Flows
      summary: List flows
      description: >
        Retrieve a paginated list of your automation flows, including each
        flow's trigger and steps.

        Use `GET /v1/flows/{id}` for a flow's full configuration — entry
        frequency,

        flow filters, exit criteria, and the node branch graph.


        Configuration only — no performance, and no membership. Flow results and

        the live enrollment count both come from `/v1/reports/flows`, which
        lists

        every flow, so pair the two rather than expecting stats here.


        **Required scope:** `flows_read`
      operationId: listFlows
      parameters:
        - $ref: '#/components/parameters/AccountIdParam'
        - $ref: '#/components/parameters/PageParam'
        - $ref: '#/components/parameters/PerPageParam'
        - name: status
          in: query
          description: Filter by flow status.
          schema:
            type: string
            enum:
              - draft
              - active
              - inactive
          example: active
      responses:
        '200':
          description: A paginated list of flows.
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: '#/components/schemas/Flow'
                  pagination:
                    $ref: '#/components/schemas/PaginationEnvelope'
              example:
                data:
                  - id: Vq7L3mN9xR
                    title: Abandoned Cart Recovery
                    status: active
                    trigger_type: cart_abandoned
                    trigger_label: Cart abandoned
                    nodes:
                      - uuid: 6f1e8d0a-4b2c-4c1d-9a3e-2f5b7c8d9e0f
                        type: delay
                        name: Wait 1 hour
                      - uuid: 7a2f9e1b-5c3d-4d2e-8b4f-3a6c8d9e0f1a
                        type: email
                        name: Cart reminder email
                    sync_coupons: false
                    last_transition_at: '2026-06-01T12:00:00Z'
                pagination:
                  page: 1
                  per_page: 40
                  total_count: 4
                  total_pages: 1
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/InsufficientScope'
        '422':
          $ref: '#/components/responses/ValidationFailed'
        '429':
          $ref: '#/components/responses/RateLimited'
      security:
        - bearerAuth: []
components:
  parameters:
    AccountIdParam:
      name: Privy-Account-Id
      in: header
      required: false
      description: >
        Target a subaccount instead of the main connected account.

        Pass a subaccount `id` from get_account's `subaccounts` list. Only
        direct subaccounts

        of the connected account are reachable — omit this for the main account
        itself.
      schema:
        type: string
      example: S1U2B3A4C5C6T7
    PageParam:
      name: page
      in: query
      description: Page number (starts at 1).
      schema:
        type: integer
        default: 1
        minimum: 1
      example: 1
    PerPageParam:
      name: per_page
      in: query
      description: >-
        Number of results per page. Values outside 10–100 are clamped to the
        nearest bound.
      schema:
        type: integer
        default: 40
        minimum: 10
        maximum: 100
      example: 40
  schemas:
    Flow:
      type: object
      properties:
        id:
          type: string
          description: >-
            Stable, unique identifier for the flow. Use this value in
            `/v1/flows/{id}`.
          example: Vq7L3mN9xR
        title:
          type:
            - string
            - 'null'
          example: Abandoned Cart Recovery
        status:
          type: string
          enum:
            - draft
            - active
            - inactive
          example: active
        trigger_type:
          type:
            - string
            - 'null'
          description: >
            Normalized name of the event that starts the flow — e.g.

            `order_placed`, `order_delivered`, `cart_abandoned`,

            `checkout_abandoned`, `browse_abandoned`, `back_in_stock`,

            `date_triggered`, `customer_subscribed_to_marketing`,

            `customer_tag_added`, `customer_tag_removed`, `flow_completed`.

            `order_placed` is the one name for the per-platform order events

            (Shopify, BigCommerce, Wix, and the public API) and
            `order_delivered`

            renames the order-received event; every other trigger passes through
            as

            stored, so integration and custom API event names (`api_event:...`)

            appear here verbatim.


            Platform availability: `browse_abandoned` and `back_in_stock`
            currently

            fire for Shopify stores only — the underlying product-view and
            inventory

            signals aren't collected for other platforms, so a flow using one of

            these triggers on a non-Shopify business will never enroll a
            contact.

            `checkout_abandoned` and `cart_abandoned` are available on both
            Shopify

            and BigCommerce. Shopify checkout starts come from the Web Pixel, so
            the

            pixel must hold the scopes that track them; BigCommerce checkout
            starts

            are captured when the Privy widget loads on the standard Optimized

            One-Page Checkout, so custom or headless BigCommerce checkouts
            produce no

            event and never enroll a contact.
          example: cart_abandoned
        trigger_label:
          type:
            - string
            - 'null'
          description: Human-readable form of `trigger_type`.
          example: Cart abandoned
        nodes:
          type: array
          description: The flow's steps, from its current version.
          items:
            $ref: '#/components/schemas/FlowNode'
        sync_coupons:
          type: boolean
          description: >
            Whether the flow uses one shared coupon: when true, a single coupon
            is

            set at the flow level and applied to every email and SMS node in
            every

            version of the flow, including nodes added later. When false,
            coupons

            are attached to individual nodes by hand and nothing is propagated.
          example: false
        last_transition_at:
          type:
            - string
            - 'null'
          format: date-time
          description: When the flow last changed status.
          example: '2026-06-01T12:00:00Z'
    PaginationEnvelope:
      type: object
      properties:
        page:
          type: integer
          example: 1
        per_page:
          type: integer
          example: 25
        total_count:
          type: integer
          example: 142
        total_pages:
          type: integer
          example: 6
    FlowNode:
      type: object
      description: >-
        One step in the flow. `email` and `sms` send a message — the only node
        types that carry per-node report stats; `delay` waits; `split` branches
        on conditions; `ab_test` sends each contact down path A or B by a
        percentage split; `tag` and `update_contact` change the contact.
      properties:
        uuid:
          type: string
          example: 6f1e8d0a-4b2c-4c1d-9a3e-2f5b7c8d9e0f
        type:
          type: string
          enum:
            - email
            - sms
            - delay
            - split
            - ab_test
            - tag
            - update_contact
          example: email
        name:
          type: string
          example: Welcome email
    ErrorResponse:
      type: object
      properties:
        error:
          type: object
          required:
            - code
            - message
          properties:
            code:
              type: string
              enum:
                - invalid_client
                - invalid_scope
                - unauthorized
                - insufficient_scope
                - paid_plan_required
                - api_access_required
                - not_found
                - no_connected_store
                - conflict
                - contacts_not_ready
                - validation_failed
                - rate_limited
                - store_unavailable
              example: validation_failed
            message:
              type: string
              example: One or more fields are invalid
            details:
              type: array
              items:
                type: object
                properties:
                  field:
                    type: string
                    example: email
                  message:
                    type: string
                    example: is required
  responses:
    Unauthorized:
      description: Missing or invalid bearer token.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            error:
              code: unauthorized
              message: Bearer token is missing or invalid
    InsufficientScope:
      description: Token lacks the required scope for this endpoint.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            error:
              code: insufficient_scope
              message: Token does not have the required scope
    ValidationFailed:
      description: One or more fields failed validation.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            error:
              code: validation_failed
              message: One or more fields are invalid
              details:
                - field: email
                  message: is required
    RateLimited:
      description: Rate limit exceeded. Retry after the specified time.
      headers:
        Retry-After:
          description: Seconds to wait before retrying.
          schema:
            type: integer
          example: 42
        X-RateLimit-Limit-Minute:
          description: Maximum requests allowed per minute.
          schema:
            type: integer
          example: 60
        X-RateLimit-Remaining-Minute:
          description: Requests remaining in the current minute window.
          schema:
            type: integer
          example: 0
        X-RateLimit-Reset-Minute:
          description: Unix timestamp when the minute window resets.
          schema:
            type: integer
          example: 1711929600
        X-RateLimit-Limit-Day:
          description: Maximum requests allowed per day.
          schema:
            type: integer
          example: 10000
        X-RateLimit-Remaining-Day:
          description: Requests remaining in the current day window.
          schema:
            type: integer
          example: 9500
        X-RateLimit-Reset-Day:
          description: Unix timestamp when the day window resets.
          schema:
            type: integer
          example: 1712016000
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            error:
              code: rate_limited
              message: Rate limit exceeded
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: API token or OAuth access token
      description: >
        Send either an API token or an OAuth access token as

        `Authorization: Bearer <token>`. See the Authentication page for
        details.

````