Apps
Manage app definitions, fields, and configuration
12 tools
List Apps
POST /v1/tools/tape/listApps
List all accessible Tape apps, optionally filtered by workspace. Returns app_id, name, and workspace_id for each app. Use workspace_id to scope results to a single workspace. Use summary_only for the most compact response (just app_id, workspace_id, name). Call tape_getApp with a specific app_id to get full field definitions.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
workspace_id | number | optional | Filter apps to a specific workspace (from listWorkspaces or platform context). Omit to list all accessible apps across workspaces. |
summary_only | boolean | optional | Return only app_id, workspace_id, and name |
Flags
| Name | Type | Description |
|---|---|---|
summary_only | boolean | Return only app_id, workspace_id, and name |
Request
curl -X POST https://api.syncello.io/v1/tools/tape/listApps \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json"Response
{
"workspace_id": 500100,
"total_count": 2,
"apps": [
{
"app_id": 500123,
"workspace_id": 500100,
"workspace_name": "Sales",
"slug": "deals",
"external_id": "deals",
"name": "Deals",
"record_name": "Deal",
"item_name": "Deal",
"type": "database",
"position": 100000,
"config": {
"item_name": "Deal",
"name": "Deals"
}
},
{
"app_id": 500124,
"workspace_id": 500100,
"workspace_name": "Sales",
"slug": "vendors",
"external_id": "vendors",
"name": "Vendors",
"record_name": "Vendor",
"item_name": "Vendor",
"type": "database",
"position": 200000,
"config": {
"item_name": "Vendor",
"name": "Vendors"
}
}
]
}Alternate mode
{
"workspace_id": 500100,
"total_count": 2,
"summary_only": true,
"apps": [
{
"app_id": 500123,
"workspace_id": 500100,
"name": "Deals"
},
{
"app_id": 500124,
"workspace_id": 500100,
"name": "Vendors"
}
]
} Try It
Try it
Sign in to execute this tool
Sign InGet App
POST /v1/tools/tape/getApp
Get a Tape app schema including field IDs, field types, category option IDs, and relation targets. IMPORTANT: Always call this before creating or updating records — you need field_id values, field_types, and category option_ids from the response to construct valid field values. Use field_id or field_label to look up a single specific field without fetching the whole app. Prefer minimal output: use include_fields: false for app metadata only, or field_type_filter: "basic" to exclude read-only calculation fields. Key response fields per field: field_id (number — use as key in createRecord/updateRecord), external_id (string — alternative key), field_type (determines value format), config.settings.options (category/status option_ids with text), config.settings.referenced_apps (linked app_ids for relation fields).
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
app_id | number | required | App ID (from listApps, platform context, or other tools) |
field_id | number | optional | Get single field by ID |
field_label | string | optional | Get single field by label (case-insensitive) |
include_fields | boolean | optional | Include the fields array (default: true). Set to false for app metadata only (name, workspace_id, item_name) without field definitions. |
field_type_filter | string | optional | Filter fields: "all" (default), "basic" (exclude calculation fields), "calculation" (only calculation fields). Use "basic" when preparing for createRecord/updateRecord — calculation fields are read-only. Values: all, basic, calculation |
fields_limit | number | optional | Max fields to return (for pagination on apps with many fields). Use with fields_offset. |
fields_offset | number | optional | Number of fields to skip (pagination). Use with fields_limit. |
fields_only | boolean | optional | Return only field_id, external_id, label, field_type for each field |
Flags
| Name | Type | Description |
|---|---|---|
field_id | number | Get single field by ID |
field_label | string | Get single field by label (case-insensitive) |
fields_only | boolean | Return only field_id, external_id, label, field_type for each field |
Request
curl -X POST https://api.syncello.io/v1/tools/tape/getApp \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json"
-d '{
"app_id": "123"
}'Response
{
"app_id": 500123,
"workspace_id": 500100,
"workspace_name": "Sales",
"slug": "deals",
"external_id": "deals",
"name": "Deals",
"record_name": "Deal",
"item_name": "Deal",
"type": "database",
"description": "Sales pipeline",
"config": {
"item_name": "Deal",
"name": "Deals"
},
"total_fields": 6,
"returned_count": 6,
"has_more": false,
"fields": [
{
"field_id": 702001,
"external_id": "deal_name",
"slug": "deal_name",
"label": "Deal Name",
"type": "text",
"field_type": "single_text",
"config": {
"label": "Deal Name",
"slug": "deal_name",
"external_id": "deal_name",
"required": false,
"settings": {
"formatted": false,
"format": "plain"
}
}
},
{
"field_id": 702002,
"external_id": "stage",
"slug": "stage",
"label": "Stage",
"field_type": "status",
"type": "category",
"config": {
"label": "Stage",
"slug": "stage",
"external_id": "stage",
"required": true,
"settings": {
"multiple": false,
"layout": "inline",
"options": [
{
"id": 90001,
"text": "Lead",
"color": "0077DE",
"means_completed": false
},
{
"id": 90003,
"text": "Won",
"color": "00866A",
"means_completed": true
}
]
}
}
}
]
}Alternate mode
{
"app_id": 500123,
"workspace_id": 500100,
"name": "Deals",
"item_name": "Deal",
"type": "database",
"total_fields": 6,
"returned_count": 6,
"has_more": false,
"fields_only": true,
"fields": [
{
"field_id": 702001,
"external_id": "deal_name",
"label": "Deal Name",
"field_type": "single_text"
},
{
"field_id": 702002,
"external_id": "stage",
"label": "Stage",
"field_type": "status"
}
]
} Try It
Try it
Sign in to execute this tool
Sign InGet Field
POST /v1/tools/tape/getField
Get a single field definition from a Tape app by label, field_id, or external_id. Returns the full field config including settings (category options, relation targets, calculation script, etc.). If the field is not found, returns a list of all available fields in the app to help identify the correct one. More efficient than getApp when you only need one field. Provide app_id plus one identifier (label, field_id, or external_id).
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
app_id | number | required | The app ID containing the field (from listApps or platform context). |
label | string | optional | Field label to search for (case-insensitive match). |
field_id | number | optional | Field ID (numeric, from getApp). |
external_id | string | optional | External ID (string, from getApp). |
Request
curl -X POST https://api.syncello.io/v1/tools/tape/getField \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json"
-d '{
"app_id": "123"
}'Response
{
"app_id": 500123,
"app_name": "Deals",
"field": {
"field_id": 702002,
"external_id": "stage",
"slug": "stage",
"label": "Stage",
"field_type": "status",
"type": "category",
"config": {
"label": "Stage",
"slug": "stage",
"external_id": "stage",
"required": true,
"settings": {
"multiple": false,
"layout": "inline",
"options": [
{
"id": 90001,
"text": "Lead",
"color": "0077DE",
"means_completed": false
},
{
"id": 90003,
"text": "Won",
"color": "00866A",
"means_completed": true
}
]
}
}
}
} Try It
Try it
Sign in to execute this tool
Sign InCreate App
POST /v1/tools/tape/createApp
Create a new Tape app in a workspace with optional fields. Returns the created app with app_id and all fields (including generated field_ids). Calculation fields are automatically separated and added after app creation (they need field_ids to reference). Field config format: {field_type: "single_text", config: {label: "Name", settings: {}}, external_id: "name"}. Common field types: single_text, multi_text, number (settings: decimals, unit, unit_location), single_date (settings: time "disabled"/"enabled"/"required"), single_category/multi_category (settings: {options: [{text, color}]}), status (settings: {options: [{text, color, means_completed}]}), single_relation/multi_relation (settings: {referenced_apps: [{app_id}]}), single_user/multi_user, multi_email, multi_phone, multi_link, checklist, single_attachment/multi_attachment, single_location, calculation (settings: {script, return_type, decimals, unit, unit_location}). For calculation fields with script validation, prefer tape_calculationField — it validates scripts before sending to the API.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
workspace_id | number | required | Workspace ID to create the app in (from listWorkspaces or platform context). |
name | string | required | Display name of the app (e.g., "Projects", "Contacts"). |
item_name | string | required | Singular name for records in this app (e.g., "Project", "Contact", "Task"). Used in the UI as "New [item_name]". |
description | string | optional | Optional description of the app. |
fields | array | required | Array of field definitions. Each needs field_type and config.label at minimum. Category/status fields need config.settings.options. Relation fields need config.settings.referenced_apps. See tool description for all field types and their settings. |
Request
curl -X POST https://api.syncello.io/v1/tools/tape/createApp \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json"
-d '{
"workspace_id": "123",
"name": "example",
"item_name": "example",
"fields": "..."
}'Response
{
"app_id": 500123,
"workspace_id": 500100,
"workspace_name": "Sales",
"slug": "projects",
"external_id": "projects",
"name": "Projects",
"record_name": "Project",
"item_name": "Project",
"type": "database",
"description": "Track all active projects",
"config": {
"item_name": "Project",
"name": "Projects"
},
"fields": [
{
"field_id": 702001,
"external_id": "project_name",
"slug": "project_name",
"label": "Project Name",
"type": "text",
"field_type": "single_text",
"config": {
"label": "Project Name",
"required": false,
"settings": {
"formatted": false,
"format": "plain"
}
}
},
{
"field_id": 702002,
"external_id": "status",
"slug": "status",
"label": "Status",
"field_type": "status",
"type": "category",
"config": {
"label": "Status",
"required": true,
"settings": {
"multiple": false,
"layout": "inline",
"options": [
{
"id": 90001,
"text": "Not Started",
"color": "0077DE",
"means_completed": false
},
{
"id": 90003,
"text": "Done",
"color": "00866A",
"means_completed": true
}
]
}
}
}
]
} Try It
Try it
Sign in to execute this tool
Sign InCreate Fields
POST /v1/tools/tape/createFields
Add one or more new fields to an existing Tape app. Additive-only: never updates or removes existing fields — use updateFields for that. Each field requires field_type and config.label; settings depend on the type. For calculation fields, config.settings may include trigger_webhooks and trigger_automations (booleans) to control whether recalculations fire the app's webhooks/automations; omit them to inherit Tape's default. Returns a summary (field count added + server response).
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
app_id | number | required | App ID to add fields to (from listApps/getApp). |
fields | array | required | New fields to add. Do NOT include field_id on any entry. |
Request
curl -X POST https://api.syncello.io/v1/tools/tape/createFields \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json"
-d '{
"app_id": "123",
"fields": "..."
}'Response
{
"app_id": 500123,
"fields_added": 2,
"created_fields": [
{
"field_id": 702014,
"label": "Budget",
"external_id": "budget",
"field_type": "number"
},
{
"field_id": 702015,
"label": "Notes",
"external_id": "notes",
"field_type": "multi_text"
}
],
"hint": "Use the field_id values above (not labels) when setting field values in createRecord/updateRecord."
} Try It
Try it
Sign in to execute this tool
Sign InUpdate App
POST /v1/tools/tape/updateApp
Update Tape app-level properties (name, item_name, description, icon, item_icon). For field changes use createFields, updateFields, updateAppFieldOrder, or calculationField.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
app_id | number | required | The app ID to update (from getApp, listApps, or platform context). |
updates | object | required | App-level properties to update. Supported keys: name (string), item_name (string), description (string), icon (string), item_icon (string). Only include the keys you want to change. |
return_full_response | boolean | optional | If true, returns the complete app JSON. If false (default), returns a summary. |
Request
curl -X POST https://api.syncello.io/v1/tools/tape/updateApp \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json"
-d '{
"app_id": "123",
"updates": "..."
}'Response
{
"app_id": 500123,
"app_name": "Deals",
"updates": {
"name": "Deals",
"item_name": "Record",
"description": "Updated description"
}
} Try It
Try it
Sign in to execute this tool
Sign InUpdate Fields
POST /v1/tools/tape/updateFields
Safely update fields on a Tape app. Validates every proposed change against the current app state and applies only the safe ones — unsafe operations are reported in the "skipped" bucket with explanations and alternatives. Does NOT accept settings.options directly for category or status fields; use option_ops instead — removal of options is intentionally not available because it causes irreversible data loss. Each option_ops entry is a SINGLE op object. Shapes: {op:"add", options:[{text:"5", color?:"DCEBD8"}, ...]} to add one or more new options; {op:"rename", option_id:123, text:"New name"} to rename one option; {op:"recolor", option_id:123, color:"E8F0F8"} to recolor one option; {op:"reorder", option_ids:[3,1,2]} to reorder by id. Do NOT put `text` at the op level for "add" — text belongs inside each options[] entry. Do NOT pass the full options list (that would be settings.options, which is refused). Does NOT accept settings.* changes on date fields (stored values depend on settings). For calculation fields, prefer the dedicated calculationField tool; you may also set trigger_webhooks / trigger_automations (booleans) in a calculation field's config.settings to control whether recalculations fire the app's webhooks/automations. PREREQUISITE: call getApp first to collect field_ids and current option IDs.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
app_id | number | required | |
fields | array | required |
Request
curl -X POST https://api.syncello.io/v1/tools/tape/updateFields \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json"
-d '{
"app_id": "123",
"fields": "..."
}'Response
{
"app_id": 500123,
"applied": [
{
"field_id": 702003,
"changes": [
"label",
"option_ops add"
]
}
],
"skipped": []
}Alternate mode
{
"app_id": 500123,
"applied": [],
"skipped": [
{
"field_id": 702003,
"requested": "update delta",
"reason": "updateFields does not change field order — delta is preserved. Use updateAppFieldOrder to reorder fields.",
"alternative": "Use updateAppFieldOrder with the desired field_id sequence."
}
]
} Try It
Try it
Sign in to execute this tool
Sign InUpdate App Field Order
POST /v1/tools/tape/updateAppFieldOrder
Reorder fields in a Tape app. Pass ALL field_ids in the desired display order — every field must be included. PREREQUISITE: Call tape_getApp first to get all current field_ids. The order determines how fields appear in the app UI and record forms.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
app_id | number | required | The app ID to reorder fields in (from getApp or listApps). |
field_ids | array | required | Array of ALL field_ids in the desired order (from getApp). Every field must be included — missing fields will cause an error. |
count_only | boolean | optional | Return only the count of reordered fields |
ids_only | boolean | optional | Return only the array of field IDs in new order |
Flags
| Name | Type | Description |
|---|---|---|
count_only | boolean | Return only the count of reordered fields |
ids_only | boolean | Return only the array of field IDs in new order |
Request
curl -X POST https://api.syncello.io/v1/tools/tape/updateAppFieldOrder \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json"
-d '{
"app_id": "123",
"field_ids": "..."
}'Response
{
"app_id": 500123,
"workspace_id": 500100,
"name": "Deals",
"item_name": "Deal",
"type": "database",
"fields": [
{
"field_id": 702002,
"external_id": "stage",
"label": "Stage",
"field_type": "status"
},
{
"field_id": 702001,
"external_id": "deal_name",
"label": "Deal Name",
"field_type": "single_text"
}
]
}Alternate mode
{
"app_id": 500123,
"field_ids": [
702002,
702001,
702003,
702004,
702005
]
}Alternate mode
{
"app_id": 500123,
"fields_reordered": 5
} Try It
Try it
Sign in to execute this tool
Sign InCalculation Field
POST /v1/tools/tape/calculationField
Create or update a Tape calculation field with script validation. Tape calculations use JavaScript with globally available libraries (NO import/require needed): - _ (lodash): _.sum(), _.groupBy(), _.uniq(), _.flatten(), etc. - moment: moment(date).format("DD/MM/YYYY"), .add(), .subtract(), .diff() - dateFns: format(), parseISO(), differenceInDays(), etc. - dateFnsTz: formatInTimeZone(), utcToZonedTime(), etc. - uuid: uuid.v4() - striptags: striptags(html) - jsonata: jsonata(expression).evaluate(data) FIELD REFERENCE SYNTAX — @[Label](variable): Same-app: @[Field Label](field_NUMBER) e.g. @[Status](field_702438) Metadata: @[Record ID](meta_recordId) e.g. @[Record ID](meta_recordId) @[App ID](meta_appId) Related-app: @[All of Label](DIRECTION_TARGETFIELDID_RELFIELDID) DIRECTION: in (incoming, drops nulls), out (outgoing, drops nulls), inn (incoming with nulls), outn (outgoing with nulls) ALWAYS use inn_/outn_ (with nulls) when pulling multiple parallel arrays — without nulls, missing values cause arrays to shrink and indexes misalign. TARGETFIELDID: the field_id of the field you want to READ in the RELATED app RELFIELDID: the field_id of the relationship field in THIS app HOW TO FIND THE RIGHT IDs: 1. Call getApp on THIS app — find the relationship field (single_relation/multi_relation) → its field_id is the RELFIELDID (last number) 2. Call getApp on the RELATED app — find each field you want to read → their field_ids are the TARGETFIELDIDs (first number) The variable MUST be: field_N, meta_recordId, meta_appId, in_N_N, out_N_N, inn_N_N, or outn_N_N. NO words like "contacts" or "my_field". UNSUPPORTED IN CALC CONTEXT (will error): - import/require — libraries are global, no importing needed - async/await — calculations must be synchronous - return statements at top level — the final expression is returned implicitly; helper functions CAN use return internally SUPPORTED (unlike Podio, Tape supports modern JS): - .map(), .filter(), .reduce(), .forEach(), .find(), .some(), .every() - for...of loops, arrow functions, template literals, destructuring, spread - lodash, moment, date-fns, jsonata (all global) FIELD TYPES THAT CANNOT BE REFERENCED: multi_image, multi_attachment, single_attachment, created_by, last_modified_by, created_on, last_modified_on, single_relation, multi_relation COMMON MISTAKE: Do not try to reference single_relation or multi_relation fields directly with @[Label](field_N) syntax. Instead, use the cross-app reference syntax: @[All of TargetField](in_TARGETFIELDID_RELFIELDID) to pull values from related records through the relation. RETURN TYPES: "number" (set decimals 0-4, optional unit with prefix/suffix) or "text" (supports markdown/HTML) WEBHOOK & AUTOMATION TRIGGERS (optional booleans in settings): - trigger_webhooks: when this field recalculates, fire the app's webhooks. - trigger_automations: when this field recalculates, fire the app's automations. Both inherit Tape's default (currently on) when omitted on create, and are preserved when omitted on update. Set either to false to stop this field's recalculations from firing that channel. PATTERNS: Simple math: @[Qty](field_1) * @[Price](field_2) Conditional: const t = @[Type](field_1); t === "A" ? @[Amount](field_2) : 0 Count related: @[All of Title](inn_fieldId_relId).length Lodash sum: _.sum(@[All of Hours](in_fieldId_relId)) Date format: moment(@[Date](field_1)).format("YYYY/MM/DD") Markdown table: const names = @[All of Name](inn_F1_R); const emails = @[All of Email](inn_F2_R); names.map((n, i) => `${n || ""} | ${emails[i] || ""}`).join("\n") UUID generation: uuid.v4() Record ID: @[Record ID](meta_recordId) HEADING / DIVIDER / SECTION LABEL (common pattern): Tape requires at least one field reference even for static/decorative content. Use a dummy reference that won't affect display: var dummy = @[Status](field_123); '<a href="#"><img src="https://dummyimage.com/690x40/40188e/edf0bd.png&text=SECTION+TITLE"></a>' Or simpler HTML: var dummy = @[Record ID](meta_recordId); '<div style="border-top:2px solid #40188e;padding:8px 0;font-weight:bold;font-size:14px;color:#40188e">SECTION TITLE</div>' The dummy variable absorbs the required field reference. The final expression (the HTML string) is what gets displayed. IMPORTANT: The script MUST contain at least one @[Label](field_N) or @[...](meta_recordId) reference or the API will reject it.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
app_id | number | required | App ID |
field_id | number | optional | Field ID — include to update an existing calculation field, omit to create a new one |
external_id | string | optional | External identifier for the field |
config | object | required |
Request
curl -X POST https://api.syncello.io/v1/tools/tape/calculationField \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json"
-d '{
"app_id": "123",
"config": "..."
}'Response
"Created calculation field. field_id: 702013. app now has 13 fields" Try It
Try it
Sign in to execute this tool
Sign InClone App
POST /v1/tools/tape/cloneApp
Create an exact duplicate of a Tape app with all fields, settings, and field order preserved. Calculation fields are excluded (they must be re-added manually with tape_calculationField after cloning because they reference field_ids that change). Relationship/relation fields are copied as-is — if cloning to a different workspace, you may need to update their referenced_apps. Returns the new app_id and a summary of cloned vs skipped fields.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
app_id | number | required | Source app ID to clone (from listApps, getApp, or platform context) |
workspace_id | number | optional | Target workspace ID for the cloned app. Defaults to the same workspace as the source app if omitted. |
name | string | optional | Name for the cloned app. Defaults to the same name as the source app (duplicate names are allowed). |
Request
curl -X POST https://api.syncello.io/v1/tools/tape/cloneApp \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json"
-d '{
"app_id": "123"
}'Response
{
"app_id": 500125,
"source_app_id": 500123,
"fields_cloned": 12,
"calculation_fields_skipped": 1,
"skipped_calculation_fields": [
"Weighted Value"
]
} Try It
Try it
Sign in to execute this tool
Sign InDelete App
POST /v1/tools/tape/deleteApp
Permanently delete a Tape app and ALL its records. This action CANNOT be undone. Use tape_getApp first to verify you have the correct app. Consider the impact on relation fields in other apps that reference this app.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
app_id | number | required | The app ID to delete (from getApp, listApps, or platform context). |
Request
curl -X POST https://api.syncello.io/v1/tools/tape/deleteApp \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json"
-d '{
"app_id": "123"
}'Response
{
"deleted": true,
"app_id": 500123
} Try It
Try it
Sign in to execute this tool
Sign InDelete Fields
POST /v1/tools/tape/deleteFields
Delete one or more fields from a Tape app. DESTRUCTIVE — every value stored in the deleted fields across every record is lost irreversibly. REST API only; not exposed to the agent or MCP.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
app_id | number | required | |
field_ids | array | required |
Request
curl -X POST https://api.syncello.io/v1/tools/tape/deleteFields \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json"
-d '{
"app_id": "123",
"field_ids": "..."
}'Response
{
"app_id": 500123,
"deleted": [
702012,
702013
]
} Try It
Try it
Sign in to execute this tool
Sign In