Checking authentication...

Apps

Manage app definitions, fields, and configuration

12 tools

List Apps

Read Idempotent

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

NameTypeRequiredDescription
workspace_idnumberoptionalFilter apps to a specific workspace (from listWorkspaces or platform context). Omit to list all accessible apps across workspaces.
summary_onlybooleanoptionalReturn only app_id, workspace_id, and name

Flags

NameTypeDescription
summary_onlybooleanReturn 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

Get App

Read Idempotent

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

NameTypeRequiredDescription
app_idnumberrequiredApp ID (from listApps, platform context, or other tools)
field_idnumberoptionalGet single field by ID
field_labelstringoptionalGet single field by label (case-insensitive)
include_fieldsbooleanoptionalInclude the fields array (default: true). Set to false for app metadata only (name, workspace_id, item_name) without field definitions.
field_type_filterstringoptionalFilter 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_limitnumberoptionalMax fields to return (for pagination on apps with many fields). Use with fields_offset.
fields_offsetnumberoptionalNumber of fields to skip (pagination). Use with fields_limit.
fields_onlybooleanoptionalReturn only field_id, external_id, label, field_type for each field

Flags

NameTypeDescription
field_idnumberGet single field by ID
field_labelstringGet single field by label (case-insensitive)
fields_onlybooleanReturn 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

Get Field

Read Idempotent

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

NameTypeRequiredDescription
app_idnumberrequiredThe app ID containing the field (from listApps or platform context).
labelstringoptionalField label to search for (case-insensitive match).
field_idnumberoptionalField ID (numeric, from getApp).
external_idstringoptionalExternal 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

Create App

Write

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

NameTypeRequiredDescription
workspace_idnumberrequiredWorkspace ID to create the app in (from listWorkspaces or platform context).
namestringrequiredDisplay name of the app (e.g., "Projects", "Contacts").
item_namestringrequiredSingular name for records in this app (e.g., "Project", "Contact", "Task"). Used in the UI as "New [item_name]".
descriptionstringoptionalOptional description of the app.
fieldsarrayrequiredArray 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

Create Fields

Write

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

NameTypeRequiredDescription
app_idnumberrequiredApp ID to add fields to (from listApps/getApp).
fieldsarrayrequiredNew 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

Update App

Write

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

NameTypeRequiredDescription
app_idnumberrequiredThe app ID to update (from getApp, listApps, or platform context).
updatesobjectrequiredApp-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_responsebooleanoptionalIf 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

Update Fields

Write

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

NameTypeRequiredDescription
app_idnumberrequired
fieldsarrayrequired

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

Update App Field Order

Write

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

NameTypeRequiredDescription
app_idnumberrequiredThe app ID to reorder fields in (from getApp or listApps).
field_idsarrayrequiredArray of ALL field_ids in the desired order (from getApp). Every field must be included — missing fields will cause an error.
count_onlybooleanoptionalReturn only the count of reordered fields
ids_onlybooleanoptionalReturn only the array of field IDs in new order

Flags

NameTypeDescription
count_onlybooleanReturn only the count of reordered fields
ids_onlybooleanReturn 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

Calculation Field

Write

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

NameTypeRequiredDescription
app_idnumberrequiredApp ID
field_idnumberoptionalField ID — include to update an existing calculation field, omit to create a new one
external_idstringoptionalExternal identifier for the field
configobjectrequired

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

Clone App

Write

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

NameTypeRequiredDescription
app_idnumberrequiredSource app ID to clone (from listApps, getApp, or platform context)
workspace_idnumberoptionalTarget workspace ID for the cloned app. Defaults to the same workspace as the source app if omitted.
namestringoptionalName 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

Delete App

Destructive

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

NameTypeRequiredDescription
app_idnumberrequiredThe 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

Delete Fields

Destructive

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

NameTypeRequiredDescription
app_idnumberrequired
field_idsarrayrequired

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