🚨 Must-read before execution
- ✅ Create a data table: Supports two modes — ① When requirements are clear, at
createdefine fields all at once viatable.fields(reduces API calls); ② In exploratory scenarios, use the default table + modify fields step by step (more stable, easier to adjust) - ⚠️ Empty-row pitfall of the default table:
app.createThe built-in default table contains empty records (empty rows)! Before inserting data, it is recommended to first callfeishu_bitable_app_table_record.list+batch_deleteto delete empty rows and avoid data pollution - ✅ Before writing records: First call
feishu_bitable_app_table_field.listto get the field type/ui_type - ✅ Person field: Defaults to open_id (ou_...), the value must be
[{id:"ou_xxx"}](array of objects) - ✅ Date field: millisecond timestamp (for example
1674206443000), not seconds - ✅ Single select field: string (for example
"选项1"), not an array - ✅ Multi-select field: array of strings (for example
["选项1", "选项2"]) - ✅ Attachment field: must first be uploaded to the current Bitable, use the returned file_token
- ✅ Batch limit: ≤ 500 per request, exceeding requires batching (batch operations are atomic)
- ✅ Concurrency limit: Concurrent writes are not supported for the same data table; serial calls + 0.5-1 second delay are required
📋 Quick index: intent → tool → required parameters
| User intent | Tool | action | Required parameters | Common optional |
|---|---|---|---|---|
| Check which fields the table has | feishu_bitable_app_table_field | list | app_token, table_id | - |
| Query records | feishu_bitable_app_table_record | list | app_token, table_id | filter, sort, field_names |
| Add one row | feishu_bitable_app_table_record | create | app_token, table_id, fields | - |
| Batch import | feishu_bitable_app_table_record | batch_create | app_token, table_id, records (≤500) | - |
| Update one row | feishu_bitable_app_table_record | update | app_token, table_id, record_id, fields | - |
| Batch update | feishu_bitable_app_table_record | batch_update | app_token, table_id, records (≤500) | - |
| Create a Bitable | feishu_bitable_app | create | name | folder_token |
| Create a data table | feishu_bitable_app_table | create | app_token, name | fields |
| Create a field | feishu_bitable_app_table_field | create | app_token, table_id, field_name, type | property |
| Create a view | feishu_bitable_app_table_view | create | app_token, table_id, view_name, view_type | - |
🎯 Core constraints (knowledge not revealed by the Schema)
📚 Detailed reference documentation
When encountering field configuration or record value format issues, or when complete examples are needed, consult the following documents:
- Field Property configuration details - The
propertyparameter structure required when creating/updating each field type (options for single select, min/max for progress, table_id for links, etc.) - Record value data structure details - The
fieldsvalue format corresponding to each field type in a record (person fields only pass id, dates are millisecond timestamps, attachments must be uploaded first, etc.) - Complete usage scenario examples - 8 complete scenario examples (comparison of table creation modes, batch import, filtered query, attachment handling, linked fields, etc.)
When to consult:
- When creating/updating fields and receiving
125408Xerror code (property structure error) → consult field-properties.md - Received when writing records
125406Xerror code (field value conversion failed) → see record-values.md - Need the complete operation workflow and parameter examples → see examples.md
1. Field types and value formats must strictly match
The biggest pitfall of Bitable: different field types have completely different data structure requirements for value.
The most error-prone field types (see the full list in record-values.md)
| type | ui_type | Field type | Correct format | ❌ Common mistakes |
|---|---|---|---|---|
| 11 | User | User | [{id: "ou_xxx"}] |
Passing a string "ou_xxx" or [{name: "张三"}] |
| 5 | DateTime | Date | 1674206443000(milliseconds) |
Passing a seconds timestamp or string |
| 3 | SingleSelect | Single select | "选项名" |
Passing an array ["选项名"] |
| 4 | MultiSelect | Multi-select | ["选项1", "选项2"] |
Passing a string "选项1" |
| 15 | Url | Hyperlink | {link: "...", text: "..."} |
Passing only a string URL |
| 17 | Attachment | Attachment | [{file_token: "..."}] |
Passing an external URL or local path |
Mandatory workflow:
- First call
feishu_bitable_app_table_field.listto get the field'stypeandui_type - According to the table above or record-values.md construct the correct format
- Error code
125406Xor1254015→ check the field value format
Special attention to the User field:
- Use open_id (ou_...) by default, consistent with calendar/task
- Format:
[{id: "ou_xxx"}](array of objects) - Only the id field can be passed, name/email etc. cannot be passed
📌 Core use cases
Complete examples: consult examples.md to learn more scenarios (table creation mode comparison, empty row handling, attachment upload, linked fields, etc.)
Scenario 1: Check field types (mandatory first step)
{
"action": "list",
"app_token": "S404b...",
"table_id": "tbl..."
}
Returns: includes each field's field_id、field_name、type、ui_type、property
Scenario 2: Batch import customer data
{
"action": "batch_create",
"app_token": "S404b...",
"table_id": "tbl...",
"records": [
{
"fields": {
"客户名称": "Bytedance",
"负责人": [{"id": "ou_xxx"}],
"签约日期": 1674206443000,
"状态": "进行中"
}
},
{
"fields": {
"客户名称": "飞书",
"负责人": [{"id": "ou_yyy"}],
"签约日期": 1675416243000,
"状态": "已完成"
}
}
]
}
Field value formats:
- User:
[{id: "ou_xxx"}](array of objects) - Date: millisecond timestamp
- Single select: string
- Multi-select: array of strings
Limit: at most 500 records
Scenario 3: Filter query (advanced filtering)
{
"action": "list",
"app_token": "S404b...",
"table_id": "tbl...",
"filter": {
"conjunction": "and",
"conditions": [
{
"field_name": "状态",
"operator": "is",
"value": ["进行中"]
},
{
"field_name": "截止日期",
"operator": "isLess",
"value": ["ExactDate", "1740441600000"]
}
]
},
"sort": [
{
"field_name": "截止日期",
"desc": false
}
]
}
filter description:
- Supports 10 operators (is/isNot/contains/isEmpty etc., see Appendix C)
- ⚠️ isEmpty/isNotEmpty must pass
value: [](although logically no value is needed, the API requires an empty array to be passed) - Date filtering can use
["Today"]、["ExactDate", "时间戳"]etc. sortcan specify multiple sort fields
🔍 Common errors and troubleshooting
| Error code | Error symptom | Root cause | Solution |
|---|---|---|---|
| 1254064 | DatetimeFieldConvFail | Date field format error | Must use a millisecond timestamp(e.g. 1772121600000), a string cannot be used ("2026-02-27", RFC3339) or a second-level timestamp |
| 1254068 | URLFieldConvFail | Hyperlink field format error | Must use an object {text: "显示文本", link: "URL"}, a string URL cannot be passed directly |
| 1254066 | UserFieldConvFail | User field format error or ID type mismatch | Must pass [{id: "ou_xxx"}], confirm user_id_type |
| 1254015 | Field types do not match | Field value format does not match the type | List the fields first, then construct the correct format according to the type |
| 1254104 | RecordAddOnceExceedLimit | Batch creation exceeds 500 records | Call in batches, each batch ≤ 500 |
| 1254291 | Write conflict | Concurrent write conflict | Call serially + delay 0.5-1 second |
| 1254303 | AttachPermNotAllow | The attachment has not been uploaded to the current table | Call the upload material API first |
| 1254045 | FieldNameNotFound | The field name does not exist | Check the field name (including spaces and case) |
📚 Appendix: Background Knowledge
A. Resource Hierarchy
App (多维表格应用)
├── Table (数据表) ×100
│ ├── Record (记录/行) ×20,000
│ ├── Field (字段/列) ×300
│ └── View (视图) ×200
└── Dashboard (仪表盘)
B. Filter Condition operator List
| operator | Meaning | Supported Fields | value Requirements |
|---|---|---|---|
is |
Equals | All | Single value |
isNot |
Not equals | Except dates | Single value |
contains |
Contains | Except dates | Multiple values allowed |
doesNotContain |
Does not contain | Except dates | Multiple values allowed |
isEmpty |
Is empty | All | Must be [] |
isNotEmpty |
Is not empty | All | Must be [] |
isGreater |
Greater than | Numbers, dates | Single value |
isGreaterEqual |
Greater than or equal to | Numbers (dates not supported) | Single value |
isLess |
Less than | Numbers, dates | Single value |
isLessEqual |
Less than or equal to | Numbers (dates not supported) | Single value |
Special values for date fields: ["Today"], ["Tomorrow"], ["ExactDate", "时间戳"] , etc. (for the full list, see examples.md)
C. Usage Limits
| Limit Item | Upper Limit |
|---|---|
| Data tables + dashboards | 100 (single App) |
| Number of records | 20,000 (single data table) |
| Number of fields | 300 (single data table) |
| Number of views | 200 (single data table) |
| Batch create/update/delete | 500 (single API call) |
| Cell text | 100,000 characters |
| Single/multiple select options | 20,000 (single field) |
| Cell attachments | 100 |
| Cell members | 1,000 |
D. Other Constraints
- Data tables synced from other data sourcesdo not support adding, deleting, or modifyingrecords
- Formula fields and lookup reference fields areread-only.
- Delete operationscannot be recovered
- View filter conditions use
field_id, and field.list must be called first to obtain them