---
title: "List flow messages"
method: GET
path: "/flows/{flow_id}/messages"
tags: ["flows"]
---

# List flow messages

`GET /flows/{flow_id}/messages`

## Request

- Base URL: `https://api.pscrpt.com/v1`
- URL: `https://api.pscrpt.com/v1/flows/{flow_id}/messages`
- Auth: one of:
  - HTTP bearer
  - OAuth 2
    - Authorization code: `https://api.pscrpt.com/oauth/authorize`
    - Token URL: `https://api.pscrpt.com/oauth/token` scopes: `flows:read`

Reporting handles for a flow — one row per send node of the published version, with the experiment-split lineage that makes A/B variants distinct rows. Each `node_id` is the `message_id` dimension in `POST /v1/message-stats`. A flow that has never been published is 404 `not_found`.

## Query parameters

- `page[limit]` integer
- `page[after]` string
- `sort` string

## Headers

- `Postscript-Version` string, date

## Response `200`

One page of send nodes from the flow's published version.

- object
  - `data` FlowMessage[], required
    - `body` string, nullable, required: SMS/MMS/RCS text body, cut to its first 2,000 characters. Null for email and for RCS cards.
    - `channel` 'sms' | 'mms' | 'rcs' | 'email', required
    - `flow_id` string, required
    - `flow_version_id` string, required: The published version the node was read from.
    - `media_url` string, nullable, required: MMS image URL; null when the node has none.
    - `name` string, required: Step title as shown in the editor.
    - `node_id` string, required
    - `object` 'flow_message', required
    - `position` integer, required: Walk order from the trigger, 1-based; stable within a version.
    - `preview_text` string, nullable, required: Email preview text (preheader); null when unset or not email.
    - `subject` string, nullable, required: Email subject line; null for other channels.
    - `template_version_id` string, nullable, required: Template version a template-armed email node sends from; null for inline content. The node follows its template's publishes, so this is the version sends use now.
    - `variation` FlowMessageVariation[], required: Enclosing experiment splits, outermost first. Empty when the node is not under a split.
      - `branch_index` integer, required: Zero-based position of the branch this message sits on.
      - `branch_name` string, nullable, required: Merchant-given branch name; null when unnamed.
      - `split_node_id` string, required: `node_id` of the experiment_split node.
      - `weight` number, nullable, required: Traffic share of the branch at the published version. Null until split weights are served.
  - `meta` Meta, required
    - `as_of` string, date-time
    - `livemode` boolean, required
    - `page` PageMeta
      - `limit` integer, required
      - `next_cursor` string, nullable, required: Pass as `page[after]`. Null on the last page.
    - `request_id` string, required
    - `resolved_from` string: The merged-away profile ID the request addressed; `data` holds the survivor.
    - `revision` string, date, required

## Other responses

- `400`: Malformed input, an unknown parameter, an unsupported filter, sort, or expand, or a mistyped ID.
- `401`: Missing or invalid API key.
- `403`: The key lacks the required scope.
- `404`: No such resource in the authenticated property.
- `429`: Rate limit exceeded.
- `500`: Internal error.
- `502`: Upstream provider failure.
- `503`: Temporarily unavailable.

## Changes

- **2026-10-02** `c0c9a9f0ac5c`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/pscrpt/apis/postscript-native-api-beta/changes/flows/:flow_id/messages/get.md)

---

[API](https://skmtc.dev/pscrpt/apis/postscript-native-api-beta.md) - [All operations](https://skmtc.dev/pscrpt/apis/postscript-native-api-beta/llms.txt) - [OpenAPI document](https://skmtc.dev/pscrpt/apis/postscript-native-api-beta/revisions/882458ee1f36?raw)
