<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Yasir</title>
    <description>The latest articles on DEV Community by Yasir (@its_me_yasir).</description>
    <link>https://dev.to/its_me_yasir</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4200151%2F5772ccc2-904e-4023-8831-e79ca932ecd6.png</url>
      <title>DEV Community: Yasir</title>
      <link>https://dev.to/its_me_yasir</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/its_me_yasir"/>
    <language>en</language>
    <item>
      <title>Email Verification API on Apify: A Practical Guide</title>
      <dc:creator>Yasir</dc:creator>
      <pubDate>Thu, 22 Oct 2026 09:44:27 +0000</pubDate>
      <link>https://dev.to/its_me_yasir/email-verification-api-on-apify-a-practical-guide-493</link>
      <guid>https://dev.to/its_me_yasir/email-verification-api-on-apify-a-practical-guide-493</guid>
      <description>&lt;h1&gt;
  
  
  Email Verification API on Apify: A Practical Guide
&lt;/h1&gt;

&lt;p&gt;An email verification API lets your application submit addresses and receive structured verification results. With the &lt;a href="https://apify.com/yasir-on-apify/email-verifier-deliverability-checker" rel="noopener noreferrer"&gt;Email Verifier &amp;amp; Deliverability Checker&lt;/a&gt;, you can build that step around an Apify Actor run.&lt;/p&gt;

&lt;p&gt;The Actor accepts a single input field, &lt;code&gt;emails&lt;/code&gt;, and saves its available results to a dataset. This makes it suitable for background contact checks, batch processing, and workflows that review a list before another system uses it.&lt;/p&gt;

&lt;p&gt;The examples below illustrate the documented API sequence. They have not been executed against a paid live run as part of this article.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prepare the email-list input
&lt;/h2&gt;

&lt;p&gt;Send an array of between 1 and 1,000 strings:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"emails"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"person@example.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"team@example.org"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The addresses above demonstrate the payload format. Replace them with the addresses you intend to verify.&lt;/p&gt;

&lt;p&gt;The Actor accepts neither a CSV file URL nor complete CRM contact objects. Extract the email values first and retain any contact identifiers in your own system.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start one Actor run
&lt;/h2&gt;

&lt;p&gt;Store your Apify API token securely in the environment as &lt;code&gt;APIFY_TOKEN&lt;/code&gt;. The following request starts a run and returns its run object. Running it incurs the Actor's applicable charges.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;--fail-with-body&lt;/span&gt; &lt;span class="nt"&gt;--silent&lt;/span&gt; &lt;span class="nt"&gt;--show-error&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--request&lt;/span&gt; POST &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s1"&gt;'https://api.apify.com/v2/actors/yasir-on-apify~email-verifier-deliverability-checker/runs'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$APIFY_TOKEN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s1"&gt;'Content-Type: application/json'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--data&lt;/span&gt; &lt;span class="s1"&gt;'{"emails":["person@example.com","team@example.org"]}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Save &lt;code&gt;data.id&lt;/code&gt; from the response. The response also includes storage identifiers such as &lt;code&gt;data.defaultDatasetId&lt;/code&gt;. The &lt;a href="https://docs.apify.com/api/v2/actors-runs-post" rel="noopener noreferrer"&gt;asynchronous start endpoint&lt;/a&gt; returns before the verification work finishes.&lt;/p&gt;

&lt;p&gt;Use the configured Actor run options and an appropriate spending limit for your job. Keep the token in server-side code or your automation platform's credential store.&lt;/p&gt;

&lt;h2&gt;
  
  
  Check the same run
&lt;/h2&gt;

&lt;p&gt;Put the saved run ID in &lt;code&gt;APIFY_RUN_ID&lt;/code&gt;, then request that run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;--fail-with-body&lt;/span&gt; &lt;span class="nt"&gt;--silent&lt;/span&gt; &lt;span class="nt"&gt;--show-error&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"https://api.apify.com/v2/actor-runs/&lt;/span&gt;&lt;span class="nv"&gt;$APIFY_RUN_ID&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$APIFY_TOKEN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Inspect &lt;code&gt;data.status&lt;/code&gt;. Continue checking that run at a reasonable interval while it is active. Once it reaches a terminal state, handle the outcome: &lt;code&gt;SUCCEEDED&lt;/code&gt;, &lt;code&gt;FAILED&lt;/code&gt;, &lt;code&gt;TIMED-OUT&lt;/code&gt;, or &lt;code&gt;ABORTED&lt;/code&gt;. Use the returned &lt;a href="https://docs.apify.com/api/v2/actor-run-get" rel="noopener noreferrer"&gt;run information&lt;/a&gt; when reporting errors.&lt;/p&gt;

&lt;p&gt;Do not create another run just to check whether the first one has finished. Keep the run ID in your job record so a lost connection does not cause unnecessary resubmission.&lt;/p&gt;

&lt;p&gt;For this Actor, a successful platform run can still have a partial application summary because a spending or access limit was reached. Review the &lt;code&gt;SUMMARY&lt;/code&gt; record in the default key-value store and the saved results before marking the entire input batch complete.&lt;/p&gt;

&lt;h2&gt;
  
  
  Retrieve the verification dataset
&lt;/h2&gt;

&lt;p&gt;After the run finishes, put the returned default dataset ID in &lt;code&gt;APIFY_DATASET_ID&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;--fail-with-body&lt;/span&gt; &lt;span class="nt"&gt;--silent&lt;/span&gt; &lt;span class="nt"&gt;--show-error&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"https://api.apify.com/v2/datasets/&lt;/span&gt;&lt;span class="nv"&gt;$APIFY_DATASET_ID&lt;/span&gt;&lt;span class="s2"&gt;/items?format=json&amp;amp;offset=0&amp;amp;limit=1000"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$APIFY_TOKEN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The dataset response is an array of result objects. Each result uses the existing 17-field structure, including &lt;code&gt;email&lt;/code&gt;, &lt;code&gt;status&lt;/code&gt;, &lt;code&gt;overall_score&lt;/code&gt;, and the verification flags.&lt;/p&gt;

&lt;p&gt;Apify supports JSON, CSV, and Excel dataset exports, among other formats. The API &lt;a href="https://docs.apify.com/api/v2/dataset-items-get" rel="noopener noreferrer"&gt;supports pagination&lt;/a&gt; when you need to retrieve more data. For this Actor's current per-run input limit, the request above asks for up to 1,000 items.&lt;/p&gt;

&lt;h2&gt;
  
  
  Interpret fields before automating decisions
&lt;/h2&gt;

&lt;p&gt;A &lt;code&gt;safe&lt;/code&gt; status, a &lt;code&gt;role_account&lt;/code&gt; status, and an &lt;code&gt;unknown&lt;/code&gt; status should not be treated as interchangeable. Preserve the original category and apply the contact rules for your workflow.&lt;/p&gt;

&lt;p&gt;The output retains compatibility values. A check can be a boolean, a number, or a string such as &lt;code&gt;"None"&lt;/code&gt;. Avoid programming shortcuts that treat every nonempty value as a positive result.&lt;/p&gt;

&lt;p&gt;Likewise, an integer score is not a calibrated delivery probability. Use the score with the status and available checks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Join results back to your source records
&lt;/h2&gt;

&lt;p&gt;Keep the input batch and the original contact identifiers in your application. Match using an appropriate email comparison rule and preserve any one-to-many relationship when several records share an address.&lt;/p&gt;

&lt;p&gt;Do not attach results to CRM contacts by array position alone. The result count may be smaller than the input count, and the returned order should not be assumed to preserve your original contact-table ordering.&lt;/p&gt;

&lt;p&gt;The Actor does not perform a separate input deduplication or canonicalization step. Any cleanup or contact merging in your application is a separate workflow decision.&lt;/p&gt;

&lt;h2&gt;
  
  
  Choose an appropriate execution pattern
&lt;/h2&gt;

&lt;p&gt;A background run is a practical default for bulk verification. It allows your application to track progress without keeping one request open for the entire job.&lt;/p&gt;

&lt;p&gt;Apify also provides a &lt;a href="https://docs.apify.com/api/v2/actor-run-sync-get-dataset-items-post" rel="noopener noreferrer"&gt;synchronous run-and-dataset endpoint&lt;/a&gt;, but its documented HTTP wait limit is 300 seconds. Longer runs can exceed that limit. Do not assume that an HTTP timeout means the underlying work never started.&lt;/p&gt;

&lt;p&gt;For an interactive signup form, measure latency and design fallback behavior before relying on a complete Actor run in the user's request path.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use the same contract with connected agents
&lt;/h2&gt;

&lt;p&gt;Connected agents can call eligible Actors through &lt;a href="https://docs.apify.com/mcp" rel="noopener noreferrer"&gt;Apify's MCP server&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Provide the exact Actor identifier, the email list, the input limit, and the meaning of uncertain results. Ask the agent to retrieve the actual dataset before summarizing outcomes.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Use the Apify Actor yasir-on-apify/email-verifier-deliverability-checker to verify the email list I provide. Show the applicable cost and input before starting the run. After it completes, summarize the returned statuses and provide the dataset link. Keep catch-all and unknown results separate from safe results.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This prompt works only in an environment with an appropriate Apify connection and authorization. It does not install a connector or make the tool available in every AI application.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apify.com/yasir-on-apify/email-verifier-deliverability-checker/api" rel="noopener noreferrer"&gt;Open the Actor's API examples&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>api</category>
      <category>email</category>
      <category>tutorial</category>
      <category>webdev</category>
    </item>
    <item>
      <title>How to Verify an Email List Before Cold Outreach</title>
      <dc:creator>Yasir</dc:creator>
      <pubDate>Thu, 22 Oct 2026 09:44:03 +0000</pubDate>
      <link>https://dev.to/its_me_yasir/how-to-verify-an-email-list-before-cold-outreach-4mip</link>
      <guid>https://dev.to/its_me_yasir/how-to-verify-an-email-list-before-cold-outreach-4mip</guid>
      <description>&lt;h1&gt;
  
  
  How to Verify an Email List Before Cold Outreach
&lt;/h1&gt;

&lt;p&gt;Before you start an outreach campaign, check the email addresses you plan to use. An email verification tool can identify invalid addresses and flag other categories that need review, including disposable emails, shared inboxes, catch-all domains, and inconclusive results.&lt;/p&gt;

&lt;p&gt;A useful verification workflow goes beyond running a check. You also need to interpret the results, connect them to the right contact records, and keep your campaign rules intact.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://apify.com/yasir-on-apify/email-verifier-deliverability-checker" rel="noopener noreferrer"&gt;Email Verifier &amp;amp; Deliverability Checker on Apify&lt;/a&gt; provides a Console interface and an API for this process. You submit addresses and receive verification statuses, scores, and individual flags.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start with the list you actually intend to contact
&lt;/h2&gt;

&lt;p&gt;Prepare the email addresses for the specific campaign. Keep a copy of the original contact records, including the identifiers you will need when updating a spreadsheet or CRM.&lt;/p&gt;

&lt;p&gt;The Actor accepts an email list, rather than a whole contact database. If your source is a spreadsheet, extract the email column first. If another tool collected the contacts, pass the resulting addresses into the verifier.&lt;/p&gt;

&lt;p&gt;Prepare spelling and formatting before submission. The Actor forwards the supplied strings without a separate trimming, deduplication, or typo-correction step.&lt;/p&gt;

&lt;h2&gt;
  
  
  Submit a small batch first
&lt;/h2&gt;

&lt;p&gt;Open the Actor, paste a small selection of addresses, review the applicable pricing, and start the run. This gives you an opportunity to understand the output before processing the rest of the list.&lt;/p&gt;

&lt;p&gt;The input accepts up to 1,000 entries per run. Larger lists should be split into separate runs. Account rules and spending limits can affect how much of a batch is processed, so keep a record of each run and the addresses submitted.&lt;/p&gt;

&lt;p&gt;If you already use Apify, the &lt;a href="https://apify.com/yasir-on-apify/email-verifier-deliverability-checker/examples/bulk-email-verifier-for-cold-email-outreach" rel="noopener noreferrer"&gt;cold outreach example task&lt;/a&gt; is a convenient starting point. Replace the demonstration addresses with your campaign list.&lt;/p&gt;

&lt;h2&gt;
  
  
  Read the verification status before choosing contacts
&lt;/h2&gt;

&lt;p&gt;The main result category is in the &lt;code&gt;status&lt;/code&gt; field. Other fields provide context, including the overall score, syntax result, disposable flag, role-account flag, and deliverability signals.&lt;/p&gt;

&lt;p&gt;A practical review separates the results into three working groups:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Working group&lt;/th&gt;
&lt;th&gt;Examples&lt;/th&gt;
&lt;th&gt;What to do next&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Candidates for your normal selection rules&lt;/td&gt;
&lt;td&gt;&lt;code&gt;safe&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Apply your existing campaign and contact requirements&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Results needing separate review&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;catch_all&lt;/code&gt;, &lt;code&gt;unknown&lt;/code&gt;, &lt;code&gt;role_account&lt;/code&gt;, &lt;code&gt;inbox_full&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Decide whether to hold, recheck, or handle them separately&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Results generally unsuitable for the active outreach list&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;invalid&lt;/code&gt;, &lt;code&gt;disabled&lt;/code&gt;, &lt;code&gt;spamtrap&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Exclude them until there is a justified correction or reassessment&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Disposable addresses should be handled according to the purpose of your list. Their temporary nature may make them unsuitable for a lasting business relationship, even if they can receive a message at the time of checking.&lt;/p&gt;

&lt;p&gt;A role account may belong to a legitimate shared inbox. A catch-all result describes domain behavior and does not confirm a particular person's mailbox. Avoid turning these distinct results into a single "valid" category.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use the score as supporting information
&lt;/h2&gt;

&lt;p&gt;The Actor returns &lt;code&gt;overall_score&lt;/code&gt; on a scale from 0 to 100. Use it alongside the status and flags.&lt;/p&gt;

&lt;p&gt;Do not interpret a score of 90 as a 90% probability of inbox placement. A missing score can also fall back to zero. Your selection rule needs to consider the available evidence rather than a score alone.&lt;/p&gt;

&lt;p&gt;Some flags can contain an inconclusive value such as &lt;code&gt;"None"&lt;/code&gt;. If you use an automated filter, make sure that it understands those values instead of treating every nonempty string as true.&lt;/p&gt;

&lt;h2&gt;
  
  
  Export and join the results carefully
&lt;/h2&gt;

&lt;p&gt;Export CSV or Excel for manual review, or retrieve JSON through the API. Apify datasets support &lt;a href="https://docs.apify.com/api/v2/dataset-items-get" rel="noopener noreferrer"&gt;these export formats&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Keep the verification fields alongside the correct contact record when updating your source system. Do not join rows only by their position: the response may contain fewer rows than the submitted list, and its ordering should not be assumed to match your original contact table.&lt;/p&gt;

&lt;p&gt;Preserve unsubscribes and existing suppression rules when preparing the final campaign audience. A technical verification result does not tell you whether someone has asked to stop receiving messages.&lt;/p&gt;

&lt;h2&gt;
  
  
  Check whether the batch completed
&lt;/h2&gt;

&lt;p&gt;Before calling a list "verified," review the run's status, saved results, and summary. A spending limit or interruption can leave a partial result set.&lt;/p&gt;

&lt;p&gt;Avoid immediately submitting the full list again when you see fewer results. First determine what was saved and which contacts still need attention. A new run can create new charges.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep verification close to the decision
&lt;/h2&gt;

&lt;p&gt;An email assessment reflects the time it was performed. Addresses and mailbox conditions can change, particularly when you are working with an older contact list.&lt;/p&gt;

&lt;p&gt;When the list has been sitting for a while, reassess the contacts you actually plan to use. Choose the timing based on how quickly your data changes and how soon the campaign will run.&lt;/p&gt;

&lt;p&gt;Address verification can help you identify avoidable address problems. Sending quality still depends on the wider campaign, including your relationship with recipients and how the sending system is operated.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apify.com/yasir-on-apify/email-verifier-deliverability-checker" rel="noopener noreferrer"&gt;Verify your next email list on Apify&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>email</category>
      <category>marketing</category>
      <category>deliverability</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
