Python library for uploading attachments and creating records in Feishu Bitable (飞书多维表格).
Features
- Upload attachments to Feishu Bitable using multipart upload API
- Create records in Bitable tables with batch support
- Schema validation using Pydantic models
- Automatic field mapping between field names and field IDs
- Type-safe data models for API requests and responses
Installation
Using uv (recommended):
Or using pip:
Quick Start
Basic Usage
from py_bitable import Bitable # Initialize Bitable client bitable = Bitable( app_id="your_app_id", app_secret="your_app_secret", app_token="your_bitable_app_token", table_id="your_table_id" ) # Get table schema schema = bitable.get_table_schema() for field in schema: print(f"{field.field_name}: {field.type}") # Create a simple record record = bitable.create_record({ "Name": "John Doe", "Age": 30, "Email": "john@example.com" }) print(f"Created record: {record['record_id']}")
Upload Attachments
# Upload attachment and create record record = bitable.upload_and_create_record( record_data={ "Name": "Project Document", "Description": "Important document" }, attachment_files={ "Attachments": "/path/to/file.pdf" # Single file } ) # Upload multiple attachments record = bitable.upload_and_create_record( record_data={ "Name": "Project Images" }, attachment_files={ "Images": [ "/path/to/image1.png", "/path/to/image2.png" ] } )
Using Pydantic Models
from pydantic import BaseModel from typing import Optional class ProjectRecord(BaseModel): Name: str Description: Optional[str] = None Status: str = "In Progress" Priority: int = 1 # Create record with validation record_data = ProjectRecord( Name="New Project", Description="A new project", Priority=5 ) record = bitable.create_record(record_data)
Batch Create Records
# Create multiple records at once records = bitable.create_records([ {"Name": "Task 1", "Status": "Todo"}, {"Name": "Task 2", "Status": "In Progress"}, {"Name": "Task 3", "Status": "Done"} ]) print(f"Created {len(records)} records")
Low-level API Client
For more control, use the BitableApiClient directly:
from py_bitable import BitableApiClient client = BitableApiClient( app_id="your_app_id", app_secret="your_app_secret" ) # Upload a file file_token = client.upload_file("/path/to/file.pdf") # Get table fields fields = client.get_table_fields(app_token, table_id) # Create records response = client.batch_create_records( app_token=app_token, table_id=table_id, records=[{"field_id_1": "value1", "field_id_2": "value2"}] )
API Reference
Bitable
Main class for high-level operations.
Methods:
get_table_schema()- Fetch table schema from Feishu APIget_field_id(field_name)- Get field ID by field nameupload_attachment(file_path)- Upload a file and get attachment infocreate_record(record_data, use_field_names=True)- Create a single recordcreate_records(records_data, use_field_names=True)- Batch create recordsupload_and_create_record(record_data, attachment_files, use_field_names=True)- Upload files and create record
BitableApiClient
Low-level API client for direct API calls.
Methods:
get_table_fields(app_token, table_id)- Get table field metadataupload_file(file_path, parent_type, parent_node)- Upload a file completelybatch_create_records(app_token, table_id, records)- Batch create records
Configuration
The library requires Feishu app credentials:
app_id: Your Feishu app IDapp_secret: Your Feishu app secretapp_token: The Bitable app tokentable_id: The table ID in the Bitable
You can find these in the Feishu Open Platform console.
References
License
MIT