---
title: "Start validation run"
method: POST
path: "/multichannel/workspaces/{workspaceID}/validations"
tags: ["Validations"]
---

# Start validation run

`POST /multichannel/workspaces/{workspaceID}/validations`

## Request

- Base URL: `https://multichannel-api.salesforge.ai/public`
- URL: `https://multichannel-api.salesforge.ai/public/multichannel/workspaces/{workspaceID}/validations`
- Auth: API key in header `Authorization`

Starts asynchronous email validation for the contacts the filters resolve to.

Before returning, submission resolves and persists exact lead IDs and emails after filters,
exclusions, sequence scope, deduplication, and the effective limit. The exact selected count
is checked against current credits; insufficient credits return 402 without creating a run.
Non-empty runs return pending. Empty selections return a terminal failed run with
failureCode validation_scope_empty. The deprecated strict field is accepted and ignored.

## Path parameters

- `workspaceID` string, required

## Request body

- union
  - object
  - RequestsStartValidationRunRequest
    - `filters` RequestsValidationFiltersRequest, required
      - `companies` string[]
      - `companyEmpty` boolean
      - `customVarIds` string[]
      - `customVars` string[]
      - `deleted` boolean
      - `esps` string[]
      - `excludeContacted` boolean
      - `excludeUncontacted` string
      - `hasEmail` boolean
      - `hasValidLinkedIn` boolean
      - `inMcSequenceIds` string[]
      - `includeUncontacted` string
      - `leadIds` string[]
      - `notInCustomVarIds` string[]
      - `notInCustomVars` string[]
      - `notInESPs` string[]
      - `notInLeadIds` string[]
      - `notInMcSequenceIds` string[]
      - `notInTagIds` string[]
      - `numberOfContactsToAdd` integer
      - `primeboxLabelIds` string[]
      - `searchQuery` string
      - `selectionScope` string
      - `sequenceLeadStatuses` string[]
      - `tagIds` string[]
      - `validationStatuses` string[]
      - `withEmailOnly` boolean
    - `limit` integer
    - `strict` boolean: Deprecated: Strict is accepted and ignored because empty scopes become terminal failed runs.

## Response `201`

Validation initiated

- ResponsesStartValidationRunResponse
  - `failureCode` 'validation_scope_empty' | 'insufficient_credits' | 'validation_execution_failed' | 'validation_timed_out' | 'validation_results_sync_failed' | 'credit_reservation_failed' | 'credit_reconciliation_failed' | 'validation_processing_failed': FailureCode identifies a stable terminal failure reason.
  - `matched` integer: Matched counts contacts returned while resolving the submitted scope. Deprecated: use selected at submission and validation results after completion.
  - `message` string: Deprecated: inspect status and failureCode on validation results instead.
  - `selected` integer: Selected counts the exact candidates frozen for this run.
  - `skipped` ResponsesValidationSkipCountsResponse: Skipped reports exact request-time duplicate exclusions.
    - `duplicate` integer
  - `started` boolean: Deprecated: Started is retained as true for accepted asynchronous submissions.
  - `status` 'pending' | 'failed': Status is the lifecycle status at submission completion.
  - `validationJobID` string

## Other responses

- `400`: Bad Request
- `401`: Unauthorized
- `402`: Insufficient email-validation credits
- `403`: Forbidden
- `500`: Internal Server Error

---

[API](https://skmtc.dev/salesforge/apis/multichannel-public-api.md) - [All operations](https://skmtc.dev/salesforge/apis/multichannel-public-api/llms.txt) - [OpenAPI document](https://skmtc.dev/salesforge/apis/multichannel-public-api/revisions/f4dc28ed447d?raw)
