- 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 you can set the fields below on a draft, but publishing that draft is rejected with a
400 — see Publishing preconditions.How the flow works
- A participant applies to your project and completes the Respondent screener as usual.
-
If the answers to the Respondent screener qualifies them for the study, the participant is shown a handoff page explaining they’ll finish the screener on your platform. When they continue, they arrive at your
externalScreenerLinkwith 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 due to skip logic, disqualification etc.), the response moves to
PENDING— the same status a classic application reaches when it is submitted — provided nothing else is outstanding on our side. The participant may be required to complete identity verification steps on the Respondent platform, so the response staysEXTERNAL_SCREENER_IN_PROGRESSuntil they complete it, and moves toPENDINGon its own afterwards. Do not treat a response that has not yet reachedPENDINGas an error. FromPENDINGit behaves like any classic application: one that passed (qualified: true) and is not held is visible to the researcher, counts toward the project’s applications, and can be invited — manually or by auto-invite. A failed verdict staysPENDINGtoo but is never auto-invited, and a held response is not visible to the researcher until its hold resolves.
Reaching
PENDING does not mean the participant passed your screener either — as with a classic submission, the pass/fail verdict lives in the qualified flag, so a participant who fails your screener also settles on PENDING, with qualified: false.Setting up a project
An external-screener project declares two things:externalScreenerLink— the URL of your screener, as an absolutehttps://URL (http://and bare hostnames are rejected). 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.
externalScreenerLink can be set or changed on a live project with Update a project, and the catalog endpoint works on live projects too — see Changing the screener after publish.
- 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.
Publishing preconditions
Publish a project checks that the external screener config is valid before an external-screener project can go live: The pair must be complete.A project must have both
externalQuestions and an externalScreenerLink configured.A draft may hold just the link (or just the catalog) while you’re setting up, but publishing rejects a half-configured pair with a
400.
At least 2 questions in total.Every project needs at least 2 screener questions to publish. On an external-screener project the two catalogs count together: two Respondent screener questions, two external questions, or one of each all satisfy it. A project with a single question across both is rejected with a
400 (Project must have at least 2 screener questions).
The same total applies once the project is live: replacing the external catalog with fewer questions, or removing Respondent screener questions, is rejected if it would leave the published project below 2.
Changing the screener after publish
Your screener does not have to exist when the project goes live. On a published project (projectStatus: PAID):
- Set or change
externalScreenerLinkwith Update a project — it is one of the fields accepted on a live project. WhileexternalQuestionsare declared the link is required, so anullis rejected with a400; send the new URL instead. - Set or replace
externalQuestionswith Replace external screener questions — the same replace-all endpoint you use on a draft.
- Participants who applied before both were configured went through the classic flow and are already
PENDING— they never saw your screener, and they stay invitable. If you want their answers too, screen them on your side after inviting them. - Participants who were already handed off to your screener keep the URL they were sent to when they resume from the Respondent apply page, so a partner session they started is not broken by a link change. New applicants get the new link.
- Removing the link is only possible while no catalog is declared. Answers you already posted stay on their responses either way.
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: your side of the screener is complete once the stored rows cover every declared question. The response then moves to
PENDING, unless a Respondent verification step is still outstanding — see step 5. 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 onPENDINGwithqualified: false— visible to the researcher, but excluded from qualified counts and auto-invite. - You can keep posting corrections while the response is in
EXTERNAL_SCREENER_IN_PROGRESSorPENDING. 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 moment your answers settle the response —EXTERNAL_SCREENER_IN_PROGRESS → PENDING — is the application’s submission moment, so it arrives as a SCREENER_RESPONSES.CREATED event, exactly as a classic application’s submission does. There is no separate external-screener submission event to subscribe to.
There is no webhook for the handoff into your screener. You learn a participant has arrived when they land on your externalScreenerLink with the respondent_* correlation parameters — the same moment a webhook would tell you, without the round trip.
A few status behaviors worth knowing:
- A
PENDINGresponse may still be held — in an identity-verification or review hold, it is not yet visible to the researcher. The status does not change when the hold is released. Your answer posts are accepted throughout. - Cancel invite reverts to
PENDING— the same as on a classic project. The participant’s answers are already stored, so withdrawing an invitation does not send them through your screener again. - List screener responses accepts
EXTERNAL_SCREENER_IN_PROGRESSin itsstatusesfilter.