Pollfish Respondent Demographics API

Fetch the collected demographic profile (gender, year of birth, education, employment, income, marital status, parental, race, career) for a given respondent device id, using Pollfish's demographic enumeration codes.

OpenAPI Specification

pollfish-openapi.yml Raw ↑
openapi: 3.0.3
info:
  title: Pollfish API
  version: '2026.07'
  description: >-
    Unified OpenAPI description of Pollfish's documented public REST surfaces.
    Pollfish is a mobile survey and market-research platform owned by Prodege LLC.


    Two hosts are covered:

    - `https://www.pollfish.com` - the Dashboard API (publisher app management and
      analytics), HTTP Basic Auth with your Pollfish account email and secret key.
    - `https://wss.pollfish.com` - the survey-serving / offerwall API used as an
      alternative to the SDK. Despite the `wss` hostname, the transport is HTTPS
      GET/HEAD, NOT WebSocket.


    Endpoints are annotated with `x-endpoint-status` of `confirmed` (documented in
    Pollfish's own GitHub docs at github.com/pollfish/docs) or `modeled` (shape
    inferred where the response body is HTML or the schema is not exhaustively
    documented). Survey creation / audience design for researchers is done in the
    Pollfish dashboard and is not part of this documented public REST API.
  contact:
    name: Pollfish (Prodege)
    url: https://www.pollfish.com/docs
  termsOfService: https://www.pollfish.com/terms/
  license:
    name: Proprietary
    url: https://www.pollfish.com/terms/
servers:
  - url: https://www.pollfish.com
    description: Dashboard API (apps, performance, revenue, demographics, logs)
  - url: https://wss.pollfish.com
    description: Survey serving and offerwall API (HTTPS, not WebSocket)
tags:
  - name: Apps
    description: Publisher app / placement management (Dashboard API).
  - name: Performance
    description: Survey-serving performance metrics.
  - name: Revenue
    description: Revenue reporting per provider and per country.
  - name: Demographics
    description: Respondent demographic profiles.
  - name: Logs
    description: Per-user survey logs and disqualification reasons.
  - name: Survey Distribution
    description: Device register, offerwall, and survey rendering.
paths:
  /api/public/v2/apps:
    get:
      operationId: listApps
      tags: [Apps]
      summary: List apps
      description: Returns an array of the authenticated developer's apps.
      x-endpoint-status: confirmed
      security:
        - basicAuth: []
      responses:
        '200':
          description: Array of app objects.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/App'
    post:
      operationId: createApp
      tags: [Apps]
      summary: Create an app
      description: Creates a new publisher app (monetization placement) and returns its api_key.
      x-endpoint-status: confirmed
      security:
        - basicAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AppCreate'
      responses:
        '200':
          description: The created app.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/App'
        '400':
          description: Missing or invalid parameters.
  /api/public/v2/apps/{api_key}:
    parameters:
      - $ref: '#/components/parameters/ApiKeyPath'
    get:
      operationId: getApp
      tags: [Apps]
      summary: Get an app
      description: Returns a single app object by its api_key.
      x-endpoint-status: confirmed
      security:
        - basicAuth: []
      responses:
        '200':
          description: The app object.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/App'
        '403':
          description: App does not exist or you lack permission.
    put:
      operationId: updateApp
      tags: [Apps]
      summary: Update an app
      description: Updates properties of an existing app. Only supplied fields are changed.
      x-endpoint-status: confirmed
      security:
        - basicAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AppUpdate'
      responses:
        '200':
          description: The updated app.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/App'
        '400':
          description: Missing or invalid parameters.
        '403':
          description: App does not exist or you lack permission.
    delete:
      operationId: deleteApp
      tags: [Apps]
      summary: Delete an app
      description: Deletes an app by its api_key.
      x-endpoint-status: confirmed
      security:
        - basicAuth: []
      responses:
        '204':
          description: App deleted.
        '403':
          description: App does not exist or you lack permission.
  /api/public/v3/apps/performance:
    get:
      operationId: getAllAppsPerformance
      tags: [Performance]
      summary: Performance for all apps
      description: >-
        Returns performance metrics (served, seen, accepted, completed) per survey
        network for all of the developer's apps over a date range of up to 31 days.
      x-endpoint-status: confirmed
      security:
        - basicAuth: []
      parameters:
        - $ref: '#/components/parameters/From'
        - $ref: '#/components/parameters/To'
      responses:
        '200':
          description: Performance series grouped by network.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/NetworkPerformance'
        '400':
          description: Missing or invalid parameters.
  /api/public/v3/apps/{api_key}/performance:
    parameters:
      - $ref: '#/components/parameters/ApiKeyPath'
    get:
      operationId: getAppPerformance
      tags: [Performance]
      summary: Performance for one app
      description: Returns performance metrics for a single app over a date range of up to 31 days.
      x-endpoint-status: confirmed
      security:
        - basicAuth: []
      parameters:
        - $ref: '#/components/parameters/From'
        - $ref: '#/components/parameters/To'
      responses:
        '200':
          description: Performance series grouped by network.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/NetworkPerformance'
        '400':
          description: Missing or invalid parameters.
  /api/public/v3/apps/{api_key}/performanceByCountry:
    parameters:
      - $ref: '#/components/parameters/ApiKeyPath'
    get:
      operationId: getAppPerformanceByCountry
      tags: [Performance]
      summary: Performance for one app grouped by country
      description: Returns performance metrics for a single app, grouped by country and network, over a date range of up to 31 days.
      x-endpoint-status: confirmed
      security:
        - basicAuth: []
      parameters:
        - $ref: '#/components/parameters/From'
        - $ref: '#/components/parameters/To'
      responses:
        '200':
          description: Country-grouped performance. Shape is documented by example; modeled loosely here.
          x-endpoint-status: modeled
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    countryISO:
                      type: string
                    data:
                      type: array
                      items:
                        $ref: '#/components/schemas/NetworkPerformance'
        '400':
          description: Missing or invalid parameters.
  /api/public/v3/apps/revenue:
    get:
      operationId: getAllAppsRevenue
      tags: [Revenue]
      summary: Revenue per provider for all apps
      description: Returns total revenue per survey provider for all apps over a date range, optionally filtered by country.
      x-endpoint-status: confirmed
      security:
        - basicAuth: []
      parameters:
        - $ref: '#/components/parameters/From'
        - $ref: '#/components/parameters/To'
        - $ref: '#/components/parameters/Countries'
      responses:
        '200':
          description: Revenue series grouped by provider.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/ProviderRevenue'
        '400':
          description: Missing or invalid parameters.
  /api/public/v3/apps/{api_key}/revenue:
    parameters:
      - $ref: '#/components/parameters/ApiKeyPath'
    get:
      operationId: getAppRevenue
      tags: [Revenue]
      summary: Revenue per provider for one app
      description: Returns total revenue per survey provider for a single app over a date range, optionally filtered by country.
      x-endpoint-status: confirmed
      security:
        - basicAuth: []
      parameters:
        - $ref: '#/components/parameters/From'
        - $ref: '#/components/parameters/To'
        - $ref: '#/components/parameters/Countries'
      responses:
        '200':
          description: Revenue series grouped by provider.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/ProviderRevenue'
        '400':
          description: Missing or invalid parameters.
  /api/public/v3/apps/revenuePerCountry:
    get:
      operationId: getAllAppsRevenuePerCountry
      tags: [Revenue]
      summary: Revenue per country for all apps
      description: Returns total revenue per country for all apps over a date range, optionally filtered by country.
      x-endpoint-status: confirmed
      security:
        - basicAuth: []
      parameters:
        - $ref: '#/components/parameters/From'
        - $ref: '#/components/parameters/To'
        - $ref: '#/components/parameters/Countries'
      responses:
        '200':
          description: Daily revenue with per-country breakdown.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/RevenuePerCountryDay'
        '400':
          description: Missing or invalid parameters.
  /api/public/v3/apps/{api_key}/revenuePerCountry:
    parameters:
      - $ref: '#/components/parameters/ApiKeyPath'
    get:
      operationId: getAppRevenuePerCountry
      tags: [Revenue]
      summary: Revenue per country for one app
      description: Returns total revenue per country for a single app over a date range, optionally filtered by country.
      x-endpoint-status: confirmed
      security:
        - basicAuth: []
      parameters:
        - $ref: '#/components/parameters/From'
        - $ref: '#/components/parameters/To'
        - $ref: '#/components/parameters/Countries'
      responses:
        '200':
          description: Daily revenue with per-country breakdown.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/RevenuePerCountryDay'
        '400':
          description: Missing or invalid parameters.
  /api/public/v3/apps/demographics:
    get:
      operationId: getRespondentDemographics
      tags: [Demographics]
      summary: Get respondent demographics
      description: Returns the collected demographic profile for a given respondent device id.
      x-endpoint-status: confirmed
      security:
        - basicAuth: []
      parameters:
        - name: user
          in: query
          required: true
          description: The device id to fetch demographics for.
          schema:
            type: string
      responses:
        '200':
          description: Demographic profile using Pollfish enumeration codes.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Demographics'
        '400':
          description: Missing or invalid parameters.
  /api/public/v3/apps/{api_key}/users_log:
    parameters:
      - $ref: '#/components/parameters/ApiKeyPath'
    get:
      operationId: getUsersLog
      tags: [Logs]
      summary: Get user logs
      description: Returns paginated per-user survey logs for a given device_id or request_uuid.
      x-endpoint-status: confirmed
      security:
        - basicAuth: []
      parameters:
        - name: key
          in: query
          required: true
          description: The search term (device_id or request_uuid).
          schema:
            type: string
        - name: page
          in: query
          required: false
          description: Page number when results are paginated.
          schema:
            type: integer
        - name: rows
          in: query
          required: false
          description: Number of rows returned.
          schema:
            type: integer
      responses:
        '200':
          description: Paginated survey log results.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UsersLog'
        '400':
          description: Missing or invalid parameters.
  /v2/device/register/true:
    get:
      operationId: registerDevice
      tags: [Survey Distribution]
      summary: Request a survey / offerwall for a device
      description: >-
        Requests a matching survey (or, with `offerwall=true`, an offerwall) for a
        respondent device. All register parameters are passed inside the `json`
        query parameter as a JSON string; `dontencrypt=true` must be included. With
        `offerwall=true` and `content_type=json`, returns a JSON list of surveys
        with reward and remaining-completes data; otherwise returns an HTML page.
        Response is HTTP 200 when a survey is available, 204 when none is available.
        This host is wss.pollfish.com but the call is a normal HTTPS GET, not a
        WebSocket connection.
      servers:
        - url: https://wss.pollfish.com
      x-endpoint-status: confirmed
      parameters:
        - name: json
          in: query
          required: true
          description: >-
            URL-encoded JSON object carrying all register parameters (api_key,
            device_id, timestamp, ip, os, locale, version, encryption, placement_key,
            offerwall, content_type, reward_name, reward_conversion, click_id,
            targeting demographics, etc.). See the register JSON schema.
          schema:
            $ref: '#/components/schemas/RegisterJson'
        - name: dontencrypt
          in: query
          required: true
          description: Must be set to true on every request.
          schema:
            type: boolean
            default: true
        - name: sig
          in: query
          required: false
          description: >-
            Base64 + percent-encoded HMAC-SHA1 of reward_conversion+reward_name+click_id
            signed with your account secret key. Required when reward_conversion is passed.
          schema:
            type: string
      responses:
        '200':
          description: >-
            Survey available. Body is an HTML page, or (offerwall JSON mode) an
            OfferwallResponse JSON object.
          content:
            text/html:
              schema:
                type: string
            application/json:
              schema:
                $ref: '#/components/schemas/OfferwallResponse'
        '204':
          description: No survey available.
        '400':
          description: Bad request (for example, "Hash check failed" when sig validation fails).
    head:
      operationId: checkSurveyAvailability
      tags: [Survey Distribution]
      summary: Check survey availability (no body)
      description: Same as the GET register call but returns only the status code, letting you check availability without transferring the HTML body.
      servers:
        - url: https://wss.pollfish.com
      x-endpoint-status: confirmed
      parameters:
        - name: json
          in: query
          required: true
          schema:
            $ref: '#/components/schemas/RegisterJson'
        - name: dontencrypt
          in: query
          required: true
          schema:
            type: boolean
            default: true
      responses:
        '200':
          description: Survey available.
        '204':
          description: No survey available.
  /v2/device/survey/{survey_id}:
    get:
      operationId: loadSurvey
      tags: [Survey Distribution]
      summary: Load / render a specific survey
      description: >-
        Loads a specific survey by id, as referenced by the `survey_link` returned
        in an offerwall response. Renders the survey HTML to the respondent. The
        `json` and `dontencrypt` query parameters mirror the register call. Marked
        modeled because the response is an HTML survey experience rather than a
        documented JSON schema.
      servers:
        - url: https://wss.pollfish.com
      x-endpoint-status: modeled
      parameters:
        - name: survey_id
          in: path
          required: true
          description: The survey id (as returned in an offerwall survey_link).
          schema:
            type: integer
        - name: json
          in: query
          required: true
          schema:
            $ref: '#/components/schemas/RegisterJson'
        - name: dontencrypt
          in: query
          required: true
          schema:
            type: boolean
            default: true
      responses:
        '200':
          description: HTML survey page.
          content:
            text/html:
              schema:
                type: string
        '204':
          description: Survey no longer available.
components:
  securitySchemes:
    basicAuth:
      type: http
      scheme: basic
      description: >-
        HTTP Basic Auth for the Dashboard API. Username is your Pollfish account
        email, password is your account secret key (from Account Information in the
        publisher dashboard).
  parameters:
    ApiKeyPath:
      name: api_key
      in: path
      required: true
      description: The app's api_key.
      schema:
        type: string
    From:
      name: from
      in: query
      required: false
      description: Start date (ISO 8601 yyyy-MM-dd, UTC). Defaults to one month before `to`. The from/to window must not exceed 31 days.
      schema:
        type: string
        format: date
    To:
      name: to
      in: query
      required: false
      description: End date (ISO 8601 yyyy-MM-dd, UTC). Defaults to the current date.
      schema:
        type: string
        format: date
    Countries:
      name: countries
      in: query
      required: false
      description: Comma-separated ISO Alpha-2 country codes to filter revenue by. Omit for all countries.
      schema:
        type: string
  schemas:
    App:
      type: object
      properties:
        api_key:
          type: string
        id:
          type: integer
        name:
          type: string
        platform:
          type: string
          description: Android, iOS, Windows Phone, or Web.
        category:
          type: string
          description: IAB category code.
        subcategory:
          type: string
        url:
          type: string
        image:
          type: string
        behavior:
          type: integer
        incentive:
          type: boolean
        revenue:
          type: number
          format: float
        short_surveys_enabled:
          type: boolean
        third_party_surveys_enabled:
          type: boolean
        data_collection_surveys_enabled:
          type: boolean
        rewarded_survey:
          $ref: '#/components/schemas/RewardedSurvey'
        offerwall:
          $ref: '#/components/schemas/OfferwallReward'
    AppCreate:
      type: object
      required: [name, category, subcategory, url, platform]
      properties:
        name:
          type: string
        category:
          type: string
        subcategory:
          type: string
        url:
          type: string
        platform:
          type: integer
          description: 0 android, 1 ios, 2 windows phone, 3 web.
        callback_url:
          type: string
          description: URL for server-to-server postback callbacks.
        behavior:
          type: integer
          description: 0 indicators, 1 dynamic (recommended), 2 force slide regularly, 3 force all the time.
        data_collection_surveys_enabled:
          type: boolean
        third_party_surveys_enabled:
          type: boolean
        rewarded_survey:
          $ref: '#/components/schemas/RewardedSurvey'
        offerwall:
          $ref: '#/components/schemas/OfferwallReward'
    AppUpdate:
      type: object
      properties:
        name:
          type: string
        category:
          type: string
        subcategory:
          type: string
        url:
          type: string
        callback_url:
          type: string
        behavior:
          type: integer
        data_collection_surveys_enabled:
          type: boolean
        third_party_surveys_enabled:
          type: boolean
        rewarded_survey:
          $ref: '#/components/schemas/RewardedSurvey'
        offerwall:
          $ref: '#/components/schemas/OfferwallReward'
    RewardedSurvey:
      type: object
      properties:
        currency_name:
          type: string
        variable_amount:
          type: number
          format: float
        fixed_amount:
          type: boolean
    OfferwallReward:
      type: object
      properties:
        currency_name:
          type: string
        variable_amount:
          type: number
          format: float
    NetworkPerformance:
      type: object
      properties:
        name:
          type: string
          description: Survey network name (Pollfish, Cint, Toluna, etc.).
        data:
          type: array
          items:
            type: object
            properties:
              date:
                type: string
                format: date
              served:
                type: integer
              seen:
                type: integer
              accepted:
                type: integer
              completed:
                type: integer
    ProviderRevenue:
      type: object
      properties:
        name:
          type: string
        total:
          type: number
          format: float
        data:
          type: array
          items:
            type: object
            properties:
              date:
                type: string
                format: date
              amount:
                type: number
                format: float
    RevenuePerCountryDay:
      type: object
      properties:
        date:
          type: string
          format: date
        total:
          type: number
          format: float
        countries:
          type: array
          items:
            type: object
            properties:
              iso_code:
                type: string
              amount:
                type: number
                format: float
    Demographics:
      type: object
      description: Demographic enumeration codes; see pollfish.com/docs/demographic-surveys.
      properties:
        device_id:
          type: string
        gender:
          type: integer
        year_of_birth:
          type: integer
        marital_status:
          type: integer
        parental:
          type: integer
        education:
          type: integer
        employment:
          type: integer
        career:
          type: integer
        race:
          type: integer
        income:
          type: integer
    UsersLog:
      type: object
      properties:
        totalCount:
          type: integer
        results:
          type: array
          items:
            type: object
            properties:
              id:
                type: string
              survey_started:
                type: integer
                format: int64
                description: Epoch millis when the survey started.
              completed:
                type: boolean
              disqualified_reason:
                type: string
                nullable: true
                description: One of the public termination reasons (Quota Full, Survey Closed, Screenout, Duplicate, VPN, Quality, etc.) or null.
    RegisterJson:
      type: object
      description: >-
        The JSON object passed (URL-encoded) as the `json` query parameter on the
        register/survey calls. Only the most common fields are listed; see the
        Pollfish API documentation for the full parameter table. Every value must
        be a string.
      required: [api_key, device_id, timestamp, ip, os, locale, encryption, version]
      properties:
        api_key:
          type: string
        device_id:
          type: string
          description: Advertising id (IDFA / AAID) or a stable per-user UUID.
        timestamp:
          type: string
          description: Request time in epoch millis.
        ip:
          type: string
        os:
          type: integer
          description: 0 Android, 1 iOS, 2 Windows Phone, 3 Web.
        locale:
          type: string
        encryption:
          type: string
          enum: [NONE]
        version:
          type: integer
          description: Current API version (7).
        placement_key:
          type: string
          description: Placement id whose settings apply.
        offerwall:
          type: boolean
        content_type:
          type: string
          enum: [json, html]
        always_return_content:
          type: boolean
        reward_name:
          type: string
        reward_conversion:
          type: string
        click_id:
          type: string
        debug:
          type: boolean
        sortBy:
          type: string
          enum: [reward, loi, ir]
        order:
          type: string
          enum: [asc, desc]
    OfferwallResponse:
      type: object
      properties:
        surveys:
          type: array
          items:
            $ref: '#/components/schemas/OfferwallSurvey'
        hasDemographics:
          type: boolean
    OfferwallSurvey:
      type: object
      properties:
        survey_id:
          type: integer
        survey_cpa:
          type: integer
          description: Payout in US dollar cents.
        survey_class:
          type: string
          description: Provider and optional type, e.g. "Pollfish/Demographics", "Toluna", "Cint".
        survey_ir:
          type: integer
          description: Estimated incidence rate 0-100.
        survey_loi:
          type: integer
          description: Estimated length of interview in minutes.
        survey_lang:
          type: string
        reward_name:
          type: string
        reward_value:
          type: number
        survey_link:
          type: string
          description: URL to load/render this survey (GET /v2/device/survey/{survey_id}).
        remaining_completes:
          type: integer
          description: Remaining completes (Pollfish surveys only).
        ordering:
          type: integer