Airtable user scraping
Skill mickzijdel/airtable-utils/skills/airtable-user-scraping
Scrape user/collaborator access data from Airtable bases using the airtable-scrape-users utility. Use when the user wants to audit who has access to which Airtable bases and at what permission level.From its SKILL.md
npx -y skills add mickzijdel/airtable-utils --skill airtable-user-scrapingAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 0 stars0 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
4.5 KB, ~1.1k tokens by cl100k_base, as published. Nobody here has run it
Airtable User Scraper Skill
Purpose
This skill covers running airtable-scrape-users to extract user/collaborator data from Airtable bases grouped by workspace. Airtable's API does not expose collaborator data on the Team plan; this tool scrapes it from the web UI instead.
⚠️ Important: Acceptable Use Policy
This tool violates Airtable's Acceptable Use Policy. Always warn the user and obtain explicit acknowledgment before proceeding.
Prerequisites
Install Playwright's browser (first time only):
playwright install chromium
# Dependencies are handled automatically by uv on first run
Workflow
Step 1: Login (once per ~30 days)
Opens a browser for manual authentication. Auth cookies are saved to output/airtable_auth_state.json.
airtable-scrape-users --login
Re-run --login if scraping starts failing (cookies expire after ~30 days).
Step 2: Discover bases and save workspace config (once, or when bases change)
Fetches all accessible bases from the Airtable API and saves workspace groupings to output/airtable_scraper_config.json.
export AIRTABLE_API_KEY=patXXXXXXXXXX
airtable-scrape-users --from-api --save-config
Tip: Place a .env file in the directory you run the command from. It is loaded automatically.
# .env
AIRTABLE_API_KEY=patXXXXXXXXXX
If the project manages secrets with fnox (a fnox.toml in scope), wrap the command instead — required in non-interactive (agent) shells, where the fnox activate cd-hook doesn't fire:
fnox exec -- airtable-scrape-users --from-api --save-config
Agents: never read
.env(nocat,head,grep, or the Read tool) — it contains secret values and access is typically deny-listed. Don't pre-check that credentials exist. Just run the command: it loads.envautomatically and errors clearly ifAIRTABLE_API_KEYis missing. React to that error — the message suggestsfnox execonly when fnox is installed; retry with that if afnox.tomlis in scope, otherwise relay the error to the user.
Step 3: Scrape user data
Uses the saved config. Shows changes compared to the previous run.
airtable-scrape-users
Common Options
# Filter to specific workspace(s) by name or ID
airtable-scrape-users --workspace "Operations"
airtable-scrape-users --workspace "Operations" "Research"
# Scrape specific base IDs only
airtable-scrape-users --bases appXXXXXXXXXX appYYYYYYYYYY
# Export CSVs from the latest JSON without re-scraping
airtable-scrape-users --export-csv-from-json
# Export CSVs from a specific JSON file
airtable-scrape-users --export-csv-from-json output/airtable_users_export.20260123_114935.json
# Skip change comparison
airtable-scrape-users --no-compare
# Slow down requests (default: 1.0 second between bases)
airtable-scrape-users --delay 2
# Debug: show browser and save diagnostic HTML
airtable-scrape-users --no-headless --debug
Output Files
All output is written to output/ in the current working directory:
| File | Contents |
|---|---|
airtable_auth_state.json | Browser cookies — gitignored |
airtable_scraper_config.json | Workspace/base mapping |
airtable_users_export.json | Latest results |
airtable_users_export.YYYYMMDD_HHMMSS.json | Backup of previous run |
{Workspace}_users.csv | One row per user, columns = bases, values = permission level |
{Workspace}_bases.csv | One row per base, columns = users, values = permission level |
Permission Levels
owner— Full admincreate— Create/edit recordsedit— Edit records onlycomment— Comment onlyread— Read-only
Service accounts (AI, Automations, Table Sync) are automatically excluded.
Console Output
Each run prints:
- Per-base progress and user counts
- Change detection: users added/removed, permission changes since last run
- Workspace summary with unique user counts
JSON Structure
{
"scrape_time": "2026-01-23T...",
"total_bases": 17,
"workspace_summary": {
"wspXXXXXXXXXXX": {
"workspace_name": "Operations",
"base_count": 12,
"unique_user_count": 9,
"users": [...]
}
},
"bases": [...]
}
What ships with it
Read from the repository
Just SKILL.md. No reference files, no scripts.
Gives 0 of the 12 instructions most scraping extraction skills give in ~1.1k tokens
Counted across 109 of the 148 authors here whose files we hold, read 2026-09-06
- Add delays between requestsin 7 of 109, across 6 files
- Close the browser when finishedin 6 of 109, across 4 files
- Authenticate every request with the x-api-key headerin 5 of 109, across 2 files
- Default to Scraper APIs when one existsin 5 of 109, across 2 files
- Map site structure before a full crawlin 5 of 109, across 3 files
- Use the Web Scraping API for arbitrary URLsin 4 of 109, across 1 file
- Treat data as valid only if requestMetadata.status is okin 4 of 109, across 1 file
- Set client timeout to at least 300 secondsin 4 of 109, across 1 file
- Retry only 429 and 5xx with exponential backoffin 4 of 109, across 1 file
- Cap concurrency at your plan limitin 4 of 109, across 1 file
- Persist the async job id immediatelyin 4 of 109, across 1 file
- Poll job status every 10 to 30 secondsin 4 of 109, across 1 file
Said here and by no other author read
- warn the user and obtain explicit acknowledgment before scraping
- authenticate once with --login
- re-run --login when scraping starts failing
- save workspace config with --from-api --save-config
- run the command without pre-checking credentials
- wrap the command with fnox exec when fnox is installed
Grouped from the skills themselves: near-identical wordings counted once, and counted by distinct author, so one author publishing three of these counts once. Length counted with cl100k_base; the agent that loads this file may tokenize it differently.