Skip to main content

Verification Pipeline — Technical Documentation

Last updated: February 2026


Table of Contents

  1. Overview
  2. Architecture
  3. Repository Map
  4. Core Flows
  5. Entities & Data Model
  6. API Endpoints
  7. Services & Business Logic
  8. Configuration
  9. Integration Points

1. Overview

The Verification Pipeline handles bulk email verification — batch processing of prospect email addresses to check deliverability. Jobs are managed via Hangfire background processing, with results aggregated and exposed through the Data API. The system lives primarily in sopromasterdata (backend API + Hangfire services) and data-admin (frontend UI for job management and verification search).


2. Architecture


3. Repository Map

RepositoryLayerKey Files
sopromasterdataControllerAPI/SoProMasterDBAPI/Controllers/VerificationController.cs
sopromasterdataServiceVerificationServices/VerificationService.cs
sopromasterdataHangfireHangfireServices/VerificationHangfireService.cs
sopromasterdataRepositoryRepository/Verification/VerificationRepository.cs
sopromasterdataEntitiesVerificationEntities/VerificationJob.cs, VerificationResult.cs
data-adminPagessrc/pages/verifications/
data-adminSearch Pagesrc/pages/verification-search/
data-adminAPI Hookssrc/api/verifications.queries.ts
data-adminTypessrc/types/verifications/

4. Core Flows

4.1 Create & Process Verification Job

4.2 Verification Check Pipeline

4.3 Verification Search (Person Lookup)


5. Entities & Data Model

VerificationJob

ColumnTypeDescription
Idint (PK)Job identifier
Namenvarchar(255)Job description
Statusint (enum)Pending=0, Processing=1, Complete=2, Failed=3
TotalCountintTotal emails to verify
ProcessedCountintEmails processed so far
ValidCountintValid emails found
InvalidCountintInvalid emails found
RiskyCountintRisky (catch-all) emails
UnknownCountintUnknown status emails
CreatedAtdatetimeJob creation timestamp
StartedAtdatetime?Processing start time
CompletedAtdatetime?Processing end time
CreatedBynvarchar(100)User who created the job

VerificationResult

ColumnTypeDescription
Idlong (PK)Result identifier
JobIdint (FK)Parent verification job
Emailnvarchar(255)Email address verified
ProspectIdlong? (FK)Linked prospect
Statusint (enum)Valid=0, Invalid=1, Risky=2, Unknown=3
Reasonnvarchar(500)Why the email was given this status
IsCatchAllbitWhether the domain is catch-all
VerifiedAtdatetimeWhen verification was performed

Status Enums

public enum VerificationJobStatus
{
Pending = 0,
Processing = 1,
Complete = 2,
Failed = 3
}

public enum VerificationResultStatus
{
Valid = 0,
Invalid = 1,
Risky = 2,
Unknown = 3
}

6. API Endpoints

Data API (/api/Verifications)

MethodEndpointDescription
GET/api/Verifications/GetJobsList verification jobs with pagination
GET/api/Verifications/GetJobById/{id}Get job details with result summary
GET/api/Verifications/GetJobResults/{id}Get individual results for a job
GET/api/Verifications/PersonSearch verification history by email
POST/api/Verifications/CreateJobCreate a new verification job
POST/api/Verifications/RetryJob/{id}Retry a failed job

Frontend API Hooks

// src/api/verifications.queries.ts
useGetVerificationJobs(page, pageSize);
useGetVerificationJobById(id);
useGetVerificationResults(jobId, page, pageSize);
useGetVerificationsForPerson(email);
useCreateVerificationJob();

7. Services & Business Logic

VerificationService

Location: VerificationServices/VerificationService.cs
Interface: IVerificationService
DI: AddScoped<IVerificationService, VerificationService>() in ApiServiceExtensions.cs

MethodDescription
CreateJobAsync()Creates job + items, enqueues Hangfire job
GetJobByIdAsync()Returns job with aggregated statistics
GetJobResultsAsync()Paginated results for a job
GetVerificationsForPersonAsync()Verification history for an email

VerificationHangfireService

Location: HangfireServices/VerificationHangfireService.cs
Interface: IVerificationHangfireService
DI: AddTransient<IVerificationHangfireService, VerificationHangfireService>()

MethodDescription
RunVerificationJobAsync()Processes all emails in a job through the verification pipeline
VerifyBatchAsync()Verifies a batch of emails (format → DNS → MX → SMTP)
UpdateProgressAsync()Updates job progress counters
AggregateResultsAsync()Final statistics calculation after job completes

VerificationRepository

Location: Repository/Verification/VerificationRepository.cs
Interface: IVerificationRepository

MethodDescription
GetJobsPagedAsync()Paginated job listing
GetResultsByJobAsync()Results for a specific job
GetHistoryByEmailAsync()All verifications for an email address
InsertResultsBatchAsync()Bulk insert verification results

8. Configuration

DI Registration

DataApi: API/SoProMasterDBAPI/Extensions/ApiServiceExtensions.cs

services.AddScoped<IVerificationService, VerificationService>();
services.AddScoped<IVerificationRepository, VerificationRepository>();
services.AddTransient<IVerificationHangfireService, VerificationHangfireService>();

Hangfire Configuration

Verification jobs use Hangfire with [AutomaticRetry] for resilience:

[AutomaticRetry(Attempts = 3)]
public async Task RunVerificationJobAsync(int jobId) { ... }

Frontend Configuration

Endpoints: src/api/endpoints.ts

verifications: {
getVerificationsForPerson: "/verifications/person",
getJobs: "/verifications/jobs",
// ...
}

9. Integration Points

Upstream (data flows in)

SourceDataMechanism
Audience ManagementProspect emails to verifyJob creation via API
Email FindingNewly found emails to verifyTrigger from email finding pipeline
Data Admin UIManual job creationPOST to API endpoint

Downstream (data flows out)

TargetDataMechanism
Prospect RecordsVerification status updatedDatabase update
Audience StatisticsValid/invalid counts affect statsStatistics recalculation
Email SendingOnly verified emails are used for deliveryStatus check before send
Data Admin UIJob status, results, search resultsREST API → React Query

Cross-Feature Dependencies

FeatureRelationship
Email FindingFound emails are verified before use
Email SendingOnly verified-valid emails are delivered
Audience ManagementVerification status affects audience statistics
Campaign ManagementCampaigns may trigger bulk re-verification