Skip to main content
A study is one piece of research: its brief, model settings and participation links. Its welcome, screening, characteristics, questions, flow and recruitment are configured through their own resources. See the Study lifecycle guide for the full workflow.

create()

Create a study inside a project. It starts as a draft, in linear interview mode, with an empty question list.
str | UUID
required
Project to create the study in.
str
required
Study name, shown to participants.
str
Study description.
str | StudyType
default:"sociology"
sociology, user_experience, customer_development or polling.
str
The research question or questions.
str
Research objectives.
str
Who you want to interview.
str
Methodology notes.
str
Benefits of taking part. Used in consent text.
str
Risks of taking part. Used in consent text.
str
Researcher or support contact.
str
Institutional affiliation.
str
default:"English"
Primary interview language.
bool
Skip collecting participants’ first names.
str | ModelTier
default:"open_weights"
open_weights, standard or premium. frontier is accepted by the API as a deprecated alias for premium.
str
Where participants go after completing. May contain {{external_participant_id}}.
int
Response quota. Omit for unlimited.
bool
Offer a voice-call interview link alongside text chat.
bool
Offer a video-call interview link alongside text chat.
Returns StudyOut.

list()

List the studies in a project. Returns StudyListOut, with studies holding a list of StudySummary.

get()

Get a study’s full configuration, its status, setup counts (such as question_count and screening_enabled) and participation links. Returns StudyOut.

update()

Partially update a study. Takes the same optional fields as create() except project_id; only the ones you pass change. To remove a response quota, use recruitment.update(clear_max_responses=True). Returns StudyOut.

get_stats()

Participation statistics: interview counts, completion rate and quota fill. Simulated interviews and test runs are counted separately. Returns StudyStatsOut.

draft()

Turn a short research brief into study fields with AI. Nothing is stored: pass the draft’s fields to create(), then fill in questions with questions.generate(). Usually takes 20–40 seconds.
str | StudyType
required
The methodology. It decides which brief fields are read.
str
default:"English"
Language to write the draft in, which also becomes the interview language.
Only the brief fields for the chosen survey_type are read: All brief fields are strings. Returns StudyDraft.

draft_from_site()

Read a product landing page and draft a user research study for it. Nothing is stored. When is_valid is true, pass draft to create(); otherwise draft is None and rationale explains what was missing. Each site allows a limited number of drafts per user (generations_used of generations_limit), and the API returns 429 (RateLimitError) after that. Usually takes 20–40 seconds.
str
required
Public http(s) URL of the product or startup landing page.
str
default:"English"
Language to write the draft and rationale in.
Returns StudyDraftFromSiteOut.

get_publication()

The study’s publication status (draft, open, paused or closed), how many studies your plan may have open, the publish-time credit check, the latest validation run and whether the configuration has changed since publishing. Returns PublicationStatusOut.

validate()

Validate everything participants will read (questions or flow, welcome, screening and characteristics) without publishing. The result is recorded and reused by publish() while the configuration is unchanged. This is a model call, so allow up to a minute. outcome is passed, methodological_issues, ethical_issues or blocking_issues. Each issue’s severity is ethical or blocking (both must be fixed) or methodological (can be acknowledged). Returns ValidationRunOut.

publish()

Open the study to participants, or resume a paused one. Checks the plan’s open-study limit, credits and validation first. A refusal raises ConflictError, whose body carries the refusal code, the issues and the validation_run_id. Publishing a study that’s already open does nothing and returns already_open=True.
str | UUID
To publish despite methodological issues, pass the validation_run_id from the refusal. Ethical and blocking issues can’t be acknowledged.
bool
Publish even though your balance covers at least one interview but not every remaining response.
Returns PublishOut.

pause()

Stop admitting new participants and unlock editing. Interviews already running finish on the configuration they started with; in_flight_count says how many. Resume with publish(). Returns PauseOut.