or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

docs

attachments.mdcli.mdcomments.mdcore-api.mdenterprise.mdformulas.mdindex.mdorm.mdrecord-operations.mdtesting.mdwebhooks.md
tile.json

tessl/pypi-pyairtable

Python client for the Airtable API providing comprehensive database operations, ORM functionality, enterprise features, and testing utilities

Workspace
tessl
Visibility
Public
Created
Last updated
Describes
pypipkg:pypi/pyairtable@3.2.x

To install, run

npx @tessl/cli install tessl/pypi-pyairtable@3.2.0

index.mddocs/

PyAirtable

A comprehensive Python client library for interacting with the Airtable API. PyAirtable provides high-level classes for managing Airtable databases, tables, and records, with additional support for enterprise features, ORM-style models, formulas, testing utilities, and a command-line interface.

Package Information

  • Package Name: pyairtable
  • Language: Python
  • Installation: pip install pyairtable
  • PyPI: https://pypi.org/project/pyairtable/
  • Documentation: https://pyairtable.readthedocs.io/

Core Imports

from pyairtable import Api, Base, Table

Additional components:

from pyairtable import Enterprise, Workspace, retry_strategy
from pyairtable.api import retrying  # For retry strategy types
from pyairtable.api.types import UserAndScopesDict, BaseSchema  # For type annotations
from pyairtable.formulas import Formula, AND, OR, match
from pyairtable.orm import Model, fields
from pyairtable.testing import MockAirtable, fake_record

Basic Usage

from pyairtable import Api

# Initialize API connection
api = Api('your_access_token')

# Get a table
table = api.table('app1234567890abcde', 'My Table')

# Create a record
new_record = table.create({'Name': 'John Doe', 'Email': 'john@example.com'})
print(f"Created record: {new_record['id']}")

# Retrieve all records
records = table.all()
for record in records:
    print(f"{record['id']}: {record['fields']}")

# Update a record
updated = table.update(new_record['id'], {'Name': 'Jane Doe'})

# Delete a record
table.delete(new_record['id'])

Architecture

PyAirtable follows a hierarchical API structure that mirrors Airtable's organization:

  • Api: Top-level connection manager handling authentication and HTTP requests
  • Base: Represents an Airtable base, manages tables and metadata
  • Table: Individual tables within bases, provides CRUD operations for records
  • Enterprise: Enterprise account management (Enterprise billing plans only)
  • Workspace: Workspace management and base organization

Additional systems provide specialized functionality:

  • ORM: Model-based approach with field definitions and automatic type conversion
  • Formulas: Expression building for complex queries and filters
  • Testing: Mock APIs and utilities for unit testing
  • CLI: Command-line interface for direct API interaction

Capabilities

Core API Operations

Fundamental Airtable API access through Api, Base, and Table classes. Provides complete CRUD operations, authentication, retry strategies, and base/table management.

class Api:
    def __init__(self, api_key: str, *, timeout: Optional[tuple] = None, 
                 retry_strategy: Optional[Union[bool, retrying.Retry]] = True,
                 endpoint_url: str = "https://api.airtable.com",
                 use_field_ids: bool = False): ...
    def base(self, base_id: str, validate: bool = False, force: bool = False) -> Base: ...
    def table(self, base_id: str, table_name: str, validate: bool = False, force: bool = False) -> Table: ...
    def whoami(self) -> UserAndScopesDict: ...

class Base:
    def table(self, id_or_name: str, validate: bool = False, force: bool = False) -> Table: ...
    def tables(self, force: bool = False) -> list: ...
    def schema(self, *, force: bool = False) -> BaseSchema: ...

class Table:
    def all(self, **options) -> list: ...
    def get(self, record_id: str, **options) -> dict: ...
    def create(self, fields: dict, typecast: bool = False, use_field_ids: Optional[bool] = None) -> dict: ...
    def update(self, record_id: str, fields: dict, replace: bool = False, typecast: bool = False, use_field_ids: Optional[bool] = None) -> dict: ...
    def delete(self, record_id: str) -> dict: ...

Core API Operations

Record Operations

Advanced record handling including batch operations, upserts, pagination, filtering, and sorting. Supports complex queries and bulk data operations.

def batch_create(self, records: list, typecast: bool = False, use_field_ids: Optional[bool] = None) -> list: ...
def batch_update(self, records: list, replace: bool = False, typecast: bool = False, use_field_ids: Optional[bool] = None) -> list: ...
def batch_upsert(self, records: list, key_fields: list, replace: bool = False, typecast: bool = False, use_field_ids: Optional[bool] = None) -> dict: ...
def batch_delete(self, record_ids: list) -> list: ...
def iterate(self, **options) -> Iterator: ...
def first(self, **options) -> Optional[dict]: ...

Record Operations

Formula System

Comprehensive formula building and expression system with support for all Airtable formula functions, logical operators, comparisons, and field references.

class Formula:
    def __init__(self, value: str): ...
    def flatten(self) -> Formula: ...

def AND(*components, **fields) -> Formula: ...
def OR(*components, **fields) -> Formula: ...
def NOT(component, **fields) -> Formula: ...
def match(field_values: dict, match_any: bool = False) -> Formula: ...

# Math functions
def SUM(number, *numbers) -> Formula: ...
def AVERAGE(number, *numbers) -> Formula: ...
def MAX(number, *numbers) -> Formula: ...

# Text functions  
def CONCATENATE(text, *texts) -> Formula: ...
def FIND(string_to_find, where_to_search, start_from_position=None) -> Formula: ...

# Date functions
def DATEADD(date, number, units) -> Formula: ...
def DATETIME_FORMAT(date, output_format=None) -> Formula: ...

Formula System

ORM (Object-Relational Mapping)

Model-based approach to Airtable tables with field definitions, type validation, and automatic conversions. Provides Django-style model syntax for Python developers.

class Model:
    def __init__(self, **field_values): ...
    def save(self) -> object: ...
    def delete(self) -> bool: ...
    def to_record(self) -> dict: ...
    @classmethod
    def from_record(cls, record: dict) -> Model: ...
    @classmethod
    def all(cls, **options) -> list: ...

# Field types
class TextField:
    def __init__(self, field_name: str): ...

class NumberField:
    def __init__(self, field_name: str): ...

class CheckboxField:
    def __init__(self, field_name: str): ...

ORM System

Enterprise Features

Enterprise account management including user administration, audit logging, workspace management, and organizational controls (requires Enterprise billing plan).

class Enterprise:
    def info(self, aggregated: bool = False, descendants: bool = False) -> object: ...
    def user(self, id_or_email: str, collaborations: bool = True) -> object: ...
    def users(self, ids_or_emails: list) -> list: ...
    def audit_log(self, **kwargs) -> Iterator: ...
    def remove_user(self, user_id: str, replacement: str = None) -> object: ...

class Workspace:
    def create_base(self, name: str, tables: list) -> object: ...
    def collaborators(self, force: bool = False) -> object: ...
    def delete(self) -> None: ...

Enterprise Features

Testing Utilities

Mock Airtable APIs and helper functions for unit testing applications that use pyAirtable. Provides fake data generation and API simulation.

class MockAirtable:
    def __init__(self, passthrough: bool = False): ...
    def add_records(self, base_id: str, table_name: str, records: list) -> list: ...
    def set_records(self, base_id: str, table_name: str, records: list) -> None: ...

def fake_record(fields: dict = None, id: str = None, **other_fields) -> dict: ...
def fake_user(value=None) -> dict: ...
def fake_attachment(url: str = "", filename: str = "") -> dict: ...

Testing Utilities

Attachments

File upload and attachment management with support for multiple attachment fields, content type detection, and URL-based attachments.

def upload_attachment(self, record_id: str, field: str, filename: str, 
                     content: Optional[bytes] = None, content_type: str = None) -> dict: ...

Attachment Management

Comments and Collaboration

Record-level commenting system with user mentions, collaborative features, and comment management.

def comments(self, record_id: str) -> list: ...
def add_comment(self, record_id: str, text: str) -> object: ...

class Comment:
    def save(self) -> Comment: ...
    def delete(self) -> bool: ...

Comments and Collaboration

Webhooks

Webhook management for real-time notifications when data changes in Airtable bases.

def webhooks(self) -> list: ...
def add_webhook(self, notify_url: str, spec: dict) -> object: ...

class Webhook:
    # Webhook properties and methods
    pass

Webhook Management

Command Line Interface

Complete CLI for direct API interaction, base exploration, record management, and ORM code generation.

# CLI commands available via: python -m pyairtable
# - whoami: Get current user information  
# - bases: List all available bases
# - base <id> schema: Get base schema
# - base <id> table <name> records: Get table records
# - enterprise <id> users: List enterprise users

Command Line Interface

Types

# Record structure
RecordDict = {
    "id": str,  # Record ID starting with "rec"
    "createdTime": str,  # ISO 8601 datetime string
    "fields": dict  # Field name -> field value mapping
}

# Common field value types
FieldValue = Union[str, int, float, bool, list, dict, None]

# Attachment structure  
AttachmentDict = {
    "id": str,  # Attachment ID starting with "att"
    "url": str,  # URL to access the attachment
    "filename": str,  # Original filename
    "size": int,  # File size in bytes
    "type": str  # MIME type
}

# User/Collaborator structure
CollaboratorDict = {
    "id": str,  # User ID starting with "usr"
    "email": str,  # User email address
    "name": str  # Display name
}

# Retry strategy for API requests
TimeoutTuple = tuple[int, int]  # (connect_timeout, read_timeout)

Error Handling

PyAirtable provides a comprehensive exception hierarchy for different error scenarios:

class PyAirtableError(Exception):
    """Base class for all exceptions raised by PyAirtable."""

class CircularFormulaError(PyAirtableError, RecursionError):
    """A circular dependency was encountered when flattening nested conditions."""

class InvalidParameterError(PyAirtableError, ValueError):
    """Raised when invalid parameters are passed to all(), first(), etc."""

class MissingValueError(PyAirtableError, ValueError):
    """A required field received an empty value, either from Airtable or other code."""

class MultipleValuesError(PyAirtableError, ValueError):
    """SingleLinkField received more than one value from either Airtable or calling code."""

class ReadonlyFieldError(PyAirtableError, ValueError):
    """Attempted to set a value on a readonly field."""

class UnsavedRecordError(PyAirtableError, ValueError):
    """Attempted to perform an unsupported operation on an unsaved record."""

Usage example:

import requests
from pyairtable import Api
from pyairtable.exceptions import PyAirtableError, InvalidParameterError

try:
    api = Api('invalid_token')
    records = api.table('base_id', 'table_name').all()
except requests.exceptions.HTTPError as e:
    print(f"HTTP Error: {e}")
except InvalidParameterError as e:
    print(f"Invalid Parameter: {e}")
except PyAirtableError as e:
    print(f"PyAirtable Error: {e}")

Common HTTP exception types include authentication errors (401), permission errors (403), not found errors (404), and rate limiting (429).