Morning Consult API

The Morning Consult API provides access to the syndicated survey data that powers Morning Consult Intelligence. Metadata (Lookup) operations discover the data sources, countries, categories, entities, questions and scores available to a subscription; Data operations return aggregated question responses and computed scores for a custom audience over a date range; bulk operations queue asynchronous Data Bridge jobs that return Parquet; and an AI operation resolves a natural-language query against the respondent corpus. Authentication is a Basic-credential exchange at POST /auth/token for a short-lived JWT plus a refresh token.

Documentation

Specifications

Schemas & Data

Other Resources

OpenAPI Specification

morning-consult-openapi-original.yml Raw ↑
openapi: 3.0.3
info:
  title: Morning Consult API
  version: '1.0.0'
  description: The Morning Consult API provides access to various forms of survey data collected by Morning Consult
  contact:
    email: api-support@morningconsult.com
  termsOfService: 'https://morningconsult.com/mci-terms-and-conditions'
servers:
  - url: 'https://api.morningconsult.com/v1'
    description: Version 1 API
tags:
  - name: Authentication
    description: Authentication related operations.
  - name: Lookup
    description: Metadata information related to syndicated surveys.
  - name: Data
    description: Syndicated tracking survey data data responses.
  - name: AI
    description: Morning Consult's AI backed by survey data responses.
paths:
  /surveys/syndicated/countries:
    get:
      summary: Get Countries
      description: >-
        Deprecated. This endpoint will be sunset on October 1, 2026. Use the
        [/data_sources](#GET-getDataSources) resource API for updated data
        source and country discovery.

        Get available countries. The `country_code` parameter is required to browse
        categories and entities via the [/surveys/syndicated/categories](#GET-getSurveysSyndicatedCategories) and
        the [/surveys/syndicated/entities](#GET-getSurveysSyndicatedEntities) endpoints, respectively, and it
        can be included in the [/surveys/syndicated/questions](#GET-getSurveysSyndicatedQuestions) endpoint
        to filter questions to a specific country.

        If an expected country does not appear in the response body, reach out
        to your Account Executive to confirm your country-level access is properly
        configured.
      deprecated: true
      operationId: getSurveysSyndicatedCountries
      tags:
        - Lookup
      responses:
        '200':
          $ref: '#/components/responses/GetCountriesOutput'
        '500':
          $ref: '#/components/responses/InternalServerError'
  /surveys/syndicated/categories:
    get:
      summary: Get Categories
      description: >-
        Deprecated. This endpoint will be sunset on October 1, 2026. Use the
        [/categories](#GET-getCategories) resource API for updated category discovery.

        Get question categories for a country. The categories can be used in
        the [/surveys/syndicated/entities](#GET-getSurveysSyndicatedEntities) and
        [/surveys/syndicated/questions](#GET-getSurveysSyndicatedQuestions) endpoints to
        filter entities and questions to a specific category.
      deprecated: true
      operationId: getSurveysSyndicatedCategories
      tags:
        - Lookup
      responses:
        '200':
          $ref: '#/components/responses/GetCategoriesOutput'
        '400':
          $ref: '#/components/responses/BadRequestError'
        '500':
          $ref: '#/components/responses/InternalServerError'
      parameters:
        - $ref: '#/components/parameters/country_code'
        - $ref: '#/components/parameters/page_size'
        - $ref: '#/components/parameters/pagination_token'
  /categories:
    get:
      summary: Get Categories
      description: >-
        Get question categories across all data sources the caller has access
        to. The categories can be used in metadata endpoints to filter entities
        and questions to a specific category.
      operationId: getCategories
      tags:
        - Lookup
      responses:
        '200':
          $ref: '#/components/responses/GetCategoriesOutput'
        '400':
          $ref: '#/components/responses/BadRequestError'
        '500':
          $ref: '#/components/responses/InternalServerError'
      parameters:
        - $ref: '#/components/parameters/page_size'
        - $ref: '#/components/parameters/pagination_token'
  /surveys/syndicated/entities:
    get:
      summary: Get Entities
      description: >-
        Deprecated. This endpoint will be sunset on October 1, 2026. Use the
        [/entities](#GET-getEntities) resource API for updated entity discovery.

        Search tracked entities (e.g., brands, products, public figures, issues)
        for a specific country. Queries are run against the `entity.label` field of all
        questions included in our syndicated surveys. Wildcard search is supported.
      deprecated: true
      operationId: getSurveysSyndicatedEntities
      tags:
        - Lookup
      responses:
        '200':
          $ref: '#/components/responses/GetEntitiesOutput'
        '400':
          $ref: '#/components/responses/BadRequestError'
        '500':
          $ref: '#/components/responses/InternalServerError'
      parameters:
        - $ref: '#/components/parameters/country_code'
        - $ref: '#/components/parameters/category_id'
        - $ref: '#/components/parameters/entity_type_id'
        - $ref: '#/components/parameters/page_size'
        - $ref: '#/components/parameters/query'
        - $ref: '#/components/parameters/pagination_token'
  /surveys/syndicated/questions:
    get:
      summary: Get Questions
      description: >-
        Deprecated. This endpoint will be sunset on October 1, 2026. Use the
        [/data_sources/{data_source_id}/countries/{country_code}/questions](#GET-getDataSourceQuestions)
        resource API for updated question discovery.

        Search questions. The ID field of each returned question can be used in
        the [/surveys/syndicated/timeseries](#POST-postSurveysSyndicatedTimeseries) endpoint as the question
        of interest or in the `audience` parameter to filter responses.
      deprecated: true
      operationId: getSurveysSyndicatedQuestions
      tags:
        - Lookup
      responses:
        '200':
          $ref: '#/components/responses/GetQuestionsOutput'
        '400':
          $ref: '#/components/responses/BadRequestError'
        '500':
          $ref: '#/components/responses/InternalServerError'
      parameters:
        - name: country_code
          in: query
          description: >-
            The two-letter [ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2)
            country code used to filter results.

            The available countries can be retrieved from the
            [/surveys/syndicated/countries](#GET-getSurveysSyndicatedCountries) endpoint.
          schema:
            $ref: '#/components/schemas/CountryCode'
        - $ref: '#/components/parameters/category_id'
        - $ref: '#/components/parameters/entity_id'
        - $ref: '#/components/parameters/query'
        - $ref: '#/components/parameters/page_size'
        - $ref: '#/components/parameters/pagination_token'
  /data_sources:
    get:
      summary: Get Data Sources
      description: >-
        Get the data sources the caller has access to. The `id` of each data
        source can be used in other endpoints (e.g.
        [/data_sources/{data_source_id}/countries/{country_code}/questions](#GET-getDataSourceQuestions))
        to scope requests to a particular data source.

        Data sources the caller does not have access to are not returned. If an
        expected data source is missing, reach out to your Account Executive to
        confirm your entitlements are properly configured.
      operationId: getDataSources
      tags:
        - Lookup
      responses:
        '200':
          $ref: '#/components/responses/GetDataSourcesOutput'
        '400':
          $ref: '#/components/responses/BadRequestError'
        '500':
          $ref: '#/components/responses/InternalServerError'
      parameters:
        - $ref: '#/components/parameters/page_size'
        - $ref: '#/components/parameters/pagination_token'
  /entities:
    get:
      summary: Get Entities
      description: >-
        List tracked entities (e.g., brands, products, public figures,
        issues).
      operationId: getEntities
      tags:
        - Lookup
      responses:
        '200':
          $ref: '#/components/responses/GetEntitiesOutput'
        '400':
          $ref: '#/components/responses/BadRequestError'
        '500':
          $ref: '#/components/responses/InternalServerError'
      parameters:
        - $ref: '#/components/parameters/data_source_id_query'
        - $ref: '#/components/parameters/country_code'
        - $ref: '#/components/parameters/category_id'
        - $ref: '#/components/parameters/entity_type_id'
        - $ref: '#/components/parameters/page_size'
        - $ref: '#/components/parameters/query'
        - $ref: '#/components/parameters/pagination_token'
  /data_sources/{data_source_id}/countries/{country_code}/questions:
    get:
      summary: Get Questions
      description: >-
        Get questions for a data source and country.
      operationId: getDataSourceQuestions
      tags:
        - Lookup
      responses:
        '200':
          $ref: '#/components/responses/GetDataSourceQuestionsOutput'
        '400':
          $ref: '#/components/responses/BadRequestError'
        '500':
          $ref: '#/components/responses/InternalServerError'
      parameters:
        - $ref: '#/components/parameters/data_source_id'
        - $ref: '#/components/parameters/path_country_code'
        - $ref: '#/components/parameters/category_id'
        - $ref: '#/components/parameters/entity_id'
        - $ref: '#/components/parameters/query'
        - $ref: '#/components/parameters/page_size'
        - $ref: '#/components/parameters/pagination_token'
  /surveys/syndicated/questions/{question_id}:
    get:
      summary: Get a single question by its unique identifier
      description: >-
        Deprecated. This endpoint will be sunset on October 1, 2026. Use the
        [/data_sources/{data_source_id}/countries/{country_code}/questions/{question_id}](#GET-getDataSourceQuestion)
        resource API for updated question lookup.

        Retrieve all information associated with a `question_id`. This endpoint
        can be leveraged to get the human readable information associated with
        a previously obtained ID.
      deprecated: true
      operationId: getSurveysSyndicatedQuestionsByID
      tags:
        - Lookup
      responses:
        '200':
          $ref: '#/components/responses/GetQuestionByIDOutput'
        '400':
          $ref: '#/components/responses/InvalidQuestionIDError'
        '404':
          $ref: '#/components/responses/NotFoundError'
        '500':
          $ref: '#/components/responses/InternalServerError'
      parameters:
        - name: question_id
          in: path
          required: true
          description: The question ID to get
          example: 1820851b-a527-4395-9529-f4da16de36a7
          schema:
            $ref: '#/components/schemas/QuestionID'
  /data_sources/{data_source_id}/countries/{country_code}/questions/{question_id}:
    get:
      summary: Get a single question by its unique identifier
      description: >-
        Retrieve all information associated with a question within a specific
        data source and country.
      operationId: getDataSourceQuestion
      tags:
        - Lookup
      responses:
        '200':
          $ref: '#/components/responses/GetDataSourceQuestionOutput'
        '400':
          $ref: '#/components/responses/InvalidQuestionIDError'
        '404':
          $ref: '#/components/responses/NotFoundError'
        '500':
          $ref: '#/components/responses/InternalServerError'
      parameters:
        - $ref: '#/components/parameters/data_source_id'
        - $ref: '#/components/parameters/path_country_code'
        - name: question_id
          in: path
          required: true
          description: The question ID to get.
          example: 1820851b-a527-4395-9529-f4da16de36a7
          schema:
            $ref: '#/components/schemas/QuestionID'
  /surveys/syndicated/scores:
    get:
      summary: Get Scores
      description: >-
        Deprecated. This endpoint will be sunset on October 1, 2026. Use the
        [/scores](#GET-getScores) resource API for updated score discovery.

        Search scores (e.g., Net Favorability, NPS, ICS). Scores can be used in
        the [/surveys/syndicated/scores](#POST-postSurveysSyndicatedScores)
        endpoint as the score of interest.
      deprecated: true
      operationId: getSurveysSyndicatedScores
      tags:
        - Lookup
      responses:
        '200':
          $ref: '#/components/responses/GetScoresOutput'
        '400':
          $ref: '#/components/responses/BadRequestError'
        '500':
          $ref: '#/components/responses/InternalServerError'
      parameters:
        - name: country_code
          in: query
          description: >-
            The two-letter [ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2)
            country code used to filter results.

            The available countries can be retrieved from the
            [/surveys/syndicated/countries](#GET-getSurveysSyndicatedCountries) endpoint.
          schema:
            $ref: '#/components/schemas/CountryCode'
        - $ref: '#/components/parameters/query'
        - $ref: '#/components/parameters/page_size'
        - $ref: '#/components/parameters/pagination_token'
    post:
      summary: Get Scores for Syndicated Timeseries Data
      description: >-
        Deprecated. This endpoint will be sunset on October 1, 2026. Use the
        [/scores](#POST-postScores) resource API for updated score retrieval.

        Get score data for a particular score. The `score_id` must be valid in
        the specified `country_code`. Every `question_id` included in the
        `audience` body must also be from the same `country_code`.
      tags:
        - Data
      deprecated: true
      operationId: postSurveysSyndicatedScores
      responses:
        '200':
          $ref: '#/components/responses/PostSurveysSyndicatedScoresOutput'
        '400':
          $ref: '#/components/responses/BadRequestError'
        '500':
          $ref: '#/components/responses/InternalServerError'
      requestBody:
        description: Request body for syndicated tracking score data
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PostSurveysSyndicatedScoresInput'
            examples:
              Example:
                $ref: '#/components/examples/PostSyndicatedScoresInput'
              ExampleWithEntity:
                $ref: '#/components/examples/PostSyndicatedScoresInputWithEntity'
  /surveys/syndicated/scores/{score_id}/countries:
    get:
      summary: Get Countries for Score
      description: >-
        Deprecated. This endpoint will be sunset on October 1, 2026. Use the
        [/scores/{score_id}/data_sources](#GET-getScoreDataSources) resource API for
        updated score availability discovery.

        Not all scores are valid in all countries. This returns the list of
        countries a specific score is valid in.
      deprecated: true
      operationId: getSurveysSyndicatedScoreCountries
      tags:
        - Lookup
      responses:
        '200':
          $ref: '#/components/responses/GetScoreCountriesOutput'
        '400':
          $ref: '#/components/responses/BadRequestError'
        '500':
          $ref: '#/components/responses/InternalServerError'
      parameters:
        - name: score_id
          in: path
          required: true
          description: The score ID to get countries for
          example: 48ef9961-1dc8-42d1-b03c-c480681bc732
          schema:
            $ref: '#/components/schemas/ScoreID'
  /surveys/syndicated/timeseries:
    post:
      summary: Get Syndicated Survey Timeseries Data
      description: >-
          Deprecated. This endpoint will be sunset on October 1, 2026. Use the
          [/responses](#POST-postResponses) resource API for updated question
          response retrieval.

          Get respondents data for a particular question. Every `question_id` included
          in the request body --- whether as the question of interest or within the
          `audience` parameter --- must be from the same country.
      tags:
        - Data
      deprecated: true
      operationId: postSurveysSyndicatedTimeseries
      responses:
        '200':
          $ref: '#/components/responses/PostSurveysSyndicatedTimeseriesOutput'
        '400':
          $ref: '#/components/responses/BadRequestError'
        '500':
          $ref: '#/components/responses/InternalServerError'
      requestBody:
        description: Request body for syndicated tracking survey data
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PostSurveysSyndicatedTimeseriesInput'
            examples:
              Example:
                $ref: '#/components/examples/PostSyndicatedTimeseriesInput'
  /surveys/syndicated/timeseries/batch:
    post:
      summary: Submit a Batch Timeseries Request
      description: >-
        Deprecated. This endpoint will be sunset on October 1, 2026. Use the
        [/responses](#POST-postResponses) resource API for updated response retrieval.

        Submit a request to asynchronously generate timeseries data for one or
        more questions and audiences. The max date range for a single request is
        10 years. Returns a `request_id` that can be used to poll the status of
        the report via the
        [/surveys/syndicated/timeseries/batch/{request_id}](#GET-getSurveysSyndicatedTimeseriesBatchStatus)
        endpoint. When the report is complete, a download URL will be provided
        to retrieve the data.
      tags:
        - Data
      deprecated: true
      operationId: postSurveysSyndicatedTimeseriesBatch
      responses:
        '200':
          $ref: '#/components/responses/PostResponsesBulkOutput'
        '400':
          $ref: '#/components/responses/BadRequestError'
        '403':
          $ref: '#/components/responses/ForbiddenError'
        '500':
          $ref: '#/components/responses/InternalServerError'
      requestBody:
        description: Request body for submitting a batch timeseries report
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PostSurveysSyndicatedTimeseriesBatchInput'
            examples:
              Example:
                $ref: '#/components/examples/PostSurveysSyndicatedTimeseriesBatchInput'
  /surveys/syndicated/timeseries/batch/{request_id}:
    get:
      summary: Get Batch Timeseries Request Status
      description: >-
        Deprecated. This endpoint will be sunset on October 1, 2026. Use the
        [/responses](#POST-postResponses) resource API for updated response retrieval.

        Get the status of a previously submitted batch timeseries report request.
        When the report is complete, the response will include a `download_url`
        that can be used to download the report data.
      tags:
        - Lookup 
      deprecated: true
      operationId: getSurveysSyndicatedTimeseriesBatchStatus
      responses:
        '200':
          $ref: '#/components/responses/GetResponsesBulkStatusOutput'
        '400':
          $ref: '#/components/responses/BadRequestError'
        '403':
          $ref: '#/components/responses/ForbiddenError'
        '404':
          $ref: '#/components/responses/NotFoundError'
        '500':
          $ref: '#/components/responses/InternalServerError'
      parameters:
        - name: request_id
          in: path
          required: true
          description: The request ID returned from the batch timeseries request.
          example: b1a2c3d4-e5f6-7890-abcd-ef1234567890
          schema:
            type: string
            format: uuid
  /ai/resolve:
    post:
      summary: Resolve a user query
      description: >-
        Given a query about Morning Consult's syndicated public opinion
        data sets, pull data from respondent interviews and produce a
        summary of the data. The query should be a standalone question,
        as conversation history is not preserved between calls to the endpoint.

        Responses will typically take around 10 seconds, with more complex queries
        taking upwards of 20 seconds.
      tags:
        - AI
      operationId: postAIResolve
      x-dd-p50-warning-threshold: 12
      x-dd-p50-critical-threshold: 20
      x-dd-p90-warning-threshold: 25
      x-dd-p90-critical-threshold: 40
      x-dd-average-warning-threshold: 18
      x-dd-average-critical-threshold: 30
      x-dd-notification-channel: "@diamond-dogs@morningconsult.com"
      responses:
        '200':
          $ref: '#/components/responses/PostAIResolveOutput'
        '400':
          $ref: '#/components/responses/BadRequestError'
        '500':
          $ref: '#/components/responses/InternalServerError'
      requestBody:
        description: AI resolve input parameters.
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PostAIResolveInput'
            examples:
              Example:
                $ref: '#/components/examples/PostAIResolveInput'
  /auth/token:
    post:
      x-docs-exclude-operation-json: true
      x-docs-code-example-apitoken: basic
      summary: Retrieve Authentication Token
      operationId: postAuthToken
      responses:
        '200':
          $ref: '#/components/responses/PostAuthTokenOutput'
        '400':
          $ref: '#/components/responses/InvalidCredentialsError'
        '500':
          $ref: '#/components/responses/InternalServerError'
      security:
        - Basic: []
        - RefreshToken: []
      description: >-
        Exchange credentials for JWT and Refresh tokens. The returned tokens
        are required to use other API endpoints and to retrieve new tokens
        before they expire.

        For initial authentication, supply your username and password with the
        Basic authorization format header. For subsequent authentications, use
        the refresh token in the Bearer format.
      tags:
        - Authentication
  /scores:
    get:
      summary: Get Scores
      description: >-
        Search scores (e.g., Net Favorability, NPS, ICS) across the data sources
        you have access to. Supply the optional `data_source_id` parameter to
        restrict results to a specific data source.

        Scores are universal: a given score ID is applicable to any data source
        where it can be calculated. To discover which data sources a score is
        valid in, use the
        [/scores/{score_id}/data_sources](#GET-getScoreDataSources) endpoint.
      operationId: getScores
      tags:
        - Lookup
      responses:
        '200':
          $ref: '#/components/responses/GetScoresOutput'
        '400':
          $ref: '#/components/responses/BadRequestError'
        '500':
          $ref: '#/components/responses/InternalServerError'
      parameters:
        - $ref: '#/components/parameters/data_source_id_query'
        - name: country_code
          in: query
          description: >-
            The two-letter [ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2)
            country code used to filter results.
          schema:
            $ref: '#/components/schemas/CountryCode'
        - $ref: '#/components/parameters/query'
        - $ref: '#/components/parameters/page_size'
        - $ref: '#/components/parameters/pagination_token'
    post:
      summary: Get Scores for Timeseries Data
      description: >-
        Get score data for a particular score against any data source you have
        access to. The `score_id` must be valid in the specified `data_source_id`
        and `country_code`. Every `question_id` included in the `audience` body
        must also be from the same `country_code`.


        The `min_date` and `max_date` range is bounded to 10 years. When both
        are omitted, the range defaults to the last 10 years. If only one is
        provided, the request is rejected.
      tags:
        - Data
      operationId: postScores
      responses:
        '200':
          $ref: '#/components/responses/PostScoresOutput'
        '400':
          $ref: '#/components/responses/BadRequestError'
        '404':
          $ref: '#/components/responses/NotFoundError'
        '500':
          $ref: '#/components/responses/InternalServerError'
      requestBody:
        description: Request body for score data
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PostScoresInput'
            examples:
              Example:
                $ref: '#/components/examples/PostScoresInput'
              ExampleWithEntity:
                $ref: '#/components/examples/PostScoresInputWithEntity'
  /scores/{score_id}/data_sources:
    get:
      summary: Get Data Sources for Score
      description: >-
        Scores are not available in every data source, nor in every country
        within a given data source. This endpoint returns the list of data
        sources a score is available in, along with the countries the score
        can be calculated in for each data source.
      operationId: getScoreDataSources
      tags:
        - Lookup
      responses:
        '200':
          $ref: '#/components/responses/GetScoreDataSourcesOutput'
        '400':
          $ref: '#/components/responses/BadRequestError'
        '404':
          $ref: '#/components/responses/NotFoundError'
        '500':
          $ref: '#/components/responses/InternalServerError'
      parameters:
        - name: score_id
          in: path
          required: true
          description: The score ID to get data sources for.
          example: 48ef9961-1dc8-42d1-b03c-c480681bc732
          schema:
            $ref: '#/components/schemas/ScoreID'
  /responses:
    post:
      summary: Get Aggregated Question Responses Data
      description: >-
        Get aggregated data for a requested question. The range between `min_date` and `max_date`
        must not exceed 10 years.
      tags:
        - Data
      operationId: postResponses
      responses:
        '200':
          $ref: '#/components/responses/PostResponsesOutput'
        '400':
          $ref: '#/components/responses/BadRequestError'
        '404':
          $ref: '#/components/responses/NotFoundError'
        '500':
          $ref: '#/components/responses/InternalServerError'
      requestBody:
        description: Request body for responses data
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PostResponsesInput'
            examples:
              Example:
                $ref: '#/components/examples/PostResponsesInput'
  /responses/bulk:
    post:
      summary: Submit a Bulk Responses Request
      description: >-
        Submit a request to asynchronously generate timeseries data for one or
        more questions and audiences from the specified data source. The max
        date range for a single request is 10 years. Returns a `request_id`
        that can be used to poll the status of the report via the
        [/responses/bulk/{request_id}](#GET-getResponsesBulkStatus) endpoint.
        When the report is complete, a download URL will be provided to
        retrieve the data.
      tags:
        - Data
      operationId: postResponsesBulk
      responses:
        '200':
          $ref: '#/components/responses/PostResponsesBulkOutput'
        '400':
          $ref: '#/components/responses/BadRequestError'
        '403':
          $ref: '#/components/responses/ForbiddenError'
        '404':
          $ref: '#/components/responses/NotFoundError'
        '500':
          $ref: '#/components/responses/InternalServerError'
      requestBody:
        description: Request body for submitting a bulk responses report
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PostResponsesBulkInput'
            examples:
              Example:
                $ref: '#/components/examples/PostResponsesBulkInput'
  /responses/bulk/{request_id}:
    get:
      summary: Get Bulk Responses Request Status
      description: >-
        Get the status of a previously submitted bulk responses report request.
        When the report is complete, the response will include a `download_url`
        that can be used to download the report data.
      tags:
        - Lookup
      operationId: getResponsesBulkStatus
      responses:
        '200':
          $ref: '#/components/responses/GetResponsesBulkStatusOutput'
        '400':
          $ref: '#/components/responses/BadRequestError'
        '403':
          $ref: '#/components/responses/ForbiddenError'
        '404':
          $ref: '#/components/responses/NotFoundError'
        '500':
          $ref: '#/components/responses/InternalServerError'
      parameters:
        - name: request_id
          in: path
          required: true
          description: The request ID returned from the bulk responses request.
          example: b1a2c3d4-e5f6-7890-abcd-ef1234567890
          schema:
            type: string
            format: uuid
  /scores/bulk:
    post:
      summary: Submit a Bulk Scores Request
      description: >-
        Submit a request to asynchronously generate timeseries score data for
        one or more named scores and audiences from the specified data source.
        The max date range for a single request is 10 years. Returns a
        `request_id` that can be used to poll the status of the report via the
        [/scores/bulk/{request_id}](#GET-getScoresBulkStatus) endpoint.
        When the report is complete, a download URL will be provided to
        retrieve the data.
      tags:
        - Data
      operationId: postScoresBulk
      responses:
        '200':
          $ref: '#/components/responses/PostScoresBulkOutput'
        '400':
          $ref: '#/components/responses/BadRequestError'
        '403':
          $ref: '#/components/responses/ForbiddenError'
        '404':
          $ref: '#/components/responses/NotFoundError'
        '500':
          $ref: '#/components/responses/InternalServerError'
      requestBody:
        description: Request body for submitting a bulk scores report
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PostScoresBulkInput'
            examples:
              Example:
                $ref: '#/components/examples/PostScoresBulkInput'
  /scores/bulk/{request_id}:
    get:
      summary: Get Bulk Scores Request Status
      description: >-
        Get the status of a previously submitted bulk scores report request.
        When the report is complete, the response will include a `download_url`
        that can be used to download the report data.
      tags:
        - Lookup
      operationId: getScoresBulkStatus
      responses:
        '200':
          $ref: '#/components/responses/GetScoresBulkStatusOutput'
        '400':
          $ref: '#/components/responses/BadRequestError'
        '403':
          $ref: '#/components/responses/ForbiddenError'
        '404':
          $ref: '#/components/responses/NotFoundError'
        '500':
          $ref: '#/components/responses/InternalServerError'
      parameters:
        - name: request_id
          in: path
          required: true
          description: The request ID returned from the bulk scores request.
          example: b1a2c3d4-e5f6-7890-abcd-ef1234567890
          schema:
            type: string
            format: uuid
components:
  schemas:
    PaginationToken:
      type: string
      format: base64
      description: >-
        A pagination token to use to get paginated results.
        For more details, see the section on [Pagination](#pagination).
      pattern: '^(?:[A-Za-z\d+/]{4})*(?:[A-Za-z\d+/]{3}=|[A-Za-z\d+/]{2}==)?$'
      minLength: 3
      maxLength: 300
      example: eyJxdWVyeSI6ImRvZ3MifQ==
    Error:
      type: object
      description: Error message.
      additionalProperties: false
      example:
        code: 500
        status: Internal Server Error
        errors:
          - 'Oops, something went wrong'
      properties:
        code:
          type: integer
          description: Numeric HTTP status code.
          example: 500
          format: int32
          minimum: 100
          maximum: 599
        status:
          type: string
          description: Text description of HTTP status code.
          example: Internal Server Error
        errors:
          type: array
          description: Messages describing errors.
          items:
            title: error
            type: string
            description: A specific error message.
          example:
            - 'Oops, something went wrong'
    Entity:
      title: Entity
      type: object
      description: 'A 

# --- truncated at 32 KB (97 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/morning-consult/refs/heads/main/openapi/morning-consult-openapi-original.yml