apache/seatunnel · error · IOException

Failed to send Airtable API request

Error message

Failed to send Airtable API request

What it means

sendWithRateLimitRetry wraps any non-IOException failure while executing the Airtable HTTP request into an IOException with message 'Failed to send Airtable API request' and the original as cause. This covers client-side errors (connection failures, timeouts, serialization issues) rather than Airtable-returned error statuses.

Source

Thrown at seatunnel-connectors-v2/connector-http/connector-http-airtable/src/main/java/org/apache/seatunnel/connectors/seatunnel/airtable/sink/AirtableSinkWriter.java:158

                            retryCount,
                            rateLimitMaxRetries,
                            backoffMillis);
                    try {
                        Thread.sleep(backoffMillis);
                    } catch (InterruptedException e) {
                        Thread.currentThread().interrupt();
                        throw new RuntimeException(e);
                    }
                    continue;
                }
                throw new IOException(
                        String.format(
                                "Airtable API request failed, status code:[%s], content:[%s]",
                                response.getCode(), response.getContent()));
            } catch (IOException e) {
                throw e;
            } catch (Exception e) {
                throw new IOException("Failed to send Airtable API request", e);
            }
        }
    }

    private void waitForRequestSlot() {
        if (requestIntervalMs <= 0) {
            return;
        }
        long now = System.currentTimeMillis();
        long elapsed = now - lastRequestTimeMillis;
        if (elapsed < requestIntervalMs) {
            try {
                Thread.sleep(requestIntervalMs - elapsed);
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
                throw new RuntimeException(e);
            }
        }

View on GitHub (pinned to cf67b549a7)

Solutions

  1. Inspect the cause chain for the root exception (UnknownHostException, SSLException, ConnectException).
  2. Verify network/DNS/proxy connectivity from the SeaTunnel worker node to api.airtable.com:443.
  3. Fix proxy settings (-Dhttps.proxyHost/-Dhttps.proxyPort) if behind a corporate proxy.
  4. Retry the job once connectivity is restored; the writer is checkpoint-aware so it will resume.

Example fix

// before: worker has no egress to api.airtable.com
// after: set JVM proxy args on the worker
-Dhttps.proxyHost=proxy.corp.internal -Dhttps.proxyPort=3128
Defensive patterns

Strategy: try-catch

Validate before calling

// From the worker node before running
curl -sS --max-time 5 https://api.airtable.com/v0/meta/whoami -H "Authorization: Bearer $AIRTABLE_TOKEN"

Try / catch

try { writer.write(row); } catch (IOException e) { if (getRootCause(e) instanceof java.net.ConnectException || getRootCause(e) instanceof java.net.UnknownHostException) { /* check network/proxy */ } }

Prevention

When it happens

Trigger: The HTTP client call itself throws a non-IO exception: DNS/connect failures surfaced as runtime exceptions, SSL handshake errors, request building failures, or interruptions during the HTTP call.

Common situations: Network outages or firewall blocking airtable.com from the SeaTunnel worker, TLS/proxy misconfiguration, or hostname resolution failures in containers.

Related errors


AI-assisted analysis of apache/seatunnel@cf67b549a7 (2026-09-10). Data as JSON: /api/errors/68841c57cc924bce. Report an issue: GitHub.