Airtable как база данных для сайта и разработки: руководство с примерами
Title: Airtable как база данных для сайта — API, примеры кода, ограничения 2026 Description: Используем Airtable как backend и CMS для сайта: REST API, примеры на JavaScript и Python, no-code интеграции, ограничения и когда Airtable лучше PostgreSQL. Реальные кейсы 2026. Keyphrases: airtable как база данных, airtable api для сайта, airtable backend, airtable cms, airtable javascript python, airtable no-code, airtable vs notion, airtable ограничения, airtable для разработчика date: '2026-04-06' cover: '/blog-covers/cover_airtable.png'
Airtable — это гибрид таблицы Excel и реляционной базы данных с удобным интерфейсом и полноценным REST API. В 2026 году это один из самых популярных инструментов для быстрого создания backend без написания кода. Разберём, как работает Airtable API, когда это правильный выбор и как не наступить на типичные грабли.
Чем Airtable отличается от Notion и обычных таблиц
Airtable позиционируется как «реляционная база данных с интерфейсом таблицы». Ключевые отличия:
от Excel/Google Sheets:
- Связи между таблицами (Linked Records — аналог Foreign Key)
- Типизированные поля (Date, Number, Attachment, не просто текст)
- Формулы, rollup-вычисления по связанным записям
- Полноценный REST API из коробки
- Автоматизации (Automations) без сторонних инструментов
от Notion:
- Airtable — это чистая БД, Notion — рабочее пространство с заметками
- Airtable API быстрее и предсказуемее для работы с данными
- В Notion можно хранить длинный контент внутри записи, в Airtable — нет (только через attachments)
- Airtable лучше для структурированных данных, Notion — для смешанного контента
Структура Airtable
- Workspace — верхний уровень, аналог аккаунта
- Base — аналог базы данных (несколько связанных таблиц)
- Table — таблица с полями
- Record — строка в таблице
- Field — колонка с типом данных
- View — отображение таблицы с фильтрами и сортировками (не меняет данные)
Типы полей
| Тип | Описание | |---|---| | Single line text | Короткий текст | | Long text | Длинный текст, поддерживает Markdown | | Number | Число с форматированием | | Currency | Денежное значение | | Date | Дата и время | | Checkbox | Булево значение | | Single/Multi select | Список значений | | Linked record | Связь с другой таблицей | | Lookup | Значение из связанной записи | | Rollup | Агрегация по связанным записям | | Formula | Вычисляемое поле | | Attachment | Файлы и изображения | | URL, Email, Phone | Специализированный текст | | Rating | Оценка от 1 до 5 | | Autonumber | Автоинкремент |
Airtable REST API: основы
Аутентификация
В Airtable используются Personal Access Tokens (PAT). Создайте токен на airtable.com/create/tokens с нужными правами.
# Базовый запрос — получить все записи
curl "https://api.airtable.com/v0/{BASE_ID}/{TABLE_NAME}" \
-H "Authorization: Bearer YOUR_TOKEN"
ID базы можно найти в URL: airtable.com/appXXXXXXXX/tblXXXXXXXX/...
Получение записей
# Получить с фильтром (filterByFormula)
curl "https://api.airtable.com/v0/{BASE_ID}/{TABLE_NAME}?filterByFormula=AND(Status='Published',{Category}='Tech')" \
-H "Authorization: Bearer YOUR_TOKEN"
# Сортировка и лимит
curl "https://api.airtable.com/v0/{BASE_ID}/{TABLE_NAME}?sort[0][field]=Date&sort[0][direction]=desc&maxRecords=10" \
-H "Authorization: Bearer YOUR_TOKEN"
# Пагинация (cursor-based)
curl "https://api.airtable.com/v0/{BASE_ID}/{TABLE_NAME}?pageSize=100&offset=OFFSET_FROM_PREV_RESPONSE" \
-H "Authorization: Bearer YOUR_TOKEN"
Создание записи
curl -X POST "https://api.airtable.com/v0/{BASE_ID}/{TABLE_NAME}" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"fields": {
"Name": "Новый товар",
"Price": 1500,
"Category": "Electronics",
"In Stock": true
}
}'
Обновление
# PATCH — обновить только указанные поля
curl -X PATCH "https://api.airtable.com/v0/{BASE_ID}/{TABLE_NAME}/{RECORD_ID}" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"fields": {"Price": 1200}}'
Airtable на JavaScript (Node.js и браузер)
Официальная библиотека
npm install airtable
const Airtable = require('airtable')
// Инициализация (НИКОГДА не делайте это в браузерном коде!)
const base = new Airtable({ apiKey: process.env.AIRTABLE_TOKEN })
.base(process.env.AIRTABLE_BASE_ID)
// Получить все записи
async function getAllProducts() {
const records = []
await base('Products').select({
filterByFormula: "{Status} = 'Active'",
sort: [{ field: 'Name', direction: 'asc' }]
}).eachPage((pageRecords, fetchNextPage) => {
pageRecords.forEach(record => {
records.push({
id: record.id,
name: record.get('Name'),
price: record.get('Price'),
category: record.get('Category'),
imageUrl: record.get('Image')?.[0]?.url
})
})
fetchNextPage()
})
return records
}
// Создать запись
async function createOrder(order) {
return await base('Orders').create({
'Customer Name': order.name,
'Email': order.email,
'Product': [order.productId], // Linked record — массив ID
'Status': 'New',
'Date': new Date().toISOString()
})
}
// Обновить статус
async function updateOrderStatus(recordId, status) {
return await base('Orders').update(recordId, {
'Status': status
})
}
// Удалить запись
async function deleteRecord(recordId) {
return await base('Products').destroy(recordId)
}
Использование в Next.js API Route
// app/api/products/route.ts
import Airtable from 'airtable'
import { NextResponse } from 'next/server'
const base = new Airtable({ apiKey: process.env.AIRTABLE_TOKEN })
.base(process.env.AIRTABLE_BASE_ID!)
export async function GET() {
try {
const records: any[] = []
await base('Products').select({
filterByFormula: "{Status} = 'Active'",
sort: [{ field: 'Name', direction: 'asc' }]
}).eachPage((pageRecords, fetchNextPage) => {
pageRecords.forEach(record => {
records.push({
id: record.id,
name: record.get('Name'),
price: record.get('Price'),
})
})
fetchNextPage()
})
return NextResponse.json(records)
} catch (error) {
return NextResponse.json({ error: 'Failed to fetch' }, { status: 500 })
}
}
export async function POST(request: Request) {
const body = await request.json()
const record = await base('Orders').create({
'Name': body.name,
'Email': body.email,
'Product': body.productId,
})
return NextResponse.json({ id: record.id })
}
Airtable на Python
pip install pyairtable
from pyairtable import Api
import os
api = Api(os.environ["AIRTABLE_TOKEN"])
table = api.table(os.environ["AIRTABLE_BASE_ID"], "Products")
# Получить все записи с фильтром
records = table.all(
formula="AND({Status}='Active', {Price}<1000)",
sort=["Name"]
)
for record in records:
print(f"{record['fields']['Name']}: {record['fields'].get('Price', 0)} руб.")
# Создать запись
new_record = table.create({
"Name": "Новый товар",
"Price": 999,
"Status": "Active"
})
# Обновить
table.update(new_record["id"], {"Price": 849})
# Удалить
table.delete(new_record["id"])
# Batch-вставка (до 10 записей за раз)
table.batch_create([
{"Name": "Товар 1", "Price": 100},
{"Name": "Товар 2", "Price": 200},
{"Name": "Товар 3", "Price": 300},
])
Практические кейсы Airtable как backend
Кейс 1: Каталог товаров для лендинга
Схема базы:
- Таблица Products: Name, Price, Description, Images (attachments), Category (single select), Featured (checkbox), Status (single select)
- Таблица Categories: Name, Slug, Description
Next.js получает данные через ISR (кэш на 1 час):
// В Next.js 14+
const data = await fetch('https://api.airtable.com/v0/...', {
headers: { Authorization: `Bearer ${process.env.AIRTABLE_TOKEN}` },
next: { revalidate: 3600 }
})
Кейс 2: Форма обратной связи → CRM в Airtable
// Обработчик формы на сервере
async function handleContactForm(formData) {
await base('Leads').create({
'Name': formData.name,
'Email': formData.email,
'Message': formData.message,
'Source': 'Website',
'Status': 'New',
'Created At': new Date().toISOString()
})
}
Теперь каждая заявка с сайта автоматически появляется в Airtable. Менеджеры работают в Airtable как в CRM, меняют статусы, добавляют заметки.
Кейс 3: Редакционный план и блог
Таблица Posts: Title, Slug, Status (Draft/Review/Published), Author (linked), PublishDate, Tags (multi-select), Content (long text в Markdown).
Редакторы работают в Airtable, разработчик получает данные через API:
def get_published_posts():
records = table.all(
formula="AND({Status}='Published', IS_BEFORE({PublishDate}, TODAY()))",
sort=[("PublishDate", "desc")]
)
return [
{
"slug": r["fields"]["Slug"],
"title": r["fields"]["Title"],
"date": r["fields"]["PublishDate"],
"tags": r["fields"].get("Tags", [])
}
for r in records
]
Ограничения Airtable
| Ограничение | Бесплатный план | Платный (Team) | Enterprise | |---|---|---|---| | Записей на базу | 1 000 | 50 000 | Неограниченно | | Хранилище | 1 ГБ | 20 ГБ | Неограниченно | | API rate limit | 5 req/s | 5 req/s | Выше | | История ревизий | 2 недели | 1 год | 3 года | | Automations | 100/мес | 25 000/мес | Неограниченно |
Важные ограничения API:
- Rate limit: 5 запросов в секунду на базу — обязательно нужно кэширование
- Максимум 100 записей за один запрос (pagination через
offset) - Формулы работают через URL-строку — нужно урлэнкодировать
No-code инструменты поверх Airtable
Если нужен готовый сайт или внутренний инструмент без написания кода:
- Softr (softr.io) — самый популярный, превращает Airtable в web-app с аутентификацией и порталами
- Noloco (noloco.io) — мощные внутренние инструменты
- Glide (glideapps.com) — мобильные приложения из Airtable
- Stacker (stackerhq.com) — клиентские порталы
Airtable vs Notion как база данных: что выбрать
| Критерий | Airtable | Notion | |---|---|---| | Реляционные связи | Сильнее (настоящие linked records с rollup) | Слабее (отношения есть, но ограничены) | | API скорость и предсказуемость | Выше | Ниже (сложный ответ) | | Длинный контент внутри записи | Нет (только текстовое поле) | Да (полноценные страницы) | | Редактирование нетехниками | Хорошо | Отлично (привычный интерфейс) | | Автоматизации | Мощные (встроенные + Zapier/Make) | Слабее | | Бесплатный план | 1 000 записей | Более щедрый | | Российская команда | Сложнее (нет рублей/оплата картой) | Аналогично |
Безопасность: не раскрывайте токен
Самая частая ошибка — Airtable token в браузерном JavaScript:
// ОПАСНО — токен виден всем через DevTools
const data = await fetch(`https://api.airtable.com/v0/${BASE_ID}/Table`, {
headers: { Authorization: `Bearer ${token}` } // Токен виден всем!
})
// ПРАВИЛЬНО — только серверный код
// app/api/products/route.ts (Next.js)
// pages/api/products.ts
// Или любой серверный endpoint
FAQ
Можно ли использовать Airtable как основную БД приложения? Для небольших проектов (лендинги, MVP, внутренние инструменты, CRM для малого бизнеса) — да. Для масштабных приложений с тысячами пользователей или сложными транзакциями — нет. Переходите на PostgreSQL.
Airtable хранит данные в России? Нет, серверы в США и Европе. Если ваши данные подпадают под 152-ФЗ (персональные данные россиян), Airtable не подходит. Рассмотрите российские аналоги: SeaTable (хостится в России), или обычные БД на российских хостингах.
Как сделать полнотекстовый поиск в Airtable через API?
Airtable формулы поддерживают SEARCH() и FIND(), но для полноценного поиска нужно либо загружать все данные на сервер и искать там, либо использовать Airtable Search (платная функция). Для серьёзного поиска — PostgreSQL + pg_trgm или Elasticsearch.
Есть ли российская альтернатива Airtable? Ближайший аналог: nocoDB (open-source, можно хостить сами), Baserow (open-source), Apitable. Из SaaS — SeaTable с серверами в Германии и опцией self-hosting.
Как сделать Airtable быстрым для сайта с трафиком? Кэшируйте данные на своём сервере или в Redis. Обновляйте кэш по расписанию (cron каждые 15 минут) или через webhook-триггеры в Airtable Automations. Никогда не запрашивайте Airtable напрямую при каждом запросе пользователя.
Airtable поддерживает webhook-и? Да, Airtable Automations позволяют отправить HTTP-запрос при изменении записи — это фактически webhook. Используйте для инвалидации кэша или триггеров в своём приложении.