<article class="sy-endpoint"><h3><code>GET /v1/connectors/airtable/records</code></h3><p>Read records from a table or a view, with the view's own filter applied.</p><div class="sy-table-wrap"><table><thead><tr><th>Param</th><th>Type</th><th>Required</th><th>Description</th></tr></thead><tbody><tr><td>connection_id</td><td>string</td><td>yes</td><td>The authorised Airtable connection to read through.</td></tr><tr><td>base_id</td><td>string</td><td>yes</td><td>The base to read from, for example appK71c2Fq9Le0Xd.</td></tr><tr><td>table</td><td>string</td><td>yes</td><td>Table name or ID.</td></tr><tr><td>view</td><td>string</td><td>no</td><td>View name. Supplying it inherits the filter your team already maintains in Airtable.</td></tr><tr><td>limit</td><td>integer</td><td>no</td><td>Results per page, 1 to 100. Defaults to 50.</td></tr></tbody></table></div><pre><code>{
"run_id": "run_09db7594",
"connector": "airtable",
"status": "ok",
"data": [
{
"record_id": "recQ4m81tVbZa0Kx",
"fields": {
"Name": "Harbour Line Coffee",
"Status": "Ready",
"Amount": 4900,
"Owner": "marcus@syncline.topclb.com"
},
"created_at": "2026-09-06T16:04:55Z"
}
],
"next_cursor": "recQ4m81tVbZa0Kx"
}</code></pre></article><article class="sy-endpoint"><h3><code>POST /v1/connectors/airtable/records</code></h3><p>Create up to ten records in one call, with per record success reported.</p><div class="sy-table-wrap"><table><thead><tr><th>Param</th><th>Type</th><th>Required</th><th>Description</th></tr></thead><tbody><tr><td>connection_id</td><td>string</td><td>yes</td><td>The authorised Airtable connection to write through.</td></tr><tr><td>base_id</td><td>string</td><td>yes</td><td>The base that holds the target table.</td></tr><tr><td>table</td><td>string</td><td>yes</td><td>Table name or ID.</td></tr><tr><td>records</td><td>array</td><td>yes</td><td>One to ten objects of field name to value. Rejected as a whole when the array is longer.</td></tr><tr><td>allow_new_options</td><td>boolean</td><td>no</td><td>Let a select field gain an option it does not have yet. Defaults to false, which fails loudly instead.</td></tr></tbody></table></div><pre><code>{
"run_id": "run_1aec86a5",
"connector": "airtable",
"status": "partial",
"data": {
"created": ["recB19zPd3Yn7Wcq"],
"failed": [
{
"index": 1,
"error": "select_option_missing",
"field": "Status",
"value": "Ready for review"
}
]
}
}</code></pre></article><article class="sy-endpoint"><h3><code>PATCH /v1/connectors/airtable/records/{record_id}</code></h3><p>Update the fields you name on one record, leaving the rest untouched.</p><div class="sy-table-wrap"><table><thead><tr><th>Param</th><th>Type</th><th>Required</th><th>Description</th></tr></thead><tbody><tr><td>connection_id</td><td>string</td><td>yes</td><td>The authorised Airtable connection to write through.</td></tr><tr><td>base_id</td><td>string</td><td>yes</td><td>The base that holds the record.</td></tr><tr><td>table</td><td>string</td><td>yes</td><td>Table name or ID.</td></tr><tr><td>fields</td><td>object</td><td>yes</td><td>Field name to value. Formula and rollup fields are read only and are refused here.</td></tr></tbody></table></div><pre><code>{
"run_id": "run_2bfd97b6",
"connector": "airtable",
"status": "ok",
"data": {
"record_id": "recQ4m81tVbZa0Kx",
"updated_fields": ["Status", "Amount"],
"updated_at": "2026-09-07T11:21:38Z"
}
}</code></pre></article><article class="sy-endpoint"><h3><code>POST /v1/connectors/airtable/attachments</code></h3><p>Attach a file to a record from a public link or an uploaded file.</p><div class="sy-table-wrap"><table><thead><tr><th>Param</th><th>Type</th><th>Required</th><th>Description</th></tr></thead><tbody><tr><td>connection_id</td><td>string</td><td>yes</td><td>The authorised Airtable connection to write through.</td></tr><tr><td>record_id</td><td>string</td><td>yes</td><td>The record that will hold the attachment.</td></tr><tr><td>field</td><td>string</td><td>yes</td><td>The attachment field name on that table.</td></tr><tr><td>url</td><td>string</td><td>yes</td><td>A publicly reachable link. Syncline streams the file rather than loading it into memory.</td></tr><tr><td>filename</td><td>string</td><td>no</td><td>Override the name shown in Airtable. Defaults to the last path segment of the URL.</td></tr></tbody></table></div><pre><code>{
"run_id": "run_3c0ea8c7",
"connector": "airtable",
"status": "ok",
"data": {
"record_id": "recQ4m81tVbZa0Kx",
"field": "Documents",
"attachment_id": "attR7v20Kc9dLm3s",
"filename": "invoice-20481.pdf",
"size_bytes": 184320
}
}</code></pre></article><article class="sy-endpoint"><h3><code>GET /v1/connectors/airtable/tables</code></h3><p>List tables, views and field types in a base, for building a mapping.</p><div class="sy-table-wrap"><table><thead><tr><th>Param</th><th>Type</th><th>Required</th><th>Description</th></tr></thead><tbody><tr><td>connection_id</td><td>string</td><td>yes</td><td>The authorised Airtable connection to inspect.</td></tr><tr><td>base_id</td><td>string</td><td>yes</td><td>The base to describe.</td></tr><tr><td>include_views</td><td>boolean</td><td>no</td><td>Include the view list on each table. Defaults to true.</td></tr></tbody></table></div><pre><code>{
"run_id": "run_4d1fb9d8",
"connector": "airtable",
"status": "ok",
"data": [
{
"table": "Orders",
"table_id": "tblM3s90PqVn1Zdc",
"primary_field": "Name",
"fields": [
{ "name": "Status", "type": "singleSelect" },
{ "name": "Amount", "type": "number" }
],
"views": ["Grid view", "Ready"]
}
]
}</code></pre></article>