πŸ“„ PDF Β· Excel Β· CSV

Turn messy member lists into clean, validated email exports.

Upload a member list β€” even a borderless PDF with no column headings. Mailgot works out the structure, pulls out each person's name and email, keeps only real webmail addresses (gmail, yahoo, outlook…), drops corporate ones, checks the addresses are deliverable, and hands you a tidy Excel file.

Open the app Request access API docs
Mailgot results view showing extracted names, emails and validation status
Real output: 80 rows scanned, 12 duplicates removed, 39 free-mail addresses kept and validated.

What it does

Four jobs, in one pass.

πŸ”

Reads any layout

Excel and CSV are easy. PDFs are not β€” Mailgot rebuilds columns from word positions, so even borderless tables with no headings work.

πŸ‘€

Splits out names

Handles one β€œfull name” column or separate first/last columns, and always gives you all three fields back.

βœ‰οΈ

Keeps only webmail

Filters to gmail, yahoo, hotmail, outlook, icloud, aol, proton and friends. Corporate and unknown domains are set aside, not silently dropped.

βœ…

Validates addresses

Checks syntax and that the domain actually accepts mail (MX), then marks every row valid or invalid with a reason.

What β€œvalid” honestly means: the address is well-formed and its domain accepts mail. It does not prove that one specific inbox exists β€” for gmail/yahoo/outlook that can't be confirmed without sending a real email. Nobody can do better than this without mailing people.

How to use it

Four steps, about a minute for a few hundred rows.

  1. Sign in. Use your account at /app. No account yet? Request an invite code below.
  2. Upload your list. Drop in a .pdf, .xlsx, .xls or .csv (up to 25 MB). Your file is processed in memory and never stored.
  3. Confirm the columns. Mailgot shows what it detected β€” whether there's a heading row, and which columns hold the name and email. Correct anything that looks wrong from the dropdowns.
  4. Run it and download. Press Run extraction + validation, review the results table, then download the Excel file with first name, last name, full name, email, status.
Mailgot upload screen
Step 2 β€” upload a member list.
Mailgot showing detected document structure and column mapping
Step 3 β€” Mailgot detected the heading row and picked the name and email columns; you confirm or change them.

If a PDF's columns come out wrong

Open Adjust column boundaries under the preview. Mailgot shows the x-positions where it thinks each column starts β€” add, remove or move a value and re-parse. This is the escape hatch for unusual layouts, and it's rarely needed.

πŸ€– Built for automation

AI agent integration

Everything the web app does is available as a JSON REST API, so an agent can drive it directly. The surface is self-describing β€” point your tooling at /api/openapi.json and it can generate the tool definitions itself. Interactive docs live at /api/docs.

Endpoints

EndpointWhat it's for
GET /api/v1/healthLiveness check. No key needed.
POST /api/v1/analyzeInspect a document first β€” returns detected columns, whether a heading row exists, a suggested mapping and a preview.
POST /api/v1/processDo the work: extract, filter to webmail domains, validate. Returns JSON rows plus summary counts.
POST /api/v1/process/xlsxSame, but responds with the .xlsx file.
POST /api/v1/validate-emailsValidate a plain list of addresses β€” no file needed.

Authenticate with a key

Send your key as an X-API-Key header on every call except /health.

The recommended agent flow

Analyze first so the agent can check the column mapping, then process.

# 1 β€” look at the document before committing to anything
curl -X POST https://mailgot.squadly.tech/api/v1/analyze \
  -H "X-API-Key: $MAILGOT_API_KEY" \
  -F "file=@members.pdf"

# 2 β€” run it (accepts the auto-detected mapping)
curl -X POST https://mailgot.squadly.tech/api/v1/process \
  -H "X-API-Key: $MAILGOT_API_KEY" \
  -F "file=@members.pdf" -F "include_excluded=true"

If analyze got a column wrong, override it explicitly instead of guessing:

curl -X POST https://mailgot.squadly.tech/api/v1/process \
  -H "X-API-Key: $MAILGOT_API_KEY" \
  -F "file=@members.pdf" \
  -F "name_mode=parts" \
  -F "first_name_column=column 0" \
  -F "last_name_column=column 1" \
  -F "email_column=column 2"

What comes back

{
  "mapping_used": { "email": "Contact Email", "name_mode": "full", "full": "Contact Name" },
  "stats": { "rows_with_email": 80, "duplicates_removed": 12,
             "kept": 39, "excluded": 29, "valid": 39, "invalid": 0 },
  "results": [
    { "first name": "Peter", "last name": "Meduga", "full name": "Peter Meduga",
      "email": "pete_meduga@yahoo.com", "status": "valid", "reason": "" }
  ]
}

Python

import os, requests

BASE = "https://mailgot.squadly.tech"
H = {"X-API-Key": os.environ["MAILGOT_API_KEY"]}

with open("members.pdf", "rb") as f:
    info = requests.post(f"{BASE}/api/v1/analyze", headers=H, files={"file": f}).json()
print(info["column_names"], info["suggested_mapping"])

with open("members.pdf", "rb") as f:
    out = requests.post(f"{BASE}/api/v1/process", headers=H, files={"file": f}).json()

print(out["stats"])
for row in out["results"]:
    print(row["full name"], row["email"], row["status"])

Tool definition for function calling

{
  "name": "mailgot_process_member_list",
  "description": "Extract member names and free-webmail email addresses from a PDF/Excel/CSV member list, filter out corporate domains, and validate deliverability. Returns rows of first name, last name, full name, email, status.",
  "input_schema": {
    "type": "object",
    "properties": {
      "file_path":       { "type": "string" },
      "email_column":    { "type": "string" },
      "name_mode":       { "type": "string", "enum": ["full", "parts"] },
      "full_name_column":{ "type": "string" },
      "first_name_column":{ "type": "string" },
      "last_name_column":{ "type": "string" },
      "include_excluded":{ "type": "boolean" }
    },
    "required": ["file_path"]
  }
}

Errors an agent should handle

CodeMeaningWhat to do
400Bad column name or boundary valuesRead detail β€” it lists the valid column names β€” then retry
401Missing or wrong API keyFix the key; don't retry blindly
413File over 25 MBSplit the file
422No email or name column could be identifiedCall /analyze, then pass explicit column names

Requests are stateless β€” upload the file on each call, nothing is kept server-side. MX lookups are cached per domain, so a list full of gmail addresses resolves fast.

Get access

Accounts are invite-only, which keeps the service from being used as a free public email-checker. Tell us who you are and we'll send you an invite code β€” then you can create your account, sign in, and change your password any time from the sidebar.

Request an invite code

Mailgot sign in and create account screen
Sign in, or create an account with your invite code.
  1. Request a code using the form.
  2. Create your account at /app β†’ Create account, entering the code, your email and a password of at least 8 characters.
  3. Sign in and work. Change your password whenever you like from πŸ”‘ Change password in the sidebar.