Airbyte: Open-Source Data Integration Platform Guide
Airbyte is the leading open-source ELT platform with 350+ connectors that you can self-host for free. Move data from any source to any destination — databases, SaaS tools, APIs, and files — with full control over your infrastructure and connector code.
What is Airbyte?
Airbyte is an open-source ELT (Extract, Load, Transform) data integration platform founded in 2020. It provides a catalog of 350+ pre-built connectors — covering databases (Postgres, MySQL, MongoDB, SQL Server), SaaS applications (Salesforce, HubSpot, Stripe, Google Ads, Zendesk), cloud storage (S3, GCS), and data warehouses. The open-source version is free to self-host on Docker Compose or Kubernetes, making it an attractive alternative to Fivetran and Stitch for cost-conscious teams.
Airbyte's architecture separates the platform (UI, scheduler, metadata DB) from the connector runtime (Docker containers for each connector). Each sync runs a source connector and a destination connector in Docker, extracting and loading data in Airbyte's internal JSON format. The platform handles scheduling, state management (incremental cursors), and error retry. Airbyte Cloud is the managed offering; for most teams scaling beyond a single developer, Kubernetes deployment with the Helm chart is the recommended production path.
Self-Hosted Deployment
# Deploy Airbyte self-hosted with Docker Compose # Requirements: Docker, Docker Compose, 4GB+ RAM git clone https://github.com/airbytehq/airbyte.git cd airbyte ./run-ab-platform.sh # Airbyte UI available at: http://localhost:8000 # Default credentials: airbyte / password # # For production, use Airbyte on Kubernetes: helm repo add airbyte https://airbytehq.github.io/helm-charts helm install airbyte airbyte/airbyte \ --namespace airbyte \ --set global.edition=community \ --set webapp.service.type=LoadBalancer # Environment variables for custom config: # .env AIRBYTE_VERSION=0.63.0 DATABASE_PASSWORD=your_secure_password SECRET_PERSISTENCE=GOOGLE_SECRET_MANAGER # or AWS_SECRET_MANAGER LOG_LEVEL=INFO
Managing Connections via Airbyte API v2
# Airbyte API v2 — manage connections programmatically
# pip install requests
import requests
BASE_URL = "https://api.airbyte.com/v1"
CLIENT_ID = "your_client_id"
CLIENT_SECRET = "your_client_secret"
# 1. Get access token
token_resp = requests.post(
"https://api.airbyte.com/v1/applications/token",
json={"client_id": CLIENT_ID, "client_secret": CLIENT_SECRET},
)
token = token_resp.json()["access_token"]
HEADERS = {"Authorization": f"Bearer {token}"}
# 2. List available source definitions
sources = requests.get(
f"{BASE_URL}/sources",
headers=HEADERS,
).json()
# 3. Create a Postgres source
new_source = requests.post(
f"{BASE_URL}/sources",
headers=HEADERS,
json={
"name": "Production Postgres",
"workspaceId": "your_workspace_id",
"definitionId": "decd338e-5647-4c0b-adf4-da0e75f5a750", # Postgres
"configuration": {
"sourceType": "postgres",
"host": "db.example.com",
"port": 5432,
"database": "production",
"username": "airbyte",
"password": "secret",
"ssl_mode": {"mode": "require"},
"replication_method": {
"method": "CDC",
"publication": "airbyte_pub",
"replication_slot": "airbyte_slot",
},
},
},
).json()
source_id = new_source["sourceId"]
print(f"Source created: {source_id}") Building a Custom Connector with CDK
# Airbyte CDK — build a custom connector in Python
# pip install airbyte-cdk
from airbyte_cdk.sources import AbstractSource
from airbyte_cdk.sources.streams.http import HttpStream
from airbyte_cdk.models import SyncMode
from typing import Any, Iterable, List, Mapping, Optional, Tuple
import requests
class OrdersStream(HttpStream):
url_base = "https://api.example.com/"
primary_key = "order_id"
def path(self, **kwargs) -> str:
return "orders"
def next_page_token(self, response: requests.Response) -> Optional[Mapping]:
data = response.json()
if data.get("next_cursor"):
return {"cursor": data["next_cursor"]}
return None
def request_params(self, next_page_token=None, **kwargs) -> Mapping:
params = {"limit": 100}
if next_page_token:
params["cursor"] = next_page_token["cursor"]
return params
def parse_response(self, response: requests.Response, **kwargs) -> Iterable[Mapping]:
yield from response.json().get("orders", [])
class MyApiSource(AbstractSource):
def check_connection(self, logger, config) -> Tuple[bool, Any]:
try:
resp = requests.get(
"https://api.example.com/health",
headers={"Authorization": f"Bearer {config['api_key']}"},
)
return resp.status_code == 200, None
except Exception as e:
return False, str(e)
def streams(self, config: Mapping) -> List:
auth = {"Authorization": f"Bearer {config['api_key']}"}
return [OrdersStream(authenticator=auth)] Airbyte vs Fivetran vs Stitch
| Feature | Airbyte | Fivetran | Stitch |
|---|---|---|---|
| License | Open-source (MIT/EL) | Proprietary | Proprietary (Singer open) |
| Self-hosted cost | Free (infra costs only) | Not available | Not available |
| Connectors | 350+ (community) | 500+ (enterprise-grade) | ~130 |
| Custom connectors | Python CDK (excellent) | Connector SDK | Singer taps (open) |
| CDC support | Yes (Debezium) | Yes (all plans) | Yes (Advanced plan) |
| dbt integration | Built-in normalization | Native dbt Core | Webhook + dbt Cloud |
| Best for | Cost-sensitive, flexibility | Enterprise reliability | Simple, affordable SaaS |
Production Best Practices
- Use Incremental Deduped sync mode for tables with primary keys to avoid data duplication
- Configure CDC (Debezium) for high-volume database sources — far lower source load than key-based polling
- Deploy on Kubernetes with dedicated worker nodes to isolate connector memory from platform services
- Store secrets in AWS Secrets Manager or Google Secret Manager instead of the Airbyte DB for production security
- Use the Airbyte Terraform provider to manage connections as code — version control your data pipeline configuration
- Monitor sync lag and failure rates in the Airbyte UI or export metrics to Datadog/Prometheus via the Airbyte metrics endpoint
Frequently Asked Questions
What is Airbyte and how does it differ from Fivetran and Stitch?▼
Airbyte is an open-source ELT data integration platform. Unlike Fivetran and Stitch which are proprietary managed SaaS services, Airbyte's core is open-source under the MIT/Elastic license — you can self-host it for free on Docker Compose or Kubernetes. Airbyte Cloud is the managed offering with per-credit pricing. The key advantages over Fivetran and Stitch are cost (free self-hosted), flexibility (modify or build connectors), and a rapidly growing connector catalog (350+). The trade-off is that self-hosting requires infrastructure management and monitoring that Fivetran/Stitch handle for you.
What is Airbyte CDK and when should I build a custom connector?▼
The Airbyte Connector Development Kit (CDK) is a Python framework for building custom source connectors. Build a custom connector when your data source is not in the official catalog, when an existing community connector is missing features you need, or when you are integrating a proprietary internal API. The CDK handles pagination, authentication (OAuth, API Key, Basic), incremental sync with cursor fields, schema declaration, and error handling. Once built, custom connectors can be published to the Airbyte connector catalog or kept private in your workspace. The process typically takes a few hours for simple REST APIs.
What is the difference between Full Refresh and Incremental sync in Airbyte?▼
Full Refresh sync re-fetches all records from the source every run and either overwrites (Overwrite mode) or appends (Append mode) the destination table. This is simple but expensive for large datasets. Incremental Append sync fetches only records added since the last sync using a cursor field (typically updated_at or an auto-increment ID), appending new rows to the destination. Incremental Deduped History also fetches incrementally but deduplicates rows by primary key in the destination — each row is stored once, updated in-place, with Airbyte maintaining the deduplication logic. Prefer Incremental Deduped for most production use cases.
How does Airbyte handle schema evolution and data type changes?▼
When Airbyte detects new columns in the source, it adds them to the destination table on the next sync. For breaking changes (column type change, column removal), Airbyte's behavior depends on the destination and sync mode — in most cases it preserves historical data by keeping the old column and adding a new one. Airbyte normalizes data through its internal normalization step (using dbt under the hood), which can handle type coercion. You can disable normalization and use raw tables with Airbyte's JSON columns, then apply your own transformations with dbt. The Raw Tables feature stores data in JSON format, maximally preserving schema flexibility.
What are Airbyte's deployment options and their trade-offs?▼
Docker Compose is the simplest deployment — one command starts the full Airbyte platform locally or on a VM. Good for development and small teams. Kubernetes via Helm charts enables horizontal scaling, high availability, and production-grade deployments. Airbyte Cloud is the fully managed option — zero infrastructure management, per-credit pricing, and SLA. For large data volumes with cost sensitivity, Kubernetes self-hosted is the sweet spot: scale workers independently and avoid Airbyte Cloud's per-credit fees. Airbyte Enterprise adds single-tenant cloud hosting with a dedicated environment and enterprise support for teams that want SaaS convenience without the multi-tenancy concerns.
How does Airbyte integrate with dbt for transformations?▼
Airbyte handles the EL (Extract + Load) part of the pipeline — it loads raw data into your warehouse in a schema like airbyte_internal or _airbyte_raw. dbt handles the T (Transform) — it reads from the raw tables and creates clean, tested, documented models in the analytics schema. The standard pattern is: Airbyte sync completes → trigger dbt run (via dbt Cloud webhook, Airflow/Prefect operator, or the Airbyte dbt integration). Airbyte's normalization feature runs a built-in dbt project on raw data to create typed tables automatically — useful for getting started, but most teams replace this with a custom dbt project for full control.
Related Products
on GumroadDeveloper Productivity Bundle
Stop rebuilding the same setup every project. 51 VSCode snippets, 40 Git aliases, 5 Docker Compose stacks, 5 GitHub Actions workflows, 5 README templates, and a dotfiles kit. Set up a professional dev environment in under an hour.
Buy on Gumroad →AI Prompt Engineering Toolkit
58 structured prompt templates for Claude, ChatGPT, and Gemini — organized by use case. Code Review, Debugging, Documentation, Architecture, and 10 model-specific tips. Stop writing prompts from scratch.
Buy on Gumroad →Developer Cheat Sheet Bundle
10 print-ready cheat sheets for the tools developers use every day: Git, Docker, Linux CLI, SQL, Regex, HTTP Status codes, VS Code shortcuts, Bash scripting, jq/JSON, and Markdown.
Buy on Gumroad →You Might Also Need
Svelte Component Generator
Generate Svelte 5 component boilerplate with runes syntax ($state, $props, $derived, $effect), props, events, and lifecycle. Also supports Svelte 4 legacy syntax.
Open free tool →
Highlight.io
Open-source full-stack monitoring with session replay, errors, logs, and tracing.
Open free tool →
Game Loop Calculator
Calculate game loop timing for any FPS target and physics update rate. Get frame time budget, fixed delta time, ticks per frame, and copy JavaScript game loop code.
Open free tool →
More Free Tools
Related Articles
ETL vs ELT: Modern Data Pipeline Architecture Guide 2026
ETL vs ELT data pipeline comparison 2026: traditional ETL limitations, cloud ELT advantages, dbt for transformation, tools comparison (Fivetran/Airbyte/dbt), and when to use each approach.
Apache Airflow vs Prefect: Workflow Orchestration Comparison 2026
Apache Airflow vs Prefect 2026: DAG vs flow syntax, scheduling, dynamic workflows, observability, learning curve, cloud offerings, and which to choose for your data team.
Apache Kafka for Real-Time Data Pipelines: Tutorial 2026
Apache Kafka tutorial 2026: topics, partitions, consumer groups, producers/consumers in Python, Schema Registry, Kafka Connect, exactly-once semantics, and production best practices.
Apache Spark vs Flink: Stream Processing Comparison 2026
Apache Spark vs Apache Flink 2026: architecture differences, true streaming vs micro-batch, latency, exactly-once semantics, SQL support, state management, and when to choose each.
DuckDB vs PostgreSQL for Analytics: When to Choose Each 2026
DuckDB vs PostgreSQL 2026: OLAP vs OLTP, query performance on large datasets, Parquet/CSV support, and when to choose DuckDB for analytics workloads.
Enjoying this tool? Get more like it.
Weekly developer tool guides, productivity playbooks & AI tricks. Free. No spam.
Unlock AI-Powered Dev Tools
- ⚡ AI Code Review, Doc Generator & SQL Builder
- ⚡ All premium templates & early access
- ⚡ Member discounts on Gumroad products
$9/mo after trial · Cancel anytime
Want the full toolkit?
Get DevPlaybook Pro
Every template, guide, boilerplate, and automation script in one bundle. 13 premium products — grab them all at once and save big.
MIT licensed · Instant download · No subscription
See what's included → Browse all deals →