Skip to documentation

Feedback

Reconcile raw rating events and calculate transparent, reproducible fixed-window rollups while keeping feedback subjects, Study context, accounts, and source paths distinct.

2 endpoints

GET

List feedback events

GET /external/v1/studies/feedback

Read optional post-study ratings and participant identity from Study completions and Live Interview Pulse submissions. Responses without a rating are omitted. Use GET /external/v1/studies/:id/responses for research answers, including responses that skipped the rating. Existing keys with studies:read receive the same name, email, and company display as the Study UI automatically; no new key, additional scope, or include flag is required. participant is null when identity is unknown. Saved identity is also available on historical responses. submittedAt is the rating event time; source identifies the submission path. The feedback subject is separate from the Study’s current accepted context. For a stable synchronization run, hold submittedTo fixed, follow X-Has-More, and advance offset by X-Limit. submittedFrom is inclusive; submittedTo is exclusive.

Requirements

API scopes required:
studies:read

Request

Parameters

NameTypeDescription
metric stringStable metric key.
subjectType stringImmutable subject type.
subjectId uuidImmutable subject id.
submittedFrom ISO timestampInclusive rating event timestamp.
submittedTo ISO timestampExclusive rating event timestamp.
initiativeId uuidCurrent accepted Initiative context.
ideaId uuidCurrent accepted Idea context.
accountId uuidExact Account filter.
limit number1–100 results.
offset numberNumber of results to skip.

Responses

200
Success

Each participant contains nullable id, name, email, accountId, accountName, and account, plus type: public_user, portal_user, or discovery_user. id identifies a linked portal or discovery user; it is not a People/Contact ID. Participants known only through saved response details have id: null even when their name and email are available. The outer id is the group Pulse submission ID when present, otherwise the response ID. Group Pulse identity and account attribution come from the attendee’s saved submission, without falling back to the interview owner. For other feedback, account reflects the response’s linked Account. accountName falls back to captured company text when no Account is linked; account and accountId then remain null. Research answers, notes, transcripts, and clicks are excluded.

Schema
Array<FeedbackEvent>

Example Response

200 OK
json
[
  {
    "id": "response-uuid",
    "rating": 5,
    "metric": "initiative_direction",
    "subject": {
      "type": "initiative",
      "id": "initiative-uuid"
    },
    "comment": "Keep this direction.",
    "submittedAt": "2026-07-14T10:00:00Z",
    "source": "live_interview",
    "accountId": "account-uuid",
    "participant": {
      "id": null,
      "name": "Dana Ruiz",
      "email": "dana@example.com",
      "type": "public_user",
      "accountId": "account-uuid",
      "accountName": "Northstar Dental",
      "account": {
        "id": "account-uuid",
        "name": "Northstar Dental"
      }
    },
    "study": {
      "id": "study-uuid",
      "publicId": "STUDY-8",
      "name": "Scheduler direction check",
      "status": "active",
      "type": "heatmap_interaction",
      "phase": "validation",
      "appPath": "/studies/STUDY-8"
    },
    "initiativeIds": [
      "initiative-uuid"
    ],
    "ideaIds": []
  }
]
GET

Summarize feedback

GET /external/v1/feedback/summary

Return one reproducible metric-and-subject rollup over rating event time. Average, rating sum, rated count, observable eligible interactions, coverage, distribution, source paths, comparison, Studies, and comments remain distinct. A copied Pulse link is not counted as delivered feedback; a submitted Live Interview Pulse is both rated and observable. Comment accounts include an id only; resolve names with accounts:read.

Requirements

API scopes required:
studies:read

Request

Parameters

NameTypeDescription
metric *stringStable metric key, such as initiative_direction.
subjectType *stringSubject type required by the metric.
subjectId *uuidImmutable rating subject.
windowStart ISO timestampInclusive start. Defaults to 14 days before windowEnd.
windowEnd ISO timestampExclusive end. Defaults to the request time.

Responses

200
Success

The fixed-window summary was calculated.

Schema
FeedbackSummary

Example Response

200 OK
json
{
  "metric": "initiative_direction",
  "subject": {
    "type": "initiative",
    "id": "initiative-uuid"
  },
  "window": {
    "start": "2026-07-01T00:00:00Z",
    "end": "2026-07-15T00:00:00Z",
    "days": 14
  },
  "summary": {
    "averageRating": 4.1,
    "ratingSum": 49,
    "ratedInteractionCount": 12,
    "eligibleInteractionCount": 15,
    "ratingCoverage": 0.8,
    "distribution": {
      "1": 0,
      "2": 1,
      "3": 2,
      "4": 4,
      "5": 5
    },
    "sourceCounts": {
      "study_completion": {
        "eligibleInteractionCount": 13,
        "ratedInteractionCount": 10
      },
      "live_interview": {
        "eligibleInteractionCount": 2,
        "ratedInteractionCount": 2
      }
    }
  },
  "previous": {
    "averageRating": 3.7,
    "ratedInteractionCount": 10
  },
  "studies": [
    {
      "id": "study-uuid",
      "publicId": "STUDY-8",
      "name": "Scheduler direction check",
      "averageRating": 4.1,
      "ratedInteractionCount": 12,
      "eligibleInteractionCount": 15
    }
  ],
  "recentComments": [
    {
      "responseId": "response-uuid",
      "rating": 5,
      "comment": "Keep this direction.",
      "submittedAt": "2026-07-14T10:00:00Z",
      "account": {
        "id": "account-uuid"
      },
      "study": {
        "id": "study-uuid",
        "publicId": "STUDY-8",
        "name": "Scheduler direction check"
      }
    }
  ]
}