> ## Documentation Index
> Fetch the complete documentation index at: https://developers.partoo.co/llms.txt
> Use this file to discover all available pages before exploring further.

# Send a feedback email campaign

> Validates the sender email, validates recipients, and sends a feedback email campaign to the provided recipient list.

Use the [Get campaign requirements](/api-reference/feedback-management/get-campaign-requirements) endpoint
to retrieve the variables each recipient must provide.

The sender email domain must be authorized for your organization and validated for email sending.
If sender validation fails, the entire campaign is rejected and the response includes `sender_validation` details.

If any recipient fails validation, the entire campaign is rejected and **no emails are sent**.
The response body details every validation error.

Set `is_dry_run: true` to validate recipients without sending any emails.




## OpenAPI

````yaml /assets/openapi/openapi-bundled.yaml post /feedback/campaign/send
openapi: 3.1.0
info:
  title: Partoo Rest API
  version: v2
  license:
    name: © Copyright Partoo
    url: https://www.partoo.co/en/gtu-api/
  x-logo:
    url: >-
      https://partoo-client-images.s3.amazonaws.com/logo-partoo-restapi-white.png
  description: >
    ## Introduction

    The Partoo Rest API allows you to automate all the actions that are possible
    to do in the Partoo Web Application.


    The Partoo Rest API can be used for many different purposes:
      - Create/update/delete your businesses & users if you are a client.
      - Create/subscribe/manage organizations, businesses & users if you are a reseller.
      - Retrieve data on businesses you have access to if you are a publisher.
      - ...
servers:
  - url: https://api.partoo.co/v2
    description: Production server
  - url: https://api.sandbox.partoo.co/v2
    description: Sandbox server (dev environment for clients & partners)
security:
  - ApiKeyAuth: []
paths:
  /feedback/campaign/send:
    post:
      tags:
        - Feedback Management
      summary: Send a feedback email campaign
      description: >
        Validates the sender email, validates recipients, and sends a feedback
        email campaign to the provided recipient list.


        Use the [Get campaign
        requirements](/api-reference/feedback-management/get-campaign-requirements)
        endpoint

        to retrieve the variables each recipient must provide.


        The sender email domain must be authorized for your organization and
        validated for email sending.

        If sender validation fails, the entire campaign is rejected and the
        response includes `sender_validation` details.


        If any recipient fails validation, the entire campaign is rejected and
        **no emails are sent**.

        The response body details every validation error.


        Set `is_dry_run: true` to validate recipients without sending any
        emails.
      operationId: sendFeedbackEmailCampaign
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SendCampaignRequest'
      responses:
        '200':
          description: >-
            Campaign accepted or failed validation. Check the `status` field to
            distinguish the two outcomes.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SendCampaignResponse'
        '401':
          $ref: '#/components/responses/401'
        '403':
          $ref: '#/components/responses/403'
        '404':
          description: Feedback form or email template not found
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    example: Form not found.
        '422':
          description: Request body validation error
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: array
                    items:
                      type: object
                      properties:
                        loc:
                          type: array
                          items: {}
                        msg:
                          type: string
                        type:
                          type: string
components:
  schemas:
    SendCampaignRequest:
      type: object
      required:
        - feedback_form_id
        - feedback_email_template_id
        - sender_email
        - sender_name
        - recipients
      properties:
        feedback_form_id:
          type: string
          description: ID of the feedback form to associate with this campaign
          example: 5a3f8c2e1b4d7f9a0c6e2b18
        feedback_email_template_id:
          type: integer
          description: ID of the email template to use for this campaign
          example: 42
        sender_email:
          type: string
          format: email
          description: >
            Email address displayed as the sender.


            <Warning>

            The domain of this address must be authorized for your organization
            and validated for email sending.

            If this check fails, the campaign is rejected with `status: failed`
            and the response includes

            `sender_validation` details.

            </Warning>
          example: noreply@example.com
        sender_name:
          type: string
          description: Name displayed as the sender
          example: Acme Corp
        recipients:
          type: array
          description: >
            List of recipients for the campaign. Maximum 1000 recipients per
            call.

            For larger lists, split them into batches and call this endpoint
            multiple times.
          maxItems: 1000
          items:
            $ref: '#/components/schemas/FeedbackEmailCampaignRecipient'
        is_dry_run:
          type: boolean
          default: false
          description: >
            When `true`, validates the recipients without actually sending the
            emails.

            Use this to verify your recipient list before triggering a real
            send.
          example: false
    SendCampaignResponse:
      type: object
      required:
        - status
        - feedback_form_id
        - feedback_email_template_id
        - recipient_count
      properties:
        status:
          type: string
          enum:
            - accepted
            - failed
          description: >
            `accepted` — validation passed; emails have been enqueued (or
            skipped if `is_dry_run` was `true`).


            `failed` — sender or recipient validation failed; no emails were
            sent.

            Check the error fields for details.
          example: accepted
        feedback_email_campaign_id:
          type:
            - integer
            - 'null'
          description: >-
            ID of the created campaign. `null` when `status` is `failed` or
            `is_dry_run` is `true`
          example: 101
        feedback_form_id:
          type: string
          description: ID of the feedback form associated with this campaign
          example: 5a3f8c2e1b4d7f9a0c6e2b18
        feedback_email_template_id:
          type: integer
          description: ID of the email template used for this campaign
          example: 42
        recipient_count:
          type: integer
          description: Total number of recipients provided in the request
          example: 150
        duplicate_emails:
          type:
            - array
            - 'null'
          description: >-
            Email addresses that appear more than once in the recipients list.
            Populated when `status` is `failed`
          items:
            type: string
            format: email
          example:
            - duplicate@example.com
        invalid_emails:
          type:
            - array
            - 'null'
          description: >-
            Email addresses that are not valid. Populated when `status` is
            `failed`
          items:
            type: string
          example:
            - not-an-email
            - missing@
        missing_variables:
          type:
            - array
            - 'null'
          description: >
            List of `[email_address, missing_variable_names]` pairs identifying
            recipients

            who are missing one or more required template variables. Populated
            when `status` is `failed`
          items:
            type: array
            prefixItems:
              - type: string
                format: email
                description: Recipient email address
              - type: array
                description: Names of the missing variables for this recipient
                items:
                  type: string
            minItems: 2
            maxItems: 2
          example:
            - - john@example.com
              - - first_name
                - store_name
        empty_variables:
          type:
            - array
            - 'null'
          description: >
            List of `[email_address, empty_variable_names]` pairs identifying
            recipients

            who have one or more required template variables set to an empty
            string. Populated when `status` is `failed`
          items:
            type: array
            prefixItems:
              - type: string
                format: email
                description: Recipient email address
              - type: array
                description: Names of the empty variables for this recipient
                items:
                  type: string
            minItems: 2
            maxItems: 2
          example:
            - - jane@example.com
              - - store_name
        sender_validation:
          type:
            - object
            - 'null'
          description: >
            Result of the sender email validation check. Populated when `status`
            is `failed`.

            If `sender_validation.status` is `not_validated`, the sender domain
            is either not authorized

            for the organization or not validated for email sending.
          allOf:
            - $ref: '#/components/schemas/SenderValidation'
          example:
            sender_email: noreply@example.com
            domain: example.com
            status: not_validated
    FeedbackEmailCampaignRecipient:
      type: object
      required:
        - email_address
        - variables
      properties:
        email_address:
          type: string
          format: email
          description: Recipient email address
          example: john.doe@example.com
        unsubscribe_url:
          type:
            - string
            - 'null'
          format: uri
          description: >
            URL that allows the recipient to unsubscribe from future campaigns.


            If omitted, Partoo will generate and inject a default unsubscribe
            link automatically.

            Opt-out records are stored by Partoo and can be exported from the
            Partoo interface

            as an XLSX file (columns: `email_address`, `opt_out_date`).


            <Warning>

            It is your responsibility to honour opt-outs and exclude opted-out
            recipients

            from future campaign sends. Partoo does not suppress opted-out
            addresses automatically.

            </Warning>
          example: https://example.com/unsubscribe?token=abc123
        variables:
          type: object
          additionalProperties:
            type: string
          description: Key-value pairs for template variable substitution
          example:
            first_name: John
            store_name: Paris Store
    SenderValidation:
      type: object
      required:
        - sender_email
        - domain
        - status
      properties:
        sender_email:
          type: string
          format: email
          description: Sender email submitted in the request
          example: sender@example.com
        domain:
          type: string
          description: Domain extracted from `sender_email`
          example: example.com
        status:
          type: string
          enum:
            - validated
            - not_validated
          description: >
            `validated` — the domain is authorized for the organization and
            validated for email sending.


            `not_validated` — the domain is not authorized for the organization
            or not validated for email sending.
          example: validated
  responses:
    '401':
      description: You are not authenticated
      content:
        application/json:
          schema:
            description: Error that occurs when you are not authenticated
            type: object
            properties:
              errors:
                type: object
                description: The detail of the error encountered
                properties:
                  authentication:
                    type: string
                    default: User not authenticated
    '403':
      description: |
        You are not allowed to perform this action
      content:
        application/json:
          schema:
            description: >
              Error that occurs when you are authenticated but you are trying to
              perform an action you are not allowed to perform
            type: object
            properties:
              errors:
                type: object
                description: The detail of the error encountered
                properties:
                  authorization:
                    type: string
                    default: Operation not allowed
  securitySchemes:
    ApiKeyAuth:
      description: >
        The authentication system on Partoo API is using API Key that should be
        put in the header of the request (the name of the header is `x-APIKey`).
        An api_key is linked to a user. This user's role will give you different
        access level to the API features.
      type: apiKey
      in: header
      name: x-APIKey

````