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.`);