Prolific filters API

The filters API from Prolific — 3 operation(s) for filters.

Operations 3

GET /api/v1/filters/ List all filters #
GET /api/v1/filters/{id}/distribution/ Get filter distribution #
POST /api/v1/eligibility-count/ Count participants #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • 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.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/prolific-filters-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

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 Specification

prolific-filters-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Reference aiTaskBuilder 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:
    RangeFilterListResponseMinMax:
      oneOf:
      - type: integer
      - type: number
        format: double
      - type: string
      description: Optional maximum allowed value for the selected_range lower bound.
      title: RangeFilterListResponseMinMax
    RangeFilterListDetailedResponseMax:
      oneOf:
      - type: integer
      - type: number
        format: double
      - type: string
      description: The maximum valid value of the range.
      title: RangeFilterListDetailedResponseMax
    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
    RangeFilterWeightingsSelectedRange:
      type: object
      properties:
        lower:
          $ref: '#/components/schemas/RangeFilterWeightingsSelectedRangeLower'
        upper:
          $ref: '#/components/schemas/RangeFilterWeightingsSelectedRangeUpper'
      title: RangeFilterWeightingsSelectedRange
    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
    RangeFilterListDetailedResponseMinMax:
      oneOf:
      - type: integer
      - type: number
        format: double
      - type: string
      description: Optional maximum allowed value for the selected_range lower bound.
      title: RangeFilterListDetailedResponseMinMax
    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
    SelectFilterListDetailedResponseType:
      type: string
      enum:
      - select
      - range
      description: The filter type.
      title: SelectFilterListDetailedResponseType
    RangeFilterListResponseMin:
      oneOf:
      - type: integer
      - type: number
        format: double
      - type: string
      description: The minimum valid value of the range.
      title: RangeFilterListResponseMin
    RangeFilterListResponseType:
      type: string
      enum:
      - select
      - range
      description: The filter type.
      title: RangeFilterListResponseType
    RangeFilterWeightingsSelectedRangeUpper:
      oneOf:
      - type: integer
      - type: string
      - type: number
        format: double
      title: RangeFilterWeightingsSelectedRangeUpper
    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
    RangeFilterListDetailedResponseMaxMin:
      oneOf:
      - type: integer
      - type: number
        format: double
      - type: string
      description: Optional minimum allowed value for the selected_range upper bound.
      title: RangeFilterListDetailedResponseMaxMin
    ErrorDetailDetail:
      oneOf:
      - type: string
      - type: array
        items:
          type: string
      - $ref: '#/components/schemas/ErrorDetailDetail2'
      description: Error detail
      title: ErrorDetailDetail
    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
    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
    SelectFilterListResponseType:
      type: string
      enum:
      - select
      - range
      description: The filter type.
      title: SelectFilterListResponseType
    RangeFilterListResponseMaxMin:
      oneOf:
      - type: integer
      - type: number
        format: double
      - type: string
      description: Optional minimum allowed value for the selected_range upper bound.
      title: RangeFilterListResponseMaxMin
    FilterDistributionDistribution:
      oneOf:
      - type: object
        additionalProperties:
          type: integer
      - type: object
        additionalProperties:
          type: integer
      title: FilterDistributionDistribution
    RequirementsCountRequestFiltersItems:
      oneOf:
      - $ref: '#/components/schemas/SelectFilter'
      - $ref: '#/components/schemas/RangeFilter'
      - $ref: '#/components/schemas/CompositeFilter'
      title: RequirementsCountRequestFiltersItems
    FilterDistribution:
      type: object
      properties:
        distribution:
          type: object
          additionalProperties:
            $ref: '#/components/schemas/FilterDistributionDistribution'
          description: Distribution data for the specified `distribution_filters`
      title: FilterDistribution
    RangeFilterWeightings:
      type: object
      properties:
        selected_range:
          $ref: '#/components/schemas/RangeFilterWeightingsSelectedRange'
        weighting:
          type: number
          format: double
      required:
      - selected_range
      - weighting
      title: RangeFilterWeightings
    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
    CompositeFilterSelectedFiltersItems:
      oneOf:
      - $ref: '#/components/schemas/SelectFilter'
      - $ref: '#/components/schemas/RangeFilter'
      - $ref: '#/components/schemas/CompositeFilter'
      title: CompositeFilterSelectedFiltersItems
    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
    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
    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
    RequirementsCount:
      type: object
      properties:
        count:
          type: number
          format: double
          description: Number of participants passing all the requirements
      required:
      - count
      title: RequirementsCount
    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
    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
    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
    RangeFilterSelectedRangeUpper:
      oneOf:
      - type: integer
      - type: string
      - type: number
        format: double
      description: Your selected upper bound for the range.
      title: RangeFilterSelectedRangeUpper
    RangeFilterSelectedRangeLower:
      oneOf:
      - type: integer
      - type: string
      - type: number
        format: double
      description: Your selected lower bound for the range.
      title: RangeFilterSelectedRangeLower
    FilterListResultsItems:
      oneOf:
      - $ref: '#/components/schemas/SelectFilterListResponse'
      - $ref: '#/components/schemas/SelectFilterListDetailedResponse'
      - $ref: '#/components/schemas/RangeFilterListResponse'
      - $ref: '#/components/schemas/RangeFilterListDetailedResponse'
      title: FilterListResultsItems
    Error:
      type: object
      properties:
        error:
          $ref: '#/components/schemas/ErrorDetail'
      required:
      - error
      title: Error
    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
    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
    RangeFilterWeightingsSelectedRangeLower:
      oneOf:
      - type: integer
      - type: string
      - type: number
        format: double
      title: RangeFilterWeightingsSelectedRangeLower
    RangeFilterListResponseMax:
      oneOf:
      - type: integer
      - type: number
        format: double
      - type: string
      description: The maximum valid value of the range.
      title: RangeFilterListResponseMax
    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
    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
    RangeFilterListDetailedResponseType:
      type: string
      enum:
      - select
      - range
      description: The filter type.
      title: RangeFilterListDetailedResponseType
    RangeFilterListDetailedResponseMin:
      oneOf:
      - type: integer
      - type: number
        format: double
      - type: string
      description: The minimum valid value of the range.
      title: RangeFilterListDetailedResponseMin
  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>`.'