Forsta Sample Marketplace Partner APIs

The contract a sample provider must implement to be listed in the Forsta Sample Marketplace - estimates, projects and samples over OAuth 2.0 client credentials or HTTP Basic - together with the Partner Setup API Forsta itself hosts for managing vendor configuration, and a published qualification list enumerating the qualifications available per locale.

Operations 8

POST /oauth2/token Client Credentials Access Token #
POST /estimates Sample Estimates #
GET /projects/{project_id} Get project data #
PATCH /projects/{project_id} Update project data #
POST /projects Create project #
GET /samples/{sample_id} Get sample data #
PATCH /samples/{sample_id} Update sample #
POST /samples Create Sample #

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/sample-marketplace"
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

forsta-sample-marketplace-partner-contract-openapi.yml Raw ↑
openapi: 3.0.0
info:
  version: 1.0-beta
  title: Sample Marketplace Partner API Contract
  description: |
    # Summary

    Sample providers that wish to be added to the Forsta Sample Marketplace must implement
    an API following the specifications outlined in this document after obtaining an authentication key from Forsta.

    # Disclaimer

    Subject to the execution of a Non-Disclosure Agreement with FocusVision Worldwide, Inc (“Forsta”), Forsta hereby grants you a limited, revocable, non-exclusive, non-transferable,
    non-sublicensable license during the term of the Agreement to:
    (a) use the API solely for your internal business purposes in developing Your Applications that will communicate and interoperate with the Forsta Offering; and
    (b) display certain Forsta Marks in compliance with usage guidelines that we may specify from time to time solely in connection with the use of the API and the Applications
    and not in connection with the advertising, promotion, distribution, or sale of any other products or services. You acknowledge that there are no implied licenses granted under this Agreement.
    We reserve all rights that are not expressly granted. You may not use the API or any Forsta Mark for any other purpose without our prior written consent.
    You must obtain an API Key through the registration process available to use and access the API. You may not share your API Key with any third party, must keep your API Key and all log-in information secure,
    and must use the API Key as your sole means of accessing the API. Your API Key may be revoked at any time by us.


    # Introduction

    Integration with the Forsta Sample Marketplace provides valuable opportunity to provide sample to Decipher surveys.

    # Qualifications

    Qualifications are used to constrict sample to participants that have specific qualities or traits. Each qualification is introduced in a particular version of the API.

    Qualifications need to match the locale that the sample is intended for. For instance, if a sample is created for en_CA, the qualifications must be from the en_CA qualification list.

    As new qualifications are added to the Forsta Sample Marketplace, the API contract version will have a minor version upgrade. If there are breaking changes such as renaming of a specific qualification or the options of a qualification, a larger change is required and the major version of the API contract will change.

    The schema for each qualification and the version they are added to will be listed below:

    A list of all en_US qualifications are below. For a list of qualifcations for each region, refer to [this](qualification-list) page.

    Qualification | API version added
    --------------|------------------
    [Age and Gender of Child](/static/media/questions/en_US/child_ages.yml) | [1.0-beta](#) |  [Translation]()
    [Age](/static/media/questions/en_US/age.yml) | [1.0-beta](#) |  [Translation]()
    [Auto Purchase Type](/static/media/questions/en_US/auto_purchase_type.yml) | [1.0-beta](#) |  [Translation]()
    [Business Decision Maker](/static/media/questions/en_US/department_decision_maker.yml) | [1.0-beta](#) |  [Translation]()
    [Cell Carrier US](/static/media/questions/en_US/cell_carrier_us.yml) | [1.0-beta](#) |  [Translation]()
    [Cell Carrier](/static/media/questions/en_US/cell_carrier.yml) | [1.0-beta](#) |  [Translation]()
    [Department](/static/media/questions/en_US/employee_dept.yml) | [1.0-beta](#) |  [Translation]()
    [Division](/static/media/questions/en_US/division.yml) | [1.0-beta](#) |  [Translation]()
    [DMA](/static/media/questions/en_US/dma.yml) | [1.0-beta](#) |  [Translation]()
    [Education](/static/media/questions/en_US/education.yml) | [1.0-beta](#) |  [Translation]()
    [Education 2](/static/media/questions/en_US/education_v2.yml) | [1.0-beta](#) |  [Translation]()
    [Employment](/static/media/questions/en_US/employment.yml) | [1.0-beta](#) |  [Translation]()
    [Ethnicity](/static/media/questions/en_US/ethnicity.yml) | [1.0-beta](#) |  [Translation]()
    [Gender](/static/media/questions/en_US/gender.yml) | [1.0-beta](#) |  [Translation]()
    [Grocery Shopper](/static/media/questions/en_US/grocery_shopper.yml) | [1.0-beta](#) |  [Translation]()
    [Hispanic](/static/media/questions/en_US/hispanic.yml) | [1.0-beta](#) |  [Translation]()
    [Home Owner](/static/media/questions/en_US/home_owner.yml) | [1.0-beta](#) |  [Translation]()
    [Household Responsibility](/static/media/questions/en_US/hh_responsibility.yml) | [1.0-beta](#) |  [Translation]()
    [Income](/static/media/questions/en_US/income.yml) | [1.0-beta](#) |  [Translation]()
    [Industry within Household](/static/media/questions/en_US/household_industry.yml) | [1.0-beta](#) |  [Translation]()
    [Job Title](/static/media/questions/en_US/job_title.yml) | [1.0-beta](#) |  [Translation]()
    [Mobile](/static/media/questions/en_US/mobile.yml) | [1.0-beta](#) |  [Translation]()
    [Organization Income](/static/media/questions/en_US/org_income.yml) | [1.0-beta](#) |  [Translation]()
    [Organization Size](/static/media/questions/en_US/org_census.yml) | [1.0-beta](#) |  [Translation]()
    [Parent](/static/media/questions/en_US/has_children.yml) | [1.0-beta](#) |  [Translation]()
    [Pets](/static/media/questions/en_US/pets.yml) | [1.0-beta](#) |  [Translation]()
    [Primary Decision Maker](/static/media/questions/en_US/primary_decision_maker.yml) | [1.0-beta](#) |  [Translation]()
    [Profession](/static/media/questions/en_US/personal_industry.yml) | [1.0-beta](#) |  [Translation]()
    [Region](/static/media/questions/en_US/region.yml) | [1.0-beta](#) |  [Translation]()
    [Spanish Speaking](/static/media/questions/en_US/spanish_speaking.yml) | [1.0-beta](#) |  [Translation]()
    [State](/static/media/questions/en_US/state.yml) | [1.0-beta](#) |  [Translation]()
    [Tablet](/static/media/questions/en_US/tablet.yml) | [1.0-beta](#) |  [Translation]()
    [Urban Rural](/static/media/questions/en_US/urban_rural.yml) | [1.0-beta](#) |  [Translation]()
    [Webcam](/static/media/questions/en_US/webcam.yml) | [1.0-beta](#) |  [Translation]()
    [Zip Code](/static/media/questions/en_US/zip.yml) | [1.0-beta](#) |  [Translation]()


    # API Workflow

    <ol>
      <li>
      The `/estimates` endpoint is always requested before any other endpoint, the result of which will be included
      in the bid results page of the Sample Marketplace. The user may select a bid result from any provider they wish to purchase from
      at this point.
      </li>
      <li>
      Whichever provider the user selects is then used to create a new sample. If there is no project already made
      for this provider for the survey the user is purchasing sample for, one will be created using the `/projects`
      endpoint, otherwise the same project id is used that is already tied to the survey.
      </li>
      <li>
      A new sample is then created using the `/samples` endpoint with the same specifications provided by the user
      that were previously used to obtain the feasibility estimate. The sample is created using the project id obtained
      from the previous step.
      </li>
      <li>
      Once the user is ready to begin receiving participants in the Decipher survey, they will finalize their sample selection and the sample status will be set to live using the `/samples`
      endpoint.
      </li>
    </ol>

    # Test Runner

    To validate the implementation of the API Contract, we will use a test runner.
    This test runner has been made publicly available [here](http://smp-docs-fvdev.s3-website-us-west-2.amazonaws.com/test-runner.zip).
    We will use this test runner to ensure that each of the endpoints work as expected.

    All requests that come from the test runner include the header <b>"X-FV-TEST"</b> with a value of "true" to enable
    the ability to differentiate fake requests from real requests.
    For more information on how to run the test runner, refer to the readme within the zipped test runner.
tags:
  - name: OAuth2
    description: The OAuth2 resources are used to validate authentication tokens to allow communication between the applications.
  - name: Estimates
    description: The Estimate resources are used to determine the pricing and feasibility of a potential sample bid. The Forsta Sample Marketplace expects responses to these calls within 10 seconds before terminating the request. If the sample's quota is unable to be fufilled, a null price in the result object should be returned.
  - name: Projects
    description: The Project resources are used to create organizational containers for Samples. The Forsta Sample Marketplace expects responses to these calls within 10 seconds before terminating the request.
  - name: Samples
    description: The Sample resources are used to create or alter sample purchases.  The Forsta Sample Marketplace expects responses to these calls within 10 seconds before terminating the request.
paths:
  /oauth2/token:
    post:
      summary: Client Credentials Access Token
      tags:
        - OAuth2
      description: This is used to gain an access token to use for the rest of the APIs following the <a href="https://tools.ietf.org/html/rfc6749#section-4.4">Client Credentials Grant</a> flow of the OAuth2 spec. Authorization used for this endpoint should be of the form `Basic Base64Encode(client_id:client_secret)`. We will use your client_id and client_secret that is set in the apispec endpoint in the partner signup process.
      security:
        - BasicAuth: []
      operationId: demo.post_token
      requestBody:
        content:
          application/x-www-form-urlencoded:
            schema:
              type: object
              properties:
                grant_type:
                  type: string
                  enum:
                    - client_credentials
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/response'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/error'
  /estimates:
    post:
      requestBody:
        content:
          application/json:
            schema:
              allOf:
                - $ref: '#/components/schemas/EstimateBody'
      tags:
        - Estimates
      summary: Sample Estimates
      description: Endpoint that returns an estimated cost for a potential sample. If the sample's quota is unable to be fufilled, a null price in the result object should be returned.
      security:
        - OAuth2: []
      operationId: demo.post_estimate
      responses:
        '200':
          description: Estimate created
          content:
            application/json:
              schema:
                allOf:
                  - type: object
                    properties:
                      result:
                        type: object
                        properties:
                          price:
                            type: number
                            description: The expected price per complete for each participant.
                            example: 2.5
                  - $ref: '#/components/schemas/EstimateBody'
        '401':
          $ref: '#/components/responses/401'
        '422':
          $ref: '#/components/responses/422'
        '500':
          $ref: '#/components/responses/500'
  /projects/{project_id}:
    get:
      parameters:
        - name: project_id
          in: path
          required: true
          example: f7694b5e-3f50-4bb6-b307-f68b0fe111aa
          description: The ID tied to a specific project.
          schema:
            type: string
      tags:
        - Projects
      summary: Get project data
      security:
        - OAuth2: []
      operationId: demo.get_project
      responses:
        '200':
          description: Project data retrieved
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Projects'
        '401':
          $ref: '#/components/responses/401'
        '404':
          $ref: '#/components/responses/404'
        '500':
          $ref: '#/components/responses/500'
    patch:
      parameters:
        - name: project_id
          in: path
          required: true
          example: f7694b5e-3f50-4bb6-b307-f68b0fe111aa
          description: The ID tied to a specific project.
          schema:
            type: string
      operationId: demo.patch_project
      requestBody:
        content:
          application/json:
            schema:
              allOf:
                - type: object
                  properties:
                    name:
                      type: string
                      example: Myke's Project
                      description: The name used to identify the project.
      tags:
        - Projects
      summary: Update project data
      security:
        - OAuth2: []
      responses:
        '200':
          description: Project updated
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/Projects'
        '401':
          $ref: '#/components/responses/401'
        '404':
          $ref: '#/components/responses/404'
        '422':
          $ref: '#/components/responses/422'
        '500':
          $ref: '#/components/responses/500'
  /projects:
    post:
      requestBody:
        content:
          application/json:
            schema:
              allOf:
                - type: object
                  properties:
                    name:
                      type: string
                      example: Myke's Project
                      description: The name associated with the project. For organizational purposes.
      tags:
        - Projects
      summary: Create project
      security:
        - OAuth2: []
      operationId: demo.post_project
      responses:
        '201':
          description: Project created
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/Projects'
        '401':
          $ref: '#/components/responses/401'
        '422':
          $ref: '#/components/responses/422'
        '500':
          $ref: '#/components/responses/500'
  /samples/{sample_id}:
    get:
      parameters:
        - name: sample_id
          in: path
          required: true
          schema:
            type: string
            example: 18ebed02-6e91-4504-af97-a83c103dca41
            description: The UUID (an immutable ID tied to a specific resource) tied to a specific example.
      tags:
        - Samples
      summary: Get sample data
      security:
        - OAuth2: []
      operationId: demo.get_sample
      responses:
        '200':
          description: Sample retrieved
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SampleOutput'
        '401':
          $ref: '#/components/responses/401'
        '404':
          $ref: '#/components/responses/404'
        '500':
          $ref: '#/components/responses/500'
    patch:
      parameters:
        - name: sample_id
          in: path
          required: true
          example: 18ebed02-6e91-4504-af97-a83c103dca41
          description: The UUID (an immutable ID tied to a specific resource) used to identify a particular sample.
          schema:
            type: string
      operationId: demo.patch_sample
      requestBody:
        content:
          application/json:
            schema:
              allOf:
                - type: object
                  properties:
                    name:
                      type: string
                      example: CSAT Survey
                      description: A name used to identfiy the survey.
                    live_url:
                      type: string
                      example: https://release.decipherinc.com/survey/demo/dashboard
                      description: The full URL to the live survey to receive participants. Required if setting sample to the live state.
                      format: URI
                    status:
                      type: string
                      example: live
                      description: The status of this sample
                      enum:
                        - pending
                        - live
                        - paused
                        - closed
                        - deleted
      tags:
        - Samples
      summary: Update sample
      security:
        - OAuth2: []
      responses:
        '200':
          description: Sample patched
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/SampleOutput'
        '401':
          $ref: '#/components/responses/401'
        '404':
          $ref: '#/components/responses/404'
        '422':
          $ref: '#/components/responses/422'
        '500':
          $ref: '#/components/responses/500'
  /samples:
    post:
      requestBody:
        content:
          application/json:
            schema:
              allOf:
                - $ref: '#/components/schemas/Sample'
      tags:
        - Samples
      summary: Create Sample
      security:
        - OAuth2: []
      operationId: demo.post_sample
      responses:
        '201':
          description: Sample created
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/SampleOutput'
        '401':
          $ref: '#/components/responses/401'
        '422':
          $ref: '#/components/responses/422'
        '500':
          $ref: '#/components/responses/500'
components:
  securitySchemes:
    OAuth2:
      type: oauth2
      description: See https://docs.aws.amazon.com/cognito/latest/developerguide/token-endpoint.html
      flows:
        clientCredentials:
          tokenUrl: /oauth2/token/
          scopes: {}
      x-tokenInfoFunc: demo.token_auth
    BasicAuth:
      type: http
      scheme: basic
      x-basicInfoFunc: demo.basic_auth
  schemas:
    Projects:
      type: object
      properties:
        name:
          type: string
          example: Myke's Projects
          description: The name of the project.
        project_id:
          type: string
          example: f7694b5e-3f50-4bb6-b307-f68b0fe111aa
          description: The unique identifier of the project.
    EstimateBody:
      type: object
      required:
        - quantity
        - days
        - incidence
        - pii
        - locale
        - length_of_interview
        - currency
        - category
      properties:
        incidence:
          type: integer
          example: 50
          description: Incidence or Qualifying Rate is the expected percentage of persons eligible to participate in a survey within a given population.
          minimum: 1
          maximum: 100
        pii:
          type: boolean
          example: true
          description: Boolean used to determine if the survey intends to collect personally identifiable information.
        days:
          type: integer
          example: 5
          description: Number of days the survey will be fielded.
          minimum: 1
        length_of_interview:
          type: integer
          example: 20
          description: Number in minutes the average respondent will take to finish the survey.
          minimum: 1
        category:
          type: string
          example: Business
          description: The category in which best describes the topic of the survey.
          enum:
            - No Selection
            - Automotive
            - Beauty/Costmetics
            - Beverages - Alcoholic
            - Beverages - Non-alcoholic
            - Business
            - Children & Parenting
            - Coalition/Loyalty Programs
            - Credit Cards
            - Destinations & Tourism
            - Education
            - Electronics/Computer/Software
            - Entertainment & Leisure
            - Explicit Content
            - Fashion & Clothing - Department Store
            - Fashion & Clothing - Other
            - Finance, Banking Investing & Insurance
            - Food/Snacks
            - Gambling/Lottery
            - Government & Politics
            - Heathcare/Pharmaceuticals
            - Home (Utilities, Appliances)
            - Home Entertainment (DVD, VHS)
            - Home Improvement/Real Estate/Construction
            - IT (Servers, Databases, etc)
            - Media & Publishing
            - Personal Care/Toiletries
            - Pets
            - Restaurants
            - Sensitive Content
            - Smoking/Tobacco
            - Social Research
            - Sports, Recreation, Fitness
            - Telecommunications (phone, cell phone, cable)
            - Toys
            - Transportation
            - Travel - Airlines
            - Travel - Hotels
            - Travel Services/Agency/Booking
            - Video Games
            - Websites/Internet/E-Commerce
        locale:
          type: string
          example: en_US
          enum:
            - de_DE
            - en_CA
            - en_GB
            - en_US
            - es_ES
            - fr_FR
            - it_IT
            - pt_BR
          description: The locale to describe the language and location of the survey.
        quantity:
          type: integer
          example: 5000
          description: The total number participants in the sample that are purchased.
          minimum: 1
        currency:
          type: string
          example: USD
          description: The type of currency to use to pay for the Sample.
          enum:
            - USD
        qualifications:
          type: array
          description: Demographic criteria required for panelists.
          items:
            anyOf:
              - $ref: '#/components/schemas/en_US_Qualifications'
              - $ref: '#/components/schemas/en_CA_Qualifications'
              - $ref: '#/components/schemas/en_GB_Qualifications'
              - $ref: '#/components/schemas/es_ES_Qualifications'
              - $ref: '#/components/schemas/fr_FR_Qualifications'
              - $ref: '#/components/schemas/it_IT_Qualifications'
              - $ref: '#/components/schemas/pt_BR_Qualifications'
          example:
            - question_id: age
              answers:
                - 18
                - 19
                - 20
                - 21
                - 22
                - 23
                - 24
            - question_id: income
              answers:
                - Less than $14,999
                - $15,000 to $19,999
                - $20,000 to $24,999
                - $25,000 to $29,999
                - $30,000 to $34,999
                - $35,000 to $39,999
                - $40,000 to $44,999
                - $45,000 to $49,999
        quotas:
          allOf:
            - $ref: '#/components/schemas/Quotas'
          example:
            - quantity: 3000
              qualifications:
                question_id: age
                answers:
                  - 18
                  - 19
                  - 20
            - quantity: 2000
              qualifications:
                question_id: age
                answers:
                  - 21
                  - 22
                  - 23
                  - 24
            - quantity: 500
              qualifications:
                question_id: income
                answers:
                  - Less than $14,999
    de_DE_Qualifications:
      type: array
      description: Demographic criteria required for panelists.
      items:
        anyOf:
          - $ref: '#/components/schemas/age-6'
          - $ref: '#/components/schemas/education-7'
          - $ref: '#/components/schemas/employment-5'
          - $ref: '#/components/schemas/gender-5'
          - $ref: '#/components/schemas/hhi_combined-6'
          - $ref: '#/components/schemas/hhi-6'
          - $ref: '#/components/schemas/mobile'
          - $ref: '#/components/schemas/region-5'
          - $ref: '#/components/schemas/tablet'
    en_CA_Qualifications:
      type: array
      description: Demographic criteria required for panelists.
      items:
        anyOf:
          - $ref: '#/components/schemas/age-2'
          - $ref: '#/components/schemas/b2b_decision_maker'
          - $ref: '#/components/schemas/education-2'
          - $ref: '#/components/schemas/employment'
          - $ref: '#/components/schemas/gender'
          - $ref: '#/components/schemas/hhi_combined'
          - $ref: '#/components/schemas/hhi'
          - $ref: '#/components/schemas/mobile'
          - $ref: '#/components/schemas/province'
          - $ref: '#/components/schemas/tablet'
    en_GB_Qualifications:
      type: array
      description: Demographic criteria required for panelists.
      items:
        anyOf:
          - $ref: '#/components/schemas/age_and_gender_of_child'
          - $ref: '#/components/schemas/age-2'
          - $ref: '#/components/schemas/b2b_decision_maker'
          - $ref: '#/components/schemas/company_department'
          - $ref: '#/components/schemas/company_revenue'
          - $ref: '#/components/schemas/county'
          - $ref: '#/components/schemas/education-3'
          - $ref: '#/components/schemas/employment'
          - $ref: '#/components/schemas/gender'
          - $ref: '#/components/schemas/hhi_combined-2'
          - $ref: '#/components/schemas/hhi-2'
          - $ref: '#/components/schemas/industry_personal'
          - $ref: '#/components/schemas/industry'
          - $ref: '#/components/schemas/job_title'
          - $ref: '#/components/schemas/mobile'
          - $ref: '#/components/schemas/no_of_employees'
          - $ref: '#/components/schemas/parental_status_standard'
          - $ref: '#/components/schemas/region-2'
          - $ref: '#/components/schemas/tablet'
    en_US_Qualifications:
      type: array
      description: Demographic criteria required for panelists.
      items:
        anyOf:
          - $ref: '#/components/schemas/age'
          - $ref: '#/components/schemas/auto_purchase_type'
          - $ref: '#/components/schemas/cell_carrier_us'
          - $ref: '#/components/schemas/cell_carrier'
          - $ref: '#/components/schemas/department_decision_maker'
          - $ref: '#/components/schemas/employee_dept'
          - $ref: '#/components/schemas/division'
          - $ref: '#/components/schemas/dma'
          - $ref: '#/components/schemas/education_v2'
          - $ref: '#/components/schemas/education'
          - $ref: '#/components/schemas/employment'
          - $ref: '#/components/schemas/ethnicity'
          - $ref: '#/components/schemas/gender'
          - $ref: '#/components/schemas/grocery_shopper'
          - $ref: '#/components/schemas/hispanic'
          - $ref: '#/components/schemas/home_owner'
          - $ref: '#/components/schemas/hh_responsibility'
          - $ref: '#/components/schemas/income'
          - $ref: '#/components/schemas/household_industry'
          - $ref: '#/components/schemas/job_title'
          - $ref: '#/components/schemas/mobile'
          - $ref: '#/components/schemas/child_ages'
          - $ref: '#/components/schemas/org_income'
          - $ref: '#/components/schemas/org_census'
          - $ref: '#/components/schemas/has_children'
          - $ref: '#/components/schemas/pets'
          - $ref: '#/components/schemas/primary_decision_maker'
          - $ref: '#/components/schemas/personal_industry'
          - $ref: '#/components/schemas/region'
          - $ref: '#/components/schemas/spanish_speaking'
          - $ref: '#/components/schemas/tablet'
          - $ref: '#/components/schemas/urban_rural'
          - $ref: '#/components/schemas/webcam'
          - $ref: '#/components/schemas/zip'
    es_ES_Qualifications:
      type: array
      description: Demographic criteria required for panelists.
      items:
        anyOf:
          - $ref: '#/components/schemas/age-3'
          - $ref: '#/components/schemas/education-4'
          - $ref: '#/components/schemas/employment-2'
          - $ref: '#/components/schemas/gender-2'
          - $ref: '#/components/schemas/hhi_combined-3'
          - $ref: '#/components/schemas/hhi-3'
          - $ref: '#/components/schemas/mobile'
          - $ref: '#/components/schemas/tablet'
    fr_FR_Qualifications:
      type: array
      description: Demographic criteria required for panelists.
      items:
        anyOf:
          - $ref: '#/components/schemas/age-4'
          - $ref: '#/components/schemas/education-5'
          - $ref: '#/components/schemas/employment-3'
          - $ref: '#/components/schemas/gender-3'
          - $ref: '#/components/schemas/hhi_combined-4'
          - $ref: '#/components/schemas/hhi-4'
          - $ref: '#/components/schemas/mobile'
          - $ref: '#/components/schemas/region-3'
          - $ref: '#/components/schemas/tablet'
    it_IT_Qualifications:
      type: array
      description: Demographic criteria required for panelists.
      items:
        anyOf:
          - $ref: '#/components/schemas/age-5'
          - $ref: '#/components/schemas/education-6'
          - $ref: '#/components/schemas/employment-4'
          - $ref: '#/components/schemas/gender-4'
          - $ref: '#/components/schemas/hhi_combined-5'
          - $ref: '#/components/schemas/hhi-5'
          - $ref: '#/components/schemas/mobile'
          - $ref: '#/components/schemas/region-4'
          - $ref: '#/components/schemas/tablet'
    pt_BR_Qualifications:
      type: array
      description: Demographic criteria required for panelists.
      items:
        anyOf:
          - $ref: '#/components/schemas/age-5'
          - $ref: '#/components/schemas/education-6'
          - $ref: '#/components/schemas/employment-4'
          - $ref: '#/components/schemas/gender-4'
          - $ref: '#/components/schemas/hhi_combined-5'
          - $ref: '#/components/schemas/hhi-5'
          - $ref: '#/components/schemas/mobile'
          - $ref: '#/components/schemas/region-4'
          - $ref: '#/components/schemas/tablet'
    Quotas:
      description: A quota is defined by a set of qualifications and a complete count.
      type: array
      items:
        type: object
        properties:
          quantity:
            type: integer
            description: The number of qualified participants to be accepted.
            example: 100
            minimum: 1
          qualifications:
            items:
              anyOf:
                - $ref: '#/components/schemas/en_US_Qualifications'
                - $ref: '#/components/schemas/en_CA_Qualifications'
                - $ref: '#/components/schemas/en_GB_Qualifications'
                - $ref: '#/components/schemas/es_ES_Qualifications'
                - $ref: '#/components/schemas/fr_FR_Qualifications'
                - $ref: '#/components/schemas/it_IT_Qualifications'
                - $ref: '#/components/schemas/pt_BR_Qualifications'
            description: Demographic criteria required for panelists.
    Sample:
      allOf:
        - $ref: '#/components/schemas/EstimateBody'
      required:
        - name
        - cpi
        - project_id
      properties:
        name:
          type: string
          example: CSAT Survey
          description: A name used to identfiy the survey.
          maximum: 255
        cpi:
          type: number
          example: 2.5
          description: The price per complete in the currency designated.
          minimum: 0
        live_url:
          type: string
          example: https://release.decipherinc.com/survey/demo/dashboard
          description: The full URL to the live survey to receive participants. Required if setting sample to the live state.
          format: URI
        project_id:
          type: string
          example: f7694b5e-3f50-4bb6-b307-f68b0fe111aa
          description: The UUID (an immutable ID tied to a specific resource) tied to a specific project ID.
    SampleOutput:
      allOf:
        - $ref: '#/components/schemas/Sample'
        - type: object
          properties:
            id:
              type: string
              example: 18ebed02-6e91-4504-af97-a83c103dca41
              description: The UUID (an immutable ID tied to a specific resource) tied to a specific example.

# --- truncated at 32 KB (117 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/forsta/refs/heads/main/openapi/forsta-sample-marketplace-partner-contract-openapi.yml