---
title: "Create a project"
method: POST
path: "/api/v1/workspaces/{workspace_id}/projects/"
tags: ["projects"]
---

# Create a project

`POST /api/v1/workspaces/{workspace_id}/projects/`

Creates a new project within the workspace.
When this project is created, it adds the user as a Project Editor.
Set `type` to `PUBLIC` to create a public project.

## Path parameters

- `workspace_id` string, required

## Headers

- `Authorization` string, required

## Request body

- CreateProject
  - `title` string, required — Name of project
  - `description` string — What is this project used for
  - `type` 'PRIVATE' | 'PUBLIC' — Project visibility type.
  - `public_details` PublicDetails
    - `status` 'ENABLED' | 'DISABLED' — Participant-facing publication status for a public project.
    - `title` string — Participant-facing title for the public project.
    - `short_description` string — Short participant-facing summary shown to participants for the public project.
    - `description` string — Additional participant-facing information shown to participants for the public project.
  - `naivety_distribution_rate` number, double, nullable — Control the balance between speed of your studies and the naivety of the participants. If not defined, by default Prolific calculates the best rate for most studies taking into account the `filters` and the `total_available_places` needed for this study. Use 0 if your priority is speed. When this property is set to 0 all eligible participants will have access to your study at the same time, without any prioritization. You can also set this at a workspace and study level.
  - `is_longitudinal` boolean — Whether this is a longitudinal (multi-wave) project.
  - `longitudinal` CreateProjectLongitudinal — Longitudinal configuration. Only used when `is_longitudinal` is true. `waves` may not be set at creation — add studies via `POST /api/v1/projects/{project_id}/studies/` after creation.
    - `config` LongitudinalConfig
      - `target_completions` integer, required — Target number of completions for the final wave.
      - `retention_rate` number, double, required — Expected retention rate between waves.
      - `filters` LongitudinalConfigFiltersItems[] — Recruitment filters applied to participants entering the first wave. Uses the same filter shapes as study creation.
        - union
          - SelectFilter
            - `filter_id` string, required — ID of the "select" type filter.
            - `selected_values` string[], required — This schema applies for filters of the `select` type, as defined in the [filter list response](\#tag/Filters/paths/~1api~1v1~1filters~1/get). Array of IDs matching the response IDs, from the `select` filter's `choices` (see response linked above). String format should match the `data_type` of the `select` filter's `choices` (see response linked above).
            - `weightings` object — Ratios to control the distribution of participants across the selected values. Integer percentages, floats, and exact quantities are valid inputs.
          - RangeFilter
            - `filter_id` string, required — ID of the "range" type filter.
            - `selected_range` RangeFilterSelectedRange, required — This schema applies for filters of the `range` type, as defined in the [filter list response](\#tag/Filters/paths/~1api~1v1~1filters~1/get). A dictionary with two possible objects, 'lower' and 'upper'. At least one must be present and a non-null value. The expected data type for these values is defined by the `range` filter's `data_type` (see response linked above). If the data_type is a date, string format should be a parseable ISO8601 date string. Date values should be provided as a string in ISO 8601 format. Leaving a value as null will result in that bound being set to the lowest or highest possible value, depending on whether it is the upper or lower bound.
              - …
            - `weightings` object — Ratios to control the distribution of participants across the selected values. Integers and exact quantities are valid inputs.
          - CompositeFilter
            - `filter_id` 'and' | 'or', required — Composite filter group operator. Use `and` when every child filter must match, or `or` when at least one child filter must match.
            - `selected_filters` CompositeFilterSelectedFiltersItems[], required — Child filters in this group. Children can be select filters, range filters, or supported nested composite groups.
              - …

## Response `201`

Successfully created project.

- Project
  - `id` string, required — Project id. It is created by Prolific.
  - `title` string, required — Name of project
  - `description` string — What is this project used for
  - `owner` string — User id of the creator of the project. It is created by Prolific.
  - `type` 'PRIVATE' | 'PUBLIC', required — Project visibility type.
  - `public_details` PublicDetails
    - `status` 'ENABLED' | 'DISABLED' — Participant-facing publication status for a public project.
    - `title` string — Participant-facing title for the public project.
    - `short_description` string — Short participant-facing summary shown to participants for the public project.
    - `description` string — Additional participant-facing information shown to participants for the public project.
  - `users` WorkspaceUser[] — Data for all users who have access to this project
    - `id` string, required — Id of user
    - `name` string — Name of user
    - `email` string — email of user
    - `roles` string[] — User roles in workspace
  - `workspace` string — Id of the workspace this project is in. This is created by Prolific.
  - `naivety_distribution_rate` number, double, nullable — The rate at which the studies within this project are distributed.
  - `is_longitudinal` boolean — Whether this is a longitudinal (multi-wave) project.
  - `longitudinal` ProjectLongitudinal — Only present when `is_longitudinal` is true.
    - `config` LongitudinalConfig
      - `target_completions` integer, required — Target number of completions for the final wave.
      - `retention_rate` number, double, required — Expected retention rate between waves.
      - `filters` LongitudinalConfigFiltersItems[] — Recruitment filters applied to participants entering the first wave. Uses the same filter shapes as study creation.
        - union
          - SelectFilter
            - `filter_id` string, required — ID of the "select" type filter.
            - `selected_values` string[], required — This schema applies for filters of the `select` type, as defined in the [filter list response](\#tag/Filters/paths/~1api~1v1~1filters~1/get). Array of IDs matching the response IDs, from the `select` filter's `choices` (see response linked above). String format should match the `data_type` of the `select` filter's `choices` (see response linked above).
            - `weightings` object — Ratios to control the distribution of participants across the selected values. Integer percentages, floats, and exact quantities are valid inputs.
          - RangeFilter
            - `filter_id` string, required — ID of the "range" type filter.
            - `selected_range` RangeFilterSelectedRange, required — This schema applies for filters of the `range` type, as defined in the [filter list response](\#tag/Filters/paths/~1api~1v1~1filters~1/get). A dictionary with two possible objects, 'lower' and 'upper'. At least one must be present and a non-null value. The expected data type for these values is defined by the `range` filter's `data_type` (see response linked above). If the data_type is a date, string format should be a parseable ISO8601 date string. Date values should be provided as a string in ISO 8601 format. Leaving a value as null will result in that bound being set to the lowest or highest possible value, depending on whether it is the upper or lower bound.
              - …
            - `weightings` object — Ratios to control the distribution of participants across the selected values. Integers and exact quantities are valid inputs.
          - CompositeFilter
            - `filter_id` 'and' | 'or', required — Composite filter group operator. Use `and` when every child filter must match, or `or` when at least one child filter must match.
            - `selected_filters` CompositeFilterSelectedFiltersItems[], required — Child filters in this group. Children can be select filters, range filters, or supported nested composite groups.
              - …
    - `retention` ProjectLongitudinalRetention — Computed retention projections and actuals, keyed by wave study id.
    - `waves` string[] — Ordered list of study IDs defining the project's current wave sequence. Empty if the project has no waves yet. Set via `longitudinal.waves` on `PATCH` (see `UpdateProject`).

## Other responses

- `400` — Error

## Changes

> 11 revisions in range; 5 could not be searched.

- **2026-07-31** `6427f33866b6` — 1 info
  - added the optional property `longitudinal/oneOf[subschema #1: ProjectLongitudinal]/waves` to the response with the `201` status
- **2026-07-26** `421c6aa415ef` — 4 info
  - added the new optional request property `is_longitudinal`
  - added the new optional request property `longitudinal`
  - added the optional property `is_longitudinal` to the response with the `201` status
  - added the optional property `longitudinal` to the response with the `201` status

[Change history](https://skmtc.dev/prolific/apis/api-reference/changes/api/v1/workspaces/:workspace_id/projects/post.md)

---

[API](https://skmtc.dev/prolific/apis/api-reference.md) · [All operations](https://skmtc.dev/prolific/apis/api-reference/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/prolific/api-reference/revisions/578f400cea53/schema)
