1. Introduction
This document describes the Workflow Report API endpoints. Two report types are available:
- Participation Report — summary of who participated, with completion counts and per-session breakdown.
- Detail Report — per-session, per-prompt breakdown of individual subscriber responses.
All dates and times are passed and returned as UTC ISO-8601 strings (e.g. 2026-04-24T00:00:00Z). Responses are JSON.
Rate Limit: These endpoints are subject to a limit of 3 requests per second per account.
2. Authentication
All requests to the Workflow Report API must be authenticated using an API Key. The key must be included in the request header as apikey.
How to Generate Your API Key
To get your API key, please follow the instructions provided in our help center:
Request Headers
| Header | Value | Required |
|---|---|---|
apikey |
YOUR_API_KEY |
Yes |
3. Participation Report
Returns a summary of workflow campaign participation, including total participants, completion counts, and a pageable list of session rows.
Endpoint
GET https://api.txtimpact.com/api/v2/workflow/{campaignId}/ResponseReport
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
campaignId |
Integer | Yes | Numeric ID of the workflow campaign. |
Query Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
startDateTime |
String | No | — | Start of the date range. UTC ISO-8601, e.g. 2026-04-01T00:00:00Z. |
endDateTime |
String | No | — | End of the date range. UTC ISO-8601, e.g. 2026-04-24T23:59:59Z. |
lastUpdated |
String | No | "" |
UTC ISO-8601 datetime, e.g. 2026-04-24T16:40:36Z.When provided, only sessions where LastAnswerReceivedTime ≥ lastUpdated are returned. Use for incremental sync: save the latest SessionStartTime from each response and pass it on the next call. |
page |
Integer | No | 1 |
1-based page number. |
pageSize |
Integer | No | 0 |
Number of rows per page. 0 returns all matching rows. |
status |
String | No | all |
Filter by completion status.all — all sessionscompleted — fully completed workflowincomplete — started but not completed (at least one prompt answered)noresponse — session opened but no prompts answered |
Response — 200 OK
| Field | Type | Description |
|---|---|---|
TotalParticipants |
Integer | Total unique participants across all statuses (before status filter is applied). |
CompleteWorkflow |
Integer | Number of participants who completed the workflow. |
IncompleteWorkflow |
Integer | Number of participants who started but did not complete. |
TotalFilteredCount |
Integer | Total rows matching the current status filter (before pagination). |
WorkflowResponseReportDataList |
Array | Page of session rows (see fields below). |
WorkflowResponseReportDataList Item Fields
| Field | Type | Description |
|---|---|---|
MobileNumber |
String | Subscriber's mobile number. |
SubscriberName |
String | Subscriber's name. Empty string if not available. |
Prompts |
Integer | Number of prompts the subscriber answered. |
SessionStartTime |
String | UTC ISO-8601 datetime the session started. |
PromptText |
String | Text of the last prompt the subscriber answered. |
WorkflowStatus |
String |
C = Completed P = Pending / Incomplete |
Example Request
curl -X GET \ "https://api.txtimpact.com/api/v2/workflow/42/ResponseReport\ ?startDateTime=2026-04-01T00:00:00Z\ &endDateTime=2026-04-24T23:59:59Z\ &status=completed\ &page=1\ &pageSize=25" \ -H "apikey: YOUR_API_KEY"
Example: Incremental Sync
Pass the SessionStartTime of the most recent record you received as lastUpdated to fetch only newer sessions:
curl -X GET \ "https://api.txtimpact.com/api/v2/workflow/42/ResponseReport\ ?lastUpdated=2026-04-24T16:40:36Z\ &pageSize=100" \ -H "apikey: YOUR_API_KEY"
Example Response
{
"TotalParticipants": 150,
"CompleteWorkflow": 120,
"IncompleteWorkflow": 30,
"TotalFilteredCount": 120,
"WorkflowResponseReportDataList": [
{
"MobileNumber": "14155550100",
"SubscriberName": "Jane Doe",
"Prompts": 5,
"SessionStartTime": "2026-04-24T14:22:10Z",
"PromptText": "How satisfied are you overall?",
"WorkflowStatus": "C"
},
{
"MobileNumber": "14155550101",
"SubscriberName": "",
"Prompts": 2,
"SessionStartTime": "2026-04-24T15:08:45Z",
"PromptText": "What is your age group?",
"WorkflowStatus": "P"
}
]
}
4. Detail Report
Returns a per-session, per-prompt breakdown of subscriber responses. Columns are dynamic: fixed metadata columns are always present and one additional column is added for each prompt in the workflow. Prompt response values are JSON objects containing the response text and any attached media URLs.
Endpoint
GET https://api.txtimpact.com/api/v2/workflow/{campaignId}/DetailReport
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
campaignId |
Integer | Yes | Numeric ID of the workflow campaign. |
Query Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
startDateTime |
String | No | — | Start of the date range. UTC ISO-8601, e.g. 2026-04-01T00:00:00Z. |
endDateTime |
String | No | — | End of the date range. UTC ISO-8601, e.g. 2026-04-24T23:59:59Z. |
lastUpdated |
String | No | "" |
UTC ISO-8601 datetime. Only sessions where LastAnswerReceivedTime ≥ lastUpdated are returned. Use for incremental sync. |
page |
Integer | No | 1 |
1-based page number. |
pageSize |
Integer | No | 0 |
Number of rows per page. 0 returns all rows. |
mobileNumber |
String | No | — | Filter results to a single subscriber's mobile number. |
Response — 200 OK
| Field | Type | Description |
|---|---|---|
TotalCount |
Integer | Total sessions matching the query (before pagination). |
Items |
Array | Page of session detail rows. Each row is a flat object with fixed and dynamic prompt columns. |
Fixed Columns (always present in every row)
| Column | Type | Description |
|---|---|---|
SessionId |
String | Unique session identifier. |
MobileNumber |
String | Subscriber's mobile number. |
SessionDateTime |
String | UTC ISO-8601 session start time. |
WorkflowStatus |
String |
C = Completed P = Pending |
Name |
String | Subscriber name. |
Email |
String | Subscriber email. |
Custom1 – Custom4
|
String | Custom subscriber attributes. |
DOB |
String | Subscriber date of birth. |
Dynamic Prompt Columns
One column per workflow prompt, named after the prompt text. Each value is a JSON-encoded string:
{
"Text": "The subscriber's text response",
"Media": [
"https://cdn.example.com/mms/image1.jpg",
"https://cdn.example.com/mms/video1.mp4"
]
}
-
Text— The subscriber's typed reply. Empty string if no text was sent. -
Media— Array of fully-qualified media URLs. Empty array if no media was attached..txtattachments are excluded.
If the subscriber did not answer a prompt, the column value is an empty string "".
Example Request
curl -X GET \ "https://api.txtimpact.com/api/v2/workflow/42/DetailReport\ ?startDateTime=2026-04-01T00:00:00Z\ &endDateTime=2026-04-24T23:59:59Z\ &page=1\ &pageSize=25" \ -H "apikey: YOUR_API_KEY"
Example: Filter by Mobile Number
curl -X GET \ "https://api.txtimpact.com/api/v2/workflow/42/DetailReport\ ?mobileNumber=%2B14155550100" \ -H "apikey: YOUR_API_KEY"
Example Response
{
"TotalCount": 2,
"Items": [
{
"SessionId": "1001",
"MobileNumber": "14155550100",
"SessionDateTime": "2026-04-24T14:22:10Z",
"WorkflowStatus": "C",
"Name": "Jane Doe",
"Email": "jane@example.com",
"Custom1": "",
"Custom2": "",
"Custom3": "",
"Custom4": "",
"DOB": "",
"What is your age group?": "{\"Text\":\"25-34\",\"Media\":[]}",
"Please share a photo of your receipt": "{\"Text\":\"\",\"Media\":[\"https://cdn.example.com/mms/receipt_abc.jpg\"]}"
},
{
"SessionId": "1002",
"MobileNumber": "+14155550101",
"SessionDateTime": "2026-04-24T15:08:45Z",
"WorkflowStatus": "P",
"Name": "",
"Email": "",
"Custom1": "",
"Custom2": "",
"Custom3": "",
"Custom4": "",
"DOB": "",
"What is your age group?": "{\"Text\":\"35-44\",\"Media\":[]}",
"Please share a photo of your receipt": ""
}
]
}
Appendix A — Status Reference
| Value | Applies To | Meaning |
|---|---|---|
WorkflowStatus: "C" |
Both endpoints | The subscriber completed the workflow (reached the final prompt). |
WorkflowStatus: "P" |
Both endpoints | The subscriber started but has not yet completed the workflow. |
status=all |
Participation Report only | Return all sessions regardless of status (default). |
status=completed |
Participation Report only | Only sessions where WorkflowStatus = "C". |
status=incomplete |
Participation Report only | Sessions where WorkflowStatus = "P" and at least one prompt was answered (Prompts > 0). |
status=noresponse |
Participation Report only | Sessions where WorkflowStatus = "P" and zero prompts were answered (Prompts = 0). |
Appendix B — Incremental Sync with lastUpdated
lastUpdated enables efficient polling without re-fetching the entire dataset:
- On the first call, omit
lastUpdatedto retrieve the full history for the date range. - Record the
SessionStartTime(orSessionDateTime) of the most recent session in the response. - On subsequent calls, pass that value as
lastUpdated. Only sessions updated on or after that timestamp are returned. - Repeat steps 2–3 on each successful poll.
Note: lastUpdated is compared against LastAnswerReceivedTime on the session, not the session start time. A session that started before lastUpdated but received a new answer after that datetime will still be included.
Appendix C — Error Responses
| HTTP Status | Meaning |
|---|---|
400 Bad Request |
Invalid parameters (e.g. date range exceeds maximum, malformed ISO-8601 string). |
401 Unauthorized |
Missing or invalid API key. |
429 Too Many Requests |
Rate limit exceeded. Maximum 3 requests per second per account. |