@jinshuju/mcp 0.4.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -82,7 +82,7 @@
82
82
  "properties": {
83
83
  "field": {
84
84
  "type": "string",
85
- "description": "What to filter on; a field api_code for entries, or a form attribute such as `created_at` for form lists. Required unless the deprecated `api_code` or `trigger` is given instead."
85
+ "description": "What to filter on; a field api_code for entries, where `creator_id` (`eq` with a user id, at most once) and `serial_number` (`eq` / `any_in` / `none_in`, several intersected) also work, or a form attribute such as `created_at` for form lists. Required unless the deprecated `api_code` or `trigger` is given instead."
86
86
  },
87
87
  "api_code": {
88
88
  "type": "string",
@@ -120,7 +120,7 @@
120
120
  "description": "Comparison; `equal` / `not_equal` / `start` / `end` are aliases of `eq` / `ne` / `gte` / `lte`. Each field type accepts only some operators, and an unsupported one returns 400 listing the available ones."
121
121
  },
122
122
  "value": {
123
- "description": "Condition value; its type depends on the field and the operator: a two-element array `[min, max]` for `between` / `not_between`, `{\"unit\": \"day\", \"n\": 30}` for `within_last`, and no value for `null` / `not_null`."
123
+ "description": "Condition value; its type depends on the field and the operator: a two-element array `[min, max]` for `between` / `not_between` (`{\"<column api_code>\": [min, max]}` on a matrix or table field), `{\"unit\": \"day\", \"n\": 30}` for `within_last` (unit minute / day / week / month), no value for `null` / `not_null`, a choice api_code or label on a choice field (a cascading drop-down also takes a `level1-level2` path), and serial numbers of the related table for `any_in` / `none_in` on a relation field."
124
124
  }
125
125
  }
126
126
  },
@@ -209,7 +209,7 @@
209
209
  {
210
210
  "operationId": "getForm",
211
211
  "summary": "Show a form's structure",
212
- "description": "Show a form's structure\nReturns the form's name, `kind`, `scene`, public URL (`url`), description, field definitions and settings. Each element of `fields` is a single-key object `{ \"<api_code>\": {...} }`, in field order.\nAlso answers for a table or a quick payment form token; `kind` says which it is.\nThe following are included when the matching parameter is `true`:\n- `include_analytics`: each analysable field's definition carries `analytics`;\n- `include_theme`: carries `theme` (the form theme);\n- `include_field_rules`: carries `field_rules` (field display rules);\n- `include_extended_attributes`: carries `extended_attributes` (source-tracking links);\n- `include_transactions`: carries `transactions` (payment statistics) when the form is bound to a payment account.\nReturns schema \"FormDetail\" (see get_schema).\nThe api_code of each field in the returned fields is its key when reading and writing entries.",
212
+ "description": "Show a form's structure\nReturns the form's name, `kind`, `scene`, public URL (`url`), description, field definitions and settings. Each element of `fields` is a single-key object `{ \"<api_code>\": {...} }`, in field order.\nAlso answers for a table or a quick payment form token; `kind` says which it is.\nReturns schema \"FormDetail\" (see get_schema).\nThe api_code of each field in the returned fields is its key when reading and writing entries.",
213
213
  "tag": "Forms",
214
214
  "method": "get",
215
215
  "path": "/forms/{form_token}",
@@ -308,7 +308,7 @@
308
308
  {
309
309
  "operationId": "createForm",
310
310
  "summary": "Create a form",
311
- "description": "Create a form\nCreates a form from a list of field definitions and returns the full form structure. `name` and `fields` are required.\n- `scene` sets the form's scene; exam / evaluation question types (such as `SingleSelect`, `FillInBlank`) can only be used in the scenes that support them.\n- `layout=card` (paged) does not support PageBreak, Matrix*, TableField, GoodsField, ESignatureField, FormAssociation, MultipleBlanksField or any kind of Widget field.\n- The folder named by `folder_token` must be manageable and of kind form; otherwise returns 404 / 400 respectively.\n- `setting` accepts only whitelisted keys (see `FormSettingWriteInput`); `setting.notification_rules` replaces, as a whole, the notification rules created through the API.\n- The returned form structure carries `url` (the public fill URL).\nReturns schema \"Form\" (see get_schema).\nEach item of fields branches on type: get_schema(\"FieldInput\") maps each type to its schema in x-variants (TextField → \"TextFieldInput\", SingleSelect → \"SingleSelectInput\"), and get_schema on that name shows the properties that type accepts; do not guess field properties or schema names. For an exam or evaluation form use create_exam_form / create_evaluation_form.",
311
+ "description": "Create a form\nCreates a form from a list of field definitions and returns the full form structure.\nReturns schema \"Form\" (see get_schema).\nEach item of fields branches on type: get_schema(\"FieldInput\") maps each type to its schema in x-variants (TextField → \"TextFieldInput\", RadioButton → \"RadioButtonInput\"), and get_schema on that name shows the properties that type accepts; do not guess field properties or schema names. For an exam or evaluation form use create_exam_form / create_evaluation_form.",
312
312
  "tag": "Forms",
313
313
  "method": "post",
314
314
  "path": "/forms",
@@ -360,10 +360,8 @@
360
360
  "survey",
361
361
  "registry",
362
362
  "vote",
363
- "exam",
364
363
  "reservation",
365
364
  "customer_acquisition",
366
- "evaluation",
367
365
  "online_payment",
368
366
  "quickpay"
369
367
  ],
@@ -375,7 +373,7 @@
375
373
  "classic",
376
374
  "card"
377
375
  ],
378
- "description": "Layout; applies only when scene is survey / form / exam / evaluation; card is the paged layout"
376
+ "description": "Layout; applies only when scene is survey / form / exam / evaluation; card is the paged layout and cannot hold PageBreak / MultipleBlanksField / WidgetContact / WidgetVideo / WidgetButton"
379
377
  }
380
378
  },
381
379
  "additionalProperties": false,
@@ -455,7 +453,7 @@
455
453
  },
456
454
  {
457
455
  "type": "object",
458
- "description": "A table column definition; type is limited to the column types a table supports\nBranches on type; get_schema shows each branch's own properties: TextAreaInput, RadioButtonInput, CheckBoxInput, BooleanFieldInput, MobileFieldInput, NumberFieldInput, DateTimeFieldInput, EmailFieldInput, 12 in all.",
456
+ "description": "A table column definition; type is limited to the column types a table supports\nBranches on type; get_schema shows each branch's own properties: TextAreaInput, RadioButtonInput, CheckBoxInput, BooleanFieldInput, MobileFieldInput, NumberFieldInput, DateTimeFieldInput, EmailFieldInput, 13 in all.",
459
457
  "required": [
460
458
  "type",
461
459
  "label"
@@ -475,7 +473,8 @@
475
473
  "LinkField",
476
474
  "AttachmentField",
477
475
  "FormulaField",
478
- "RelationField"
476
+ "RelationField",
477
+ "SequenceField"
479
478
  ]
480
479
  },
481
480
  "label": {
@@ -1082,7 +1081,7 @@
1082
1081
  {
1083
1082
  "operationId": "checkFormFieldData",
1084
1083
  "summary": "Check whether fields already hold data",
1085
- "description": "Check whether fields already hold data\nUse before deleting a field or choice: checks in batch whether fields (or single choices of a field) already have submitted entries. Deleting a field or choice that still has entries deletes those entries with it, and they cannot be recovered.\nMatches the check the web editor runs before deleting.\n- Put every deletion target of one edit in the `checks` of a single call (at most 100, may span several fields); `results` matches `checks` one to one, in order.\n- When a target cannot be checked (for example, the field does not exist), its row returns `unavailable` with the reason; the other targets return as usual.\n- Returns 400 when `checks` is missing, empty, over 100, not a JSON array, or has an item that is not an object.\nReturns schema \"FieldDataCheckResponse\" (see get_schema).",
1084
+ "description": "Check whether fields already hold data\nUse before deleting a field or choice: checks in batch whether fields (or single choices of a field) already have submitted entries. Deleting a field or choice that still has entries deletes those entries with it, and they cannot be recovered.\nMatches the check the web editor runs before deleting.\n- Put every deletion target of one edit in the `checks` of a single call (at most 100, may span several fields); `results` matches `checks` one to one, in order.\n- When a target cannot be checked (the field or the `parent_field` column does not exist, or `choice_value` matches nothing of the kind `choice_type` names, or names more than one), its row returns `unavailable` with the reason; the other targets return as usual.\n- Returns 400 when `checks` is missing, empty, over 100, not a JSON array, or has an item that is not an object.\nReturns schema \"FieldDataCheckResponse\" (see get_schema).",
1086
1085
  "tag": "Forms",
1087
1086
  "method": "get",
1088
1087
  "path": "/forms/{form_token}/fields/check",
@@ -1130,14 +1129,15 @@
1130
1129
  "properties": {
1131
1130
  "field_api_code": {
1132
1131
  "type": "string",
1133
- "description": "api_code of the field to check; to check one column of a table / matrix field, that column's api_code, with `parent_field` set"
1132
+ "description": "api_code of the field to check; for a column of a table / matrix field, the table / matrix field's api_code"
1134
1133
  },
1135
1134
  "choice_value": {
1136
1135
  "type": "string",
1137
- "description": "api_code of one choice to check; omitted, checks whether the whole field has any data"
1136
+ "description": "The choice to check, by its value or its name as GET /forms/{form_token} shows them; omitted, checks whether the whole field has any data"
1138
1137
  },
1139
1138
  "choice_type": {
1140
1139
  "type": "string",
1140
+ "default": "choice",
1141
1141
  "enum": [
1142
1142
  "choice",
1143
1143
  "statement",
@@ -1147,11 +1147,11 @@
1147
1147
  "level_3",
1148
1148
  "level_4"
1149
1149
  ],
1150
- "description": "What `choice_value` names, `choice` by default; `statement` / `dimension` for matrix fields, `level_1` to `level_4` for cascading drop-downs"
1150
+ "description": "What `choice_value` names; `statement` for a matrix row, `dimension` for a matrix, table or multiple-blank column, `level_1` to `level_4` for a cascading drop-down level"
1151
1151
  },
1152
1152
  "parent_field": {
1153
1153
  "type": "string",
1154
- "description": "api_code of the parent field when checking one column of a matrix / table field"
1154
+ "description": "api_code of the column, when checking a choice inside one column of a table / matrix field"
1155
1155
  },
1156
1156
  "check_extended_text": {
1157
1157
  "type": "boolean",
@@ -1193,7 +1193,7 @@
1193
1193
  {
1194
1194
  "operationId": "previewFormFieldTypeChange",
1195
1195
  "summary": "Preview a field type change",
1196
- "description": "Preview a field type change\nUse before changing a field's type (the field's `type` in PATCH /forms/{form_token}): changes no data, and counts, from the field's current entries, how many would be kept and how many cleared after the conversion.\nThe conversion happens on the original field (api_code and data column unchanged), so only entry data is affected; matches the preview the web editor shows before converting.\n- Put every conversion of one edit in the `checks` of a single call (at most 20); `results` matches `checks` one to one, in order.\n- `supported=false` means the field cannot be converted to the target type, and the actual edit is refused too.\n- When converting multi-line text to a choice field such as single choice / multiple choice, also returns `choice_count`, the number of choices that would be generated from existing entries, and `choice_limit_exceeded`, whether that exceeds the choice limit (when it does, the conversion is refused rather than truncated).\n- When an item cannot be previewed (the field does not exist, `target_type` is not a type available to this form, etc.), its row returns `unavailable` with the reason; the other items return as usual.\n- Returns 400 when `checks` is missing, empty, over 20, not a JSON array, or has an item that is not an object.\nReturns schema \"FieldTypeChangePreviewResponse\" (see get_schema).",
1196
+ "description": "Preview a field type change\nUse before changing a field's type (the field's `type` in PATCH /forms/{form_token}): changes no data, and counts, from the field's current entries, how many would be kept and how many cleared after the conversion; matches the preview the web editor shows before converting.\n- Put every conversion of one edit in the `checks` of a single call.\n- `supported: false`, or `choice_limit_exceeded: true` when multi-line text becomes a choice field, means the edit itself would be refused.\nReturns schema \"FieldTypeChangePreviewResponse\" (see get_schema).",
1197
1197
  "tag": "Forms",
1198
1198
  "method": "get",
1199
1199
  "path": "/forms/{form_token}/fields/preview_convert",
@@ -1287,7 +1287,7 @@
1287
1287
  {
1288
1288
  "operationId": "updateFormTheme",
1289
1289
  "summary": "Update a form's theme",
1290
- "description": "Update a form's theme\nPartially updates the form's theme (colors, background, header image, typography, form container, submit button); PUT is accepted too.\n- The request body must contain at least one of primary_color / secondary_color / wallpaper / header / typography / form_container / submit_button (`generate_header_image` is turned into header.header_image_url, so it counts too); otherwise 400.\n- Header image source precedence: header_image_upload_token > header_image_base64 > header_image_url > header_image_attachment_id; when a header image is set and header.type is not given, header.type is set to image.\n- Background image source precedence: background_image_upload_token > background_image_url > background_image_attachment_id. Setting or removing the background image also removes the preset background image that comes with the theme template; the background color is kept.\n- `header_image_attachment_id` / `background_image_attachment_id` take the `attachment_id` returned by \"Upload a form image\" (image_type header / wallpaper); pass an empty string `\"\"` to remove the current image.\n- `header.carousel_images` replaces the carousel images as a whole: at most 5, not empty; each item gives one of image_upload_token / image_url / attachment_id, and an attachment_id must be a carousel image the form already has; when it is passed and header.type is not given, header.type is set to carousel.\n- Keys in `text_style` and `typography.*` use underscores (e.g. font_size); the server converts them to hyphenated CSS keys and merges them into the existing styles; the response uses the hyphenated keys.\n- `generate_header_image` has AI generate a header image and consumes AI points; returns 402 when points are insufficient, 400 when generation fails.\n- An image upload_token is the `form_image_token` used by \"Upload a form image\"; the image purpose it records must match (header / wallpaper / carousel), and its upload must be complete.",
1290
+ "description": "Update a form's theme\nPartially updates the form's theme: colors, background, header image, typography, form container and submit button.",
1291
1291
  "tag": "Form Settings",
1292
1292
  "method": "patch",
1293
1293
  "path": "/forms/{form_token}/theme",
@@ -1455,7 +1455,7 @@
1455
1455
  "properties": {
1456
1456
  "field": {
1457
1457
  "type": "string",
1458
- "description": "What to filter on; a field api_code for entries, or a form attribute such as `created_at` for form lists. Required unless the deprecated `api_code` or `trigger` is given instead."
1458
+ "description": "What to filter on; a field api_code for entries, where `creator_id` (`eq` with a user id, at most once) and `serial_number` (`eq` / `any_in` / `none_in`, several intersected) also work, or a form attribute such as `created_at` for form lists. Required unless the deprecated `api_code` or `trigger` is given instead."
1459
1459
  },
1460
1460
  "api_code": {
1461
1461
  "type": "string",
@@ -1493,7 +1493,7 @@
1493
1493
  "description": "Comparison; `equal` / `not_equal` / `start` / `end` are aliases of `eq` / `ne` / `gte` / `lte`. Each field type accepts only some operators, and an unsupported one returns 400 listing the available ones."
1494
1494
  },
1495
1495
  "value": {
1496
- "description": "Condition value; its type depends on the field and the operator: a two-element array `[min, max]` for `between` / `not_between`, `{\"unit\": \"day\", \"n\": 30}` for `within_last`, and no value for `null` / `not_null`."
1496
+ "description": "Condition value; its type depends on the field and the operator: a two-element array `[min, max]` for `between` / `not_between` (`{\"<column api_code>\": [min, max]}` on a matrix or table field), `{\"unit\": \"day\", \"n\": 30}` for `within_last` (unit minute / day / week / month), no value for `null` / `not_null`, a choice api_code or label on a choice field (a cascading drop-down also takes a `level1-level2` path), and serial numbers of the related table for `any_in` / `none_in` on a relation field."
1497
1497
  }
1498
1498
  }
1499
1499
  },
@@ -1509,7 +1509,7 @@
1509
1509
  }
1510
1510
  ]
1511
1511
  ],
1512
- "description": "Filters, an array of ScopeCondition objects; conditions are combined with AND.\n- Each field type accepts only some of the operators; an unsupported one returns 400 listing the available operators.\n- For choice fields (single choice / multiple choice / drop-down / cascading drop-down), `value` can be a choice api_code or a choice label; a cascading drop-down also accepts a `level1-level2` path.\n- For `between` / `not_between`, `value` is a two-element array `[min, max]`; matrix / table fields need `{\"<column api_code>\": [min, max]}`.\n- `within_last` works only on date fields; `value` looks like `{\"unit\":\"day\",\"n\":30}` (unit can be minute / day / week / month).\n- `creator_id` is a special field that filters by submitter with `eq` (the value is a user id), and can appear only once.\n- `serial_number` is a special field that filters by serial number with `eq` / `any_in`; several conditions are intersected.\n- For a relation field (RelationField), the `value` of `any_in` / `none_in` is serial numbers of entries in the related table; returns 400 when a serial number does not exist.\n- With a `created_at` condition, results are sorted by creation time instead.\n- To find entries whose multiple-choice field contains a choice, use `any_in` (`none_in` to exclude); `eq` is not \"contains\": it matches only entries with exactly the same set of choices."
1512
+ "description": "Filters, an array of ScopeCondition objects; conditions are combined with AND. Besides field api_codes, `creator_id` and `serial_number` can be filtered on.\n- To find entries whose multiple-choice field contains a choice, use `any_in` (`none_in` to exclude); `eq` is not \"contains\": it matches only entries with exactly the same set of choices."
1513
1513
  },
1514
1514
  "keyword": {
1515
1515
  "type": "string",
@@ -1550,7 +1550,7 @@
1550
1550
  }
1551
1551
  ]
1552
1552
  ],
1553
- "description": "Sort rules, an array of SortRule objects, applied in order, with ascending serial number appended automatically at the end.\nOnly sortable fields are allowed; otherwise returns 400 listing the sortable fields. With `sort`, `next` becomes a row offset.\n"
1553
+ "description": "Sort rules, an array of SortRule objects, applied in order, with ascending serial number appended automatically at the end.\nOnly sortable fields are allowed; otherwise returns 400 listing the sortable fields. With `sort`, `next` becomes a row offset. Without it, entries come by serial number, or by creation time when `filters` has a `created_at` condition.\n"
1554
1554
  },
1555
1555
  "created_at": {
1556
1556
  "type": "string",
@@ -1747,7 +1747,7 @@
1747
1747
  },
1748
1748
  "entry": {
1749
1749
  "type": "object",
1750
- "description": "Field values for writing an entry, keyed by field api_code or api_code_alias. Unknown keys and non-writable fields (signature, formula) are ignored.\nChoice fields take the choice api_code or the choice label; see the table below for cascading drop-downs and choice extra text. Number fields accept a number or a numeric string.\n\n| Field | How to write |\n|---|---|\n| Single-line / multi-line text, name, mobile, email, phone, website, ID card | String |\n| Single choice, drop-down | `\"choice api_code\"` or `\"choice label\"`; extra text via `\"<api_code>_extended_text\": {\"<choice>\": \"extra text\"}`, \"Other\" text via `\"<api_code>_other\": \"...\"` |\n| Multiple choice | Array, items as above |\n| Image single choice / image multiple choice | Choice api_code (string / array) |\n| Cascading drop-down | `{\"level_1\": \"...\", \"level_2\": \"...\"}` (api_code or label) |\n| Number, rating, NPS | Number |\n| Yes/No | Boolean |\n| Date | `\"2012-12-25\"` or `\"2012-12-25 12:13:15\"` (Beijing time, UTC+8) |\n| Time | `{\"hour\": \"12\", \"minute\": \"15\"}` |\n| Address | `{\"province\",\"city\",\"district\",\"street\"}` |\n| Geolocation | `{\"longitude\",\"latitude\",\"address\"}` |\n| File upload (multiple allowed) | Array; each item is one of: the id of an uploaded attachment; the download URL of an attachment already on this form (to keep it); `{\"base64\": \"...\", \"file_name\": \"a.png\", \"content_type\": \"image/png\"}` (≤ 5MB; `base64` may also be a data URI); `{\"attachment_token\": \"...\"}` (pre-upload token) |\n| Goods | `[{\"value\": \"goods item api_code\", \"number\": 2, \"specification\": {\"spec dimension\": \"option\"}?}]` |\n| Matrix fill-in / matrix scale | `{\"<statement api_code>\": {\"<column api_code>\": value}}` |\n| Matrix single choice | `{\"<statement api_code>\": \"choice api_code\"}` |\n| Table | `[{\"<column api_code>\": value}, ...]`; attachment columns are written like file upload |\n| Inline blanks | `{\"<sub-field api_code>\": \"...\"}` |\n| Ranking | Ordered array `[\"choice api_code\", ...]` |\n| Form association | token / id of the associated entry, or a display value matched by the association key (an array for multiple association keys) |\n| Reservation | `[{\"api_code\": \"item\", \"scheduled_at\": \"2021-04-26\", \"end_at\"?: \"...\", \"number\": 1}]` |\n| Color mark | `\"color_mark\": \"<color api_code or name>\"` |\n| International mobile number | Also pass `\"<api_code>_country_id\"` / `\"<api_code>_country_code\"` |\n",
1750
+ "description": "Field values for writing an entry, keyed by field api_code or api_code_alias. Unknown keys and non-writable fields (signature, formula) are ignored.\nChoice fields take the choice api_code or the choice label; see the table below for cascading drop-downs and choice extra text. Number fields accept a number or a numeric string.\n\n| Field | How to write |\n|---|---|\n| Single-line / multi-line text, name, mobile, email, phone, website, ID card | String |\n| Single choice, drop-down | `\"choice api_code\"` or `\"choice label\"`; extra text via `\"<api_code>_extended_text\": {\"<choice>\": \"extra text\"}`, \"Other\" text via `\"<api_code>_other\": \"...\"` |\n| Multiple choice | Array, items as above |\n| Image single choice / image multiple choice | Choice api_code (string / array) |\n| Cascading drop-down | `{\"level_1\": \"...\", \"level_2\": \"...\"}` (api_code or label) |\n| Number, rating, NPS | Number |\n| Yes/No | Boolean |\n| Date | `\"2012-12-25\"` or `\"2012-12-25 12:13:15\"` (Beijing time, UTC+8) |\n| Time | `{\"hour\": \"12\", \"minute\": \"15\"}` |\n| Address | `{\"province\",\"city\",\"district\",\"street\"}` |\n| Geolocation | `{\"longitude\",\"latitude\",\"address\"}` |\n| File upload (multiple allowed) | Array; each item is one of: the id of an uploaded attachment; the download URL of an attachment already on this form (to keep it); `{\"base64\": \"...\", \"file_name\": \"a.png\", \"content_type\": \"image/png\"}` (≤ 5MB; `base64` may also be a data URI) |\n| Goods | `[{\"value\": \"goods item api_code\", \"number\": 2, \"specification\": {\"spec dimension\": \"option\"}?}]` |\n| Matrix fill-in / matrix scale | `{\"<statement api_code>\": {\"<column api_code>\": value}}` |\n| Matrix single choice | `{\"<statement api_code>\": \"choice api_code\"}` |\n| Table | `[{\"<column api_code>\": value}, ...]`; attachment columns are written like file upload |\n| Inline blanks | `{\"<sub-field api_code>\": \"...\"}` |\n| Ranking | Ordered array `[\"choice api_code\", ...]` |\n| Form association | token / id of the associated entry, or a display value matched by the association key (an array for multiple association keys) |\n| Reservation | `[{\"api_code\": \"item\", \"scheduled_at\": \"2021-04-26\", \"end_at\"?: \"...\", \"number\": 1}]` |\n| Color mark | `\"color_mark\": \"<color api_code or name>\"` |\n| International mobile number | Also pass `\"<api_code>_country_id\"` / `\"<api_code>_country_code\"` |\n",
1751
1751
  "additionalProperties": true,
1752
1752
  "examples": [
1753
1753
  {
@@ -1832,7 +1832,7 @@
1832
1832
  },
1833
1833
  "entry": {
1834
1834
  "type": "object",
1835
- "description": "Field values for writing an entry, keyed by field api_code or api_code_alias. Unknown keys and non-writable fields (signature, formula) are ignored.\nChoice fields take the choice api_code or the choice label; see the table below for cascading drop-downs and choice extra text. Number fields accept a number or a numeric string.\n\n| Field | How to write |\n|---|---|\n| Single-line / multi-line text, name, mobile, email, phone, website, ID card | String |\n| Single choice, drop-down | `\"choice api_code\"` or `\"choice label\"`; extra text via `\"<api_code>_extended_text\": {\"<choice>\": \"extra text\"}`, \"Other\" text via `\"<api_code>_other\": \"...\"` |\n| Multiple choice | Array, items as above |\n| Image single choice / image multiple choice | Choice api_code (string / array) |\n| Cascading drop-down | `{\"level_1\": \"...\", \"level_2\": \"...\"}` (api_code or label) |\n| Number, rating, NPS | Number |\n| Yes/No | Boolean |\n| Date | `\"2012-12-25\"` or `\"2012-12-25 12:13:15\"` (Beijing time, UTC+8) |\n| Time | `{\"hour\": \"12\", \"minute\": \"15\"}` |\n| Address | `{\"province\",\"city\",\"district\",\"street\"}` |\n| Geolocation | `{\"longitude\",\"latitude\",\"address\"}` |\n| File upload (multiple allowed) | Array; each item is one of: the id of an uploaded attachment; the download URL of an attachment already on this form (to keep it); `{\"base64\": \"...\", \"file_name\": \"a.png\", \"content_type\": \"image/png\"}` (≤ 5MB; `base64` may also be a data URI); `{\"attachment_token\": \"...\"}` (pre-upload token) |\n| Goods | `[{\"value\": \"goods item api_code\", \"number\": 2, \"specification\": {\"spec dimension\": \"option\"}?}]` |\n| Matrix fill-in / matrix scale | `{\"<statement api_code>\": {\"<column api_code>\": value}}` |\n| Matrix single choice | `{\"<statement api_code>\": \"choice api_code\"}` |\n| Table | `[{\"<column api_code>\": value}, ...]`; attachment columns are written like file upload |\n| Inline blanks | `{\"<sub-field api_code>\": \"...\"}` |\n| Ranking | Ordered array `[\"choice api_code\", ...]` |\n| Form association | token / id of the associated entry, or a display value matched by the association key (an array for multiple association keys) |\n| Reservation | `[{\"api_code\": \"item\", \"scheduled_at\": \"2021-04-26\", \"end_at\"?: \"...\", \"number\": 1}]` |\n| Color mark | `\"color_mark\": \"<color api_code or name>\"` |\n| International mobile number | Also pass `\"<api_code>_country_id\"` / `\"<api_code>_country_code\"` |\n",
1835
+ "description": "Field values for writing an entry, keyed by field api_code or api_code_alias. Unknown keys and non-writable fields (signature, formula) are ignored.\nChoice fields take the choice api_code or the choice label; see the table below for cascading drop-downs and choice extra text. Number fields accept a number or a numeric string.\n\n| Field | How to write |\n|---|---|\n| Single-line / multi-line text, name, mobile, email, phone, website, ID card | String |\n| Single choice, drop-down | `\"choice api_code\"` or `\"choice label\"`; extra text via `\"<api_code>_extended_text\": {\"<choice>\": \"extra text\"}`, \"Other\" text via `\"<api_code>_other\": \"...\"` |\n| Multiple choice | Array, items as above |\n| Image single choice / image multiple choice | Choice api_code (string / array) |\n| Cascading drop-down | `{\"level_1\": \"...\", \"level_2\": \"...\"}` (api_code or label) |\n| Number, rating, NPS | Number |\n| Yes/No | Boolean |\n| Date | `\"2012-12-25\"` or `\"2012-12-25 12:13:15\"` (Beijing time, UTC+8) |\n| Time | `{\"hour\": \"12\", \"minute\": \"15\"}` |\n| Address | `{\"province\",\"city\",\"district\",\"street\"}` |\n| Geolocation | `{\"longitude\",\"latitude\",\"address\"}` |\n| File upload (multiple allowed) | Array; each item is one of: the id of an uploaded attachment; the download URL of an attachment already on this form (to keep it); `{\"base64\": \"...\", \"file_name\": \"a.png\", \"content_type\": \"image/png\"}` (≤ 5MB; `base64` may also be a data URI) |\n| Goods | `[{\"value\": \"goods item api_code\", \"number\": 2, \"specification\": {\"spec dimension\": \"option\"}?}]` |\n| Matrix fill-in / matrix scale | `{\"<statement api_code>\": {\"<column api_code>\": value}}` |\n| Matrix single choice | `{\"<statement api_code>\": \"choice api_code\"}` |\n| Table | `[{\"<column api_code>\": value}, ...]`; attachment columns are written like file upload |\n| Inline blanks | `{\"<sub-field api_code>\": \"...\"}` |\n| Ranking | Ordered array `[\"choice api_code\", ...]` |\n| Form association | token / id of the associated entry, or a display value matched by the association key (an array for multiple association keys) |\n| Reservation | `[{\"api_code\": \"item\", \"scheduled_at\": \"2021-04-26\", \"end_at\"?: \"...\", \"number\": 1}]` |\n| Color mark | `\"color_mark\": \"<color api_code or name>\"` |\n| International mobile number | Also pass `\"<api_code>_country_id\"` / `\"<api_code>_country_code\"` |\n",
1836
1836
  "additionalProperties": true,
1837
1837
  "examples": [
1838
1838
  {
@@ -1976,7 +1976,7 @@
1976
1976
  "maxItems": 200,
1977
1977
  "items": {
1978
1978
  "type": "object",
1979
- "description": "Field values for writing an entry, keyed by field api_code or api_code_alias. Unknown keys and non-writable fields (signature, formula) are ignored.\nChoice fields take the choice api_code or the choice label; see the table below for cascading drop-downs and choice extra text. Number fields accept a number or a numeric string.\n\n| Field | How to write |\n|---|---|\n| Single-line / multi-line text, name, mobile, email, phone, website, ID card | String |\n| Single choice, drop-down | `\"choice api_code\"` or `\"choice label\"`; extra text via `\"<api_code>_extended_text\": {\"<choice>\": \"extra text\"}`, \"Other\" text via `\"<api_code>_other\": \"...\"` |\n| Multiple choice | Array, items as above |\n| Image single choice / image multiple choice | Choice api_code (string / array) |\n| Cascading drop-down | `{\"level_1\": \"...\", \"level_2\": \"...\"}` (api_code or label) |\n| Number, rating, NPS | Number |\n| Yes/No | Boolean |\n| Date | `\"2012-12-25\"` or `\"2012-12-25 12:13:15\"` (Beijing time, UTC+8) |\n| Time | `{\"hour\": \"12\", \"minute\": \"15\"}` |\n| Address | `{\"province\",\"city\",\"district\",\"street\"}` |\n| Geolocation | `{\"longitude\",\"latitude\",\"address\"}` |\n| File upload (multiple allowed) | Array; each item is one of: the id of an uploaded attachment; the download URL of an attachment already on this form (to keep it); `{\"base64\": \"...\", \"file_name\": \"a.png\", \"content_type\": \"image/png\"}` (≤ 5MB; `base64` may also be a data URI); `{\"attachment_token\": \"...\"}` (pre-upload token) |\n| Goods | `[{\"value\": \"goods item api_code\", \"number\": 2, \"specification\": {\"spec dimension\": \"option\"}?}]` |\n| Matrix fill-in / matrix scale | `{\"<statement api_code>\": {\"<column api_code>\": value}}` |\n| Matrix single choice | `{\"<statement api_code>\": \"choice api_code\"}` |\n| Table | `[{\"<column api_code>\": value}, ...]`; attachment columns are written like file upload |\n| Inline blanks | `{\"<sub-field api_code>\": \"...\"}` |\n| Ranking | Ordered array `[\"choice api_code\", ...]` |\n| Form association | token / id of the associated entry, or a display value matched by the association key (an array for multiple association keys) |\n| Reservation | `[{\"api_code\": \"item\", \"scheduled_at\": \"2021-04-26\", \"end_at\"?: \"...\", \"number\": 1}]` |\n| Color mark | `\"color_mark\": \"<color api_code or name>\"` |\n| International mobile number | Also pass `\"<api_code>_country_id\"` / `\"<api_code>_country_code\"` |\n",
1979
+ "description": "Field values for writing an entry, keyed by field api_code or api_code_alias. Unknown keys and non-writable fields (signature, formula) are ignored.\nChoice fields take the choice api_code or the choice label; see the table below for cascading drop-downs and choice extra text. Number fields accept a number or a numeric string.\n\n| Field | How to write |\n|---|---|\n| Single-line / multi-line text, name, mobile, email, phone, website, ID card | String |\n| Single choice, drop-down | `\"choice api_code\"` or `\"choice label\"`; extra text via `\"<api_code>_extended_text\": {\"<choice>\": \"extra text\"}`, \"Other\" text via `\"<api_code>_other\": \"...\"` |\n| Multiple choice | Array, items as above |\n| Image single choice / image multiple choice | Choice api_code (string / array) |\n| Cascading drop-down | `{\"level_1\": \"...\", \"level_2\": \"...\"}` (api_code or label) |\n| Number, rating, NPS | Number |\n| Yes/No | Boolean |\n| Date | `\"2012-12-25\"` or `\"2012-12-25 12:13:15\"` (Beijing time, UTC+8) |\n| Time | `{\"hour\": \"12\", \"minute\": \"15\"}` |\n| Address | `{\"province\",\"city\",\"district\",\"street\"}` |\n| Geolocation | `{\"longitude\",\"latitude\",\"address\"}` |\n| File upload (multiple allowed) | Array; each item is one of: the id of an uploaded attachment; the download URL of an attachment already on this form (to keep it); `{\"base64\": \"...\", \"file_name\": \"a.png\", \"content_type\": \"image/png\"}` (≤ 5MB; `base64` may also be a data URI) |\n| Goods | `[{\"value\": \"goods item api_code\", \"number\": 2, \"specification\": {\"spec dimension\": \"option\"}?}]` |\n| Matrix fill-in / matrix scale | `{\"<statement api_code>\": {\"<column api_code>\": value}}` |\n| Matrix single choice | `{\"<statement api_code>\": \"choice api_code\"}` |\n| Table | `[{\"<column api_code>\": value}, ...]`; attachment columns are written like file upload |\n| Inline blanks | `{\"<sub-field api_code>\": \"...\"}` |\n| Ranking | Ordered array `[\"choice api_code\", ...]` |\n| Form association | token / id of the associated entry, or a display value matched by the association key (an array for multiple association keys) |\n| Reservation | `[{\"api_code\": \"item\", \"scheduled_at\": \"2021-04-26\", \"end_at\"?: \"...\", \"number\": 1}]` |\n| Color mark | `\"color_mark\": \"<color api_code or name>\"` |\n| International mobile number | Also pass `\"<api_code>_country_id\"` / `\"<api_code>_country_code\"` |\n",
1980
1980
  "additionalProperties": true,
1981
1981
  "examples": [
1982
1982
  {
@@ -2097,7 +2097,7 @@
2097
2097
  },
2098
2098
  "entry": {
2099
2099
  "type": "object",
2100
- "description": "Field values for writing an entry, keyed by field api_code or api_code_alias. Unknown keys and non-writable fields (signature, formula) are ignored.\nChoice fields take the choice api_code or the choice label; see the table below for cascading drop-downs and choice extra text. Number fields accept a number or a numeric string.\n\n| Field | How to write |\n|---|---|\n| Single-line / multi-line text, name, mobile, email, phone, website, ID card | String |\n| Single choice, drop-down | `\"choice api_code\"` or `\"choice label\"`; extra text via `\"<api_code>_extended_text\": {\"<choice>\": \"extra text\"}`, \"Other\" text via `\"<api_code>_other\": \"...\"` |\n| Multiple choice | Array, items as above |\n| Image single choice / image multiple choice | Choice api_code (string / array) |\n| Cascading drop-down | `{\"level_1\": \"...\", \"level_2\": \"...\"}` (api_code or label) |\n| Number, rating, NPS | Number |\n| Yes/No | Boolean |\n| Date | `\"2012-12-25\"` or `\"2012-12-25 12:13:15\"` (Beijing time, UTC+8) |\n| Time | `{\"hour\": \"12\", \"minute\": \"15\"}` |\n| Address | `{\"province\",\"city\",\"district\",\"street\"}` |\n| Geolocation | `{\"longitude\",\"latitude\",\"address\"}` |\n| File upload (multiple allowed) | Array; each item is one of: the id of an uploaded attachment; the download URL of an attachment already on this form (to keep it); `{\"base64\": \"...\", \"file_name\": \"a.png\", \"content_type\": \"image/png\"}` (≤ 5MB; `base64` may also be a data URI); `{\"attachment_token\": \"...\"}` (pre-upload token) |\n| Goods | `[{\"value\": \"goods item api_code\", \"number\": 2, \"specification\": {\"spec dimension\": \"option\"}?}]` |\n| Matrix fill-in / matrix scale | `{\"<statement api_code>\": {\"<column api_code>\": value}}` |\n| Matrix single choice | `{\"<statement api_code>\": \"choice api_code\"}` |\n| Table | `[{\"<column api_code>\": value}, ...]`; attachment columns are written like file upload |\n| Inline blanks | `{\"<sub-field api_code>\": \"...\"}` |\n| Ranking | Ordered array `[\"choice api_code\", ...]` |\n| Form association | token / id of the associated entry, or a display value matched by the association key (an array for multiple association keys) |\n| Reservation | `[{\"api_code\": \"item\", \"scheduled_at\": \"2021-04-26\", \"end_at\"?: \"...\", \"number\": 1}]` |\n| Color mark | `\"color_mark\": \"<color api_code or name>\"` |\n| International mobile number | Also pass `\"<api_code>_country_id\"` / `\"<api_code>_country_code\"` |\n",
2100
+ "description": "Field values for writing an entry, keyed by field api_code or api_code_alias. Unknown keys and non-writable fields (signature, formula) are ignored.\nChoice fields take the choice api_code or the choice label; see the table below for cascading drop-downs and choice extra text. Number fields accept a number or a numeric string.\n\n| Field | How to write |\n|---|---|\n| Single-line / multi-line text, name, mobile, email, phone, website, ID card | String |\n| Single choice, drop-down | `\"choice api_code\"` or `\"choice label\"`; extra text via `\"<api_code>_extended_text\": {\"<choice>\": \"extra text\"}`, \"Other\" text via `\"<api_code>_other\": \"...\"` |\n| Multiple choice | Array, items as above |\n| Image single choice / image multiple choice | Choice api_code (string / array) |\n| Cascading drop-down | `{\"level_1\": \"...\", \"level_2\": \"...\"}` (api_code or label) |\n| Number, rating, NPS | Number |\n| Yes/No | Boolean |\n| Date | `\"2012-12-25\"` or `\"2012-12-25 12:13:15\"` (Beijing time, UTC+8) |\n| Time | `{\"hour\": \"12\", \"minute\": \"15\"}` |\n| Address | `{\"province\",\"city\",\"district\",\"street\"}` |\n| Geolocation | `{\"longitude\",\"latitude\",\"address\"}` |\n| File upload (multiple allowed) | Array; each item is one of: the id of an uploaded attachment; the download URL of an attachment already on this form (to keep it); `{\"base64\": \"...\", \"file_name\": \"a.png\", \"content_type\": \"image/png\"}` (≤ 5MB; `base64` may also be a data URI) |\n| Goods | `[{\"value\": \"goods item api_code\", \"number\": 2, \"specification\": {\"spec dimension\": \"option\"}?}]` |\n| Matrix fill-in / matrix scale | `{\"<statement api_code>\": {\"<column api_code>\": value}}` |\n| Matrix single choice | `{\"<statement api_code>\": \"choice api_code\"}` |\n| Table | `[{\"<column api_code>\": value}, ...]`; attachment columns are written like file upload |\n| Inline blanks | `{\"<sub-field api_code>\": \"...\"}` |\n| Ranking | Ordered array `[\"choice api_code\", ...]` |\n| Form association | token / id of the associated entry, or a display value matched by the association key (an array for multiple association keys) |\n| Reservation | `[{\"api_code\": \"item\", \"scheduled_at\": \"2021-04-26\", \"end_at\"?: \"...\", \"number\": 1}]` |\n| Color mark | `\"color_mark\": \"<color api_code or name>\"` |\n| International mobile number | Also pass `\"<api_code>_country_id\"` / `\"<api_code>_country_code\"` |\n",
2101
2101
  "additionalProperties": true,
2102
2102
  "examples": [
2103
2103
  {
@@ -2176,7 +2176,7 @@
2176
2176
  {
2177
2177
  "operationId": "aggregateEntries",
2178
2178
  "summary": "Aggregate entries",
2179
- "description": "Aggregate entries\nAggregates whole columns on the server over the entries matching the filters (sum, average, count, percentiles, etc.), optionally grouped by 1 to 2 fields. The response size depends only on the number of metrics and groups, not on the amount of data.\n- `metrics` is required, 1 to 20 items; the functions each field takes are in the `analytics.agg_funcs` returned by `GET /forms/{form_token}?include_analytics=true`.\n- `dimensions` is optional, at most 2 items; only fields whose `analytics.groupable` is true (single-value choice fields and date fields) can be grouped by, and a date field must specify `bucket`.\n- Without `dimensions`, `rows` has a single row; when grouped, one row per group, at most `limit` groups; `row_count` is the total number of groups, and `truncated` is true when there are more.\n- `filters` / `keyword` are the same as for the entry list, but `creator_id`, `serial_number` and association field conditions are not supported (returns 400).\n- Returns 400 when a field does not exist or is not readable by the caller, or a function or grouping does not apply to the field, and says which fields / functions / groupings are available.\nReturns schema \"EntryAggregateResponse\" (see get_schema).",
2179
+ "description": "Aggregate entries\nAggregates whole columns on the server over the entries matching the filters (sum, average, count, percentiles, etc.), optionally grouped by 1 to 2 fields. The response size depends only on the number of metrics and groups, not on the amount of data.\n- `filters` / `keyword` work as in the entry list, except that `creator_id`, `serial_number` and association field conditions are not supported.\nReturns schema \"EntryAggregateResponse\" (see get_schema).",
2180
2180
  "tag": "Entries",
2181
2181
  "method": "get",
2182
2182
  "path": "/forms/{form_token}/entries/aggregate",
@@ -2286,7 +2286,7 @@
2286
2286
  }
2287
2287
  ]
2288
2288
  ],
2289
- "description": "Required. Metrics to compute, an array of 1 to 20 AggregateMetric objects; returns 400 when missing or empty.\nThe available functions depend on the field (the field's `analytics.agg_funcs` is authoritative):\n| Field | Functions |\n|---|---|\n| All fields | `count` `count_non_empty` `count_empty` |\n| Text | adds `count_unique` |\n| Number | adds `count_unique` `sum` `avg` `min` `max` `stddev` `median` `p25` `p75` `p90` |\n| Date | adds `count_unique` `min` `max` |\n"
2289
+ "description": "Required. Metrics to compute, an array of 1 to 20 AggregateMetric objects; returns 400 when missing or empty.\n`count` / `count_non_empty` / `count_empty` work on every field; the rest depend on its type (`sum`, `avg` and the percentiles on numbers), and a field's `analytics.agg_funcs` from `GET /forms/{form_token}?include_analytics=true` lists exactly what it takes.\n"
2290
2290
  },
2291
2291
  "dimensions": {
2292
2292
  "type": [
@@ -2325,7 +2325,7 @@
2325
2325
  }
2326
2326
  ]
2327
2327
  ],
2328
- "description": "Fields to group by, an array of at most 2 AggregateDimension objects.\nOnly fields whose `analytics.groupable` is true can be grouped by; a date field must have a `bucket` (`day` / `week` / `month`, in Beijing time, UTC+8), and a non-date field must not have a `bucket`.\n"
2328
+ "description": "Fields to group by, an array of at most 2 AggregateDimension objects.\nOnly fields whose `analytics.groupable` is true can be grouped by, such as single choice, multiple choice and date fields; a date field needs a `bucket`, in Beijing time (UTC+8).\n"
2329
2329
  },
2330
2330
  "limit": {
2331
2331
  "type": "integer",
@@ -2346,7 +2346,7 @@
2346
2346
  "properties": {
2347
2347
  "field": {
2348
2348
  "type": "string",
2349
- "description": "What to filter on; a field api_code for entries, or a form attribute such as `created_at` for form lists. Required unless the deprecated `api_code` or `trigger` is given instead."
2349
+ "description": "What to filter on; a field api_code for entries, where `creator_id` (`eq` with a user id, at most once) and `serial_number` (`eq` / `any_in` / `none_in`, several intersected) also work, or a form attribute such as `created_at` for form lists. Required unless the deprecated `api_code` or `trigger` is given instead."
2350
2350
  },
2351
2351
  "api_code": {
2352
2352
  "type": "string",
@@ -2384,7 +2384,7 @@
2384
2384
  "description": "Comparison; `equal` / `not_equal` / `start` / `end` are aliases of `eq` / `ne` / `gte` / `lte`. Each field type accepts only some operators, and an unsupported one returns 400 listing the available ones."
2385
2385
  },
2386
2386
  "value": {
2387
- "description": "Condition value; its type depends on the field and the operator: a two-element array `[min, max]` for `between` / `not_between`, `{\"unit\": \"day\", \"n\": 30}` for `within_last`, and no value for `null` / `not_null`."
2387
+ "description": "Condition value; its type depends on the field and the operator: a two-element array `[min, max]` for `between` / `not_between` (`{\"<column api_code>\": [min, max]}` on a matrix or table field), `{\"unit\": \"day\", \"n\": 30}` for `within_last` (unit minute / day / week / month), no value for `null` / `not_null`, a choice api_code or label on a choice field (a cascading drop-down also takes a `level1-level2` path), and serial numbers of the related table for `any_in` / `none_in` on a relation field."
2388
2388
  }
2389
2389
  }
2390
2390
  },
@@ -2400,7 +2400,7 @@
2400
2400
  }
2401
2401
  ]
2402
2402
  ],
2403
- "description": "Filters, an array of ScopeCondition objects; conditions are combined with AND.\n- Each field type accepts only some of the operators; an unsupported one returns 400 listing the available operators.\n- For choice fields (single choice / multiple choice / drop-down / cascading drop-down), `value` can be a choice api_code or a choice label; a cascading drop-down also accepts a `level1-level2` path.\n- For `between` / `not_between`, `value` is a two-element array `[min, max]`; matrix / table fields need `{\"<column api_code>\": [min, max]}`.\n- `within_last` works only on date fields; `value` looks like `{\"unit\":\"day\",\"n\":30}` (unit can be minute / day / week / month).\n- `creator_id` is a special field that filters by submitter with `eq` (the value is a user id), and can appear only once.\n- `serial_number` is a special field that filters by serial number with `eq` / `any_in`; several conditions are intersected.\n- For a relation field (RelationField), the `value` of `any_in` / `none_in` is serial numbers of entries in the related table; returns 400 when a serial number does not exist.\n- With a `created_at` condition, results are sorted by creation time instead.\n- To find entries whose multiple-choice field contains a choice, use `any_in` (`none_in` to exclude); `eq` is not \"contains\": it matches only entries with exactly the same set of choices."
2403
+ "description": "Filters, an array of ScopeCondition objects; conditions are combined with AND. Besides field api_codes, `creator_id` and `serial_number` can be filtered on.\n- To find entries whose multiple-choice field contains a choice, use `any_in` (`none_in` to exclude); `eq` is not \"contains\": it matches only entries with exactly the same set of choices."
2404
2404
  },
2405
2405
  "keyword": {
2406
2406
  "type": "string",
@@ -2506,7 +2506,7 @@
2506
2506
  "properties": {
2507
2507
  "field": {
2508
2508
  "type": "string",
2509
- "description": "What to filter on; a field api_code for entries, or a form attribute such as `created_at` for form lists. Required unless the deprecated `api_code` or `trigger` is given instead."
2509
+ "description": "What to filter on; a field api_code for entries, where `creator_id` (`eq` with a user id, at most once) and `serial_number` (`eq` / `any_in` / `none_in`, several intersected) also work, or a form attribute such as `created_at` for form lists. Required unless the deprecated `api_code` or `trigger` is given instead."
2510
2510
  },
2511
2511
  "api_code": {
2512
2512
  "type": "string",
@@ -2544,7 +2544,7 @@
2544
2544
  "description": "Comparison; `equal` / `not_equal` / `start` / `end` are aliases of `eq` / `ne` / `gte` / `lte`. Each field type accepts only some operators, and an unsupported one returns 400 listing the available ones."
2545
2545
  },
2546
2546
  "value": {
2547
- "description": "Condition value; its type depends on the field and the operator: a two-element array `[min, max]` for `between` / `not_between`, `{\"unit\": \"day\", \"n\": 30}` for `within_last`, and no value for `null` / `not_null`."
2547
+ "description": "Condition value; its type depends on the field and the operator: a two-element array `[min, max]` for `between` / `not_between` (`{\"<column api_code>\": [min, max]}` on a matrix or table field), `{\"unit\": \"day\", \"n\": 30}` for `within_last` (unit minute / day / week / month), no value for `null` / `not_null`, a choice api_code or label on a choice field (a cascading drop-down also takes a `level1-level2` path), and serial numbers of the related table for `any_in` / `none_in` on a relation field."
2548
2548
  }
2549
2549
  }
2550
2550
  },
@@ -2560,7 +2560,7 @@
2560
2560
  }
2561
2561
  ]
2562
2562
  ],
2563
- "description": "Filters, an array of ScopeCondition objects; conditions are combined with AND.\n- Each field type accepts only some of the operators; an unsupported one returns 400 listing the available operators.\n- For choice fields (single choice / multiple choice / drop-down / cascading drop-down), `value` can be a choice api_code or a choice label; a cascading drop-down also accepts a `level1-level2` path.\n- For `between` / `not_between`, `value` is a two-element array `[min, max]`; matrix / table fields need `{\"<column api_code>\": [min, max]}`.\n- `within_last` works only on date fields; `value` looks like `{\"unit\":\"day\",\"n\":30}` (unit can be minute / day / week / month).\n- `creator_id` is a special field that filters by submitter with `eq` (the value is a user id), and can appear only once.\n- `serial_number` is a special field that filters by serial number with `eq` / `any_in`; several conditions are intersected.\n- For a relation field (RelationField), the `value` of `any_in` / `none_in` is serial numbers of entries in the related table; returns 400 when a serial number does not exist.\n- With a `created_at` condition, results are sorted by creation time instead.\n- To find entries whose multiple-choice field contains a choice, use `any_in` (`none_in` to exclude); `eq` is not \"contains\": it matches only entries with exactly the same set of choices."
2563
+ "description": "Filters, an array of ScopeCondition objects; conditions are combined with AND. Besides field api_codes, `creator_id` and `serial_number` can be filtered on.\n- To find entries whose multiple-choice field contains a choice, use `any_in` (`none_in` to exclude); `eq` is not \"contains\": it matches only entries with exactly the same set of choices."
2564
2564
  },
2565
2565
  "keyword": {
2566
2566
  "type": "string",
@@ -2650,7 +2650,7 @@
2650
2650
  "properties": {
2651
2651
  "field": {
2652
2652
  "type": "string",
2653
- "description": "What to filter on; a field api_code for entries, or a form attribute such as `created_at` for form lists. Required unless the deprecated `api_code` or `trigger` is given instead."
2653
+ "description": "What to filter on; a field api_code for entries, where `creator_id` (`eq` with a user id, at most once) and `serial_number` (`eq` / `any_in` / `none_in`, several intersected) also work, or a form attribute such as `created_at` for form lists. Required unless the deprecated `api_code` or `trigger` is given instead."
2654
2654
  },
2655
2655
  "api_code": {
2656
2656
  "type": "string",
@@ -2688,7 +2688,7 @@
2688
2688
  "description": "Comparison; `equal` / `not_equal` / `start` / `end` are aliases of `eq` / `ne` / `gte` / `lte`. Each field type accepts only some operators, and an unsupported one returns 400 listing the available ones."
2689
2689
  },
2690
2690
  "value": {
2691
- "description": "Condition value; its type depends on the field and the operator: a two-element array `[min, max]` for `between` / `not_between`, `{\"unit\": \"day\", \"n\": 30}` for `within_last`, and no value for `null` / `not_null`."
2691
+ "description": "Condition value; its type depends on the field and the operator: a two-element array `[min, max]` for `between` / `not_between` (`{\"<column api_code>\": [min, max]}` on a matrix or table field), `{\"unit\": \"day\", \"n\": 30}` for `within_last` (unit minute / day / week / month), no value for `null` / `not_null`, a choice api_code or label on a choice field (a cascading drop-down also takes a `level1-level2` path), and serial numbers of the related table for `any_in` / `none_in` on a relation field."
2692
2692
  }
2693
2693
  }
2694
2694
  },
@@ -2880,7 +2880,7 @@
2880
2880
  {
2881
2881
  "operationId": "listMySubmittedEntries",
2882
2882
  "summary": "List my entries in a form",
2883
- "description": "List my entries in a form\nReturns the entries the current user submitted to the given form, newest first. The form need not be created by or shared with the current user: only the user's own entries are returned,\nwith only the fields the form makes public to submitters (hidden fields are neither returned nor usable for filtering or searching). Returns an empty list when the user has not submitted.\n- `fields` keeps only the given public fields; unknown or non-public api_codes are skipped (no error).\n- `filters` works as in the entry list, but cannot filter by `creator_id` (results are already limited to the user's own) or on non-public fields; doing so returns 400.\n- `keyword` searches only the user's own entries and is not subject to the form's entry-count limit.\n- Pagination: `next` is a row offset; `skip` and `next` cannot be combined. 50 rows per page by default, adjustable with `limit` (at most 1000).\n- An account access token has no \"current user\"; calling with one returns 400. Returns 404 when the form does not exist.",
2883
+ "description": "List my entries in a form\nReturns the entries the current user submitted to the given form, newest first. The form need not be created by or shared with the current user: only the user's own entries are returned,\nwith only the fields the form makes public to submitters (hidden fields are neither returned nor usable for filtering or searching).\n- `filters` works as in the entry list, but cannot use `creator_id`, since results are already the user's own.\n- `keyword` is not subject to the form's entry-count limit.\n- An account access token has no \"current user\"; calling with one returns 400.",
2884
2884
  "tag": "Entries",
2885
2885
  "method": "get",
2886
2886
  "path": "/my/forms/{form_token}/entries",
@@ -2976,7 +2976,7 @@
2976
2976
  "properties": {
2977
2977
  "field": {
2978
2978
  "type": "string",
2979
- "description": "What to filter on; a field api_code for entries, or a form attribute such as `created_at` for form lists. Required unless the deprecated `api_code` or `trigger` is given instead."
2979
+ "description": "What to filter on; a field api_code for entries, where `creator_id` (`eq` with a user id, at most once) and `serial_number` (`eq` / `any_in` / `none_in`, several intersected) also work, or a form attribute such as `created_at` for form lists. Required unless the deprecated `api_code` or `trigger` is given instead."
2980
2980
  },
2981
2981
  "api_code": {
2982
2982
  "type": "string",
@@ -3014,7 +3014,7 @@
3014
3014
  "description": "Comparison; `equal` / `not_equal` / `start` / `end` are aliases of `eq` / `ne` / `gte` / `lte`. Each field type accepts only some operators, and an unsupported one returns 400 listing the available ones."
3015
3015
  },
3016
3016
  "value": {
3017
- "description": "Condition value; its type depends on the field and the operator: a two-element array `[min, max]` for `between` / `not_between`, `{\"unit\": \"day\", \"n\": 30}` for `within_last`, and no value for `null` / `not_null`."
3017
+ "description": "Condition value; its type depends on the field and the operator: a two-element array `[min, max]` for `between` / `not_between` (`{\"<column api_code>\": [min, max]}` on a matrix or table field), `{\"unit\": \"day\", \"n\": 30}` for `within_last` (unit minute / day / week / month), no value for `null` / `not_null`, a choice api_code or label on a choice field (a cascading drop-down also takes a `level1-level2` path), and serial numbers of the related table for `any_in` / `none_in` on a relation field."
3018
3018
  }
3019
3019
  }
3020
3020
  },
@@ -3030,7 +3030,7 @@
3030
3030
  }
3031
3031
  ]
3032
3032
  ],
3033
- "description": "Filters, an array of ScopeCondition objects; conditions are combined with AND.\n- Each field type accepts only some of the operators; an unsupported one returns 400 listing the available operators.\n- For choice fields (single choice / multiple choice / drop-down / cascading drop-down), `value` can be a choice api_code or a choice label; a cascading drop-down also accepts a `level1-level2` path.\n- For `between` / `not_between`, `value` is a two-element array `[min, max]`; matrix / table fields need `{\"<column api_code>\": [min, max]}`.\n- `within_last` works only on date fields; `value` looks like `{\"unit\":\"day\",\"n\":30}` (unit can be minute / day / week / month).\n- `creator_id` is a special field that filters by submitter with `eq` (the value is a user id), and can appear only once.\n- `serial_number` is a special field that filters by serial number with `eq` / `any_in`; several conditions are intersected.\n- For a relation field (RelationField), the `value` of `any_in` / `none_in` is serial numbers of entries in the related table; returns 400 when a serial number does not exist.\n- With a `created_at` condition, results are sorted by creation time instead.\n- To find entries whose multiple-choice field contains a choice, use `any_in` (`none_in` to exclude); `eq` is not \"contains\": it matches only entries with exactly the same set of choices."
3033
+ "description": "Filters, an array of ScopeCondition objects; conditions are combined with AND. Besides field api_codes, `creator_id` and `serial_number` can be filtered on.\n- To find entries whose multiple-choice field contains a choice, use `any_in` (`none_in` to exclude); `eq` is not \"contains\": it matches only entries with exactly the same set of choices."
3034
3034
  },
3035
3035
  "keyword": {
3036
3036
  "type": "string",
@@ -3108,7 +3108,7 @@
3108
3108
  {
3109
3109
  "operationId": "searchMySubmittedEntries",
3110
3110
  "summary": "Search my entries",
3111
- "description": "Search my entries\nSearches the current user's own entries across forms with one keyword (only fields the form makes public to submitters are searched), and returns the match count and serial numbers for each matching form.\n- `keyword` is required; returns 400 when empty.\n- By default, searches every form the current user has submitted to (quick payment forms excluded); `form_tokens` limits it to some of them, and tokens not in the user's submission history are ignored.\n Returns 400 when more than 20 forms are in the search; narrow them with `form_tokens`.\n- Forms with no match are left out of the result; when a form cannot be searched (e.g. the keyword is too long), that form returns `unavailable` with an explanation and the other forms return as usual.\n- At most 50 serial numbers are returned per form; `matched` is the form's actual total match count.\n- An account access token has no \"current user\"; calling with one returns 400.\nReturns schema \"MySearchResponse\" (see get_schema).",
3111
+ "description": "Search my entries\nSearches the current user's own entries in every form they submitted to (quick payment forms excluded) with one keyword, over the fields each form makes public to submitters, and returns the match count and serial numbers for each matching form.\n- One call searches at most 20 forms; past that, name the ones to search in `form_tokens`.\n- An account access token has no \"current user\"; calling with one returns 400.\nReturns schema \"MySearchResponse\" (see get_schema).",
3112
3112
  "tag": "Entries",
3113
3113
  "method": "get",
3114
3114
  "path": "/my/search",
@@ -3152,7 +3152,7 @@
3152
3152
  "items": {
3153
3153
  "type": "string"
3154
3154
  },
3155
- "description": "Search only these forms. Comma-separated form tokens, or an array parameter (`form_tokens[]=`)."
3155
+ "description": "Search only these of the forms the user submitted to; other tokens are not searched. Comma-separated form tokens, or an array parameter (`form_tokens[]=`)."
3156
3156
  }
3157
3157
  },
3158
3158
  "additionalProperties": false,
@@ -3170,7 +3170,7 @@
3170
3170
  {
3171
3171
  "operationId": "createEntryImport",
3172
3172
  "summary": "Import entries from an uploaded spreadsheet",
3173
- "description": "Import entries from an uploaded spreadsheet\nAppends each row of a spreadsheet uploaded with \"Upload an import file\" as an entry of this form. Upload the file first to get the import attachment ID (`attachment_id`), then say here which column goes into which field.\nProblems that can be detected up front, such as the file, the plan's import limit, the header row and the column mapping, are checked before the job is created; a rejected import writes no entries. Error messages include the spreadsheet's actual layout (row and column range, and the header contents), so the request can be fixed and retried.\nOnce validation passes, returns `201` and the entries are written in the background: `201` means the job has started, not finished; poll \"Show an entry import job\" for the result.\n- `attachment_id` must be an import file the current user uploaded for this form, otherwise returns 400 (the file cannot be found; upload it again); returns 400 when the file is not xls / xlsx / csv or cannot be read.\n- `columns` must not be empty; each item names the target field with `field_api_code`, and the source column with `column_label` (the header text, which must exactly match the header cell after trimming leading and trailing spaces) or `sheet_column_index` (the column number); when both are given, `sheet_column_index` wins.\n- The field must be one this form can import into; one field cannot map to several columns; when several header columns share a name, use `sheet_column_index` instead; the column number must be within the spreadsheet's column range.\n- `header_row_index` defaults to the first row of the spreadsheet, and there must be data rows below it.\n- Every required field of the form must have a column, otherwise returns 400 listing the missing fields.\n- `unique_field_code` names a field to deduplicate on: when a row's value for that field already exists in the form's entries, the row is skipped (counted in `skip_count`).\n- Returns 404 `form cannot be found` when the form does not exist or is not accessible to the current caller.\nOnly for a file the client actually holds and has uploaded with upload_import_file. Table / CSV text pasted into the conversation goes straight to create_entries (at most 200 per batch); do not turn it into a file to import.",
3173
+ "description": "Import entries from an uploaded spreadsheet\nAppends each row of a spreadsheet uploaded with \"Upload an import file\" as an entry of this form. Upload the file first to get the import attachment ID (`attachment_id`), then say here which column goes into which field.\nOnce validation passes, returns `201` and the entries are written in the background: `201` means the job has started, not finished; poll \"Show an entry import job\" for the result.\n- Every required field of the form needs a column, and a field takes at most one column.\n- A refused import writes no entries, and its error shows the row and column range and the header of the spreadsheet, so fix the mapping from it and retry.\nOnly for a file the client actually holds and has uploaded with prepare_import_file_upload (or upload_import_file). Table / CSV text pasted into the conversation goes straight to create_entries (at most 200 per batch); do not turn it into a file to import.",
3174
3174
  "tag": "Entries",
3175
3175
  "method": "post",
3176
3176
  "path": "/forms/{form_token}/entry_imports",
@@ -3205,7 +3205,7 @@
3205
3205
  },
3206
3206
  "attachment_id": {
3207
3207
  "type": "string",
3208
- "description": "The import attachment `id` returned by \"Upload an import file\""
3208
+ "description": "The import attachment `id` returned by \"Upload an import file\" for this form"
3209
3209
  },
3210
3210
  "columns": {
3211
3211
  "type": "array",
@@ -4097,7 +4097,7 @@
4097
4097
  "properties": {
4098
4098
  "field": {
4099
4099
  "type": "string",
4100
- "description": "What to filter on; a field api_code for entries, or a form attribute such as `created_at` for form lists. Required unless the deprecated `api_code` or `trigger` is given instead."
4100
+ "description": "What to filter on; a field api_code for entries, where `creator_id` (`eq` with a user id, at most once) and `serial_number` (`eq` / `any_in` / `none_in`, several intersected) also work, or a form attribute such as `created_at` for form lists. Required unless the deprecated `api_code` or `trigger` is given instead."
4101
4101
  },
4102
4102
  "api_code": {
4103
4103
  "type": "string",
@@ -4135,7 +4135,7 @@
4135
4135
  "description": "Comparison; `equal` / `not_equal` / `start` / `end` are aliases of `eq` / `ne` / `gte` / `lte`. Each field type accepts only some operators, and an unsupported one returns 400 listing the available ones."
4136
4136
  },
4137
4137
  "value": {
4138
- "description": "Condition value; its type depends on the field and the operator: a two-element array `[min, max]` for `between` / `not_between`, `{\"unit\": \"day\", \"n\": 30}` for `within_last`, and no value for `null` / `not_null`."
4138
+ "description": "Condition value; its type depends on the field and the operator: a two-element array `[min, max]` for `between` / `not_between` (`{\"<column api_code>\": [min, max]}` on a matrix or table field), `{\"unit\": \"day\", \"n\": 30}` for `within_last` (unit minute / day / week / month), no value for `null` / `not_null`, a choice api_code or label on a choice field (a cascading drop-down also takes a `level1-level2` path), and serial numbers of the related table for `any_in` / `none_in` on a relation field."
4139
4139
  }
4140
4140
  }
4141
4141
  },
@@ -4274,7 +4274,7 @@
4274
4274
  {
4275
4275
  "operationId": "createTable",
4276
4276
  "summary": "Create a table",
4277
- "description": "Create a table\nCreates a table. Same as creating a form, except:\n- field types can only be the column types tables support: `TextArea`, `RadioButton`, `CheckBox`, `BooleanField`, `MobileField`, `NumberField`, `DateTimeField`, `EmailField`, `LinkField`, `AttachmentField`, `FormulaField`, `RelationField`;\n- attachment columns do not accept limit properties such as count / size limits, and number / formula columns have limited precision; a violation returns 400 listing the offending columns;\n- choice columns do not get an \"Other\" choice; `folder_token` must be a table folder; `layout` is not supported.\n- with `with_default_entries: true`, 3 blank entries are added after creation (as when creating a table in the product); by default none are added.\nReturns the table structure, including fields and views.\nReturns schema \"Table\" (see get_schema).",
4277
+ "description": "Create a table\nCreates a table. Same as creating a form, except:\n- field types can only be the column types tables support: `TextArea`, `RadioButton`, `CheckBox`, `BooleanField`, `MobileField`, `NumberField`, `DateTimeField`, `EmailField`, `LinkField`, `AttachmentField`, `FormulaField`, `RelationField`, `SequenceField`;\n- attachment columns do not accept limit properties such as count / size limits, and number / formula columns have limited precision; a violation returns 400 listing the offending columns;\n- choice columns do not get an \"Other\" choice; `folder_token` must be a table folder; `layout` is not supported.\n- with `with_default_entries: true`, 3 blank entries are added after creation (as when creating a table in the product); by default none are added.\nReturns the table structure, including fields and views.\nReturns schema \"Table\" (see get_schema).",
4278
4278
  "tag": "Tables",
4279
4279
  "method": "post",
4280
4280
  "path": "/tables",
@@ -4308,7 +4308,7 @@
4308
4308
  "minItems": 1,
4309
4309
  "items": {
4310
4310
  "type": "object",
4311
- "description": "A table column definition; type is limited to the column types a table supports\nBranches on type; get_schema shows each branch's own properties: TextAreaInput, RadioButtonInput, CheckBoxInput, BooleanFieldInput, MobileFieldInput, NumberFieldInput, DateTimeFieldInput, EmailFieldInput, 12 in all.",
4311
+ "description": "A table column definition; type is limited to the column types a table supports\nBranches on type; get_schema shows each branch's own properties: TextAreaInput, RadioButtonInput, CheckBoxInput, BooleanFieldInput, MobileFieldInput, NumberFieldInput, DateTimeFieldInput, EmailFieldInput, 13 in all.",
4312
4312
  "required": [
4313
4313
  "type",
4314
4314
  "label"
@@ -4328,7 +4328,8 @@
4328
4328
  "LinkField",
4329
4329
  "AttachmentField",
4330
4330
  "FormulaField",
4331
- "RelationField"
4331
+ "RelationField",
4332
+ "SequenceField"
4332
4333
  ]
4333
4334
  },
4334
4335
  "label": {
@@ -4446,7 +4447,7 @@
4446
4447
  },
4447
4448
  {
4448
4449
  "type": "object",
4449
- "description": "A table column definition; type is limited to the column types a table supports\nBranches on type; get_schema shows each branch's own properties: TextAreaInput, RadioButtonInput, CheckBoxInput, BooleanFieldInput, MobileFieldInput, NumberFieldInput, DateTimeFieldInput, EmailFieldInput, 12 in all.",
4450
+ "description": "A table column definition; type is limited to the column types a table supports\nBranches on type; get_schema shows each branch's own properties: TextAreaInput, RadioButtonInput, CheckBoxInput, BooleanFieldInput, MobileFieldInput, NumberFieldInput, DateTimeFieldInput, EmailFieldInput, 13 in all.",
4450
4451
  "required": [
4451
4452
  "type",
4452
4453
  "label"
@@ -4466,7 +4467,8 @@
4466
4467
  "LinkField",
4467
4468
  "AttachmentField",
4468
4469
  "FormulaField",
4469
- "RelationField"
4470
+ "RelationField",
4471
+ "SequenceField"
4470
4472
  ]
4471
4473
  },
4472
4474
  "label": {
@@ -5248,7 +5250,7 @@
5248
5250
  {
5249
5251
  "operationId": "getBillingAccount",
5250
5252
  "summary": "Show the current account",
5251
- "description": "Show the current account\nReturns the account the current credential belongs to: plan, this month's usage and quota, feature trial status, and the bound payment merchant / WeChat Pay / Alipay accounts.\n`usage` is null when the account has no usage record for this month yet; for an add-on service with unlimited quota, only `unit`, `unlimited: true` and `consumed_quota` are returned.",
5253
+ "description": "Show the current account\nReturns the account the current credential belongs to: plan, this month's usage and quota, feature trial status, and the bound payment merchant / WeChat Pay / Alipay accounts.\n`usage` is null when the account has no usage record for this month yet.",
5252
5254
  "tag": "Account",
5253
5255
  "method": "get",
5254
5256
  "path": "/billing_account",
@@ -5320,10 +5322,221 @@
5320
5322
  "openWorldHint": false
5321
5323
  }
5322
5324
  },
5325
+ {
5326
+ "operationId": "prepareEntryAttachmentUpload",
5327
+ "summary": "Prepare an entry attachment upload",
5328
+ "description": "Prepare an entry attachment upload\nIssues a one-time link for uploading a local file to an attachment field, or to an attachment column of a table field, without sending its bytes in a request body.\n- With a shell that can read the file and reach the network, run `curl -F file=@<path> <upload_url>`, then put the returned `attachment_id` in the field when creating or updating an entry.\n- Without one, or when curl fails (for example under a sandbox's network limits), send small content as Base64 to \"Upload an entry attachment\".",
5329
+ "tag": "Uploads",
5330
+ "method": "post",
5331
+ "path": "/forms/{form_token}/entry_attachment_upload_urls",
5332
+ "params": [
5333
+ {
5334
+ "name": "form_token",
5335
+ "in": "path",
5336
+ "required": true
5337
+ }
5338
+ ],
5339
+ "paramNames": [
5340
+ "form_token"
5341
+ ],
5342
+ "body": {
5343
+ "contentType": "application/json",
5344
+ "required": true,
5345
+ "flatten": true
5346
+ },
5347
+ "successStatus": 201,
5348
+ "scopes": [
5349
+ "write_entries"
5350
+ ],
5351
+ "responseSchema": "PreparedUpload",
5352
+ "name": "prepare_entry_attachment_upload",
5353
+ "title": "Prepare an entry attachment upload",
5354
+ "inputSchema": {
5355
+ "type": "object",
5356
+ "properties": {
5357
+ "form_token": {
5358
+ "type": "string",
5359
+ "description": "Form token (`token` from `GET /forms`); a 24-character hexadecimal form id is also accepted."
5360
+ },
5361
+ "field_api_code": {
5362
+ "type": "string",
5363
+ "description": "api_code of the attachment field; for an attachment column in a table field, pass the table field's api_code"
5364
+ },
5365
+ "dimension_api_code": {
5366
+ "type": "string",
5367
+ "description": "api_code of the attachment column in a table field; required when `field_api_code` is a table field"
5368
+ }
5369
+ },
5370
+ "additionalProperties": false,
5371
+ "required": [
5372
+ "form_token",
5373
+ "field_api_code"
5374
+ ]
5375
+ },
5376
+ "outputSchema": {
5377
+ "type": "object",
5378
+ "required": [
5379
+ "upload_url",
5380
+ "expires_at"
5381
+ ],
5382
+ "properties": {
5383
+ "upload_url": {
5384
+ "type": "string",
5385
+ "format": "uri",
5386
+ "description": "One-time upload link: POST the file to it as the `file` part of `multipart/form-data`, without credentials; it answers `{ \"attachment_id\" }` (plus `url` for a `description` image), or 400 once used or expired or when the file breaks the size or type limits"
5387
+ },
5388
+ "expires_at": {
5389
+ "type": "string",
5390
+ "format": "date-time",
5391
+ "description": "When the link expires (UTC)"
5392
+ }
5393
+ }
5394
+ },
5395
+ "annotations": {
5396
+ "readOnlyHint": false,
5397
+ "destructiveHint": false,
5398
+ "idempotentHint": false,
5399
+ "openWorldHint": false
5400
+ }
5401
+ },
5402
+ {
5403
+ "operationId": "prepareFormImageUpload",
5404
+ "summary": "Prepare a form image upload",
5405
+ "description": "Prepare a form image upload\nIssues a one-time link for uploading a local image for a form, without sending its bytes in a request body.\n- With a shell that can read the file and reach the network, run `curl -F file=@<path> <upload_url>`, then use the returned `attachment_id` (or `url`) where its `image_type` goes.\n- Without one, or when curl fails (for example under a sandbox's network limits), give a public image URL or a small Base64 image where the image goes.",
5406
+ "tag": "Uploads",
5407
+ "method": "post",
5408
+ "path": "/form_image_upload_urls",
5409
+ "params": [],
5410
+ "paramNames": [],
5411
+ "body": {
5412
+ "contentType": "application/json",
5413
+ "required": true,
5414
+ "flatten": true
5415
+ },
5416
+ "successStatus": 201,
5417
+ "scopes": [
5418
+ "forms",
5419
+ "form_setting"
5420
+ ],
5421
+ "responseSchema": "PreparedUpload",
5422
+ "name": "prepare_form_image_upload",
5423
+ "title": "Prepare a form image upload",
5424
+ "inputSchema": {
5425
+ "type": "object",
5426
+ "properties": {
5427
+ "image_type": {
5428
+ "type": "string",
5429
+ "enum": [
5430
+ "field_choice",
5431
+ "header",
5432
+ "wallpaper",
5433
+ "carousel",
5434
+ "opensearch_header",
5435
+ "description",
5436
+ "goods_item",
5437
+ "contact_widget"
5438
+ ],
5439
+ "description": "What the image is for"
5440
+ }
5441
+ },
5442
+ "additionalProperties": false,
5443
+ "required": [
5444
+ "image_type"
5445
+ ]
5446
+ },
5447
+ "outputSchema": {
5448
+ "type": "object",
5449
+ "required": [
5450
+ "upload_url",
5451
+ "expires_at"
5452
+ ],
5453
+ "properties": {
5454
+ "upload_url": {
5455
+ "type": "string",
5456
+ "format": "uri",
5457
+ "description": "One-time upload link: POST the file to it as the `file` part of `multipart/form-data`, without credentials; it answers `{ \"attachment_id\" }` (plus `url` for a `description` image), or 400 once used or expired or when the file breaks the size or type limits"
5458
+ },
5459
+ "expires_at": {
5460
+ "type": "string",
5461
+ "format": "date-time",
5462
+ "description": "When the link expires (UTC)"
5463
+ }
5464
+ }
5465
+ },
5466
+ "annotations": {
5467
+ "readOnlyHint": false,
5468
+ "destructiveHint": false,
5469
+ "idempotentHint": false,
5470
+ "openWorldHint": false
5471
+ }
5472
+ },
5473
+ {
5474
+ "operationId": "prepareImportFileUpload",
5475
+ "summary": "Prepare an import file upload",
5476
+ "description": "Prepare an import file upload\nIssues a one-time link for uploading a local spreadsheet (`.xlsx` / `.xls` / `.csv`) to import into the form, without sending its bytes in a request body.\n- With a shell that can read the file and reach the network, run `curl -F file=@<path> <upload_url>`, then pass the returned `attachment_id` to \"Import entries from an uploaded spreadsheet\"; read the header row from your local copy.\n- Without one, or when curl fails, the file cannot be uploaded: spreadsheets have no Base64 route.",
5477
+ "tag": "Uploads",
5478
+ "method": "post",
5479
+ "path": "/forms/{form_token}/import_file_upload_urls",
5480
+ "params": [
5481
+ {
5482
+ "name": "form_token",
5483
+ "in": "path",
5484
+ "required": true
5485
+ }
5486
+ ],
5487
+ "paramNames": [
5488
+ "form_token"
5489
+ ],
5490
+ "successStatus": 201,
5491
+ "scopes": [
5492
+ "write_entries"
5493
+ ],
5494
+ "responseSchema": "PreparedUpload",
5495
+ "name": "prepare_import_file_upload",
5496
+ "title": "Prepare an import file upload",
5497
+ "inputSchema": {
5498
+ "type": "object",
5499
+ "properties": {
5500
+ "form_token": {
5501
+ "type": "string",
5502
+ "description": "Form token (`token` from `GET /forms`); a 24-character hexadecimal form id is also accepted."
5503
+ }
5504
+ },
5505
+ "additionalProperties": false,
5506
+ "required": [
5507
+ "form_token"
5508
+ ]
5509
+ },
5510
+ "outputSchema": {
5511
+ "type": "object",
5512
+ "required": [
5513
+ "upload_url",
5514
+ "expires_at"
5515
+ ],
5516
+ "properties": {
5517
+ "upload_url": {
5518
+ "type": "string",
5519
+ "format": "uri",
5520
+ "description": "One-time upload link: POST the file to it as the `file` part of `multipart/form-data`, without credentials; it answers `{ \"attachment_id\" }` (plus `url` for a `description` image), or 400 once used or expired or when the file breaks the size or type limits"
5521
+ },
5522
+ "expires_at": {
5523
+ "type": "string",
5524
+ "format": "date-time",
5525
+ "description": "When the link expires (UTC)"
5526
+ }
5527
+ }
5528
+ },
5529
+ "annotations": {
5530
+ "readOnlyHint": false,
5531
+ "destructiveHint": false,
5532
+ "idempotentHint": false,
5533
+ "openWorldHint": false
5534
+ }
5535
+ },
5323
5536
  {
5324
5537
  "operationId": "uploadEntryAttachment",
5325
5538
  "summary": "Upload an entry attachment",
5326
- "description": "Upload an entry attachment\nUploads a file ahead of time for a form's attachment field (or an attachment column in a table field) and returns the attachment ID; then, when creating / updating an entry, put that ID (or the upload token) into the matching field to bind it. An uploaded attachment that no entry references stays unused.\nAuthenticate in one of two ways:\n1. Regular API credentials (a Bearer token).\n2. A one-time upload token `attachment_token` (instead of regular credentials): the token starts with `entry_att_tok_`, is valid for 30 minutes, can be used only once, and is bound to the form, field, column and file metadata. When the request carries `attachment_token`, regular credentials are not checked and the request acts as the token's user; returns 400 `attachment_token is invalid or expired; prepare upload again` when the token is invalid, expired, already used, its user has been deleted, or it does not match the requested form / field / column; also returns 400 when the uploaded file's name, Content-Type or byte size does not match the token.\nReturns 401 when there are neither credentials nor `attachment_token`.\nSend the file content in one of two ways: the `file` field of `multipart/form-data`; or a Base64 string in the `base64` (or `data`) field of a JSON / form-encoded body (a `data:<mime>;base64,` prefix is allowed), with `file_name` (or `filename`) and `content_type`. Base64 content cannot exceed 5 MB once decoded; larger returns 400 `attachment exceeds 5MB limit`, and a decoding failure returns 400 `base64 is invalid`; returns 400 `file or base64 is required` when neither is given.\n`field_api_code` must point to an attachment field or a table field; for a table field, `dimension_api_code` must also be passed and point to an attachment column in that table field, otherwise returns 400; returns 404 when the field or column does not exist.\nThe file size is capped by the per-file limit set on the field (or column); a larger file returns 422, with the specific validation message in `error_description` (e.g. `文件超过了10 MB`); returns 422 `上传失败,请重试` when uploading to object storage fails (the server's wording is authoritative).\nReturns 404 `form cannot be found` when the form does not exist or is not accessible to the current identity.",
5539
+ "description": "Upload an entry attachment\nUploads a file for an attachment field of the form, or for an attachment column of a table field.",
5327
5540
  "tag": "Uploads",
5328
5541
  "method": "post",
5329
5542
  "path": "/forms/{form_token}/entry_attachments",
@@ -5364,25 +5577,13 @@
5364
5577
  "type": "string",
5365
5578
  "description": "api_code of the attachment column in a table field; required when `field_api_code` is a table field"
5366
5579
  },
5367
- "attachment_token": {
5368
- "type": "string",
5369
- "description": "One-time upload token, starting with `entry_att_tok_`; when passed, it replaces the regular credentials"
5370
- },
5371
5580
  "base64": {
5372
5581
  "type": "string",
5373
- "description": "File content as a Base64 string, optionally with a `data:<mime>;base64,` prefix, at most 5 MB once decoded; the `data` key also works"
5374
- },
5375
- "data": {
5376
- "type": "string",
5377
- "description": "Alias of `base64`"
5582
+ "description": "File content as a Base64 string, optionally with a `data:<mime>;base64,` prefix, at most 5 MB once decoded"
5378
5583
  },
5379
5584
  "file_name": {
5380
5585
  "type": "string",
5381
- "description": "File name, defaults to `attachment`; the `filename` key also works"
5382
- },
5383
- "filename": {
5384
- "type": "string",
5385
- "description": "Alias of `file_name`"
5586
+ "description": "File name, defaults to `attachment`"
5386
5587
  },
5387
5588
  "content_type": {
5388
5589
  "type": "string",
@@ -5442,7 +5643,7 @@
5442
5643
  {
5443
5644
  "operationId": "uploadFormImage",
5444
5645
  "summary": "Upload a form image",
5445
- "description": "Upload a form image\nUploads an image that belongs to the form itself (a picture choice image, a header image, a background image, one frame of the header carousel, the header image of the form's public query page, or an inline image in the form description / a field description), and returns the image attachment ID. The image is not bound to any form yet; it takes effect only when a form or theme references it later.\nAuthenticate in one of two ways:\n1. Regular API credentials (a Bearer token). `image_type` must then say what the image is for, and can only be `header` (header image), `wallpaper` (background image), `opensearch_header` (public query page header image) or `description` (inline description image): pass the returned `attachment_id` to `header.header_image_attachment_id` / `wallpaper.background_image_attachment_id` of \"Update a form's theme\", or to `header.background_image.attachment_id` of \"Update a public query\"; `description` also returns the image address `url`, which goes into the `<img src>` of the form `description` or of a field's `notes`. When the form is saved, the image belongs to that form (at most 30 per form); images not used by any form within 7 days are cleaned up. Returns 400 `image_type must be one of: field_choice, header, wallpaper, carousel, opensearch_header, description.` when `image_type` is missing or not one of `field_choice` / `header` / `wallpaper` / `carousel` / `opensearch_header` / `description`; `field_choice` / `carousel` have nowhere that accepts an attachment ID, so they can only be uploaded with an upload token, otherwise returns 400.\n2. A one-time upload token `form_image_token` (instead of regular credentials): the token starts with `form_img_tok_`, is valid for 30 minutes, can be used only once, and has already recorded the image purpose (`field_choice` / `header` / `wallpaper` / `carousel` / `opensearch_header` / `description`; `image_type` is then ignored) and the file metadata; the uploaded file's original file name, Content-Type and byte size must match what the token recorded, otherwise returns 400. After a successful upload, do not use the returned `attachment_id` directly; instead reference the same token in a choice's `image_upload_token` in \"Create a form\" / \"Edit a form\", in `header.header_image_upload_token` / `wallpaper.background_image_upload_token` / `header.carousel_images[].image_upload_token` of \"Update a form's theme\", or in `header.background_image.image_upload_token` of \"Update a public query\"; for the `description` purpose nothing references the token, so use the returned `url` directly. Returns 400 `form_image_token is invalid or expired; prepare upload again` when the token does not exist, has expired, has been used, or its user has been deleted.\nReturns 401 when there are neither credentials nor a `form_image_token`. The request must be `multipart/form-data`, with the image binary in the `file` field; a missing file returns 400 `file is required`.",
5646
+ "description": "Upload a form image\nUploads an image for a form; it takes effect once a form, theme or public query references it.\n- `description` returns a `url` for an `<img src>` in the form `description` or a field's `notes`, at most 30 per form; every other type returns an `attachment_id` for the property that names that `image_type`.\n- An `attachment_id` is taken only where its `image_type` goes, and only while the image is unused or already that form's; an image nothing uses within 7 days is deleted.",
5446
5647
  "tag": "Uploads",
5447
5648
  "method": "post",
5448
5649
  "path": "/form_image_attachments",
@@ -5472,17 +5673,15 @@
5472
5673
  "wallpaper",
5473
5674
  "carousel",
5474
5675
  "opensearch_header",
5475
- "description"
5676
+ "description",
5677
+ "goods_item",
5678
+ "contact_widget"
5476
5679
  ],
5477
- "description": "What the image is for; without an upload token it is required and can only be header / wallpaper / opensearch_header / description; ignored with an upload token"
5478
- },
5479
- "form_image_token": {
5480
- "type": "string",
5481
- "description": "One-time upload token, starting with `form_img_tok_`; when passed, it replaces the regular credentials"
5680
+ "description": "What the image is for"
5482
5681
  },
5483
5682
  "file_base64": {
5484
5683
  "type": "string",
5485
- "description": "The image file; with an upload token, its file name, Content-Type and size must match what the token recorded. The file content as Base64 (a data URI prefix is fine)."
5684
+ "description": "The image file. The file content as Base64 (a data URI prefix is fine)."
5486
5685
  },
5487
5686
  "file_name": {
5488
5687
  "type": "string",
@@ -5495,6 +5694,7 @@
5495
5694
  },
5496
5695
  "additionalProperties": false,
5497
5696
  "required": [
5697
+ "image_type",
5498
5698
  "file_base64",
5499
5699
  "file_name",
5500
5700
  "content_type"
@@ -5508,7 +5708,7 @@
5508
5708
  "properties": {
5509
5709
  "attachment_id": {
5510
5710
  "type": "string",
5511
- "description": "Image attachment ID (see \"Upload a form image\")"
5711
+ "description": "Image attachment ID; pass it where its `image_type` goes"
5512
5712
  },
5513
5713
  "url": {
5514
5714
  "type": "string",
@@ -5526,7 +5726,7 @@
5526
5726
  {
5527
5727
  "operationId": "uploadImportFile",
5528
5728
  "summary": "Upload an import file",
5529
- "description": "Upload an import file\nUploads a spreadsheet file (xlsx / xls / csv) the client actually holds to the given form and returns the import attachment id; pass it as attachment_id to import_entries_from_file to start the import. Table / CSV text pasted into the conversation does not go through here (do not encode it as base64 and upload it as a file); write it with create_entries (at most 200 per batch). The file size is capped by the plan's Excel import limit, and the extension must be xls / xlsx / csv; otherwise returns 422 with the reason in error_description.",
5729
+ "description": "Upload an import file\nUploads a spreadsheet (`.xlsx` / `.xls` / `.csv`) for importing entries into the form.\nThe file goes through the tool call as Base64; a file on disk goes through prepare_import_file_upload instead. Table / CSV text pasted into the conversation does not go through here (do not encode it as base64 and upload it as a file); write it with create_entries (at most 200 per batch).",
5530
5730
  "tag": "Uploads",
5531
5731
  "method": "post",
5532
5732
  "path": "/forms/{form_token}/import_files",
@@ -5559,13 +5759,9 @@
5559
5759
  "type": "string",
5560
5760
  "description": "Form token (`token` from `GET /forms`); a 24-character hexadecimal form id is also accepted."
5561
5761
  },
5562
- "import_file_token": {
5563
- "type": "string",
5564
- "description": "One-time upload token, starting with `import_file_tok_`; when passed, it replaces the regular credentials"
5565
- },
5566
5762
  "file_base64": {
5567
5763
  "type": "string",
5568
- "description": "The xlsx / xls / csv file to import; with an upload token, its file name, Content-Type and size must match what the token recorded. The file content as Base64 (a data URI prefix is fine)."
5764
+ "description": "The xlsx / xls / csv file to import. The file content as Base64 (a data URI prefix is fine)."
5569
5765
  },
5570
5766
  "file_name": {
5571
5767
  "type": "string",
@@ -5798,7 +5994,7 @@
5798
5994
  {
5799
5995
  "operationId": "createForm",
5800
5996
  "summary": "Create a form",
5801
- "description": "Creates an online exam form (scene=exam, scored automatically). Use it, not create_form, when the user wants an exam, test or quiz; an evaluation such as a psychological test, ability assessment, self-assessment questionnaire or training feedback uses create_evaluation_form. Questions must use exam question types (SingleSelect / MultiSelect / TrueOrFalse / DropDownSelect / FillInBlank / ShortAnswer / FillInNumber), each with answers (the correct answer and its score; the default absolute mode has one correct answer and scores only a fully correct response). A question type's schema is the one FieldInput's x-variants names (SingleSelect → \"SingleSelectInput\"; see get_schema). Creates the form first, then applies exam_setting; if the settings are rejected, the form already exists and the result says so.\nCreates a form from a list of field definitions and returns the full form structure. `name` and `fields` are required.\n- `scene` sets the form's scene; exam / evaluation question types (such as `SingleSelect`, `FillInBlank`) can only be used in the scenes that support them.\n- `layout=card` (paged) does not support PageBreak, Matrix*, TableField, GoodsField, ESignatureField, FormAssociation, MultipleBlanksField or any kind of Widget field.\n- The folder named by `folder_token` must be manageable and of kind form; otherwise returns 404 / 400 respectively.\n- `setting` accepts only whitelisted keys (see `FormSettingWriteInput`); `setting.notification_rules` replaces, as a whole, the notification rules created through the API.\n- The returned form structure carries `url` (the public fill URL).",
5997
+ "description": "Creates an online exam form (scene=exam, scored automatically). Use it, not create_form, when the user wants an exam, test or quiz; an evaluation such as a psychological test, ability assessment, self-assessment questionnaire or training feedback uses create_evaluation_form. Questions must use exam question types (SingleSelect / MultiSelect / TrueOrFalse / DropDownSelect / FillInBlank / ShortAnswer / FillInNumber), each with answers (the correct answer and its score; the default absolute mode has one correct answer and scores only a fully correct response). A question type's schema is the one ExamFieldInput's x-variants names (SingleSelect → \"SingleSelectInput\"; see get_schema). Creates the form first, then applies exam_setting; if the settings are rejected, the form already exists and the result says so.\nCreates a form from a list of field definitions and returns the full form structure.",
5802
5998
  "tag": "Forms",
5803
5999
  "method": "post",
5804
6000
  "path": "/forms",
@@ -5832,7 +6028,7 @@
5832
6028
  "minItems": 1,
5833
6029
  "items": {
5834
6030
  "type": "object",
5835
- "description": "Shape: schema \"FieldInput\"; call get_schema (name=\"FieldInput\") or read the resource jinshuju://schemas/FieldInput."
6031
+ "description": "Shape: schema \"ExamFieldInput\"; call get_schema (name=\"ExamFieldInput\") or read the resource jinshuju://schemas/ExamFieldInput."
5836
6032
  }
5837
6033
  },
5838
6034
  "setting": {
@@ -5849,7 +6045,7 @@
5849
6045
  "classic",
5850
6046
  "card"
5851
6047
  ],
5852
- "description": "Layout; applies only when scene is survey / form / exam / evaluation; card is the paged layout"
6048
+ "description": "Layout; applies only when scene is survey / form / exam / evaluation; card is the paged layout and cannot hold PageBreak / MultipleBlanksField / WidgetContact / WidgetVideo / WidgetButton"
5853
6049
  },
5854
6050
  "scene": {
5855
6051
  "type": "string",
@@ -5910,7 +6106,7 @@
5910
6106
  }
5911
6107
  }
5912
6108
  },
5913
- "description": "Exam settings (updateExamSetting): Partially updates an exam form's settings; PUT is accepted too. Only for exam-scene forms; otherwise returns 400.\n- When the plan does not support \"show the score after submission\", `notice_after_filling_mode` is forced to none and `success_message_rich_text` is ignored.\n- `interval_comments` replaces the existing range comments as a whole; it takes effect only when `notice_after_filling_mode` (passed in this request or already saved) is grade / explaination / answer; passing an empty array does not turn range comments off.\n- Range comments must have end_point ≥ start_point and must not overlap; otherwise 400.\n- Passing `show_timeout: true` returns 400 when the form already has required questions; once the time limit is on, question fields cannot be made required (required candidate info fields are not affected); to turn on the time limit, make the questions optional first.\n- When `notice_after_filling_mode` is not none, the server clears success_redirect_url / success_redirect_fields in the form's settings.\n- A request body with no recognized keys is a no-op and returns the current settings."
6109
+ "description": "Exam settings (updateExamSetting): Partially updates an exam form's settings."
5914
6110
  }
5915
6111
  },
5916
6112
  "additionalProperties": false,
@@ -5992,11 +6188,11 @@
5992
6188
  "anyOf": [
5993
6189
  {
5994
6190
  "type": "object",
5995
- "description": "Shape: schema \"FieldInput\"; call get_schema (name=\"FieldInput\") or read the resource jinshuju://schemas/FieldInput."
6191
+ "description": "Shape: schema \"ExamFieldInput\"; call get_schema (name=\"ExamFieldInput\") or read the resource jinshuju://schemas/ExamFieldInput."
5996
6192
  },
5997
6193
  {
5998
6194
  "type": "object",
5999
- "description": "A table column definition; type is limited to the column types a table supports\nBranches on type; get_schema shows each branch's own properties: TextAreaInput, RadioButtonInput, CheckBoxInput, BooleanFieldInput, MobileFieldInput, NumberFieldInput, DateTimeFieldInput, EmailFieldInput, 12 in all.",
6195
+ "description": "A table column definition; type is limited to the column types a table supports\nBranches on type; get_schema shows each branch's own properties: TextAreaInput, RadioButtonInput, CheckBoxInput, BooleanFieldInput, MobileFieldInput, NumberFieldInput, DateTimeFieldInput, EmailFieldInput, 13 in all.",
6000
6196
  "required": [
6001
6197
  "type",
6002
6198
  "label"
@@ -6016,7 +6212,8 @@
6016
6212
  "LinkField",
6017
6213
  "AttachmentField",
6018
6214
  "FormulaField",
6019
- "RelationField"
6215
+ "RelationField",
6216
+ "SequenceField"
6020
6217
  ]
6021
6218
  },
6022
6219
  "label": {
@@ -6343,7 +6540,7 @@
6343
6540
  }
6344
6541
  }
6345
6542
  },
6346
- "description": "Exam settings (updateExamSetting): Partially updates an exam form's settings; PUT is accepted too. Only for exam-scene forms; otherwise returns 400.\n- When the plan does not support \"show the score after submission\", `notice_after_filling_mode` is forced to none and `success_message_rich_text` is ignored.\n- `interval_comments` replaces the existing range comments as a whole; it takes effect only when `notice_after_filling_mode` (passed in this request or already saved) is grade / explaination / answer; passing an empty array does not turn range comments off.\n- Range comments must have end_point ≥ start_point and must not overlap; otherwise 400.\n- Passing `show_timeout: true` returns 400 when the form already has required questions; once the time limit is on, question fields cannot be made required (required candidate info fields are not affected); to turn on the time limit, make the questions optional first.\n- When `notice_after_filling_mode` is not none, the server clears success_redirect_url / success_redirect_fields in the form's settings.\n- A request body with no recognized keys is a no-op and returns the current settings."
6543
+ "description": "Exam settings (updateExamSetting): Partially updates an exam form's settings."
6347
6544
  }
6348
6545
  },
6349
6546
  "additionalProperties": false,
@@ -6367,7 +6564,7 @@
6367
6564
  {
6368
6565
  "operationId": "createForm",
6369
6566
  "summary": "Create a form",
6370
- "description": "Creates an evaluation form (scene=evaluation). Use it when the user wants an evaluation, psychological test, ability assessment, self-assessment questionnaire or training feedback; not create_form, and not create_exam_form (an exam with correct answers). A scored evaluation uses SingleSelect / MultiSelect / DropDownSelect / Rating / Nps: each question lists every choice with its score in answers and sets answer_setting_mode=relative (every choice scores, none is right or wrong; the default absolute accepts one correct answer and scores any other choice 0). A question type's schema is the one FieldInput's x-variants names (SingleSelect → \"SingleSelectInput\"; see get_schema). Do not score with a regular choice field's calculable / operand_value. A feedback questionnaire uses regular fields (RatingField / MatrixScaleField / TextArea, etc.) without scores. Creates the form first, then applies evaluation_setting (the report after submission, comments by total score range, dimensions).\nCreates a form from a list of field definitions and returns the full form structure. `name` and `fields` are required.\n- `scene` sets the form's scene; exam / evaluation question types (such as `SingleSelect`, `FillInBlank`) can only be used in the scenes that support them.\n- `layout=card` (paged) does not support PageBreak, Matrix*, TableField, GoodsField, ESignatureField, FormAssociation, MultipleBlanksField or any kind of Widget field.\n- The folder named by `folder_token` must be manageable and of kind form; otherwise returns 404 / 400 respectively.\n- `setting` accepts only whitelisted keys (see `FormSettingWriteInput`); `setting.notification_rules` replaces, as a whole, the notification rules created through the API.\n- The returned form structure carries `url` (the public fill URL).",
6567
+ "description": "Creates an evaluation form (scene=evaluation). Use it when the user wants an evaluation, psychological test, ability assessment, self-assessment questionnaire or training feedback; not create_form, and not create_exam_form (an exam with correct answers). A scored evaluation uses SingleSelect / MultiSelect / DropDownSelect / Rating / Nps: each question lists every choice with its score in answers and sets answer_setting_mode=relative (every choice scores, none is right or wrong; the default absolute accepts one correct answer and scores any other choice 0). A question type's schema is the one EvaluationFieldInput's x-variants names (SingleSelect → \"SingleSelectInput\"; see get_schema). Do not score with a regular choice field's calculable / operand_value. A feedback questionnaire uses regular fields (RatingField / MatrixScaleField / TextArea, etc.) without scores. Creates the form first, then applies evaluation_setting (the report after submission, comments by total score range, dimensions).\nCreates a form from a list of field definitions and returns the full form structure.",
6371
6568
  "tag": "Forms",
6372
6569
  "method": "post",
6373
6570
  "path": "/forms",
@@ -6401,7 +6598,7 @@
6401
6598
  "minItems": 1,
6402
6599
  "items": {
6403
6600
  "type": "object",
6404
- "description": "Shape: schema \"FieldInput\"; call get_schema (name=\"FieldInput\") or read the resource jinshuju://schemas/FieldInput."
6601
+ "description": "Shape: schema \"EvaluationFieldInput\"; call get_schema (name=\"EvaluationFieldInput\") or read the resource jinshuju://schemas/EvaluationFieldInput."
6405
6602
  }
6406
6603
  },
6407
6604
  "setting": {
@@ -6418,7 +6615,7 @@
6418
6615
  "classic",
6419
6616
  "card"
6420
6617
  ],
6421
- "description": "Layout; applies only when scene is survey / form / exam / evaluation; card is the paged layout"
6618
+ "description": "Layout; applies only when scene is survey / form / exam / evaluation; card is the paged layout and cannot hold PageBreak / MultipleBlanksField / WidgetContact / WidgetVideo / WidgetButton"
6422
6619
  },
6423
6620
  "scene": {
6424
6621
  "type": "string",
@@ -6427,7 +6624,7 @@
6427
6624
  },
6428
6625
  "evaluation_setting": {
6429
6626
  "type": "object",
6430
- "description": "Evaluation settings (updateEvaluationSetting): Partially updates an evaluation form's settings; PUT is accepted too. Only for evaluation-scene forms; otherwise returns 400.\n- When the plan does not support \"show the evaluation report after submission\", `notice_after_filling_mode` is forced to none.\n- `evaluation_comments` replaces the total score range comments as a whole, and an empty array turns range comments off; it takes effect only when `notice_after_filling_mode` (passed in this request or already saved) is reports / customize.\n- A comment by score range must give both start_point and end_point; comments written with conditions in the form editor read back as `id` + `conditions` and must be passed back with their original id when updating (only comment / retry may change; the conditions cannot be changed and no range can be added); leaving one out or changing it returns 400.\n- `indicator_setting.indicators` replaces the dimensions as a whole; pass `api_code` back to keep an existing dimension's identity. A dimension can bind only scorable questions visible on the form, referenced by `field_api_codes` or `field_cids`; referencing an unknown field returns 400.\n- When `notice_after_filling_mode` is not none, the server clears success_redirect_url / success_redirect_fields in the form's settings.\n- A request body with no recognized keys is a no-op and returns the current settings."
6627
+ "description": "Evaluation settings (updateEvaluationSetting): Partially updates an evaluation form's settings (schema `EvaluationSettingInput`).\n- `evaluation_comments` replaces the total score range comments as a whole (an empty array turns them off) and takes effect only when `notice_after_filling_mode`, passed or already saved, is reports / customize. A comment written with conditions in the form editor reads back as `id` + `conditions`; pass it back under that id, where only `comment` / `retry` can change.\n- `indicator_setting.indicators` replaces the dimensions as a whole; pass `api_code` back to keep a dimension. A dimension binds visible scorable questions by `field_api_codes` or `field_cids`."
6431
6628
  }
6432
6629
  },
6433
6630
  "additionalProperties": false,
@@ -6509,11 +6706,11 @@
6509
6706
  "anyOf": [
6510
6707
  {
6511
6708
  "type": "object",
6512
- "description": "Shape: schema \"FieldInput\"; call get_schema (name=\"FieldInput\") or read the resource jinshuju://schemas/FieldInput."
6709
+ "description": "Shape: schema \"EvaluationFieldInput\"; call get_schema (name=\"EvaluationFieldInput\") or read the resource jinshuju://schemas/EvaluationFieldInput."
6513
6710
  },
6514
6711
  {
6515
6712
  "type": "object",
6516
- "description": "A table column definition; type is limited to the column types a table supports\nBranches on type; get_schema shows each branch's own properties: TextAreaInput, RadioButtonInput, CheckBoxInput, BooleanFieldInput, MobileFieldInput, NumberFieldInput, DateTimeFieldInput, EmailFieldInput, 12 in all.",
6713
+ "description": "A table column definition; type is limited to the column types a table supports\nBranches on type; get_schema shows each branch's own properties: TextAreaInput, RadioButtonInput, CheckBoxInput, BooleanFieldInput, MobileFieldInput, NumberFieldInput, DateTimeFieldInput, EmailFieldInput, 13 in all.",
6517
6714
  "required": [
6518
6715
  "type",
6519
6716
  "label"
@@ -6533,7 +6730,8 @@
6533
6730
  "LinkField",
6534
6731
  "AttachmentField",
6535
6732
  "FormulaField",
6536
- "RelationField"
6733
+ "RelationField",
6734
+ "SequenceField"
6537
6735
  ]
6538
6736
  },
6539
6737
  "label": {
@@ -6808,7 +7006,7 @@
6808
7006
  },
6809
7007
  "evaluation_setting": {
6810
7008
  "type": "object",
6811
- "description": "Evaluation settings (updateEvaluationSetting): Partially updates an evaluation form's settings; PUT is accepted too. Only for evaluation-scene forms; otherwise returns 400.\n- When the plan does not support \"show the evaluation report after submission\", `notice_after_filling_mode` is forced to none.\n- `evaluation_comments` replaces the total score range comments as a whole, and an empty array turns range comments off; it takes effect only when `notice_after_filling_mode` (passed in this request or already saved) is reports / customize.\n- A comment by score range must give both start_point and end_point; comments written with conditions in the form editor read back as `id` + `conditions` and must be passed back with their original id when updating (only comment / retry may change; the conditions cannot be changed and no range can be added); leaving one out or changing it returns 400.\n- `indicator_setting.indicators` replaces the dimensions as a whole; pass `api_code` back to keep an existing dimension's identity. A dimension can bind only scorable questions visible on the form, referenced by `field_api_codes` or `field_cids`; referencing an unknown field returns 400.\n- When `notice_after_filling_mode` is not none, the server clears success_redirect_url / success_redirect_fields in the form's settings.\n- A request body with no recognized keys is a no-op and returns the current settings."
7009
+ "description": "Evaluation settings (updateEvaluationSetting): Partially updates an evaluation form's settings (schema `EvaluationSettingInput`).\n- `evaluation_comments` replaces the total score range comments as a whole (an empty array turns them off) and takes effect only when `notice_after_filling_mode`, passed or already saved, is reports / customize. A comment written with conditions in the form editor reads back as `id` + `conditions`; pass it back under that id, where only `comment` / `retry` can change.\n- `indicator_setting.indicators` replaces the dimensions as a whole; pass `api_code` back to keep a dimension. A dimension binds visible scorable questions by `field_api_codes` or `field_cids`."
6812
7010
  }
6813
7011
  },
6814
7012
  "additionalProperties": false,
@@ -6894,7 +7092,7 @@
6894
7092
  "properties": {
6895
7093
  "field": {
6896
7094
  "type": "string",
6897
- "description": "What to filter on; a field api_code for entries, or a form attribute such as `created_at` for form lists. Required unless the deprecated `api_code` or `trigger` is given instead."
7095
+ "description": "What to filter on; a field api_code for entries, where `creator_id` (`eq` with a user id, at most once) and `serial_number` (`eq` / `any_in` / `none_in`, several intersected) also work, or a form attribute such as `created_at` for form lists. Required unless the deprecated `api_code` or `trigger` is given instead."
6898
7096
  },
6899
7097
  "api_code": {
6900
7098
  "type": "string",
@@ -6932,7 +7130,7 @@
6932
7130
  "description": "Comparison; `equal` / `not_equal` / `start` / `end` are aliases of `eq` / `ne` / `gte` / `lte`. Each field type accepts only some operators, and an unsupported one returns 400 listing the available ones."
6933
7131
  },
6934
7132
  "value": {
6935
- "description": "Condition value; its type depends on the field and the operator: a two-element array `[min, max]` for `between` / `not_between`, `{\"unit\": \"day\", \"n\": 30}` for `within_last`, and no value for `null` / `not_null`."
7133
+ "description": "Condition value; its type depends on the field and the operator: a two-element array `[min, max]` for `between` / `not_between` (`{\"<column api_code>\": [min, max]}` on a matrix or table field), `{\"unit\": \"day\", \"n\": 30}` for `within_last` (unit minute / day / week / month), no value for `null` / `not_null`, a choice api_code or label on a choice field (a cascading drop-down also takes a `level1-level2` path), and serial numbers of the related table for `any_in` / `none_in` on a relation field."
6936
7134
  }
6937
7135
  }
6938
7136
  },
@@ -6948,7 +7146,7 @@
6948
7146
  }
6949
7147
  ]
6950
7148
  ],
6951
- "description": "Filters, an array of ScopeCondition objects; conditions are combined with AND.\n- Each field type accepts only some of the operators; an unsupported one returns 400 listing the available operators.\n- For choice fields (single choice / multiple choice / drop-down / cascading drop-down), `value` can be a choice api_code or a choice label; a cascading drop-down also accepts a `level1-level2` path.\n- For `between` / `not_between`, `value` is a two-element array `[min, max]`; matrix / table fields need `{\"<column api_code>\": [min, max]}`.\n- `within_last` works only on date fields; `value` looks like `{\"unit\":\"day\",\"n\":30}` (unit can be minute / day / week / month).\n- `creator_id` is a special field that filters by submitter with `eq` (the value is a user id), and can appear only once.\n- `serial_number` is a special field that filters by serial number with `eq` / `any_in`; several conditions are intersected.\n- For a relation field (RelationField), the `value` of `any_in` / `none_in` is serial numbers of entries in the related table; returns 400 when a serial number does not exist.\n- With a `created_at` condition, results are sorted by creation time instead.\n- To find entries whose multiple-choice field contains a choice, use `any_in` (`none_in` to exclude); `eq` is not \"contains\": it matches only entries with exactly the same set of choices."
7149
+ "description": "Filters, an array of ScopeCondition objects; conditions are combined with AND. Besides field api_codes, `creator_id` and `serial_number` can be filtered on.\n- To find entries whose multiple-choice field contains a choice, use `any_in` (`none_in` to exclude); `eq` is not \"contains\": it matches only entries with exactly the same set of choices."
6952
7150
  },
6953
7151
  "keyword": {
6954
7152
  "type": "string",