Audit an Airtable Base for Errors and Improvements

Site airtable.comTask audit-airtable-base-for-errorsVersion v2Updated Aug 18, 2026Category data-review

Open an Airtable base view directly, handle Airtable authentication redirects, and extract the visible grid structure and contents for a comprehensive typo, consistency, and logic review. This skill was captured from a live agent session on airtable.com and publishes here verbatim, exactly as an agent receives it.

NoteSelectors and URL schemes drift as sites change. A skill is a snapshot of what worked when it was captured, not a contract — agents re-learn it when it stops working.

Purpose

Review an Airtable base or view for spelling mistakes, typos, inconsistent values, incomplete fields, suspicious formulas, and other data-quality or logical issues.

When to Use

Use when the task provides an Airtable base, table, and view URL or their opaque IDs and requests a full audit, proofreading pass, or quality review. This recipe is intended for authenticated Airtable workspaces.

Workflow

  1. Navigate directly to the target view using Airtable's ID-bearing URL scheme: https://airtable.com/{base-id}/{table-id}/{view-id}?blocks=hide
  2. If Airtable redirects to /login?continue=...&redirectSource=liveapp, complete authentication using the user's existing login flow, then navigate again to the same direct view URL. Do not infer or fabricate any base, table, or view ID.
  3. On the authenticated view, run this single-page extractor with evaluate() to capture the currently rendered grid and visible metadata:
    (() => {
      const text = el => (el?.innerText || el?.textContent || '').replace(/\s+/g, ' ').trim();
      const visible = el => {
        if (!el) return false;
        const s = getComputedStyle(el), r = el.getBoundingClientRect();
        return s.display !== 'none' && s.visibility !== 'hidden' && r.width > 0 && r.height > 0;
      };
      const unique = xs => [...new Set(xs.filter(Boolean))];
      const headers = unique([...document.querySelectorAll('[role="columnheader"], [data-testid*="column-header"], [class*="columnHeader"]')]
        .filter(visible).map(text));
      const cells = [...document.querySelectorAll('[role="gridcell"], [data-testid*="cell"], [data-rowindex][data-columnindex]')]
        .filter(visible);
      const records = new Map();
      for (const cell of cells) {
        const row = cell.getAttribute('aria-rowindex') || cell.getAttribute('data-rowindex') ||
          cell.closest('[role="row"]')?.getAttribute('aria-rowindex') ||
          cell.closest('[role="row"]')?.getAttribute('data-rowindex') || 'unknown';
        const col = cell.getAttribute('aria-colindex') || cell.getAttribute('data-columnindex') ||
          cell.getAttribute('data-field-id') || cell.getAttribute('data-column-id') ||
          cell.closest('[role="gridcell"]')?.getAttribute('aria-colindex') || 'unknown';
        const value = text(cell);
        if (!records.has(row)) records.set(row, {});
        records.get(row)[col] = value;
      }
      const gridRecords = [...records.entries()].map(([row, values]) => ({row, values}));
      const visibleText = text(document.body);
      return {
        url: location.href,
        title: text(document.querySelector('h1')) || document.title,
        headers,
        records: gridRecords,
        visibleText,
        renderedCellCount: cells.length,
        note: 'Airtable may virtualize rows; records contains the rows currently rendered in the view.'
      };
    })()
  4. Review the returned headers, records, and visible text for spelling, capitalization, duplicate or contradictory values, blanks, invalid formats, suspicious formulas or status transitions, and mismatches between related fields. Report each finding with its row/field when available and distinguish definite errors from recommendations.

Site-Specific Gotchas

  • Airtable view URLs use opaque base, table, and view IDs in the path; preserve all three rather than relying on a workspace homepage or guessed slug.
  • Unauthenticated direct navigation redirects to /login with the original view encoded in the continue query parameter. Authentication must occur before the view can be audited.
  • Airtable grids are often virtualized. The extractor reads only rows and cells currently rendered in the DOM; a genuinely full audit may require using the view's own pagination or scrolling/loading mechanism and running the extractor for each loaded segment.
  • Prefer field identifiers and row indices from the DOM over positional assumptions when reporting findings. Airtable's internal class names can change, so the role/data-attribute selectors in the extractor are the stable first choice.

Expected Output

Return a structured audit containing the Airtable view URL, detected field headers, reviewed records or rendered segments, and a prioritized list of findings. Each finding should include the row or record reference, field name when available, observed value, issue category (typo, consistency, missing data, format, logic, or improvement), recommended correction, and confidence.

Call it

GET https://production-sfo.browserless.io/skills?token=TOKEN-HERE&domain=airtable.com&task=audit-airtable-base-for-errors