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

> Mark a participant as having attended the study session. **This triggers the incentive payment process** — ensure the session is complete before calling.

# Mark as attended

## Attendance and the first payment

Whether marking a participant as attended fires the first payment depends on the project's `automations.autopay` setting (see [Create a project](/projects/create-a-project) or read it back with [Get a project](/projects/retrieve-a-specific-project)).

* **`autopay: true`** (the default when omitted at project creation): calling this endpoint automatically charges the first incentive payment to your team's default payment card and pays the participant. Do **not** also call [Trigger manual payout](/screener-responses/trigger-manual-payout) with `payoutCount: 1` for the same participant — that would issue a second, duplicate payment.
* **`autopay: false`**: this endpoint marks the participant as attended but does **not** issue any payment. You must send the first payment yourself by calling [Trigger manual payout](/screener-responses/trigger-manual-payout) with `payoutCount: 1`, or by processing the payment from the Respondent dashboard.

There is no request-body option on this endpoint to mark a participant attended without paying when `autopay` is `true`. To decouple attendance from payment for a project, set `automations.autopay` to `false` at project creation (or via [Update a project](/projects/update-a-project)) and drive all payments through [Trigger manual payout](/screener-responses/trigger-manual-payout).

For projects that pay participants more than once, see [How to use multiple payments](/docs/Screener-responses/multiple-payments).


## OpenAPI

````yaml patch /v1/projects/{projectId}/screener-responses/{screenerResponseId}/attended
openapi: 3.0.0
info:
  title: Partner API
  description: Public API for partner integrations
  version: '1.0'
  contact: {}
servers:
  - url: https://api-staging.respondent.io
security: []
tags: []
paths:
  /v1/projects/{projectId}/screener-responses/{screenerResponseId}/attended:
    patch:
      tags:
        - screener-responses
      summary: Mark as attended
      description: |-
        Mark Participant as Attended.
        This will trigger the payment process for the Participant.
      operationId: ScreenerResponsesController_markAtteneded
      parameters:
        - name: x-api-key
          in: header
          required: true
          schema:
            type: string
        - name: x-api-secret
          in: header
          required: true
          schema:
            type: string
        - name: projectId
          required: true
          in: path
          schema:
            type: string
        - name: screenerResponseId
          required: true
          in: path
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ScreenerResponse'
components:
  schemas:
    ScreenerResponse:
      type: object
      properties:
        qualified:
          type: boolean
        qualifiedPendingIdVerification:
          type: boolean
          description: >-
            - This property is set to `true` (with `qualified` set to `false`)
            if the participant has qualified based on their responses to the
            screener, but is in the process of verifying their identity.

            - Once the participant has completed ID verification,
            `qualifiedPendingIdVerification` will be set to false.
              - If the verification was successful, `qualified` will be set to `true`.
              - If the verification failed, `qualified` will remain set to `false` unless they were manually qualified through the qualification endpoint
            (`PATCH
            /projects/{projectId}/screener-responses/{screenerResponseId}/qualify`).
        percentage:
          type: number
        status:
          $ref: '#/components/schemas/ScreenerResponseStatus'
        favorite:
          type: boolean
        hidden:
          type: boolean
        responses:
          type: array
          items:
            $ref: '#/components/schemas/ScreenerResponseAnswer'
        totalTime:
          type: number
        isNew:
          type: boolean
        inviteSentAt:
          format: date-time
          type: string
        invited:
          type: boolean
        scheduledAt:
          format: date-time
          type: string
        statusUpdatedAt:
          format: date-time
          type: string
        ndaUrl:
          type: string
        ndaAgree:
          type: boolean
        project:
          $ref: '#/components/schemas/ScreenerResponseProject'
        profile:
          $ref: '#/components/schemas/ScreenerResponseProfile'
        matching:
          $ref: '#/components/schemas/ScreenerResponseMatching'
        externalProject:
          $ref: '#/components/schemas/ExternalProject'
        invitation:
          $ref: '#/components/schemas/ScreenerResponseInvitation'
        actor:
          $ref: '#/components/schemas/Actor'
        reason:
          $ref: '#/components/schemas/ParticipantCancellationReason'
        shortNoticeCancel:
          type: boolean
        message:
          type: string
        rejection:
          $ref: '#/components/schemas/Rejection'
        visibility:
          description: >-
            The visibility status of the screener response.

            If a screener response is visible, it can be interacted with
            (invited etc).

            If a screener response is not visible, it cannot be interacted with.

            A screener may be hidden for various reasons, and a screener can
            change from visible

            to not visible at any time if a participant or screener is found to
            be untrustworthy.

            There is a webhook that will notify the client when a screener
            response changes visibility.
          allOf:
            - $ref: '#/components/schemas/ScreenerResponseVisibility'
        createdAt:
          format: date-time
          type: string
        task:
          $ref: '#/components/schemas/ScreenerResponseTask'
        quotaAssignment:
          description: |-
            Read-only. Which quota segments this response occupies and in which
            consumption tier. Present when the project has a quota.
          allOf:
            - $ref: '#/components/schemas/ScreenerResponseQuotaAssignment'
        id:
          type: string
        projectId:
          type: string
        userId:
          type: string
      required:
        - qualified
        - percentage
        - status
        - responses
        - totalTime
        - matching
        - visibility
        - id
        - projectId
        - userId
    ScreenerResponseStatus:
      type: string
      enum:
        - PENDING
        - EXTERNAL_SCREENER_IN_PROGRESS
        - INVITED
        - SCHEDULED
        - ATTENDED
        - NOSHOW
        - INVALIDRESPONSE
        - REJECTEDQUALITY
        - PAID
        - CANCELLED
    ScreenerResponseAnswer:
      type: object
      properties:
        questionId:
          type: string
        questionText:
          type: string
        order:
          type: number
        type:
          type: string
        questionType:
          $ref: '#/components/schemas/QuestionType'
        answers:
          type: array
          items:
            oneOf:
              - $ref: '#/components/schemas/ScreenerQuestionAnswerValue'
              - type: string
              - type: number
          description: >-
            Always an array; the element type depends on `questionType`.
            `radio`: a single `ScreenerQuestionAnswerValue` object. `checkbox`:
            one `ScreenerQuestionAnswerValue` object per selected option.
            `singleLineTextbox`, `multiLineTextbox`, `numericBox`,
            `sliderScale`: a single string containing the participant's raw
            input (numeric and slider answers are strings, e.g. "36"; responses
            recorded before 2024 may contain bare numbers instead). `rank`,
            `matrix` and `fileUpload` questions carry their values in
            `ranking`/`selections`/`files` and have an empty `answers` array.
        files:
          description: >-
            Only present on `fileUpload` answers: the files the participant
            uploaded.

            Each file carries a temporary download `url` (see that property for
            the

            expiry contract).
          type: array
          items:
            $ref: '#/components/schemas/ScreenerResponseAnswerFileItem'
        note:
          type: string
          description: >-
            Only present on `fileUpload` answers, and only when the participant
            added

            an optional note alongside their files.
        selections:
          type: array
          items:
            $ref: '#/components/schemas/ScreenerResponseAnswerMatrixSelection'
        ranking:
          type: array
          items:
            $ref: '#/components/schemas/ScreenerResponseAnswerRankItem'
        qualify:
          type: boolean
        skipped:
          type: boolean
          description: >-
            Only present when the `screener-responses-include-skipped-questions`
            feature flag is enabled for the calling organization (default OFF).
            `true` when the participant did not answer this question — either
            because they chose to skip an optional question (`skippedBy: user`)
            or because skip-logic on a previous question routed them past it
            (`skippedBy: skipLogic`).
        skippedBy:
          type: string
          enum:
            - user
            - skipLogic
          description: >-
            Only present when the `screener-responses-include-skipped-questions`
            feature flag is enabled for the calling organization (default OFF).
            `user` means the participant saw the question and chose to skip it;
            `skipLogic` means the participant never saw it because skip-logic on
            a previous question routed past it. Absent on items where `skipped`
            is not `true`.
        shown:
          type: boolean
          description: >-
            Only present when the `screener-responses-include-skipped-questions`
            feature flag is enabled for the calling organization (default OFF).
            `true` for answered questions and user-skipped questions (i.e. the
            participant saw the question); `false` for skip-logic-skipped
            questions (the participant never saw it).
      required:
        - questionId
        - questionText
        - type
        - questionType
        - answers
        - qualify
    ScreenerResponseProject:
      type: object
      properties:
        name:
          type: string
        incentive:
          type: number
        id:
          type: string
        organizationId:
          type: string
        teamId:
          type: string
      required:
        - name
        - incentive
        - id
        - organizationId
        - teamId
    ScreenerResponseProfile:
      type: object
      properties:
        id:
          type: string
          format: ObjectId
        userId:
          type: string
          format: ObjectId
        firstName:
          type: string
        lastName:
          type: string
        picture:
          type: string
          nullable: true
        skills:
          type: array
          items:
            $ref: '#/components/schemas/SimpleSkill'
      required:
        - id
        - userId
        - firstName
        - lastName
        - skills
    ScreenerResponseMatching:
      type: object
      properties:
        isGenderMatch:
          type: boolean
        isAgeMatch:
          type: boolean
        isEthnicityMatch:
          type: boolean
        isEducationMatch:
          type: boolean
        questionsQualified:
          type: boolean
        isLocationMatch:
          type: boolean
        isIndustryMatch:
          type: boolean
        isJobTitleMatch:
          type: boolean
        isHouseholdIncomeMatch:
          type: boolean
        isCompanySizeMatch:
          type: boolean
        isTopicsMatch:
          type: boolean
      required:
        - isGenderMatch
        - isAgeMatch
        - isEthnicityMatch
        - isEducationMatch
        - questionsQualified
        - isLocationMatch
        - isIndustryMatch
        - isJobTitleMatch
        - isHouseholdIncomeMatch
        - isCompanySizeMatch
    ExternalProject:
      type: object
      properties:
        researcherId:
          type: string
        bookingUrl:
          type: string
        meetingCancelLink:
          type: string
          description: Link to cancel a meeting. If not set, bookingLink will be used.
        bookedDate:
          format: date-time
          type: string
        timezone:
          type: string
          description: 'IANA timezone. Example: ''America/New_York'''
      required:
        - researcherId
    ScreenerResponseInvitation:
      type: object
      properties:
        id:
          type: string
          format: ObjectId
        remoteCommunicationDetails:
          type: string
        event:
          $ref: '#/components/schemas/InvitationEvent'
        message:
          type: string
          description: This will override the special instructions from the project.
          default: null
        videoProvider:
          $ref: '#/components/schemas/InvitationVideoProvider'
      required:
        - id
    Actor:
      type: string
      enum:
        - researcher
        - respondent
        - admin
    ParticipantCancellationReason:
      type: string
      enum:
        - time
        - final
    Rejection:
      type: object
      properties:
        message:
          type: string
        rejectedAt:
          format: date-time
          type: string
      required:
        - message
        - rejectedAt
    ScreenerResponseVisibility:
      type: object
      properties:
        status:
          $ref: '#/components/schemas/ScreenerResponseVisibilityStatus'
      required:
        - status
    ScreenerResponseTask:
      type: object
      properties:
        completedAt:
          type: string
          description: >-
            Timestamp when the task was completed.

            This field is automatically set when participants access the
            project's completionUrl.
    ScreenerResponseQuotaAssignment:
      type: object
      properties:
        segments:
          type: array
          items:
            $ref: '#/components/schemas/ScreenerResponseQuotaBucketRef'
        tier:
          $ref: '#/components/schemas/QuotaResponseTier'
        revision:
          type: integer
        assignedAt:
          format: date-time
          type: string
        tierChangedAt:
          format: date-time
          type: string
      required:
        - segments
        - tier
        - revision
        - assignedAt
        - tierChangedAt
    QuestionType:
      type: string
      enum:
        - radio
        - multiLineTextbox
        - checkbox
        - singleLineTextbox
        - numericBox
        - sliderScale
        - fileUpload
        - rank
        - matrix
    ScreenerQuestionAnswerValue:
      type: object
      properties:
        id:
          type: string
        uid:
          type: string
        text:
          type: string
        answerValue:
          type: number
        goToQuestionUid:
          type: string
          nullable: true
        isOther:
          type: boolean
        other:
          type: string
      required:
        - id
        - uid
        - text
        - answerValue
    ScreenerResponseAnswerFileItem:
      type: object
      properties:
        name:
          type: string
          description: The file name the participant uploaded the file under.
        size:
          type: number
          description: File size in bytes.
        mime:
          type: string
          description: MIME type of the file, e.g. `application/pdf`.
        uploadedAt:
          format: date-time
          type: string
        url:
          type: string
          description: >-
            Temporary download URL for the file, only present while `scanStatus`
            is

            `clean`. The link expires after a limited time (at least one hour
            from

            when the response was fetched), so hand it to the user promptly —
            for

            example behind a download button — rather than storing it. Once it
            has

            expired, refetch this screener response: every fetch issues a fresh
            URL.
        scanStatus:
          $ref: '#/components/schemas/UploadScanStatus'
      required:
        - name
        - size
        - mime
        - uploadedAt
    ScreenerResponseAnswerMatrixSelection:
      type: object
      properties:
        rowUid:
          type: string
        rowText:
          type: string
        answerUid:
          type: string
        answerText:
          type: string
      required:
        - rowUid
        - rowText
        - answerUid
        - answerText
    ScreenerResponseAnswerRankItem:
      type: object
      properties:
        uid:
          type: string
        text:
          type: string
      required:
        - uid
        - text
    SimpleSkill:
      type: object
      properties:
        id:
          type: string
          format: ObjectId
        name:
          type: string
        slug:
          type: string
        validated:
          type: boolean
          default: false
        type:
          type: string
          default: skill
      required:
        - id
        - name
        - slug
        - validated
        - type
    InvitationEvent:
      type: object
      properties:
        uid:
          type: string
      required:
        - uid
    InvitationVideoProvider:
      type: object
      properties:
        loginProviderId:
          type: string
        providerKey:
          type: string
          enum:
            - zoom
        userId:
          type: string
      required:
        - loginProviderId
        - providerKey
        - userId
    ScreenerResponseVisibilityStatus:
      type: string
      default: VISIBLE
      enum:
        - DISMISSED
        - VISIBLE
        - ONHOLD
    ScreenerResponseQuotaBucketRef:
      type: object
      properties:
        groupId:
          type: string
        segmentId:
          type: string
      required:
        - groupId
        - segmentId
    QuotaResponseTier:
      type: string
      enum:
        - PENDING
        - INVITED
        - ATTENDED
        - RELEASED
    UploadScanStatus:
      type: string
      description: >-
        Virus-scan verdict for this file. `url` is only issued once the verdict

        is `clean`; `pending` means the scan has not finished yet, so refetch
        the

        screener response later.
      enum:
        - pending
        - clean
        - infected
        - unscanned

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.