Skip to main content
Version: Next

Airtable

Airtable sink connector

Description

Used to write data to Airtable.

Key Features

Sink Options

NameTypeRequiredDefault ValueDescription
tokenStringYes-Airtable personal access token. Create one at https://airtable.com/create/tokens. The connector sends it as Authorization: Bearer <token>.
base_idStringYes-The ID of the Airtable base (starts with app).
tableStringYes-The table name or table ID to write to.
api_base_urlStringNohttps://api.airtable.comAirtable API base URL. The connector appends /v0/<base_id>/<table> automatically.
typecastbooleanNofalseIf true, Airtable will automatically convert values to match the field type. Default false.
batch_sizeintNo10Number of records per API request. Maximum 10 per Airtable API limit. Default 10.
request_interval_msintNo220Minimum interval in milliseconds between API requests. Default 220ms (to stay within Airtable's 5 requests/second limit). Must be >= 0.
rate_limit_backoff_msintNo30000Base backoff time in milliseconds when receiving a 429 (rate limit) response. Default 30000ms. Must be >= 0.
rate_limit_max_retriesintNo3Maximum number of retries after receiving a 429 response. Default 3. Must be >= 0.
common-optionsNo-Sink common options. See Sink Common Options.

Usage Notes

  • token is sensitive. Avoid hardcoding real tokens in shared job files. Use SeaTunnel variable substitution or your deployment secret mechanism.
  • The connector writes to one fixed base_id and table. It does not route records to different Airtable tables by upstream table name. For multi-table pipelines, configure separate sink entries or route data before the Airtable sink.
  • Each input record becomes one Airtable record. Field names in the upstream schema must match the Airtable column names, otherwise set typecast = true to let Airtable auto-convert.
  • Airtable enforces a 5 requests/second rate limit per token. The default request_interval_ms = 220 keeps a single connector within that limit. Configure rate_limit_backoff_ms and rate_limit_max_retries to control how the connector reacts to HTTP 429 responses.
  • The connector does not batch with a timer; rows are sent when the buffered count reaches batch_size or when the writer closes.

Task Examples

Write Rows To Airtable

env {
parallelism = 1
job.mode = "BATCH"
}

source {
FakeSource {
schema = {
fields {
Name = string
Age = int
}
}
rows = [
{
kind = INSERT
fields = ["Alice", 30]
},
{
kind = INSERT
fields = ["Bob", 25]
}
]
}
}

sink {
Airtable {
token = "patXXXXXXXX.XXXXXXXX"
base_id = "appXXXXXXXX"
table = "Shipments"
typecast = true
batch_size = 10
request_interval_ms = 220
}
}

Write Rows From A Source With Field Name Mapping

When upstream field names already match Airtable column names:

env {
parallelism = 1
job.mode = "BATCH"
}

source {
FakeSource {
schema = {
fields {
Name = string
Email = string
Score = int
}
}
rows = [
{
kind = INSERT
fields = ["Alice", "alice@example.com", 95]
},
{
kind = INSERT
fields = ["Bob", "bob@example.com", 88]
}
]
}
}

sink {
Airtable {
token = "patXXXXXXXX.XXXXXXXX"
base_id = "appXXXXXXXX"
table = "Contacts"
typecast = false
batch_size = 10
}
}

Pointing At A Self-Hosted Airtable

Override api_base_url when running against a self-hosted or proxied Airtable-compatible API:

env {
parallelism = 1
job.mode = "BATCH"
}

source {
FakeSource {
schema = {
fields {
Name = string
Age = int
}
}
rows = [
{
kind = INSERT
fields = ["Alice", 30]
}
]
}
}

sink {
Airtable {
api_base_url = "https://airtable.internal.example.com"
token = "patXXXXXXXX.XXXXXXXX"
base_id = "appXXXXXXXX"
table = "Shipments"
}
}

Changelog

Change Log
ChangeCommitVersion