Prolific Filters API
The filters API from Prolific — 3 operation(s) for filters.
The filters API from Prolific — 3 operation(s) for filters.
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
find_apisBrowse and filter every API in the catalog.get_api_artifactsOne API's artifacts, grouped by type.get_openapiThe primary OpenAPI for this API.find_similar_apisAPIs that look like this one.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.curl "https://apis.io/api/v1/apis/prolific-filters-api"
curl "https://apis.io/api/v1/apis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: Reference Filters API
version: 1.0.0
servers:
- url: https://api.prolific.com
description: Production
tags:
- name: Filters
paths:
/api/v1/filters/:
get:
operationId: get-filters
summary: List all filters
description: List all filters that can be applied to your filter sets or studies.
tags:
- Filters
parameters:
- name: detailed
in: query
description: Include extra information required to sort and categorise filters in the Prolific app. This is not required for API use. Default false.
required: false
schema:
type: string
- name: workspace_id
in: query
description: The workspace ID for the workspace you are creating a study or filterset in. This is used to get contextual data such as previous studies and participant groups.
required: false
schema:
type: string
- name: filter_tag
in: query
description: Can be used to return only Custom Group filters.
required: false
schema:
type: string
- name: Authorization
in: header
description: 'The Prolific API uses API token to authenticate requests. You can create an API token directly from your settings.
Your API token does not have an expiry date and carries full permission, so be sure to keep them secure.
If your token is leaked, delete it and create a new one directly in the app.
In your requests add `Authorization` header with the value `Token <your token>`.'
required: true
schema:
type: string
responses:
'200':
description: List of filters
content:
application/json:
schema:
$ref: '#/components/schemas/FilterList'
'400':
description: Error
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
/api/v1/filters/{id}/distribution/:
get:
operationId: get-filter-distribution
summary: Get filter distribution
description: Get the distribution of a filter.
tags:
- Filters
parameters:
- name: id
in: path
description: ID of the filter to get distribution for. Only filters tagged with "custom-group" are supported.
required: true
schema:
type: string
- name: workspace_id
in: query
description: ID of your current workspace.
required: true
schema:
type: string
- name: distribution_filters
in: query
description: Filters to get distributions for. This should be a comma-separated list of filter IDs. Only filters tagged with "allow-distribution" are supported.
required: true
schema:
type: string
- name: Authorization
in: header
description: 'The Prolific API uses API token to authenticate requests. You can create an API token directly from your settings.
Your API token does not have an expiry date and carries full permission, so be sure to keep them secure.
If your token is leaked, delete it and create a new one directly in the app.
In your requests add `Authorization` header with the value `Token <your token>`.'
required: true
schema:
type: string
responses:
'200':
description: Filter distribution
content:
application/json:
schema:
$ref: '#/components/schemas/FilterDistribution'
'400':
description: Error
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
/api/v1/eligibility-count/:
post:
operationId: get-eligible-count
summary: Count participants
description: 'Count how many participants meet all the given filters.
Only participants that pass **every one** of the filters are counted.
Zero means that there are less than 25 participants. We do not show lower numbers to protect the privacy of the participants.
To see a list of filters that may be passed to this endpoint, see the documentation for filters.'
tags:
- Filters
parameters:
- name: Authorization
in: header
description: 'The Prolific API uses API token to authenticate requests. You can create an API token directly from your settings.
Your API token does not have an expiry date and carries full permission, so be sure to keep them secure.
If your token is leaked, delete it and create a new one directly in the app.
In your requests add `Authorization` header with the value `Token <your token>`.'
required: true
schema:
type: string
responses:
'200':
description: Count
content:
application/json:
schema:
$ref: '#/components/schemas/RequirementsCount'
'400':
description: Error
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/RequirementsCountRequest'
components:
schemas:
SelectFilterListResponseType:
type: string
enum:
- select
- range
description: The filter type.
title: SelectFilterListResponseType
FilterListResultsItems:
oneOf:
- $ref: '#/components/schemas/SelectFilterListResponse'
- $ref: '#/components/schemas/SelectFilterListDetailedResponse'
- $ref: '#/components/schemas/RangeFilterListResponse'
- $ref: '#/components/schemas/RangeFilterListDetailedResponse'
title: FilterListResultsItems
RangeFilterListDetailedResponseType:
type: string
enum:
- select
- range
description: The filter type.
title: RangeFilterListDetailedResponseType
FilterDistributionDistribution:
oneOf:
- type: object
additionalProperties:
type: integer
- type: object
additionalProperties:
type: integer
title: FilterDistributionDistribution
RangeFilterSelectedRangeLower:
oneOf:
- type: integer
- type: string
- type: number
format: double
description: Your selected lower bound for the range.
title: RangeFilterSelectedRangeLower
CompositeFilterSelectedFiltersItems:
oneOf:
- $ref: '#/components/schemas/SelectFilter'
- $ref: '#/components/schemas/RangeFilter'
- $ref: '#/components/schemas/CompositeFilter'
title: CompositeFilterSelectedFiltersItems
RangeFilterListDetailedResponseMin:
oneOf:
- type: integer
- type: number
format: double
- type: string
description: The minimum valid value of the range.
title: RangeFilterListDetailedResponseMin
CompositeFilterFilterId:
type: string
enum:
- and
- or
description: Composite filter group operator. Use `and` when every child filter must match, or `or` when at least one child filter must match.
title: CompositeFilterFilterId
RangeFilterListDetailedResponse:
type: object
properties:
filter_id:
type: string
description: The ID of the filter, based on a slugified version of the title at the time the filter was created.
title:
type: string
description: The title of the filter.
description:
type: string
description: A description of the filter.
type:
$ref: '#/components/schemas/RangeFilterListDetailedResponseType'
description: The filter type.
question:
type: string
description: The question asked of participants to generate this filter.
min:
$ref: '#/components/schemas/RangeFilterListDetailedResponseMin'
description: The minimum valid value of the range.
max:
$ref: '#/components/schemas/RangeFilterListDetailedResponseMax'
description: The maximum valid value of the range.
data_type:
$ref: '#/components/schemas/RangeFilterListDetailedResponseDataType'
description: 'The data type of the range.
- If the data type is integer, the lower and upper values must be integers. Example: `70`.
- If the data type is date, the lower and upper values must be ISO8601 dates. Example: `2025-07-11`.
- If the data type is float, the lower and upper values can be provided as floats or integers. Returned values will be floats. Example: `70.5` or `80.0`.'
min_max:
$ref: '#/components/schemas/RangeFilterListDetailedResponseMinMax'
description: Optional maximum allowed value for the selected_range lower bound.
max_min:
$ref: '#/components/schemas/RangeFilterListDetailedResponseMaxMin'
description: Optional minimum allowed value for the selected_range upper bound.
researcher_help_text:
type:
- string
- 'null'
description: Some help text to be displayed to researchers in the filter selection modal.
participant_help_text:
type:
- string
- 'null'
description: Some help text to be displayed to participants in the About You section.
category:
type:
- string
- 'null'
description: The category the filter is displayed in About You and the filter selection modal.
subcategory:
type:
- string
- 'null'
description: The sub-category the filter is displayed in the filter selection modal.
display_order:
type:
- integer
- 'null'
description: The order in which the filter is displayed within its sub-category in the filter selection modal.
tags:
type:
- array
- 'null'
items:
type: string
description: Some additional tags that can be used to display the filter in a specific way, e.g. recommended, new, expiring.
title: RangeFilterListDetailedResponse
RangeFilterListResponseMax:
oneOf:
- type: integer
- type: number
format: double
- type: string
description: The maximum valid value of the range.
title: RangeFilterListResponseMax
RangeFilterListResponseMin:
oneOf:
- type: integer
- type: number
format: double
- type: string
description: The minimum valid value of the range.
title: RangeFilterListResponseMin
Error:
type: object
properties:
error:
$ref: '#/components/schemas/ErrorDetail'
required:
- error
title: Error
RangeFilterListDetailedResponseMinMax:
oneOf:
- type: integer
- type: number
format: double
- type: string
description: Optional maximum allowed value for the selected_range lower bound.
title: RangeFilterListDetailedResponseMinMax
RangeFilterListResponseMaxMin:
oneOf:
- type: integer
- type: number
format: double
- type: string
description: Optional minimum allowed value for the selected_range upper bound.
title: RangeFilterListResponseMaxMin
RangeFilterWeightingsSelectedRangeLower:
oneOf:
- type: integer
- type: string
- type: number
format: double
title: RangeFilterWeightingsSelectedRangeLower
CompositeFilter:
type: object
properties:
filter_id:
$ref: '#/components/schemas/CompositeFilterFilterId'
description: Composite filter group operator. Use `and` when every child filter must match, or `or` when at least one child filter must match.
selected_filters:
type: array
items:
$ref: '#/components/schemas/CompositeFilterSelectedFiltersItems'
description: Child filters in this group. Children can be select filters, range filters, or supported nested composite groups.
required:
- filter_id
- selected_filters
title: CompositeFilter
RangeFilterListResponse:
type: object
properties:
filter_id:
type: string
description: The ID of the filter, based on a slugified version of the title at the time the filter was created.
title:
type: string
description: The title of the filter.
description:
type: string
description: A description of the filter.
type:
$ref: '#/components/schemas/RangeFilterListResponseType'
description: The filter type.
question:
type: string
description: The question asked of participants to generate this filter.
min:
$ref: '#/components/schemas/RangeFilterListResponseMin'
description: The minimum valid value of the range.
max:
$ref: '#/components/schemas/RangeFilterListResponseMax'
description: The maximum valid value of the range.
data_type:
$ref: '#/components/schemas/RangeFilterListResponseDataType'
description: 'The data type of the range.
- If the data type is integer, the lower and upper values must be integers. Example: `70`.
- If the data type is date, the lower and upper values must be ISO8601 dates. Example: `2025-07-11`.
- If the data type is float, the lower and upper values can be provided as floats or integers. Returned values will be floats. Example: `70.5` or `80.0`.'
min_max:
$ref: '#/components/schemas/RangeFilterListResponseMinMax'
description: Optional maximum allowed value for the selected_range lower bound.
max_min:
$ref: '#/components/schemas/RangeFilterListResponseMaxMin'
description: Optional minimum allowed value for the selected_range upper bound.
title: RangeFilterListResponse
RangeFilterListDetailedResponseDataType:
type: string
enum:
- date
- integer
- float
description: 'The data type of the range.
- If the data type is integer, the lower and upper values must be integers. Example: `70`.
- If the data type is date, the lower and upper values must be ISO8601 dates. Example: `2025-07-11`.
- If the data type is float, the lower and upper values can be provided as floats or integers. Returned values will be floats. Example: `70.5` or `80.0`.'
title: RangeFilterListDetailedResponseDataType
SelectFilterListResponseDataType:
type: string
enum:
- ChoiceID
- ParticipantID
- StudyID
- ParticipantGroupID
description: 'The format of the keys in the choices object. If the keys are strings representing sequential integers,
the data format is integer. If the keys are database ObjectIDs, the type of ID is specified.'
title: SelectFilterListResponseDataType
RangeFilterListResponseMinMax:
oneOf:
- type: integer
- type: number
format: double
- type: string
description: Optional maximum allowed value for the selected_range lower bound.
title: RangeFilterListResponseMinMax
RequirementsCountRequestFiltersItems:
oneOf:
- $ref: '#/components/schemas/SelectFilter'
- $ref: '#/components/schemas/RangeFilter'
- $ref: '#/components/schemas/CompositeFilter'
title: RequirementsCountRequestFiltersItems
RangeFilterListResponseType:
type: string
enum:
- select
- range
description: The filter type.
title: RangeFilterListResponseType
SelectFilterListDetailedResponseDataType:
type: string
enum:
- ChoiceID
- ParticipantID
- StudyID
- ParticipantGroupID
description: 'The format of the keys in the choices object. If the keys are strings representing sequential integers,
the data format is integer. If the keys are database ObjectIDs, the type of ID is specified.'
title: SelectFilterListDetailedResponseDataType
RangeFilterListResponseDataType:
type: string
enum:
- date
- integer
- float
description: 'The data type of the range.
- If the data type is integer, the lower and upper values must be integers. Example: `70`.
- If the data type is date, the lower and upper values must be ISO8601 dates. Example: `2025-07-11`.
- If the data type is float, the lower and upper values can be provided as floats or integers. Returned values will be floats. Example: `70.5` or `80.0`.'
title: RangeFilterListResponseDataType
RangeFilterWeightingsSelectedRangeUpper:
oneOf:
- type: integer
- type: string
- type: number
format: double
title: RangeFilterWeightingsSelectedRangeUpper
ErrorDetail:
type: object
properties:
status:
type: integer
description: Status code as in the http standards
error_code:
type: integer
description: Internal error code
title:
type: string
description: Error title
detail:
$ref: '#/components/schemas/ErrorDetailDetail'
description: Error detail
additional_information:
type: string
description: Optional extra information
traceback:
type: string
description: Optional debug information
interactive:
type: boolean
required:
- status
- error_code
- title
- detail
title: ErrorDetail
SelectFilter:
type: object
properties:
filter_id:
type: string
description: ID of the "select" type filter.
selected_values:
type: array
items:
type: string
description: '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:
type: object
additionalProperties:
type: number
format: double
description: 'Ratios to control the distribution of participants across the selected values.
Integer percentages, floats, and exact quantities are valid inputs.'
required:
- filter_id
- selected_values
title: SelectFilter
RangeFilterSelectedRangeUpper:
oneOf:
- type: integer
- type: string
- type: number
format: double
description: Your selected upper bound for the range.
title: RangeFilterSelectedRangeUpper
RangeFilterListDetailedResponseMax:
oneOf:
- type: integer
- type: number
format: double
- type: string
description: The maximum valid value of the range.
title: RangeFilterListDetailedResponseMax
SelectFilterListDetailedResponseType:
type: string
enum:
- select
- range
description: The filter type.
title: SelectFilterListDetailedResponseType
FilterList:
type: object
properties:
results:
type: array
items:
$ref: '#/components/schemas/FilterListResultsItems'
_links:
type: object
additionalProperties:
description: Any type
meta:
type: object
additionalProperties:
description: Any type
title: FilterList
RequirementsCountRequest:
type: object
properties:
filters:
type: array
items:
$ref: '#/components/schemas/RequirementsCountRequestFiltersItems'
description: 'List of filters to apply to the count. This parameter uses the new, simplified
filters schema for interacting with eligibility.'
workspace_id:
type: string
description: 'The ID of the workspace you will be creating a study in.
Due to US tax laws, non US residents may not participate in studies created by US researchers.
For this reason, we use the country specified in the workspace to determine eligibility.
If you do not specify a workspace ID, we will use the current workspace ID of the user making the request.
Your eligibility count may not be accurate if you do not specify a workspace ID.'
organisation_id:
type: string
description: The ID of the workspace you will be creating a filterset in.
required:
- filters
title: RequirementsCountRequest
ErrorDetailDetail:
oneOf:
- type: string
- type: array
items:
type: string
- $ref: '#/components/schemas/ErrorDetailDetail2'
description: Error detail
title: ErrorDetailDetail
ErrorDetailDetail2:
type: object
properties:
any_field:
type: array
items:
type: string
description: Name of the field with a validation error and as a value an array with the error descriptions
description: All fields with validation errors
title: ErrorDetailDetail2
SelectFilterListDetailedResponse:
type: object
properties:
filter_id:
type: string
description: The ID of the filter, based on a slugified version of the title at the time the filter was created.
title:
type: string
description: The title of the filter.
description:
type: string
description: A description of the filter.
type:
$ref: '#/components/schemas/SelectFilterListDetailedResponseType'
description: The filter type.
question:
type: string
description: The question asked of participants to generate this filter.
choices:
type: object
additionalProperties:
description: Any type
description: An object containing all the filter's possible responses as key-value pairs, with sequential integer IDs or database ObjectIDs as the keys and the text of the response as the values.
data_type:
$ref: '#/components/schemas/SelectFilterListDetailedResponseDataType'
description: 'The format of the keys in the choices object. If the keys are strings representing sequential integers,
the data format is integer. If the keys are database ObjectIDs, the type of ID is specified.'
researcher_help_text:
type:
- string
- 'null'
description: Some help text to be displayed to researchers in the filter selection modal.
participant_help_text:
type:
- string
- 'null'
description: Some help text to be displayed to participants in the About You section.
category:
type:
- string
- 'null'
description: The category the filter is displayed in About You and the filter selection modal.
subcategory:
type:
- string
- 'null'
description: The sub-category the filter is displayed in the filter selection modal.
display_order:
type:
- integer
- 'null'
description: The order in which the filter is displayed within its sub-category in the filter selection modal.
tags:
type:
- array
- 'null'
items:
type: string
description: Some additional tags that can be used to display the filter in a specific way, e.g. recommended, new, expiring.
title: SelectFilterListDetailedResponse
RequirementsCount:
type: object
properties:
count:
type: number
format: double
description: Number of participants passing all the requirements
required:
- count
title: RequirementsCount
RangeFilterListDetailedResponseMaxMin:
oneOf:
- type: integer
- type: number
format: double
- type: string
description: Optional minimum allowed value for the selected_range upper bound.
title: RangeFilterListDetailedResponseMaxMin
RangeFilterWeightingsSelectedRange:
type: object
properties:
lower:
$ref: '#/components/schemas/RangeFilterWeightingsSelectedRangeLower'
upper:
$ref: '#/components/schemas/RangeFilterWeightingsSelectedRangeUpper'
title: RangeFilterWeightingsSelectedRange
RangeFilter:
type: object
properties:
filter_id:
type: string
description: ID of the "range" type filter.
selected_range:
$ref: '#/components/schemas/RangeFilterSelectedRange'
description: '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:
type: object
additionalProperties:
$ref: '#/components/schemas/RangeFilterWeightings'
description: 'Ratios to control the distribution of participants across the selected values.
Integers and exact quantities are valid inputs.'
required:
- filter_id
- selected_range
title: RangeFilter
RangeFilterWeightings:
type: object
properties:
selected_range:
$ref: '#/components/schemas/RangeFilterWeightingsSelectedRange'
weighting:
type: number
format: double
required:
- selected_range
- weighting
title: RangeFilterWeightings
FilterDistribution:
type: object
properties:
distribution:
type: object
additionalProperties:
$ref: '#/components/schemas/FilterDistributionDistribution'
description: Distribution data for the specified `distribution_filters`
title: FilterDistribution
SelectFilterListResponse:
type: object
properties:
filter_id:
type: string
description: The ID of the filter, based on a slugified version of the title at the time the filter was created.
title:
type: string
description: The title of the filter.
description:
type: string
description: A description of the filter.
type:
$ref: '#/components/schemas/SelectFilterListResponseType'
description: The filter type.
question:
type: string
description: The question asked of participants to generate this filter.
choices:
type: object
additionalProperties:
description: Any type
description: An object containing all the filter's possible responses as key-value pairs, with sequential integer IDs or database ObjectIDs as the keys and the text of the response as the values.
data_type:
$ref: '#/components/schemas/SelectFilterListResponseDataType'
description: 'The format of the keys in the choices object. If the keys are strings representing sequential integers,
the data format is integer. If the keys are database ObjectIDs, the type of ID is specified.'
title: SelectFilterListResponse
RangeFilterSelectedRange:
type: object
properties:
lower:
$ref: '#/components/schemas/RangeFilterSelectedRangeLower'
description: Your selected lower bound for the range.
upper:
$ref: '#/components/schemas/RangeFilterSelectedRangeUpper'
description: Your selected upper bound for the range.
description: '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.'
title: RangeFilterSelectedRange
securitySchemes:
token:
type: apiKey
in: header
name: Authorization
description: 'The Prolific API uses API token to authenticate requests. You can create an API token directly from your settings.
Your API token does not have an expiry date and carries full permission, so be sure to keep them secure.
If your token is leaked, delete it and create a new one directly in the app.
In your requests add `Authorization` header with the value `Token <your token>`.'