airtable
Interacts with Airtable's REST API using curl for CRUD operations, enabling efficient data management and integration.
Install this skill
Security score
The airtable skill was audited on May 17, 2026 and we found 41 security issues across 3 threat categories, including 1 high-severity. Review the findings below before installing.
Categories Tested
Security Issues
Curl to non-GitHub URL
| 46 | curl -s "https://api.airtable.com/v0/$BASE_ID/$TABLE?maxRecords=5" \ |
Curl to non-GitHub URL
| 75 | curl -s "https://api.airtable.com/v0/meta/bases" \ |
Curl to non-GitHub URL
| 81 | curl -s "https://api.airtable.com/v0/meta/bases/$BASE_ID/tables" \ |
Curl to non-GitHub URL
| 88 | curl -s "https://api.airtable.com/v0/$BASE_ID/$TABLE?maxRecords=10" \ |
Curl to non-GitHub URL
| 94 | curl -s "https://api.airtable.com/v0/$BASE_ID/$TABLE/$RECORD_ID" \ |
Curl to non-GitHub URL
| 103 | curl -s "https://api.airtable.com/v0/$BASE_ID/$TABLE?filterByFormula=$ENC&maxRecords=20" \ |
Curl to non-GitHub URL
| 117 | curl -s "https://api.airtable.com/v0/$BASE_ID/$TABLE?sort%5B0%5D%5Bfield%5D=Priority&sort%5B0%5D%5Bdirection%5D=asc&fields%5B%5D=Name&fields%5B%5D=Status" \ |
Curl to non-GitHub URL
| 124 | curl -s "https://api.airtable.com/v0/$BASE_ID/$TABLE?view=Grid%20view&maxRecords=50" \ |
Curl to non-GitHub URL
| 133 | curl -s -X POST "https://api.airtable.com/v0/$BASE_ID/$TABLE" \ |
Curl to non-GitHub URL
| 141 | curl -s -X POST "https://api.airtable.com/v0/$BASE_ID/$TABLE" \ |
Curl to non-GitHub URL
| 156 | curl -s -X PATCH "https://api.airtable.com/v0/$BASE_ID/$TABLE/$RECORD_ID" \ |
Curl to non-GitHub URL
| 164 | curl -s -X PATCH "https://api.airtable.com/v0/$BASE_ID/$TABLE" \ |
Curl to non-GitHub URL
| 178 | curl -s -X DELETE "https://api.airtable.com/v0/$BASE_ID/$TABLE/$RECORD_ID" \ |
Curl to non-GitHub URL
| 184 | curl -s -X DELETE "https://api.airtable.com/v0/$BASE_ID/$TABLE?records%5B%5D=rec1&records%5B%5D=rec2" \ |
Curl to non-GitHub URL
| 206 | 1. **Confirm auth.** `curl -s -o /dev/null -w "%{http_code}\n" https://api.airtable.com/v0/meta/bases -H "Authorization: Bearer $AIRTABLE_API_KEY"` — expect `200`. |
Access to hidden dotfiles in home directory
| 29 | 4. Store the token in `~/.hermes/.env` (or via `hermes setup`): |
Access to hidden dotfiles in home directory
| 225 | - **`AIRTABLE_API_KEY` flows from `~/.hermes/.env` into the subprocess automatically** when this skill is loaded — no need to re-export it before each `curl` call. |
Access to .env file
| 29 | 4. Store the token in `~/.hermes/.env` (or via `hermes setup`): |
Access to .env file
| 225 | - **`AIRTABLE_API_KEY` flows from `~/.hermes/.env` into the subprocess automatically** when this skill is loaded — no need to re-export it before each `curl` call. |
External URL reference
| 14 | homepage: https://airtable.com/developers/web/api/introduction |
External URL reference
| 23 | 1. Create a **Personal Access Token (PAT)** at https://airtable.com/create/tokens (tokens start with `pat...`). |
External URL reference
| 38 | - **Endpoint:** `https://api.airtable.com/v0` |
External URL reference
| 46 | curl -s "https://api.airtable.com/v0/$BASE_ID/$TABLE?maxRecords=5" \ |
External URL reference
| 64 | | URL / Email / Phone | `"Link": "https://…"` | |
External URL reference
| 65 | | Attachment | `"Files": [{"url": "https://…"}]` (Airtable fetches + rehosts) | |
External URL reference
| 75 | curl -s "https://api.airtable.com/v0/meta/bases" \ |
External URL reference
| 81 | curl -s "https://api.airtable.com/v0/meta/bases/$BASE_ID/tables" \ |
External URL reference
| 88 | curl -s "https://api.airtable.com/v0/$BASE_ID/$TABLE?maxRecords=10" \ |
External URL reference
| 94 | curl -s "https://api.airtable.com/v0/$BASE_ID/$TABLE/$RECORD_ID" \ |
External URL reference
| 103 | curl -s "https://api.airtable.com/v0/$BASE_ID/$TABLE?filterByFormula=$ENC&maxRecords=20" \ |
External URL reference
| 117 | curl -s "https://api.airtable.com/v0/$BASE_ID/$TABLE?sort%5B0%5D%5Bfield%5D=Priority&sort%5B0%5D%5Bdirection%5D=asc&fields%5B%5D=Name&fields%5B%5D=Status" \ |
External URL reference
| 124 | curl -s "https://api.airtable.com/v0/$BASE_ID/$TABLE?view=Grid%20view&maxRecords=50" \ |
External URL reference
| 133 | curl -s -X POST "https://api.airtable.com/v0/$BASE_ID/$TABLE" \ |
External URL reference
| 141 | curl -s -X POST "https://api.airtable.com/v0/$BASE_ID/$TABLE" \ |
External URL reference
| 156 | curl -s -X PATCH "https://api.airtable.com/v0/$BASE_ID/$TABLE/$RECORD_ID" \ |
External URL reference
| 164 | curl -s -X PATCH "https://api.airtable.com/v0/$BASE_ID/$TABLE" \ |
External URL reference
| 178 | curl -s -X DELETE "https://api.airtable.com/v0/$BASE_ID/$TABLE/$RECORD_ID" \ |
External URL reference
| 184 | curl -s -X DELETE "https://api.airtable.com/v0/$BASE_ID/$TABLE?records%5B%5D=rec1&records%5B%5D=rec2" \ |
External URL reference
| 195 | URL="https://api.airtable.com/v0/$BASE_ID/$TABLE?pageSize=100" |
External URL reference
| 206 | 1. **Confirm auth.** `curl -s -o /dev/null -w "%{http_code}\n" https://api.airtable.com/v0/meta/bases -H "Authorization: Bearer $AIRTABLE_API_KEY"` — expect `200`. |
External URL reference
| 219 | - **Per-base token scoping.** A `403` on one base while another works means the token's Access list doesn't include that base — not a scope or auth issue. Send the user to https://airtable.com/create/ |