---
title: "Validate a Dux-Soup export"
url: "https://lookvalid.com/integrations/dux-soup.md"
canonical_url: "https://lookvalid.com/integrations/dux-soup"
last_updated: "2026-10-22"
type: "how-to"
summary: "A guide to checking the email addresses in a prospect list you have taken out of Dux-Soup as a CSV file, before you load it into the tool you email from."
related: ["https://lookvalid.com/integrations.md", "https://lookvalid.com/docs/api/email-domain-check.md", "https://lookvalid.com/docs/quickstart.md"]
---

# Validate a Dux-Soup export

A guide to checking the email addresses in a prospect list you have taken out of Dux-Soup as a CSV file, before you load it into the tool you email from.

A list exported from Dux-Soup is only as clean as the contact details collected along the way: many rows have an email that was typed by the prospect, guessed or inherited from an old profile. Loading that file as it is into an email tool makes the first send bounce on throwaway domains and shared inboxes. Checking the file you own, row by row, before it goes anywhere else fixes that without touching the tool it came from.

## What LookValid checks

- [Email Domain Check](https://lookvalid.com/products/email-domain-check.md): Checks the domain of each email in your exported file for mail servers, SPF and DMARC and returns a good, risky or undeliverable signal. It cannot confirm that a mailbox exists. Marks rows on disposable domains and role addresses such as sales@, so you can drop or separate them in the file. (1 credit per address checked)
- [Link Safety Check](https://lookvalid.com/products/link-safety.md): Checks the website domain in a row against a published list of reported malicious domains, which is not proof that an unlisted site is safe. (1 credit per URL checked (a check that cannot run is free))
- [Domain Age](https://lookvalid.com/products/domain-age.md): Returns the registration date and age in days of a company domain in a row, a quick way to spot a domain registered last week. (2 credits per registered domain (unregistered domains are free))

## Connect it in four steps

1. Make a LookValid account and add a key from the API keys area of the dashboard, then take your prospect data out of Dux-Soup as a CSV file on your computer. Its Funnel Flow view lets you pick a campaign and timeframe and copy all the data into a document you can save as a CSV file; open that CSV in Excel with the text import so the columns split correctly.
2. Put the key in the LOOKVALID_API_KEY environment variable in the terminal session that runs the script, so it is never written into the exported file or the script.
3. The script reads the exported file one row at a time and calls the email domain check endpoint with each email; a found:false row is copied out unchanged for review, and an error answer stops the run.
4. It adds email_signal, disposable_domain and role_address as new columns in a copy of the file, which you filter before loading the list anywhere else.

A Python script on your own computer that reads the exported CSV file row by row and writes a checked copy beside it. The call is `POST https://YOUR_API_HOST/v1/email-domain-check`.

```python
import json
import os
import urllib.error
import urllib.request

API_URL = "https://YOUR_API_HOST/v1/email-domain-check"


def check_dux_export_email(value):
    request = urllib.request.Request(
        API_URL,
        data=json.dumps({
            "email": value,
        }).encode(),
        headers={
            "Authorization": "Bearer " + os.environ["LOOKVALID_API_KEY"],
            "Content-Type": "application/json",
        },
        method="POST",
    )
    try:
        with urllib.request.urlopen(request, timeout=30) as response:
            result = json.load(response)
    except urllib.error.HTTPError as error:
        failure = json.load(error)["error"]
        raise RuntimeError(failure["code"] + ": " + failure["fix"])
    if not result["found"]:
        return None
    return {
        "email_signal": result.get("data", {}).get("deliverability_signal"),
        "disposable_domain": result.get("data", {}).get("disposable"),
        "role_address": result.get("data", {}).get("role_account"),
    }
```

| Response field | Goes into |
| --- | --- |
| `data.deliverability_signal` | email_signal |
| `data.disposable` | disposable_domain |
| `data.role_account` | role_address |

## Without code

If you do not want to run a script, upload the exported file to a spreadsheet or an automation platform that can loop over rows, and add a generic HTTP request step per row that posts the email to the email domain check endpoint. Write the signal and flags into new columns of the sheet. No dedicated app is needed, and nothing connects back to the tool the file came from.

## Questions

### How much does it cost to check a whole export?

Each row is one check at the credit price on the pricing page. The pricing page figure times your row count is the ceiling.

### Does LookValid connect to Dux-Soup itself?

No. This guide only works on a file you have already exported and own. Nothing in it logs into or drives the tool.

### What does the check not tell me?

Whether a given mailbox exists. It reads domain level facts only: mail servers, SPF, DMARC, disposable, free and role flags.

## Sources

- [Dux-Soup knowledge base: Profile Data and Export](https://support.dux-soup.com/category/789-profile-data-export), read 2026-10-18
- [Dux-Soup knowledge base: Download data from Funnel Flow](https://support.dux-soup.com/article/239-download-data-from-funnel-flow), read 2026-10-18
- [Dux-Soup knowledge base: Importing CSV into Excel](https://support.dux-soup.com/article/127-importing-csv-into-excel), read 2026-10-18

## Related

- [LookValid integrations](https://lookvalid.com/integrations.md)
- [Email Domain Check reference](https://lookvalid.com/docs/api/email-domain-check.md)
- [Quickstart](https://lookvalid.com/docs/quickstart.md)
