Cint Profiling Helper API

Helps by generating different profile configurations, including interlocked profiles for draft.

OpenAPI Specification

cint-profiling-helper-api-openapi.yml Raw ↑
openapi: 3.0.3
info:
  title: Demand Accounts Profiling Helper API
  description: 'Cint''s demand ordering API is REST oriented. It has predictable resource based URLs, accepts JSON-encoded request bodies, returns JSON-encoded responses, and uses standard HTTP response codes, authentication, and verbs. Error responses are also JSON-encoded and follow a standard format, providing a unique error ID and detailed information about what went wrong.


    Authentication is handled via bearer tokens passed in the `Authorization` header. All requests must also include a `Cint-API-Version` header with a date in `YYYY-MM-DD` format to specify the desired API version. Depending on the version you use, endpoint behavior may differ as we improve our API with every version release.


    While many operations work on a single object per request, the demand ordering API also provides asynchronous batch endpoints for performing bulk updates efficiently on certain resources. For safety, `POST` requests support an `Idempotency-Key` header to allow for safe retries without accidentally performing the same operation twice.

    '
  version: '2025-12-18'
servers:
- description: Production server
  url: https://api.cint.com/v1
security:
- BearerAuth: []
tags:
- name: Profiling Helper
  description: Helps by generating different profile configurations, including interlocked profiles for draft.
paths:
  /demand/accounts/{account_id}/drafts/generate-blended-profile:
    parameters:
    - $ref: '#/components/parameters/AccountID'
    - $ref: '#/components/parameters/CintAPIVersion-2025-12-18'
    post:
      operationId: generate_blended_profile
      summary: Generates a blended profile from regular profiles
      tags:
      - Profiling Helper
      description: 'Generates a single `blended` profile by combining two or three `regular` profiles.


        This allows you to experiment with complex, interlocked quota structures without creating a target group.

        The endpoint automatically calculates the supplier distribution for the resulting quotas.


        Key behaviors:


        * You must provide between two and three regular profiles to be blended.

        * When this profile is later used to create a target group, there is a limit of 350 total quotas.

        '
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/GenerateDraftInterlockedProfileRequestV3'
      responses:
        '201':
          description: The blended profile was generated successfully.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CompositeDraftRegularProfileV3'
        '400':
          description: The request is malformed or contains syntactically invalid parameters.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BadRequestErrorResponseDemographics'
        '401':
          $ref: '#/components/responses/Error_Unauthorized'
        '403':
          $ref: '#/components/responses/Error_Forbidden'
        '404':
          $ref: '#/components/responses/Error_NotFound'
        '422':
          description: The request is well-formed, but the profile configuration is invalid (e.g., overlapping quotas, incorrect logic). The response body contains detailed validation errors.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationErrorResponseDemographics'
        '500':
          description: An unexpected internal error occurred.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/InternalErrorResponseDemographics'
  /demand/accounts/{account_id}/profiles/validate:
    parameters:
    - $ref: '#/components/parameters/AccountID'
    - $ref: '#/components/parameters/CintAPIVersion-2025-12-18'
    post:
      operationId: validate_profiles
      summary: Validates a profile
      description: 'Validates a complete profile and target configuration without creating or modifying any resources.


        You can use this stateless endpoint to check your profile logic for business rule violations (e.g., overlapping quotas) before you use it to create or update a target group.

        It provides detailed warnings and errors to help you build a valid configuration.


        The API automatically removes duplicate open-ended values in this request before validation, but rejects duplicates in selection or range conditions.

        '
      tags:
      - Profiling Helper
      requestBody:
        description: The complete profile configuration to be validated.
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ValidateProfilesRequestV3'
      responses:
        '204':
          description: The profile configuration is valid and has no errors or warnings.
        '400':
          description: The request is malformed or contains syntactically invalid parameters.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BadRequestErrorResponseDemographics'
        '401':
          $ref: '#/components/responses/Error_Unauthorized'
        '403':
          $ref: '#/components/responses/Error_Forbidden'
        '422':
          description: The request is well-formed, but the profile configuration is invalid (e.g., overlapping quotas, incorrect logic). The response body contains detailed validation errors.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationErrorResponseDemographics'
        '500':
          description: An unexpected internal error occurred.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/InternalErrorResponseDemographics'
components:
  schemas:
    InvalidParamStructure:
      title: Invalid request structure
      type: object
      description: An error related to the structure of the request payload itself.
      required:
      - error_type
      - name
      - reason
      properties:
        error_type:
          type: string
          description: The type of validation error.
          enum:
          - structural_error
        name:
          type: string
          description: Error name.
        reason:
          type: string
          description: Error reason.
        detail:
          type: string
    CompletesGoal:
      type: number
      description: Specifies the target group's required number of survey completions or pre-screen responses.  Formerly referred to as the "filling goal," this value sets the benchmark for the number of valid responses  needed to achieve the desired level of data reliability.
      format: int
      minimum: 1
      example: 1500
    RequestDraftQuotaPercentageV3:
      type: object
      description: Profile target with condition or conditions and percentage value in quota.
      required:
      - conditions
      - quota
      properties:
        conditions:
          type: array
          description: List of conditions for the target.
          minItems: 1
          items:
            $ref: '#/components/schemas/InterlockProfileConditionsV3'
        quota:
          type: object
          required:
          - completes_goal_percentage
          properties:
            name:
              type: string
              description: Name of the quota used for tracking. This will be deprecated, functionally replaced by the `target.name` field one layer up in the contract.
              deprecated: true
              example: SF_Quota_12
            completes_goal_percentage:
              type: number
              multipleOf: 0.01
              minimum: 0
              maximum: 100
              description: Percentage of total completes goal quota applied to this condition(s).
              example: 40
    InvalidParam:
      type: object
      description: Describes a single invalid parameter in a request.
      properties:
        name:
          type: string
          description: The name of the parameter that failed validation.
        reason:
          type: string
          description: A short explanation of why the parameter was invalid.
      required:
      - name
      - reason
    QuestionID:
      type: integer
      description: The unique identifier for a profiling question.
      example: 12413
    CompositeDraftRegularProfileV3:
      description: The response object for a successfully generated blended profile.
      type: object
      required:
      - object
      - quotas_enabled
      - name
      - description
      - targets
      properties:
        object:
          type: string
          description: The type of profile. For this object, the value is always `blended`.
          enum:
          - blended
          example: blended
        quotas_enabled:
          type: boolean
          description: Flag indicating if quotas are enabled.
          example: true
        name:
          type: string
          description: The name of the profile.
          example: HISPANIC
        description:
          type: string
          description: A short summary of the profile. Summary language will be based on the target group's locale.
          example: Are you of Hispanic, Latino, or Spanish origin?
        description_translated:
          type: string
          description: A short summary of the profile by default english language.
          example: Are you of Hispanic, Latino, or Spanish origin?
        targets:
          $ref: '#/components/schemas/DraftQuotaV3'
      example:
        object: blended
        quotas_enabled: true
        name: GENDER x AGE
        description: Blended profile for Gender and Age
        description_translated: Blended profile for Gender and Age
        targets:
        - id: 01JQMD8R7F0VW45KPWQ7WYNCFP
          text: Male and 18-34
          name: Target-Male-18-34
          conditions:
          - object: selection
            question_id: 43
            option: '1'
          - object: range
            question_id: 42
            min: 18
            max: 34
          quota:
            name: MALE_18_34
            completes_goal_percentage: 25
            quota_nominal: 250
            completes_goal: 250
    ValidateProfilesRequestV3:
      description: The request body for validating a profile configuration.
      type: object
      required:
      - locale
      - completes_goal
      - profiling
      properties:
        locale:
          type: string
          example: eng_us
        completes_goal:
          $ref: '#/components/schemas/CompletesGoal'
        profiling:
          description: The core profiling configuration to be validated.
          type: object
          required:
          - profile_adjustment_type
          - profiles
          properties:
            profile_adjustment_type:
              type: string
              description: Defines how quotas are specified in the `profile` object. Use `percentage` to define quotas as a percentage of the `completes_goal`, or `nominal` to define them as a specific number of completes.
              enum:
              - percentage
              - nominal
              example: percentage
            profiles:
              type: array
              minItems: 1
              items:
                $ref: '#/components/schemas/RequestDraftRegularProfileV3'
      example:
        locale: eng_us
        completes_goal: 1000
        profiling:
          profile_adjustment_type: percentage
          profiles:
          - object: regular
            name: GENDER
            quotas_enabled: true
            targets:
            - name: Target-Male
              conditions:
              - object: selection
                question_id: 43
                option: '1'
              quota:
                completes_goal_percentage: 50
            - name: Target-Female
              conditions:
              - object: selection
                question_id: 43
                option: '2'
              quota:
                completes_goal_percentage: 50
          - object: regular
            quotas_enabled: false
            targets:
            - conditions:
              - object: selection
                question_id: 96
                option: '1'
            - conditions:
              - object: selection
                question_id: 96
                option: '10'
            - conditions:
              - object: selection
                question_id: 96
                option: '11'
          - object: blended
            blended_type: control
            name: Control quota
            quotas_enabled: true
            targets:
            - name: Control quota 1
              conditions:
              - object: selection
                question_id: 43
                option: '1'
              - object: range
                question_id: 42
                min: 20
                max: 29
              - object: selection
                question_id: 96
                option: '1'
              quota:
                completes_goal_percentage: 0.0
                completes_goal: 0
                quota_nominal: 0
            - name: Control quota 2
              conditions:
              - object: selection
                question_id: 43
                option: '2'
              - object: range
                question_id: 42
                min: 30
                max: 39
              - object: selection
                question_id: 96
                option: '1'
              quota:
                completes_goal_percentage: 10.0
                completes_goal: 0
                quota_nominal: 0
            - name: Control quota 3
              conditions:
              - object: selection
                question_id: 43
                option: '1'
              - object: range
                question_id: 42
                min: 30
                max: 39
              - object: selection
                question_id: 96
                option: '1'
              quota:
                completes_goal_percentage: 0.0
                completes_goal: 0
                quota_nominal: 0
    DraftQuotaDetailsV3:
      description: A polymorphic object representing a single quota target. The shape of the object depends on whether it has a `quota` block defined.
      oneOf:
      - title: Targets with conditions and quota
        type: object
        description: Profile target with condition or conditions with quota.
        required:
        - id
        - conditions
        - quota
        properties:
          id:
            type: string
            description: The unique identifier for the quota.
            format: ULID
            example: 01JQMD8R7F0VW45KPWQ7WYNCFP
          name:
            type: string
            description: The name of the target.
            example: Target-Condition
          text:
            type: string
            description: The display text for the answer option, in the requested `locale`.
            example: Condition Text
          text_translated:
            type: string
            description: Translated text of the condition used for display purpose.
            example: Condition Text
          conditions:
            type: array
            description: List of conditions for the quota.
            minItems: 1
            items:
              $ref: '#/components/schemas/InterlockProfileConditionsV3'
          quota:
            type: object
            required:
            - completes_goal_percentage
            - quota_nominal
            - completes_goal
            properties:
              name:
                type: string
                description: Name of the quota used for tracking. This will be deprecated, functionally replaced by the `target.name` field one layer up in the contract.
                deprecated: true
                example: SF_Quota_12
              completes_goal_percentage:
                type: number
                multipleOf: 0.01
                minimum: 0
                maximum: 100
                description: The goal for this quota, expressed as a percentage of the target group's total `completes_goal`.
                example: 40
              quota_nominal:
                type: integer
                minimum: 0
                description: The calculated number of completes for this quota, based on its percentage.
                example: 40
              completes_goal:
                type: integer
                minimum: 0
                description: The desired number of completes for this quota. This may differ from `quota_nominal` based on balancing and other factors.
                example: 40
      - title: Targets with conditions and no quota
        type: object
        description: Profile target with condition or conditions with no quota.
        required:
        - id
        - conditions
        properties:
          id:
            type: string
            description: The unique identifier for the quota.
            format: ULID
            example: 01JQMD8R7F0VW45KPWQ7WYNCFP
          name:
            type: string
            description: The name of the target.
            example: Target-Condition
          text:
            type: string
            description: The display text for the answer option, in the requested `locale`.
            example: Condition Text
          text_translated:
            type: string
            description: Translated text of the condition used for display purpose.
            example: Condition Text
          conditions:
            type: array
            description: List of conditions for the quota.
            minItems: 1
            items:
              $ref: '#/components/schemas/InterlockProfileConditionsV3'
    DraftQuotaV3:
      description: An array of detailed quota definitions.
      type: array
      minItems: 1
      items:
        $ref: '#/components/schemas/DraftQuotaDetailsV3'
    InvalidParamData:
      title: Invalid request data
      type: object
      description: An error related to invalid business logic or data values.
      required:
      - error_type
      - name
      - reason
      properties:
        error_type:
          type: string
          description: The type of validation error.
          enum:
          - data_validation_error
        name:
          type: string
          description: Error name code.
          enum:
          - profile_validation_error_001
          - profile_validation_error_002
          - profile_validation_error_003
          - profile_validation_error_004
          - profile_validation_error_005
          - profile_validation_error_006
          - profile_validation_error_007
          - profile_validation_error_008
          - profile_validation_error_009
          - profile_validation_error_010
          - profile_validation_error_011
          - profile_validation_error_012
          - profile_validation_error_013
          - profile_validation_error_014
          - profile_validation_error_015
          - profile_validation_error_016
          - profile_validation_error_017
          - profile_validation_error_018
          - profile_validation_error_019
          - profile_validation_error_020
          - profile_validation_error_021
          - profile_validation_error_023
          - profile_validation_error_024
          - profile_validation_error_025
          - profile_validation_error_026
          - profile_validation_error_030
          - profile_validation_error_032
          - profile_validation_error_033
          - profile_validation_error_034
          - profile_validation_error_035
          - profile_validation_error_036
          - profile_validation_error_037
          - profile_validation_error_038
          - profile_validation_error_039
          - profile_validation_error_040
          - profile_validation_error_041
          - profile_validation_error_042
          - profile_validation_error_043
          - profile_validation_error_044
          - profile_validation_error_045
          - profile_validation_error_046
          - profile_validation_error_047
          - profile_validation_error_048
          - profile_validation_error_049
          - profile_validation_error_050
          - profile_validation_error_051
          - profile_validation_error_052
          - profile_validation_error_053
          - profile_validation_error_054
          - profile_validation_error_055
          - profile_validation_error_056
          - profile_validation_error_057
          - profile_validation_error_058
          - profile_validation_error_059
          - profile_validation_error_060
          - profile_validation_error_061
          - profile_validation_error_062
          - profile_validation_error_063
          - profile_validation_error_064
          - profile_validation_error_065
          - profile_validation_error_066
          - profile_validation_error_067
          - profile_validation_error_068
          - profile_validation_error_070
          - profile_validation_error_071
          - profile_validation_error_072
          - profile_validation_error_073
          - profile_validation_error_074
          - profile_validation_error_075
          - profile_validation_error_076
          - profile_validation_error_077
          - profile_validation_error_078
        reason:
          type: string
          description: Error reason code.
          enum:
          - profile_condition_min_greater_than_max_001
          - profile_condition_max_less_than_min_error_002
          - profile_condition_not_unique_003
          - quota_indexes_out_of_bounds_004
          - group_quota_not_unique_005
          - profile_not_unique_006
          - ungroup_quota_not_unique_007
          - quota_percentage_not_in_sync_with_nominal_008
          - incorrect_sum_of_percentage_009
          - incorrect_sum_of_nominal_010
          - unable_to_add_dependency_011
          - profile_with_invalid_condition_012
          - not_supported_profile_type_013
          - profile_condition_ranges_should_not_overlap_014
          - invalid_question_id_015
          - total_completes_goal_cannot_be_less_than_one_016
          - total_completes_goal_cannot_be_greater_than_max_017
          - invalid_zip_code_018
          - not_supported_question_option_020
          - zip_not_supported_in_blended_021
          - blended_profiles_cannot_have_more_than_3_questions_023
          - number_of_quotas_in_blended_cannot_be_greater_than_max_024
          - quota_will_be_always_enabled_for_blended_profile_025
          - at_least_one_quota_object_should_be_populated_with_completes_goal_or_completes_goal_percentage_value_026
          - total_number_of_quotas_cannot_be_greater_than_max_030
          - invalid_open_ended_option_032
          - quota_conditions_out_of_bounds_033
          - blended_profile_cannot_be_more_than_1_034
          - start_at_and_end_at_cannot_be_same_035
          - end_at_cannot_be_before_start_at_036
          - invalid_start_at_or_end_at_date_format_037
          - zip_values_cannot_be_greater_than_max_038
          - duplicate_condition_039
          - template_locale_does_not_match_target_group_locale_040
          - template_allows_only_percentage_adjustment_041
          - nominal_adjustment_cannot_have_percentage_042
          - percentage_adjustment_cannot_have_nominal_043
          - profile_id_not_found_044
          - target_id_not_found_for_profile_045
          - quota_value_less_than_completes_046
          - quota_value_greater_than_completes_goal_047
          - regular_profile_cannot_have_more_than_one_question_048
          - profiles_to_be_blended_cannot_have_only_one_question_049
          - profiles_and_profile_adjustment_type_must_be_provided_050
          - at_least_one_profile_must_be_in_profiles_object_051
          - completes_goal_percentage_must_be_populated_for_quota_enabled_profile_052
          - completes_goal_must_be_populated_for_quota_enabled_profile_053
          - allow_all_values_must_be_populated_for_open_ended_condition_054
          - open_ended_values_must_be_of_same_length_as_option_mask_055
          - duplicate_quota_name_056
          - target_name_or_quota_name_must_be_provided_for_multiple_conditions_057
          - blended_profile_cannot_have_only_one_condition_058
          - profile_adjustment_type_and_quota_fields_do_not_match_059
          - completes_goal_and_profiles_must_be_provided_060
          - disabled_profile_cannot_have_completes_goal_061
          - profiles_to_be_blended_cannot_be_null_062
          - at_least_one_quota_should_have_completes_goal_greater_than_zero_063
          - at_least_one_quota_should_have_completes_goal_percentage_greater_than_zero_064
          - allow_all_values_target_cannot_have_quota_065
          - blended_profile_with_control_as_blended_type_cannot_be_more_than_1_066
          - blended_profile_with_control_as_blended_type_should_match_with_regular_profiles_067
          - blended_profile_with_control_as_blended_type_cannot_share_questions_with_blended_type_as_interlock_or_null_blended_type_068
          - blended_profile_with_control_as_blended_type_cannot_have_more_than_max_targets_070
          - blended_profile_with_control_as_blended_type_cannot_have_less_than_1_target_071
          - blended_profile_with_control_as_blended_type_must_have_target_or_quota_name_072
          - blended_profile_with_control_as_blended_type_cannot_have_duplicate_target_or_quota_name_073
          - control_blended_profiles_associated_with_target_groups_are_not_supported_for_supplier_distribution_074
          - total_completes_goal_cannot_be_less_than_control_blended_profile_completes_goal_075
          - total_completes_goal_cannot_be_less_than_collected_076
          - total_number_of_profiles_cannot_be_greater_than_max_077
          - total_number_of_conditions_cannot_be_greater_than_max_078
        detail:
          type: string
        metadata:
          type: object
          properties:
            question_id:
              type: array
              items:
                type: integer
              description: The question id of the question that failed validation.
            profile_id:
              type: string
              format: ulid
              description: The profile id of the profile that failed validation.
            interlock_id:
              type: string
              format: ulid
              description: The interlock id of the interlock that failed validation.
            quota_id:
              type: string
              format: ulid
              description: The quota id of the quota that failed validation.
            error_level:
              type: string
              enum:
              - warning
              - error
              description: The level of the error.
      example:
        error_type: data_validation_error
        name: profile_validation_error_001
        reason: profile_condition_min_greater_than_max_001
        detail: The minimum value cannot be greater than the maximum value.
        metadata:
          profile_id: 01H8XGJWBWBAQ4J1Z5F4A9C3K8
          question_id:
          - 123
          error_level: error
    RequestDraftQuotaNominalV3:
      type: object
      description: Profile target with condition or conditions and nominal value in quota.
      required:
      - conditions
      - quota
      properties:
        conditions:
          type: array
          description: List of conditions.
          minItems: 1
          items:
            $ref: '#/components/schemas/InterlockProfileConditionsV3'
        quota:
          type: object
          required:
          - completes_goal
          properties:
            name:
              type: string
              description: Name of the quota used for tracking. This will be deprecated, functionally replaced by the `target.name` field one layer up in the contract.
              deprecated: true
              example: SF_Quota_12
            completes_goal:
              type: number
              format: int32
              minimum: 0
              description: Total completes goal quota applied to this condition(s).
              example: 40
    RequestDraftNoQuotaV3:
      type: object
      description: No quotas specified. The request will proceed without applying any quotas.
      required:
      - object
      - conditions
      properties:
        object:
          type: string
          description: Object field to distinguish the operation.
          enum:
          - nominal
          example: nominal
        conditions:
          type: array
          description: List of conditions.
          minItems: 1
          items:
            $ref: '#/components/schemas/InterlockProfileConditionsV3'
    Error:
      type: object
      description: The standard error object returned for all failed API requests.
      required:
      - object
      - detail
      properties:
        id:
          type: string
          format: uuid
          description: A unique identifier for this specific error instance.
        object:
          type: string
          description: A short informative string identifying the type of the error
          pattern: ^([a-z]*_)*([a-z]*)$
        detail:
          type: string
          description: An error message provides a concise overview of the cause of the error.
        invalid_params:
          type: array
          nullable: true
          description: An optional field containing a list of invalid parameters may be presented in validation errors for additional information.
          items:
            $ref: '#/components/schemas/InvalidParam'
    ProfileTargetsRangeConditionsV3:
      title: Range condition
      type: object
      description: A profiling condition that targets a numeric range (e.g. age).
      required:
      - object
      - question_id
      - min
      - max
      properties:
        object:
          type: string
          description: The type of profiling condition. For this object, the value is always 'range'.
          enum:
          - range
          example: range
        question_id:
          $ref: '#/components/schemas/QuestionID'
        min:
          type: integer
          format: int32
          minimum: 1
          maximum: 99
          description: The minimum numeric value (inclusive).
          example: 18
        max:
          type: integer
          format: int32
          minimum: 1
          maximum: 99
          description: The maximum numeric value (inclusive).
          example: 24
    ValidationErrorResponseDemographics:
      type: object
      properties:
        object:
          type: string
          default: unprocessable_entity_error
        title:
          type: string
          default: profile request validation
        detail:
          type: string
          pattern: ^Validation error.*?$
        invalid_params:
          type: array
          items:
            oneOf:
            - $ref: '#/components/schemas/InvalidParamData'
            - $ref: '#/components/schemas/InvalidParamStructure'
            discriminator:
              propertyName: error_type
              mapping:
                data_validation_error: '#/components/schemas/InvalidParamData'
                structural_error: '#/components/schemas/InvalidParamStructure'
    BadRequestErrorResponseDemographics:
      type: object
      properties:
        object:
          type: string
        detail:
          type: string
        invalid_params:
          type: array
          items:
            type: object
            properties:
              name:
                type: string
              reason:
                type: string
            required:
            - name
            - reason
      required:
      - object
      - detail
    InternalErrorResponseDemographics:
      type: object
      properties:
        object:
          type: string
        detail:
          type: string
        errors:
          type: array
          items:
            type: object
            properties:
              name:
                type: string
              reason:
                type: string
            required:
            - name
            - reason
      required:
      - object
      - detail
    InterlockProfileConditionsV3:
      description: A polymorphic object representing a single prof

# --- truncated at 32 KB (42 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/cint/refs/heads/main/openapi/cint-profiling-helper-api-openapi.yml