{
  "openapi": "3.0.1",
  "info": {
    "title": "Email Validation API - Verify and Append Names",
    "description": "Validate email addresses in bulk with syntax, MX and SMTP checks, get the verdict plus the reason code and a 0-100 score, and append the first name, last name, gender and birth year sitting on each address. Flags catch-all, disposable, free, role and no-reply. Pay per result.",
    "version": "0.1",
    "x-build-id": "pvnknhbo1SiUd38cl"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/nabeelbaghoor~email-validation-api/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-nabeelbaghoor-email-validation-api",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/nabeelbaghoor~email-validation-api/runs": {
      "post": {
        "operationId": "runs-sync-nabeelbaghoor-email-validation-api",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/nabeelbaghoor~email-validation-api/run-sync": {
      "post": {
        "operationId": "run-sync-nabeelbaghoor-email-validation-api",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "properties": {
          "emails": {
            "title": "Email addresses",
            "type": "array",
            "description": "Email addresses to validate, one per line. An address pasted inside a longer string, such as a mail header or a name and address pair, is extracted before the request, and duplicates are removed so you are never charged twice for the same address.",
            "items": {
              "type": "string"
            }
          },
          "states": {
            "title": "Keep only these verdicts",
            "type": "array",
            "description": "Only keep addresses with these verdicts. Restricting to deliverable is how you turn a raw list into one that is safe to send to. Leave empty to keep every verdict. Applied after the provider answers, so it reduces dataset noise and Apify spend rather than provider credits.",
            "items": {
              "type": "string",
              "enum": [
                "deliverable",
                "undeliverable",
                "risky",
                "unknown",
                "duplicate"
              ],
              "enumTitles": [
                "Deliverable: the mailbox accepts mail",
                "Undeliverable: will bounce",
                "Risky: may accept, but likely to underperform",
                "Unknown: no verdict could be reached",
                "Duplicate: the same address appeared twice"
              ]
            },
            "default": []
          },
          "reasons": {
            "title": "Keep only these reason codes",
            "type": "array",
            "description": "Only keep addresses whose reason code is one of these. The reason code is the detail under the verdict, and it is what separates a receiving server that timed out and will verify on a retry from a mailbox that genuinely does not exist. Leave empty to keep every reason.",
            "items": {
              "type": "string",
              "enum": [
                "accepted_email",
                "invalid_domain",
                "invalid_email",
                "invalid_smtp",
                "low_deliverability",
                "low_quality",
                "no_connect",
                "rejected_email",
                "timeout",
                "unavailable_smtp",
                "unexpected_error"
              ],
              "enumTitles": [
                "Accepted by the receiving server",
                "Invalid domain",
                "Invalid address format",
                "Invalid SMTP response",
                "Low deliverability",
                "Low quality address",
                "Could not connect to the mail server",
                "Rejected by the receiving server",
                "Timed out",
                "Mail server unavailable",
                "Unexpected error"
              ]
            },
            "default": []
          },
          "excludeFreeEmail": {
            "title": "Drop free consumer mailboxes",
            "type": "boolean",
            "description": "Leave out addresses on free consumer providers such as the large webmail services, keeping only company addresses. Useful when the list is meant for B2B outreach.",
            "default": false
          },
          "excludeRoleAccounts": {
            "title": "Drop role accounts",
            "type": "boolean",
            "description": "Leave out shared inboxes such as info, sales and support, keeping only addresses that belong to an individual.",
            "default": false
          },
          "excludeDisposable": {
            "title": "Drop disposable addresses",
            "type": "boolean",
            "description": "Leave out addresses on throwaway providers, which are created to expire and are worth nothing in a list.",
            "default": false
          },
          "excludeAcceptAll": {
            "title": "Drop catch-all domains",
            "type": "boolean",
            "description": "Leave out addresses on domains that accept everything sent to them. A catch-all domain answers yes to every mailbox, so a positive result there says nothing about the individual address.",
            "default": false
          },
          "excludeNoReply": {
            "title": "Drop no-reply addresses",
            "type": "boolean",
            "description": "Leave out addresses the provider identifies as unattended senders, which are technically deliverable and never read by anyone.",
            "default": false
          },
          "requireMxRecord": {
            "title": "Require a valid MX record",
            "type": "boolean",
            "description": "Only keep addresses whose domain publishes a mail exchanger record, which means the domain can receive mail at all. A quick way to drop parked and abandoned domains.",
            "default": false
          },
          "requireName": {
            "title": "Require a name on the address",
            "type": "boolean",
            "description": "Only keep addresses the provider was able to attach a person's name to. Useful when the point of the run is enrichment rather than hygiene.",
            "default": false
          },
          "minScore": {
            "title": "Minimum quality score",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "Only keep addresses scoring at least this on the provider's zero to one hundred scale. A useful middle ground when the verdict alone is too blunt: it keeps the stronger risky addresses and drops the weak ones. Leave at zero to keep every score.",
            "default": 0
          },
          "smtpCheck": {
            "title": "Contact the mail server",
            "type": "boolean",
            "description": "Probe the receiving mail server over SMTP to confirm the mailbox itself exists. On by default, and turning it off makes a run much faster and much less conclusive, since only syntax and domain level checks then run.",
            "default": true
          },
          "acceptAllCheck": {
            "title": "Test for catch-all domains",
            "type": "boolean",
            "description": "Additionally test whether the domain accepts every address sent to it. Off by default because it costs extra time per address, and worth turning on when you need to know whether a deliverable verdict means anything.",
            "default": false
          },
          "retryUnknown": {
            "title": "Retry addresses that come back unknown",
            "type": "boolean",
            "description": "Let the provider automatically re-check addresses it could not decide on the first attempt. On by default, and worth leaving on: a greylisting receiving server very often answers on the second try.",
            "default": true
          },
          "forceSingle": {
            "title": "Always use the single address route",
            "type": "boolean",
            "description": "Send every address as its own request instead of batching. Slower and far more requests, but the results arrive as the run goes rather than after each batch finishes. The actor already uses this route automatically for very short lists and whenever a per address timeout is set.",
            "default": false
          },
          "timeout": {
            "title": "Per address timeout in seconds",
            "minimum": 2,
            "maximum": 10,
            "type": "integer",
            "description": "How long the provider may spend on one address before answering unknown, between two and ten seconds. Only the single address route honours this, so setting it turns batching off for the whole run."
          },
          "batchSize": {
            "title": "Addresses per batch",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "How many addresses to submit in one batch. The ceiling here is one thousand rather than the provider's own fifty thousand, because above one thousand it stops returning results in the response and offers a download file instead, which cannot be read without leaving the API.",
            "default": 1000
          },
          "requestsPerMinute": {
            "title": "Requests per minute",
            "minimum": 1,
            "maximum": 1200,
            "type": "integer",
            "description": "Pace the run so it stays under whatever rate your plan allows. Lower this if the provider starts returning rate limit responses; raise it to finish a long list sooner.",
            "default": 300
          },
          "skipNotFound": {
            "title": "Skip inputs with no result",
            "type": "boolean",
            "description": "Leave addresses the provider returned no verdict for out of the dataset. Note that an undeliverable address is a verdict, not a miss, so this does not drop undeliverable rows. Off by default. Misses are never charged for either way.",
            "default": false
          },
          "maxResults": {
            "title": "Maximum results",
            "minimum": 1,
            "maximum": 100000,
            "type": "integer",
            "description": "Stop after this many rows. This is the cap on both spend and run time.",
            "default": 100
          },
          "apiKey": {
            "title": "API key",
            "type": "string",
            "description": "Your own API key for the email validation API. This provider accepts the key only as a request parameter, so the actor keeps it out of every log line instead. Required for every lookup. Stored as a secret."
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}