{"formatVersion":"1","kind":"dock_integration","slug":"airtable-web-api","title":"Airtable Web API","summary":"Import a Harbor-safe Airtable starter set for table reads, single-record lookup, and approval-friendly record creation.","description":"A Dock-hosted Airtable starter integration for Harbor. Importing it creates a local http_api port shell plus a Harbor-safe Airtable action set using Harbor's Action Model for explicit base, table, and record identifiers.","version":"0.1.0","publisher":{"slug":"airtable","name":"Airtable","websiteUrl":"https://airtable.com/developers/web/api"},"category":"Data","tags":["airtable","database","records","tables","productivity"],"compatibility":{"harborNode":">=0.1.0","notes":"Requires local operator-configured auth after import. Templates use location-based inputs such as input.path, input.query, and input.body at execution time."},"requiredPlan":"community","portTemplates":[{"kind":"http_api","label":"Airtable Web API","description":"Airtable Web API connection managed locally through Harbor.","baseUrl":"https://api.airtable.com/","authMode":"header_token","authHeaderName":"Authorization","authTokenPrefix":"Bearer"}],"actionTemplates":[{"slug":"list-records","label":"List Records","description":"List records in a specific Airtable table using explicit base and table identifiers plus typed pagination inputs.","method":"GET","path":"/v0/{baseId}/{tableIdOrName}","inputs":{"parameters":[{"name":"baseId","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Airtable base ID that contains the target table."},{"name":"tableIdOrName","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Airtable table ID or table name. Table IDs are safer because names can change."},{"name":"pageSize","in":"query","schema":{"type":"integer","minimum":1,"maximum":100},"default":25,"description":"Number of records to return per page. Airtable allows up to 100."},{"name":"maxRecords","in":"query","schema":{"type":"integer","minimum":1,"maximum":1000},"description":"Maximum total number of records to return across pages."},{"name":"offset","in":"query","schema":{"type":"string"},"description":"Continuation token from a previous records list response."},{"name":"view","in":"query","schema":{"type":"string"},"description":"Optional Airtable view name or ID to scope and sort the returned records."},{"name":"returnFieldsByFieldId","in":"query","schema":{"type":"boolean"},"description":"Return field objects keyed by field ID instead of field name."}]},"approvalMode":"automatic","requestBodyMode":"none","resultMode":"json_summary"},{"slug":"get-record","label":"Get Record","description":"Fetch a single Airtable record using explicit base, table, and record identifiers.","method":"GET","path":"/v0/{baseId}/{tableIdOrName}/{recordId}","inputs":{"parameters":[{"name":"baseId","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Airtable base ID that contains the target record."},{"name":"tableIdOrName","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Airtable table ID or table name."},{"name":"recordId","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Airtable record ID to fetch."},{"name":"returnFieldsByFieldId","in":"query","schema":{"type":"boolean"},"description":"Return field objects keyed by field ID instead of field name."}]},"approvalMode":"automatic","requestBodyMode":"none","resultMode":"json_summary"},{"slug":"create-record","label":"Create Record","description":"Create one or more Airtable records in a specific table using an explicit base and table path plus a bounded JSON request body.","method":"POST","path":"/v0/{baseId}/{tableIdOrName}","inputs":{"parameters":[{"name":"baseId","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Airtable base ID that contains the target table."},{"name":"tableIdOrName","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Airtable table ID or table name that will receive the new record."}]},"approvalMode":"require_approval","requestBodyMode":"json","resultMode":"json_summary"},{"slug":"update-record","label":"Update Record","description":"Update an Airtable record using explicit base, table, and record identifiers plus a bounded JSON request body.","method":"PATCH","path":"/v0/{baseId}/{tableIdOrName}/{recordId}","inputs":{"parameters":[{"name":"baseId","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Airtable base ID that contains the target record."},{"name":"tableIdOrName","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Airtable table ID or table name."},{"name":"recordId","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Airtable record ID to update."}]},"approvalMode":"require_approval","requestBodyMode":"json","resultMode":"json_summary"},{"slug":"delete-record","label":"Delete Record","description":"Delete an Airtable record using explicit base, table, and record identifiers.","method":"DELETE","path":"/v0/{baseId}/{tableIdOrName}/{recordId}","inputs":{"parameters":[{"name":"baseId","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Airtable base ID that contains the target record."},{"name":"tableIdOrName","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Airtable table ID or table name."},{"name":"recordId","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Airtable record ID to delete."}]},"approvalMode":"require_approval","requestBodyMode":"none","resultMode":"json_summary"}],"workflowTemplates":[{"slug":"table-intake-check","title":"Table Intake Check","summary":"Future workflow template for listing a table, inspecting a single record, and drafting an operator-reviewed create flow."}],"helpText":"Import to Harbor, configure local auth, then use the starter Airtable actions with explicit base, table, and record identifiers. Keep create-record on approval unless your local policy explicitly allows operator-reviewed writes.","installNotes":"Dock shares only safe metadata. Hidden auth must be configured locally inside Harbor after import. Airtable actions use input.path for base, table, and record identifiers, input.query for pagination and output-shaping values, and input.body for the record creation payload."}