Skip to content
Airtable Extension + Automation Scripts · v1.0.0

Verify Every Lead & Order Inside Airtable — Automatically.

Enrich Airtable tables, filtered views, and real-time form submissions with SMTP Email Verification, Mobile vs VoIP Carrier Detection, Silent WhatsApp Checks, and Caller ID (CNAM) — with built-in skip-already-verified protection so you never pay twice.

Live Airtable View Preview — Inbound Leads & COD Orders 50-Record Batch Sync · Zero OTP Sent
Lead Name Email Email Verdict Phone (E.164) Carrier & Line WhatsApp Caller ID Trust Score Status
Maya Patel maya.patel@acme.io deliverable +14155552671 Verizon · Mobile on_whatsapp MAYA PATEL (Match) 100 / 100 APPROVE
Devon Brooks devon@consulting-team.co deliverable +16505550148 Twilio · VoIP not_on_whatsapp Unlisted 43 / 100 REVIEW
Test Fake Order temp9921@mailinator.com undeliverable +10000000000 Invalid Number Skipped (0 credits) Skipped (0 credits) 0 / 100 BLOCK

Three Ways to Run ProWebLook in Airtable

Start in 30 seconds with Airtable Scripting, automate new rows on record creation, or deploy the full React Custom Extension across your workspace.

Fastest · Works on Any Plan

1. 30-Second Scripting Extension (Bulk View Verifier)

Add Airtable’s official Scripting extension, paste this script, select your Table, View, and Fields in the visual sidebar, and bulk-verify thousands of rows in 50-record batches.

// Airtable Scripting Extension -> Paste & Run (skips already-verified rows automatically)
const API_BASE = 'https://proweblook.com/api/v1/airtable';
const apiKey = (await input.secret('Enter your ProWebLook API key')).trim();
const table = await input.tableAsync('Select table to verify');
const emailField = await input.fieldAsync('Select Email field', table);
const phoneField = await input.fieldAsync('Select Phone field', table);
const verdictField = await input.fieldAsync('Select Output Status field (Text)', table);

async function callPwl(op, body) {
  const res = await remoteFetchAsync(`${API_BASE}/${op}`, {
    method: 'POST',
    headers: { Authorization: `Bearer ${apiKey}`, 'Content-Type': 'application/json' },
    body: JSON.stringify(body),
  });
  const json = await res.json();
  if (!res.ok || !json.ok) throw new Error(json?.error?.message || `HTTP ${res.status}`);
  return json.data;
}

const query = await table.selectRecordsAsync({ fields: [emailField, phoneField, verdictField] });
const updates = [];

for (const record of query.records) {
  if (record.getCellValueAsString(verdictField).trim()) continue;
  const email = record.getCellValueAsString(emailField).trim();
  const phone = record.getCellValueAsString(phoneField).trim();
  if (!email && !phone) continue;

  const emailRes = email ? await callPwl('verify_email', { email }) : null;
  const phoneRes = phone
    ? await callPwl('validate_phone', phone.startsWith('+') ? { phone_number: phone } : { phone_number: phone, country_code: 'US' })
    : null;
  const waRes = phoneRes && phoneRes.verdict !== 'invalid'
    ? await callPwl('check_whatsapp', { phone_number: phoneRes.phone_number })
    : null;

  const status = (emailRes && emailRes.verdict === 'undeliverable') || (phoneRes && phoneRes.verdict === 'invalid')
    ? 'BLOCK'
    : (waRes && waRes.verdict === 'on_whatsapp' ? 'APPROVE' : 'REVIEW');
  updates.push({ id: record.id, fields: { [verdictField.id]: status } });
}

for (let i = 0; i < updates.length; i += 50) {
  await table.updateRecordsAsync(updates.slice(i, i + 50));
}
output.markdown(`**Enrichment complete:** updated ${updates.length} records.`);
Zero-Touch · Real-Time

2. Airtable Automation ("When Record Created")

Trigger real-time Email, Phone, WhatsApp, and Caller ID verification the instant a new Airtable Form, Typeform, HubSpot lead, or Shopify COD order lands in your base.

// Airtable Automations -> Trigger: "When record created" -> Action: "Run a script"
// Left sidebar input variables: recordId, tableName, email, phone, countryCode, apiKey
const cfg = input.config();
const API_BASE = 'https://proweblook.com/api/v1/airtable';

async function callPwl(op, body) {
  const r = await fetch(`${API_BASE}/${op}`, {
    method: 'POST',
    headers: {
      Authorization: `Bearer ${String(cfg.apiKey || '').trim()}`,
      'Content-Type': 'application/json',
    },
    body: JSON.stringify(body),
  });
  const j = await r.json();
  if (!r.ok || !j.ok) throw new Error(j?.error?.message || `HTTP ${r.status}`);
  return j.data;
}

const rawPhone = String(cfg.phone || '').trim();
const cc = String(cfg.countryCode || 'US').trim().toUpperCase();
const phoneBody = rawPhone
  ? (rawPhone.startsWith('+') ? { phone_number: rawPhone } : { phone_number: rawPhone, country_code: cc })
  : null;

const emailRes = cfg.email ? await callPwl('verify_email', { email: String(cfg.email).trim() }) : null;
const phoneRes = phoneBody ? await callPwl('validate_phone', phoneBody) : null;
const waRes = phoneRes && phoneRes.verdict !== 'invalid'
  ? await callPwl('check_whatsapp', { phone_number: phoneRes.phone_number })
  : null;

const verdict = (emailRes && emailRes.verdict === 'undeliverable') || (phoneRes && phoneRes.verdict === 'invalid')
  ? 'BLOCK'
  : (waRes && waRes.verdict === 'on_whatsapp' ? 'APPROVE' : 'REVIEW');

await base.getTable(cfg.tableName).updateRecordAsync(cfg.recordId, {
  'Email Verdict': emailRes ? emailRes.verdict : '',
  'Phone Verdict': phoneRes ? phoneRes.verdict : '',
  'WhatsApp Status': waRes ? waRes.verdict : '',
  'Verification Status': verdict,
});
Full React UI · @airtable/blocks

3. Custom Extension (@airtable/blocks SDK)

Deploy the full 4-tab ProWebLook Custom Extension (Bulk Enricher, Live Cursor Record Inspector, Templates, and 4-Pool Credit Monitor) directly to your Airtable base.

git clone https://github.com/dubeychandan996/proweblook-airtable.git
cd proweblook-airtable
npm install

# Develop live inside your Airtable base:
npx @airtable/blocks-cli run

# Or release permanently to your Airtable workspace:
npx @airtable/blocks-cli release

Five Dedicated Operations on /api/v1/airtable/*

Purpose-built JSON POST endpoints with strict https://*.airtableblocks.com CORS isolation for Custom Extensions and seamless server-to-server execution for Airtable Automations.

POST https://proweblook.com/api/v1/airtable/verify_email · 1 email credit
{
  "ok": true,
  "data": {
    "email": "maya.patel@acme.io",
    "verdict": "deliverable",
    "reason": "deliverable",
    "billing_status": "charged"
  }
}

Engineered to Protect Your Credits & Base Schema

Skip Already-Verified Rows

Rows with an existing APPROVE / REVIEW / BLOCK verdict are skipped automatically on re-runs (while failed/retry rows remain eligible).

Session Deduplication & Invalid-Phone Short-Circuit

Duplicate emails or phone numbers in a view are queried once per session, and invalid phone numbers automatically skip paid WhatsApp and Caller ID calls.

50-Record Batching & Field-Type Coercion

Writes back in Airtable’s native 50-record updateRecordsAsync batches and formats Single Select, Number (0–100), Checkbox, Date, and Text columns safely.

Strict Airtable CORS & Bearer Security

Browser requests are restricted to https://*.airtableblocks.com origins with Bearer token auth, 8192-byte JSON bounds, and 60 req/min rate protection.

Frequently Asked Questions

Does ProWebLook for Airtable send any OTP or WhatsApp message to my leads?

No. Every check — Email SMTP/MX verification, Phone Carrier/VoIP validation, Silent WhatsApp registration, and Caller ID lookup — is 100% silent and sends zero messages, emails, or OTPs to your contacts.

Will re-running bulk verification charge credits again for rows already verified?

No. Both the Custom Extension and the Scripting Extension skip rows whose output Verification Status column already holds a completed verdict (APPROVE, REVIEW, or BLOCK), so only newly added or unverified records consume credits.

Which Airtable plans support ProWebLook?

The Scripting Extension and Custom Extension run inside Airtable Extensions, and the Automation script runs inside Airtable Automations ("Run a script" action on Team, Business, and Enterprise Scale plans). You can also connect Airtable via our Zapier, Make, or n8n integrations on Free Airtable plans.

How are national phone numbers without a + country prefix handled?

Supply a 2-letter ISO country code fallback (such as US, IN, GB, or AE) in the extension settings or automation input variables. ProWebLook normalizes national numbers to E.164 on the server before querying carrier, WhatsApp, and Caller ID providers.

How much does it cost to get started?

Every new ProWebLook account includes 50 one-time free credits each for Email Verification, Phone Validation, WhatsApp Verification, and Caller ID Lookup — with no credit card required and non-expiring pay-as-you-go credit packs.

Clean Your Airtable CRM & Block Fake Leads Today

Create your free ProWebLook account in 30 seconds, grab your API key with 50 free credits per product, and enrich your first Airtable view immediately.