VerifyAnyEmail 1.0.0

dotnet add package VerifyAnyEmail --version 1.0.0
                    
NuGet\Install-Package VerifyAnyEmail -Version 1.0.0
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="VerifyAnyEmail" Version="1.0.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="VerifyAnyEmail" Version="1.0.0" />
                    
Directory.Packages.props
<PackageReference Include="VerifyAnyEmail" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add VerifyAnyEmail --version 1.0.0
                    
#r "nuget: VerifyAnyEmail, 1.0.0"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package VerifyAnyEmail@1.0.0
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=VerifyAnyEmail&version=1.0.0
                    
Install as a Cake Addin
#tool nuget:?package=VerifyAnyEmail&version=1.0.0
                    
Install as a Cake Tool

VerifyAnyEmail .NET SDK

Official .NET client for the VerifyAnyEmail API — real-time and bulk email verification with catch-all, disposable, role, and typo detection, plus signed batch webhooks.

  • Multi-targets netstandard2.0 and net8.0 (works on .NET Framework 4.6.1+, .NET Core, .NET 5+, Xamarin, Unity, etc.).
  • Async, CancellationToken-aware, HttpClient-based.
  • No dependencies on net8.0; only System.Text.Json on netstandard2.0.

Install

dotnet add package VerifyAnyEmail

Quickstart

using VerifyAnyEmail;

using var client = new VerifyAnyEmailClient("vae_your_api_key");

var result = await client.VerifyAsync("name@example.com");

Console.WriteLine(result.Status);      // deliverable | undeliverable | risky | unknown
Console.WriteLine(result.Score);       // 0–100
Console.WriteLine(result.SafeToSend);  // bool
Console.WriteLine(result.SubStatus);   // e.g. valid_mailbox, mailbox_not_found, catch_all
Console.WriteLine(result.Checks.Disposable);
Console.WriteLine(result.Checks.RoleBased);
Console.WriteLine(result.Checks.CatchAll);   // bool? (null when unknown)
Console.WriteLine(result.Suggestion);        // "did you mean" domain correction, or null

Verify options

var result = await client.VerifyAsync("name@example.com", new VerifyOptions
{
    SmtpProbe = false,          // DNS-only, skip the live SMTP probe
    CatchAllDetection = true,
    Source = "signup-form",     // tags the request via the X-VAE-Source header
});

Test mode (0 credits)

Any address at @test.verifyany.email returns a deterministic result without charging a credit or probing a real mailbox:

await client.VerifyAsync("deliverable@test.verifyany.email");   // status = deliverable
await client.VerifyAsync("undeliverable@test.verifyany.email"); // status = undeliverable
await client.VerifyAsync("risky@test.verifyany.email");         // status = risky
await client.VerifyAsync("unknown@test.verifyany.email");       // status = unknown

Batches

var batch = await client.VerifyBatchAsync(
    new[] { "a@example.com", "b@example.com" },
    new BatchOptions
    {
        Name = "newsletter-2026-07",
        WebhookUrl = "https://yourapp.com/hooks/vae", // optional signed batch.completed callback
    });

Console.WriteLine(batch.Id);      // poll with this
Console.WriteLine(batch.Status);  // queued
Console.WriteLine(batch.Total);

// Poll until finished
Batch status;
do
{
    await Task.Delay(TimeSpan.FromSeconds(2));
    status = await client.GetBatchAsync(batch.Id);
    Console.WriteLine($"{status.Processed}/{status.Total}");
}
while (status.Status is not ("completed" or "failed"));

// Page through results
var page = await client.GetBatchResultsAsync(batch.Id, page: 1, pageSize: 100);
Console.WriteLine(page.Total);
foreach (var row in page.Results)
    Console.WriteLine($"{row.Email}: {row.Status} ({row.Score})");

Webhooks

When a batch finishes, VerifyAnyEmail POSTs a batch.completed event to your webhookUrl with an X-VAE-Signature: sha256=<HMAC-SHA256(rawBody, yourWebhookSecret)> header. Verify it against the exact raw request body (do not re-serialize the parsed JSON), using your webhook secret from dashboard Settings.

The check is a length-safe, constant-time comparison and tolerates the sha256= prefix.

ASP.NET Core (minimal API)

app.MapPost("/hooks/vae", async (HttpRequest req) =>
{
    using var reader = new StreamReader(req.Body);
    var rawBody = await reader.ReadToEndAsync();

    var signature = req.Headers["X-VAE-Signature"].ToString();
    var secret = Environment.GetEnvironmentVariable("VAE_WEBHOOK_SECRET")!;

    if (!VerifyAnyEmailClient.VerifyWebhookSignature(rawBody, signature, secret))
        return Results.Unauthorized();

    // ... handle the event, return 2xx to acknowledge ...
    return Results.Ok();
});

There is also a byte[] overload if you already have the raw bytes:

bool ok = VerifyAnyEmailClient.VerifyWebhookSignature(rawBodyBytes, signatureHeader, secret);

Configuration

var client = new VerifyAnyEmailClient("vae_your_api_key", new VerifyAnyEmailOptions
{
    BaseUrl = "https://api.verifyany.email", // default
    Timeout = TimeSpan.FromSeconds(30),      // default 60s (ignored when HttpClient is injected)
    HttpClient = myHttpClient,               // optional; if set, the SDK does NOT dispose it
});

When the client creates its own HttpClient, it owns it — call Dispose() (or use using) when done. When you inject an HttpClient (e.g. from IHttpClientFactory), the SDK never disposes it.

Errors

Any non-success HTTP status throws VerifyAnyEmailException:

try
{
    await client.VerifyAsync("name@example.com");
}
catch (VerifyAnyEmailException ex)
{
    Console.WriteLine(ex.StatusCode);   // e.g. 402
    Console.WriteLine(ex.Code);         // machine-readable "error" from the JSON body
    Console.WriteLine(ex.Message);      // human-readable "message" from the JSON body
}
Status Meaning
400 Invalid input (bad email / malformed request)
401 Missing or invalid API key
402 Insufficient credits
403 Feature not on your plan (e.g. batch)
413 Batch too large for your plan
429 Rate limited / concurrent-batch limit reached

Server-side only

Your API key is a secret. Use this SDK from server-side code only — never ship your API key in a browser, mobile app, or any client that end users control. Store it in an environment variable or secret manager.

Reference

Member Description
new VerifyAnyEmailClient(apiKey, options?) Create a client.
VerifyAsync(email, opts?, ct?)VerificationResult Verify one address.
VerifyBatchAsync(emails, opts?, ct?)Batch Submit a batch.
GetBatchAsync(id, ct?)Batch Get batch status & summary.
GetBatchResultsAsync(id, page = 1, pageSize = 100, ct?)BatchResults Paginated results.
VerifyAnyEmailClient.VerifyWebhookSignature(rawBody, signatureHeader, secret)bool Verify a webhook (static).

License

MIT © 2026 VerifyAnyEmail

Product Compatible and additional computed target framework versions.
.NET net5.0 was computed.  net5.0-windows was computed.  net6.0 was computed.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 was computed.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 was computed.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 was computed.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
.NET Core netcoreapp2.0 was computed.  netcoreapp2.1 was computed.  netcoreapp2.2 was computed.  netcoreapp3.0 was computed.  netcoreapp3.1 was computed. 
.NET Standard netstandard2.0 is compatible.  netstandard2.1 was computed. 
.NET Framework net461 was computed.  net462 was computed.  net463 was computed.  net47 was computed.  net471 was computed.  net472 was computed.  net48 was computed.  net481 was computed. 
MonoAndroid monoandroid was computed. 
MonoMac monomac was computed. 
MonoTouch monotouch was computed. 
Tizen tizen40 was computed.  tizen60 was computed. 
Xamarin.iOS xamarinios was computed. 
Xamarin.Mac xamarinmac was computed. 
Xamarin.TVOS xamarintvos was computed. 
Xamarin.WatchOS xamarinwatchos was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
1.0.0 0 7/21/2026