- How the flow works end to end, and the two response statuses it adds
- Setting up a project: the screener link and the declared question catalog
- Receiving participants (the
respondent_*correlation parameters) - Posting answers back, corrections, and how the qualification verdict is derived
- The return contract — the two rules your redirect must follow
- Webhooks and status handling
External screeners are enabled per organization. Contact Respondent to have the flow turned on for your organization — until then the fields below are accepted and stored, but every project runs the classic single-screener flow.
How the flow works
- A participant applies to your project and completes the Respondent screener as usual.
- If they qualify, their screener response moves to
SECOND_SCREENER_IN_PROGRESSand Respondent shows them a handoff page explaining they’ll finish the screener on your platform. When they continue, they arrive at yourexternalScreenerLinkwith correlation parameters appended. - The participant completes your screener on your site.
- You post their answers back with Post external screener answers, then redirect them to the Respondent page they came from. You must ensure all answers are posted before the user can be redirected back.
- Once the answers cover your declared question catalog (or you signal early completion), the response moves to
SECOND_SCREENER_SUBMITTED. From there it behaves exactly like a classic submitted application: it’s visible to the researcher, counts toward the project’s applications, and can be invited — manually or by auto-invite.
SECOND_SCREENER_SUBMITTED does not mean the participant passed your screener. Like a classic submission, the pass/fail verdict lives in the qualified flag — a participant who fails your screener still settles on SECOND_SCREENER_SUBMITTED, with qualified: false.Setting up a project
An external-screener project declares two things:externalScreenerLink— the URL of your screener. Participants are sent here with correlation parameters appended, so the URL may include its own query string.externalQuestions— the declared catalog of your screener’s questions. Answer rows you post back are validated against thesequestionIds, and the catalog defines when a response counts as complete.
- The endpoint replaces the whole catalog (like the screener questions bulk endpoint). Send the full list every time.
questionIdis your stable identifier — answer rows reference it, and completion is counted against it. DuplicatequestionIds are rejected.questionTypeis one ofRADIO,CHECKBOX,TEXT,NUMBER, orOTHER. UseOTHERfor anything not modelled — thetextkeeps the answers legible to researchers either way.- Don’t change
questionIds while a project is live: answers already posted are keyed by them, and completion counting depends on the declared set.
Receiving participants
When a qualified participant continues to your screener, Respondent appends these query parameters to yourexternalScreenerLink:
Persist at least
respondent_screener_response_id and respondent_project_id for the session — you need both to post answers and to send the participant back.
Posting answers back
Post the participant’s answers — and your per-question verdicts — with Post external screener answers:- Rows upsert idempotently per
questionId. Re-sending a row replaces the earlier one, so a correction is just another POST — including flipping an earlierqualifiesverdict. Respondent re-derives the response’s state from the stored rows on every write. - Each row must reference a declared
questionId(undeclared ids are rejected) and must carry content: at least one ofanswerValues(a non-empty array — multi-select friendly) oranswerText(a non-empty string). - Completion: the response moves to
SECOND_SCREENER_SUBMITTEDonce the stored rows cover every declared question. If participants may legitimately skip questions on your side, send"complete": truealongside the answers to settle the response early — you can post in as many batches as you like before that. - The verdict is derived: the response ends up
qualifiedonly if every stored row hasqualifies: true. A failed verdict settles the response onSECOND_SCREENER_SUBMITTEDwithqualified: false— visible to the researcher, but excluded from qualified counts and auto-invite. - You can keep posting corrections while the response is in
SECOND_SCREENER_IN_PROGRESS,SECOND_SCREENER_SUBMITTED, orPENDING. Once the participant has been invited, the response is closed to answer writes. - For an overall disqualification decision that isn’t tied to answer rows, use Qualify participant with
qualifyStatus: false— same as on classic projects. Note that a later answers re-post re-derives the verdict from the rows, which can undo a manual flip.
The return contract
Two rules, both load-bearing:1
Post the answers before you redirect
Send the answers request and wait for the response before sending the participant back. If the participant lands back on Respondent before the answers arrive, they see a waiting state instead of a submitted application — the page recovers on its own once your POST lands, but posting first makes the handoff seamless.
2
Redirect to the apply page — never the completion URL
Send the participant back to the project’s apply page:Do not redirect through the project’s
completionUrl. The completion URL marks the study task complete — on an unmoderated study or survey it starts the review-then-autopay clock. A screener is not the study; routing screener traffic through it would pay participants for applying.Webhooks and statuses
If you use webhooks, the two new statuses arrive as ordinarySCREENER_RESPONSES.UPDATED events — updatedFields carries the raw status strings:
- the handoff:
statusDRAFT→SECOND_SCREENER_IN_PROGRESS - the submission:
statusSECOND_SCREENER_IN_PROGRESS→SECOND_SCREENER_SUBMITTED
screenerResponseUpdatedType values STATUS.SECOND_SCREENER_IN_PROGRESS and STATUS.SECOND_SCREENER_SUBMITTED), so you can integrate before your organization’s flow is enabled.
A few status behaviors worth knowing:
- Plain
PENDINGon an external-screener project means “held” — the response is in an identity-verification or review hold. It settles back toSECOND_SCREENER_SUBMITTEDwhen released. Your answer posts are still accepted during the hold. - Cancel invite reverts to
SECOND_SCREENER_SUBMITTED, notPENDING— the participant already completed your screener, so withdrawing an invitation doesn’t send them through it again. - List screener responses accepts both new values in its
statusesfilter.