Без заголовка

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. Используйте для инвалидации кэша или триггеров в своём приложении.