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

# Get Verification

> Get verification status and results

Retrieve the status and results of a batch verification. Poll this endpoint until `status` is `completed` or `failed`.

## Path Parameters

<ParamField path="id" type="string" required>
  The verification batch ID (e.g., `ver_abc123`).
</ParamField>

## Examples

<CodeGroup>
  ```typescript JavaScript theme={null}
  import { MailBreeze } from "mailbreeze";

  const mailbreeze = new MailBreeze({ apiKey: "sk_live_xxx" });

  const status = await mailbreeze.verification.get("ver_abc123");

  console.log(`Status: ${status.status}`);
  console.log(`Progress: ${status.processedEmails}/${status.totalEmails}`);

  if (status.status === "completed") {
    console.log(`Completed at: ${status.completedAt}`);

    // View analytics summary
    console.log("Analytics:", status.analytics);
    // { valid: 85, invalid: 10, risky: 3, unknown: 2 }

    // Access individual results
    for (const result of status.results) {
      console.log(`${result.email}: ${result.result} (${result.isValid ? "✓" : "✗"})`);
    }
  }
  ```

  ```python Python theme={null}
  from mailbreeze import MailBreeze

  client = MailBreeze(api_key="sk_live_xxx")

  status = await client.verification.get("ver_abc123")

  print(f"Status: {status.status}")
  print(f"Progress: {status.processed_emails}/{status.total_emails}")

  if status.status == "completed":
      print(f"Completed at: {status.completed_at}")

      # View analytics summary
      print("Analytics:", status.analytics)
      # {"valid": 85, "invalid": 10, "risky": 3, "unknown": 2}

      # Access individual results
      for result in status.results:
          mark = "✓" if result.is_valid else "✗"
          print(f"{result.email}: {result.result} ({mark})")
  ```

  ```go Go theme={null}
  client := mailbreeze.NewClient("sk_live_xxx")

  status, err := client.Verification.Get(ctx, "ver_abc123")
  if err != nil {
      log.Fatal(err)
  }

  fmt.Printf("Status: %s\n", status.Status)
  fmt.Printf("Progress: %d/%d\n", status.ProcessedEmails, status.TotalEmails)

  if status.Status == "completed" {
      fmt.Printf("Completed at: %s\n", status.CompletedAt)

      // View analytics summary
      fmt.Printf("Analytics: %+v\n", status.Analytics)

      // Access individual results
      for _, result := range status.Results {
          mark := "✗"
          if result.IsValid {
              mark = "✓"
          }
          fmt.Printf("%s: %s (%s)\n", result.Email, result.Result, mark)
      }
  }
  ```

  ```php PHP theme={null}
  $mailbreeze = new MailBreeze('sk_live_xxx');

  $response = $mailbreeze->verification->get('694fc0cb9e63563857ae8d03');
  $status = $response['data'];

  echo "Status: " . $status['status'] . "\n";
  echo "Type: " . $status['type'] . "\n";
  echo "Total Emails: " . $status['totalEmails'] . "\n";

  if ($status['status'] === 'completed') {
      echo "Completed at: " . $status['completedAt'] . "\n";

      // View analytics summary
      $analytics = $status['analytics'];
      echo "Clean: " . $analytics['cleanCount'] . "\n";
      echo "Dirty: " . $analytics['dirtyCount'] . "\n";
      echo "Unknown: " . $analytics['unknownCount'] . "\n";
  }
  ```

  ```rust Rust theme={null}
  let client = Client::new("sk_live_xxx");

  let status = client.verification().get("ver_abc123").await?;

  println!("Status: {}", status.status);
  println!("Progress: {}/{}", status.processed_emails, status.total_emails);

  if status.status == "completed" {
      if let Some(completed_at) = status.completed_at {
          println!("Completed at: {}", completed_at);
      }

      // View analytics summary
      if let Some(analytics) = status.analytics {
          println!("Analytics: {:?}", analytics);
      }

      // Access individual results
      if let Some(results) = status.results {
          for result in results {
              let mark = if result.is_valid { "✓" } else { "✗" };
              println!("{}: {} ({})", result.email, result.result, mark);
          }
      }
  }
  ```

  ```bash cURL theme={null}
  curl "https://api.mailbreeze.com/api/v1/email-verification/694fc0cb9e63563857ae8d03" \
    -H "Authorization: Bearer sk_live_xxx"
  ```
</CodeGroup>

## Response

<ResponseField name="id" type="string">
  Verification batch ID.
</ResponseField>

<ResponseField name="status" type="string">
  Current status:

  * `pending` - Not yet started
  * `processing` - In progress
  * `completed` - Finished successfully
  * `failed` - Verification failed
</ResponseField>

<ResponseField name="totalEmails" type="integer">
  Total emails in the batch.
</ResponseField>

<ResponseField name="processedEmails" type="integer">
  Number of emails processed so far.
</ResponseField>

<ResponseField name="creditsDeducted" type="integer">
  Credits used for this batch.
</ResponseField>

<ResponseField name="createdAt" type="string">
  ISO 8601 timestamp when batch was created.
</ResponseField>

<ResponseField name="completedAt" type="string">
  ISO 8601 timestamp when batch completed (if finished).
</ResponseField>

<ResponseField name="results" type="array">
  Array of verification results (only when completed).
</ResponseField>

<ResponseField name="analytics" type="object">
  Summary analytics (only when completed).

  <Expandable title="Analytics object">
    <ResponseField name="valid" type="integer">
      Count of valid emails.
    </ResponseField>

    <ResponseField name="invalid" type="integer">
      Count of invalid emails.
    </ResponseField>

    <ResponseField name="risky" type="integer">
      Count of risky emails.
    </ResponseField>

    <ResponseField name="unknown" type="integer">
      Count of unknown emails.
    </ResponseField>
  </Expandable>
</ResponseField>

```json Example Response theme={null}
{
  "success": true,
  "data": {
    "id": "694fc0cb9e63563857ae8d03",
    "type": "single",
    "status": "completed",
    "totalEmails": 1,
    "analytics": {
      "cleanCount": 0,
      "dirtyCount": 1,
      "unknownCount": 0,
      "cleanPercentage": 0
    },
    "creditsDeducted": 2,
    "startedAt": "2025-12-27T11:19:39.878Z",
    "completedAt": "2025-12-27T11:19:39.878Z",
    "createdAt": "2025-12-27T11:19:39.881Z"
  },
  "meta": {
    "timestamp": "2025-12-27T13:39:37.291Z",
    "requestId": "c6929eab-e9a5-4970-8cc6-089636f541ff",
    "path": "/api/v1/email-verification/694fc0cb9e63563857ae8d03"
  }
}
```

## Polling Strategy

For optimal performance, use exponential backoff:

```typescript theme={null}
async function waitForCompletion(verificationId: string) {
  let delay = 1000; // Start with 1 second
  const maxDelay = 10000; // Max 10 seconds

  while (true) {
    const status = await mailbreeze.verification.get(verificationId);

    if (status.status === "completed" || status.status === "failed") {
      return status;
    }

    await new Promise(r => setTimeout(r, delay));
    delay = Math.min(delay * 1.5, maxDelay);
  }
}
```

## Errors

| Code        | HTTP Status | Description                      |
| ----------- | ----------- | -------------------------------- |
| `NOT_FOUND` | 404         | Verification batch doesn't exist |
