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

# Validate email addresses

> Heuristic email validation to run before sending: catches invalid syntax, dead domains (no MX/A records), disposable inboxes, role-based addresses (info@, contacto@, sales@), and addresses already on your project's suppression list. Use it to clean a list before a broadcast and keep your bounce rate low.

No mailbox-level (SMTP) probe is performed, so a `deliverable` verdict is not a delivery guarantee — it means no negative signal was found. Treat `risky` addresses with care and drop `undeliverable` ones.

Accepts a single `email` or an `emails` batch (max 100 per request).



## OpenAPI

````yaml /openapi.json post /v1/introspect/email
openapi: 3.0.3
info:
  title: Zavu Unified Messaging Layer API
  version: 0.2.0
  description: >
    Unified multi-channel messaging API for Zavu.


    Supported channels:

    - **SMS**: Simple text messages

    - **WhatsApp**: Rich messaging with media, buttons, lists, CTA URL buttons,
    and templates

    - **Telegram**: Bot messaging with text, media, and interactive elements

    - **Email**: Transactional emails via Amazon SES


    Design goals:

    - Simple `send()` entrypoint for developers

    - Project-level authentication via Bearer token

    - Support for all WhatsApp message types (text, image, video, audio,
    document, sticker, location, contact, buttons, list, cta_url, reaction,
    template)

    - If a non-text message type is sent, WhatsApp channel is used automatically

    - 24-hour WhatsApp conversation window enforcement

    - Universal `to` field accepts phone numbers (E.164), email addresses, or
    numeric chat IDs (Telegram/Instagram/Messenger)
servers:
  - url: https://api.zavu.dev
security:
  - bearerAuth: []
paths:
  /v1/introspect/email:
    post:
      summary: Validate email addresses
      description: >-
        Heuristic email validation to run before sending: catches invalid
        syntax, dead domains (no MX/A records), disposable inboxes, role-based
        addresses (info@, contacto@, sales@), and addresses already on your
        project's suppression list. Use it to clean a list before a broadcast
        and keep your bounce rate low.


        No mailbox-level (SMTP) probe is performed, so a `deliverable` verdict
        is not a delivery guarantee — it means no negative signal was found.
        Treat `risky` addresses with care and drop `undeliverable` ones.


        Accepts a single `email` or an `emails` batch (max 100 per request).
      operationId: introspectEmail
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/EmailIntrospectionRequest'
            examples:
              single:
                summary: Validate one address
                value:
                  email: maria@example.com
              batch:
                summary: Validate a list
                value:
                  emails:
                    - maria@example.com
                    - info@deaddomain.example
                    - not-an-email
      responses:
        '200':
          description: Validation results, one per submitted address.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EmailIntrospectionResponse'
              example:
                results:
                  - email: maria@example.com
                    normalized: maria@example.com
                    domain: example.com
                    verdict: deliverable
                    reasons: []
                  - email: info@deaddomain.example
                    normalized: info@deaddomain.example
                    domain: deaddomain.example
                    verdict: undeliverable
                    reasons:
                      - domain_not_found
                      - role_address
                  - email: not-an-email
                    normalized: null
                    domain: null
                    verdict: undeliverable
                    reasons:
                      - invalid_syntax
                summary:
                  total: 3
                  deliverable: 1
                  risky: 0
                  undeliverable: 2
        '400':
          description: Invalid request body (no addresses, or more than 100).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          description: Unauthorized.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      security:
        - bearerAuth: []
components:
  schemas:
    EmailIntrospectionRequest:
      type: object
      description: >-
        Validate one email (`email`) or a batch (`emails`). At most 100
        addresses per request across both fields.
      properties:
        email:
          type: string
          description: Single email address to validate.
          example: maria@example.com
        emails:
          type: array
          description: Batch of email addresses to validate (max 100).
          maxItems: 100
          items:
            type: string
          example:
            - maria@example.com
            - info@deaddomain.example
    EmailIntrospectionResponse:
      type: object
      required:
        - results
        - summary
      properties:
        results:
          type: array
          description: One result per submitted address, in the same order.
          items:
            $ref: '#/components/schemas/EmailValidationResult'
        summary:
          type: object
          required:
            - total
            - deliverable
            - risky
            - undeliverable
          properties:
            total:
              type: integer
            deliverable:
              type: integer
            risky:
              type: integer
            undeliverable:
              type: integer
    Error:
      type: object
      required:
        - code
        - message
      properties:
        code:
          type: string
          example: invalid_request
        message:
          type: string
          example: Phone number is invalid
        details:
          type: object
          additionalProperties: true
    EmailValidationResult:
      type: object
      required:
        - email
        - normalized
        - domain
        - verdict
        - reasons
      properties:
        email:
          type: string
          description: The address exactly as submitted.
        normalized:
          type: string
          nullable: true
          description: >-
            Lowercased, trimmed form of the address. Null when the syntax is
            invalid.
        domain:
          type: string
          nullable: true
          description: Domain part of the address. Null when the syntax is invalid.
        verdict:
          type: string
          description: >-
            Validation verdict.

            - `deliverable`: nothing suggests the address will bounce.

            - `risky`: sendable, but a signal predicts elevated bounce/complaint
            odds (role address, disposable domain, MX-less domain, prior soft
            bounce).

            - `undeliverable`: will bounce or is blocked (invalid syntax, dead
            domain, or the address is on your suppression list after a hard
            bounce/complaint).
          enum:
            - deliverable
            - risky
            - undeliverable
        reasons:
          type: array
          description: Signals behind the verdict. Empty for a clean `deliverable` address.
          items:
            type: string
            enum:
              - invalid_syntax
              - domain_not_found
              - domain_no_mx
              - disposable_domain
              - role_address
              - suppressed_hard_bounce
              - suppressed_soft_bounce
              - suppressed_complaint
              - suppressed_manual
              - suppressed_unsubscribe
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT

````