Python library for uploading attachments and creating records in Feishu Bitable (飞书多维表格).
- 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
Using uv (recommended):
uv add py-bitableOr using pip:
pip install py-bitablefrom 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 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"
]
}
)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)# 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")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"}]
)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
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
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.
MIT